🎯 MapView v2.0 - Global Deployment Ready

 MAJOR FEATURES:
• Auto-zoom intelligence với smart bounds fitting
• Enhanced 3D GPS markers với pulsing effects
• Professional route display với 6-layer rendering
• Status-based parking icons với availability indicators
• Production-ready build optimizations

🗺️ AUTO-ZOOM FEATURES:
• Smart bounds fitting cho GPS + selected parking
• Adaptive padding (50px) cho visual balance
• Max zoom control (level 16) để tránh quá gần
• Dynamic centering khi không có selection

🎨 ENHANCED VISUALS:
• 3D GPS marker với multi-layer pulse effects
• Advanced parking icons với status colors
• Selection highlighting với animation
• Dimming system cho non-selected items

🛣️ ROUTE SYSTEM:
• OpenRouteService API integration
• Multi-layer route rendering (glow, shadow, main, animated)
• Real-time distance & duration calculation
• Visual route info trong popup

📱 PRODUCTION READY:
• SSR safe với dynamic imports
• Build errors resolved
• Global deployment via Vercel
• Optimized performance

🌍 DEPLOYMENT:
• Vercel: https://whatever-ctk2auuxr-phong12hexdockworks-projects.vercel.app
• Bundle size: 22.8 kB optimized
• Global CDN distribution
• HTTPS enabled

💾 VERSION CONTROL:
• MapView-v2.0.tsx backup created
• MAPVIEW_VERSIONS.md documentation
• Full version history tracking
This commit is contained in:
2025-07-20 19:52:16 +07:00
parent 3203463a6a
commit c65cc97a33
64624 changed files with 7199453 additions and 6462 deletions

View File

@@ -0,0 +1,18 @@
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","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,kBAAP,MAA+B,0BAA/B;AACA,OAAOC,kBAAP,MAA+B,0BAA/B;AAEA,eAAe,SAASC,WAAT,GAAuB;EACrC,0BAAoCD,kBAAkB,CAACE,SAAD,CAAtD;EAAA,IAAQC,IAAR,uBAAQA,IAAR;EAAA,IAAcC,OAAd,uBAAcA,OAAd;EAAA,IAAuBC,QAAvB,uBAAuBA,QAAvB;;EACA,IAAMC,OAAO,GAAG,IAAIP,kBAAJ,CAAuBI,IAAvB,EAA6BC,OAA7B,EAAsCC,QAAtC,CAAhB;EACA,IAAME,OAAO,GAAG,EAAhB;;EACA,OAAOD,OAAO,CAACE,OAAR,EAAP,EAA0B;IACzBD,OAAO,CAACE,IAAR,CAAaH,OAAO,CAACI,IAAR,EAAb;EACA;;EACD,OAAOH,OAAP;AACA"}

View File

@@ -0,0 +1,188 @@
import findNumbers from './findNumbers.js';
import metadata from '../../metadata.max.json' assert { type: 'json' };
describe('findNumbers', function () {
it('should find numbers', function () {
findNumbers('2133734253', 'US', metadata).should.deep.equal([{
phone: '2133734253',
country: 'US',
startsAt: 0,
endsAt: 10
}]);
findNumbers('(213) 373-4253', 'US', metadata).should.deep.equal([{
phone: '2133734253',
country: 'US',
startsAt: 0,
endsAt: 14
}]);
findNumbers('The number is +7 (800) 555-35-35 and not (213) 373-4253 as written in the document.', 'US', metadata).should.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
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).should.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}, {
phone: '2133734253',
country: 'US',
startsAt: 41,
endsAt: 55
}]); // No default country.
findNumbers('The number is +7 (800) 555-35-35 as written in the document.', metadata).should.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}]); // Passing `options` and default country.
findNumbers('The number is +7 (800) 555-35-35 as written in the document.', 'US', {
leniency: 'VALID'
}, metadata).should.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}]); // Passing `options`.
findNumbers('The number is +7 (800) 555-35-35 as written in the document.', {
leniency: 'VALID'
}, metadata).should.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}]); // Not a phone number and a phone number.
findNumbers('Digits 12 are not a number, but +7 (800) 555-35-35 is.', {
leniency: 'VALID'
}, metadata).should.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 32,
endsAt: 50
}]); // Phone number extension.
findNumbers('Date 02/17/2018 is not a number, but +7 (800) 555-35-35 ext. 123 is.', {
leniency: 'VALID'
}, metadata).should.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);
phoneNumbers.length.should.equal(2);
phoneNumbers[0].startsAt.should.equal(14);
phoneNumbers[0].endsAt.should.equal(42);
phoneNumbers[0].number.number.should.equal('+78005553535');
phoneNumbers[0].number.nationalNumber.should.equal('8005553535');
phoneNumbers[0].number.country.should.equal('RU');
phoneNumbers[0].number.countryCallingCode.should.equal('7');
phoneNumbers[0].number.ext.should.equal('1234');
phoneNumbers[1].startsAt.should.equal(51);
phoneNumbers[1].endsAt.should.equal(65);
phoneNumbers[1].number.number.should.equal('+12133734253');
phoneNumbers[1].number.nationalNumber.should.equal('2133734253');
phoneNumbers[1].number.country.should.equal('US');
phoneNumbers[1].number.countryCallingCode.should.equal('1');
});
it('shouldn\'t find non-valid numbers', function () {
// Not a valid phone number for US.
findNumbers('1111111111', 'US', metadata).should.deep.equal([]);
});
it('should find non-European digits', function () {
// E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.
findNumbers('العَرَبِيَّة‎ +٤٤٣٣٣٣٣٣٣٣٣٣عَرَبِيّ‎', metadata).should.deep.equal([{
country: 'GB',
phone: '3333333333',
startsAt: 14,
endsAt: 27
}]);
});
it('should work in edge cases', function () {
var thrower; // No input
findNumbers('', metadata).should.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');
};
thrower.should["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.
findNumbers('').should.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);
numbers.length.should.equal(1);
numbers[0].number.nationalNumber.should.equal('8005553535');
});
it('shouldn\'t find phone numbers which are not phone numbers', function () {
// A timestamp.
findNumbers('2012-01-02 08:00', 'US', metadata).should.deep.equal([]); // A valid number (not a complete timestamp).
findNumbers('2012-01-02 08', 'US', metadata).should.deep.equal([{
country: 'US',
phone: '2012010208',
startsAt: 0,
endsAt: 13
}]); // Invalid parens.
findNumbers('213(3734253', 'US', metadata).should.deep.equal([]); // Letters after phone number.
findNumbers('2133734253a', 'US', metadata).should.deep.equal([]); // Valid phone (same as the one found in the UUID below).
findNumbers('The phone number is 231354125.', 'FR', metadata).should.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);
possibleNumbers.length.should.equal(1);
possibleNumbers[0].country.should.equal('FR');
possibleNumbers[0].phone.should.equal('231354125'); // Not a phone number (part of a UUID).
// Shouldn't parse by default.
findNumbers('The UUID is CA801c26f98cd16e231354125ad046e40b.', 'FR', metadata).should.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 () {
findNumbers('39945926 77200596 16533084', 'ID', metadata).should.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,25 @@
// 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","arguments","text","options","metadata"],"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,iBAAP,IAA4BC,kBAAkB,IAAIC,mBAAlD,QAA6E,4CAA7E;AACA,OAAOC,kBAAP,MAA+B,0BAA/B;AAEA,eAAe,SAASC,gBAAT,GACf;EACC,0BAAoCD,kBAAkB,CAACE,SAAD,CAAtD;EAAA,IAAQC,IAAR,uBAAQA,IAAR;EAAA,IAAcC,OAAd,uBAAcA,OAAd;EAAA,IAAuBC,QAAvB,uBAAuBA,QAAvB;;EACA,OAAOR,iBAAiB,CAACM,IAAD,EAAOC,OAAP,EAAgBC,QAAhB,CAAxB;AACA;AAED;AACA;AACA;;AACA,OAAO,SAASP,kBAAT,GACP;EACC,2BAAoCE,kBAAkB,CAACE,SAAD,CAAtD;EAAA,IAAQC,IAAR,wBAAQA,IAAR;EAAA,IAAcC,OAAd,wBAAcA,OAAd;EAAA,IAAuBC,QAAvB,wBAAuBA,QAAvB;;EACA,OAAON,mBAAmB,CAACI,IAAD,EAAOC,OAAP,EAAgBC,QAAhB,CAA1B;AACA"}

View File

@@ -0,0 +1,229 @@
function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } 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(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// This is a legacy function.
// Use `findNumbers()` instead.
import findNumbers, { searchPhoneNumbers } from './findPhoneNumbers.js';
import { PhoneNumberSearch } from './findPhoneNumbersInitialImplementation.js';
import metadata from '../../metadata.min.json' assert { type: 'json' };
describe('findPhoneNumbers', function () {
it('should find numbers', function () {
findNumbers('2133734253', 'US', metadata).should.deep.equal([{
phone: '2133734253',
country: 'US',
startsAt: 0,
endsAt: 10
}]);
findNumbers('(213) 373-4253', 'US', metadata).should.deep.equal([{
phone: '2133734253',
country: 'US',
startsAt: 0,
endsAt: 14
}]);
findNumbers('The number is +7 (800) 555-35-35 and not (213) 373-4253 as written in the document.', 'US', metadata).should.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
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).should.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}, {
phone: '2133734253',
country: 'US',
startsAt: 41,
endsAt: 55
}]); // No default country.
findNumbers('The number is +7 (800) 555-35-35 as written in the document.', metadata).should.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}]); // Passing `options` and default country.
findNumbers('The number is +7 (800) 555-35-35 as written in the document.', 'US', {
leniency: 'VALID'
}, metadata).should.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}]); // Passing `options`.
findNumbers('The number is +7 (800) 555-35-35 as written in the document.', {
leniency: 'VALID'
}, metadata).should.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}]); // Not a phone number and a phone number.
findNumbers('Digits 12 are not a number, but +7 (800) 555-35-35 is.', {
leniency: 'VALID'
}, metadata).should.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 32,
endsAt: 50
}]); // Phone number extension.
findNumbers('Date 02/17/2018 is not a number, but +7 (800) 555-35-35 ext. 123 is.', {
leniency: 'VALID'
}, metadata).should.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.
findNumbers('1111111111', 'US', metadata).should.deep.equal([]);
});
it('should find non-European digits', function () {
// E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.
findNumbers('العَرَبِيَّة‎ +٤٤٣٣٣٣٣٣٣٣٣٣عَرَبِيّ‎', metadata).should.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;
number.should.deep.equal(expected_numbers.shift());
}
expected_numbers.length.should.equal(0);
});
it('should work in edge cases', function () {
var thrower; // No input
findNumbers('', metadata).should.deep.equal([]); // No country metadata for this `require` country code
thrower = function thrower() {
return findNumbers('123', 'ZZ', metadata);
};
thrower.should["throw"]('Unknown country'); // Numerical `value`
thrower = function thrower() {
return findNumbers(2141111111, 'US');
};
thrower.should["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.
findNumbers('2012-01-02 08:00', 'US', metadata).should.deep.equal([]); // A valid number (not a complete timestamp).
findNumbers('2012-01-02 08', 'US', metadata).should.deep.equal([{
country: 'US',
phone: '2012010208',
startsAt: 0,
endsAt: 13
}]); // Invalid parens.
findNumbers('213(3734253', 'US', metadata).should.deep.equal([]); // Letters after phone number.
findNumbers('2133734253a', 'US', metadata).should.deep.equal([]); // Valid phone (same as the one found in the UUID below).
findNumbers('The phone number is 231354125.', 'FR', metadata).should.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);
possibleNumbers.length.should.equal(3);
possibleNumbers[1].country.should.equal('FR');
possibleNumbers[1].phone.should.equal('231354125'); // Not a phone number (part of a UUID).
// Shouldn't parse by default.
findNumbers('The UUID is CA801c26f98cd16e231354125ad046e40b.', 'FR', metadata).should.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);
finder.hasNext().should.equal(true);
finder.next().should.deep.equal({
country: 'RU',
phone: '8005553535',
// number : '+7 (800) 555-35-35',
startsAt: 14,
endsAt: 32
});
finder.hasNext().should.equal(true);
finder.next().should.deep.equal({
country: 'US',
phone: '2133734253',
// number : '(213) 373-4253',
startsAt: 41,
endsAt: 55
});
finder.hasNext().should.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);
finder.hasNext().should.equal(true);
finder.next().should.deep.equal({
country: 'RU',
phone: '8005553535',
// number : '+7 (800) 555-35-35',
startsAt: 14,
endsAt: 32
});
finder.hasNext().should.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();
};
thrower.should["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,201 @@
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
// This is a legacy function.
// Use `findNumbers()` instead.
import { PLUS_CHARS, VALID_PUNCTUATION, VALID_DIGITS, WHITESPACE } from '../constants.js';
import parse from '../parse.js';
import { VALID_PHONE_NUMBER_WITH_EXTENSION } from '../helpers/isViablePhoneNumber.js';
import createExtensionPattern from '../helpers/extension/createExtensionPattern.js';
import parsePreCandidate from '../findNumbers/parsePreCandidate.js';
import isValidPreCandidate from '../findNumbers/isValidPreCandidate.js';
import isValidCandidate from '../findNumbers/isValidCandidate.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');
var WHITESPACE_IN_THE_BEGINNING_PATTERN = new RegExp('^[' + WHITESPACE + ']+');
var PUNCTUATION_IN_THE_END_PATTERN = new RegExp('[' + VALID_PUNCTUATION + ']+$'); // // 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 + ']*' + '$')
var 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);
return _defineProperty({}, Symbol.iterator, function () {
return {
next: function next() {
if (search.hasNext()) {
return {
done: false,
value: search.next()
};
}
return {
done: true
};
}
};
});
}
/**
* Extracts a parseable phone number including any opening brackets, etc.
* @param {string} text - Input.
* @return {object} `{ ?number, ?startsAt, ?endsAt }`.
*/
export 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');
}
_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;
}
}]);
return PhoneNumberSearch;
}();
//# sourceMappingURL=findPhoneNumbersInitialImplementation.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,107 @@
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
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) {
var _Array$prototype$slic = Array.prototype.slice.call(args),
_Array$prototype$slic2 = _slicedToArray(_Array$prototype$slic, 5),
arg_1 = _Array$prototype$slic2[0],
arg_2 = _Array$prototype$slic2[1],
arg_3 = _Array$prototype$slic2[2],
arg_4 = _Array$prototype$slic2[3],
arg_5 = _Array$prototype$slic2[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

View File

@@ -0,0 +1 @@
{"version":3,"file":"format.js","names":["_formatNumber","parse","isObject","formatNumber","normalizeArguments","arguments","input","format","options","metadata","args","Array","prototype","slice","call","arg_1","arg_2","arg_3","arg_4","arg_5","defaultCountry","extended","Error","TypeError"],"sources":["../../source/legacy/format.js"],"sourcesContent":["import _formatNumber from '../format.js'\r\nimport parse from '../parse.js'\r\nimport isObject from '../helpers/isObject.js'\r\n\r\nexport default function formatNumber() {\r\n\tconst {\r\n\t\tinput,\r\n\t\tformat,\r\n\t\toptions,\r\n\t\tmetadata\r\n\t} = normalizeArguments(arguments)\r\n\r\n\treturn _formatNumber(input, format, options, metadata)\r\n}\r\n\r\n// Sort out arguments\r\nfunction normalizeArguments(args)\r\n{\r\n\tconst [arg_1, arg_2, arg_3, arg_4, arg_5] = Array.prototype.slice.call(args)\r\n\r\n\tlet input\r\n\tlet format\r\n\tlet options\r\n\tlet metadata\r\n\r\n\t// Sort out arguments.\r\n\r\n\t// If the phone number is passed as a string.\r\n\t// `format('8005553535', ...)`.\r\n\tif (typeof arg_1 === 'string')\r\n\t{\r\n\t\t// If country code is supplied.\r\n\t\t// `format('8005553535', 'RU', 'NATIONAL', [options], metadata)`.\r\n\t\tif (typeof arg_3 === 'string')\r\n\t\t{\r\n\t\t\tformat = arg_3\r\n\r\n\t\t\tif (arg_5)\r\n\t\t\t{\r\n\t\t\t\toptions = arg_4\r\n\t\t\t\tmetadata = arg_5\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tmetadata = arg_4\r\n\t\t\t}\r\n\r\n\t\t\tinput = parse(arg_1, { defaultCountry: arg_2, extended: true }, metadata)\r\n\t\t}\r\n\t\t// Just an international phone number is supplied\r\n\t\t// `format('+78005553535', 'NATIONAL', [options], metadata)`.\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (typeof arg_2 !== 'string')\r\n\t\t\t{\r\n\t\t\t\tthrow new Error('`format` argument not passed to `formatNumber(number, format)`')\r\n\t\t\t}\r\n\r\n\t\t\tformat = arg_2\r\n\r\n\t\t\tif (arg_4)\r\n\t\t\t{\r\n\t\t\t\toptions = arg_3\r\n\t\t\t\tmetadata = arg_4\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tmetadata = arg_3\r\n\t\t\t}\r\n\r\n\t\t\tinput = parse(arg_1, { extended: true }, metadata)\r\n\t\t}\r\n\t}\r\n\t// If the phone number is passed as a parsed number object.\r\n\t// `format({ phone: '8005553535', country: 'RU' }, 'NATIONAL', [options], metadata)`.\r\n\telse if (isObject(arg_1))\r\n\t{\r\n\t\tinput = arg_1\r\n\t\tformat = arg_2\r\n\r\n\t\tif (arg_4)\r\n\t\t{\r\n\t\t\toptions = arg_3\r\n\t\t\tmetadata = arg_4\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tmetadata = arg_3\r\n\t\t}\r\n\t}\r\n\telse throw new TypeError('A phone number must either be a string or an object of shape { phone, [country] }.')\r\n\r\n\t// Legacy lowercase formats.\r\n\tif (format === 'International') {\r\n\t\tformat = 'INTERNATIONAL'\r\n\t} else if (format === 'National') {\r\n\t\tformat = 'NATIONAL'\r\n\t}\r\n\r\n\treturn {\r\n\t\tinput,\r\n\t\tformat,\r\n\t\toptions,\r\n\t\tmetadata\r\n\t}\r\n}"],"mappings":";;;;;;;;;;;;AAAA,OAAOA,aAAP,MAA0B,cAA1B;AACA,OAAOC,KAAP,MAAkB,aAAlB;AACA,OAAOC,QAAP,MAAqB,wBAArB;AAEA,eAAe,SAASC,YAAT,GAAwB;EACtC,0BAKIC,kBAAkB,CAACC,SAAD,CALtB;EAAA,IACCC,KADD,uBACCA,KADD;EAAA,IAECC,MAFD,uBAECA,MAFD;EAAA,IAGCC,OAHD,uBAGCA,OAHD;EAAA,IAICC,QAJD,uBAICA,QAJD;;EAOA,OAAOT,aAAa,CAACM,KAAD,EAAQC,MAAR,EAAgBC,OAAhB,EAAyBC,QAAzB,CAApB;AACA,C,CAED;;AACA,SAASL,kBAAT,CAA4BM,IAA5B,EACA;EACC,4BAA4CC,KAAK,CAACC,SAAN,CAAgBC,KAAhB,CAAsBC,IAAtB,CAA2BJ,IAA3B,CAA5C;EAAA;EAAA,IAAOK,KAAP;EAAA,IAAcC,KAAd;EAAA,IAAqBC,KAArB;EAAA,IAA4BC,KAA5B;EAAA,IAAmCC,KAAnC;;EAEA,IAAIb,KAAJ;EACA,IAAIC,MAAJ;EACA,IAAIC,OAAJ;EACA,IAAIC,QAAJ,CAND,CAQC;EAEA;EACA;;EACA,IAAI,OAAOM,KAAP,KAAiB,QAArB,EACA;IACC;IACA;IACA,IAAI,OAAOE,KAAP,KAAiB,QAArB,EACA;MACCV,MAAM,GAAGU,KAAT;;MAEA,IAAIE,KAAJ,EACA;QACCX,OAAO,GAAIU,KAAX;QACAT,QAAQ,GAAGU,KAAX;MACA,CAJD,MAMA;QACCV,QAAQ,GAAGS,KAAX;MACA;;MAEDZ,KAAK,GAAGL,KAAK,CAACc,KAAD,EAAQ;QAAEK,cAAc,EAAEJ,KAAlB;QAAyBK,QAAQ,EAAE;MAAnC,CAAR,EAAmDZ,QAAnD,CAAb;IACA,CAfD,CAgBA;IACA;IAjBA,KAmBA;MACC,IAAI,OAAOO,KAAP,KAAiB,QAArB,EACA;QACC,MAAM,IAAIM,KAAJ,CAAU,gEAAV,CAAN;MACA;;MAEDf,MAAM,GAAGS,KAAT;;MAEA,IAAIE,KAAJ,EACA;QACCV,OAAO,GAAIS,KAAX;QACAR,QAAQ,GAAGS,KAAX;MACA,CAJD,MAMA;QACCT,QAAQ,GAAGQ,KAAX;MACA;;MAEDX,KAAK,GAAGL,KAAK,CAACc,KAAD,EAAQ;QAAEM,QAAQ,EAAE;MAAZ,CAAR,EAA4BZ,QAA5B,CAAb;IACA;EACD,CA3CD,CA4CA;EACA;EA7CA,KA8CK,IAAIP,QAAQ,CAACa,KAAD,CAAZ,EACL;IACCT,KAAK,GAAIS,KAAT;IACAR,MAAM,GAAGS,KAAT;;IAEA,IAAIE,KAAJ,EACA;MACCV,OAAO,GAAIS,KAAX;MACAR,QAAQ,GAAGS,KAAX;IACA,CAJD,MAMA;MACCT,QAAQ,GAAGQ,KAAX;IACA;EACD,CAdI,MAeA,MAAM,IAAIM,SAAJ,CAAc,oFAAd,CAAN,CAzEN,CA2EC;;;EACA,IAAIhB,MAAM,KAAK,eAAf,EAAgC;IAC/BA,MAAM,GAAG,eAAT;EACA,CAFD,MAEO,IAAIA,MAAM,KAAK,UAAf,EAA2B;IACjCA,MAAM,GAAG,UAAT;EACA;;EAED,OAAO;IACND,KAAK,EAALA,KADM;IAENC,MAAM,EAANA,MAFM;IAGNC,OAAO,EAAPA,OAHM;IAINC,QAAQ,EAARA;EAJM,CAAP;AAMA"}

View File

@@ -0,0 +1,279 @@
import metadata from '../../metadata.min.json' assert { 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 () {
formatNumber('+12133734253', 'NATIONAL').should.equal('(213) 373-4253');
formatNumber('+12133734253', 'INTERNATIONAL').should.equal('+1 213 373 4253'); // Invalid number.
formatNumber('+12111111111', 'NATIONAL').should.equal('(211) 111-1111'); // Formatting invalid E.164 numbers.
formatNumber('+11111', 'INTERNATIONAL').should.equal('+1 1111');
formatNumber('+11111', 'NATIONAL').should.equal('1111');
});
it('should work with the first object argument expanded', function () {
formatNumber('2133734253', 'US', 'NATIONAL').should.equal('(213) 373-4253');
formatNumber('2133734253', 'US', 'INTERNATIONAL').should.equal('+1 213 373 4253');
});
it('should support legacy "National" / "International" formats', function () {
formatNumber('2133734253', 'US', 'National').should.equal('(213) 373-4253');
formatNumber('2133734253', 'US', 'International').should.equal('+1 213 373 4253');
});
it('should format using formats with no leading digits (`format.leadingDigitsPatterns().length === 0`)', function () {
formatNumber({
phone: '12345678901',
countryCallingCode: 888
}, 'INTERNATIONAL').should.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);
}
};
formatNumber({
phone: '8005553535',
country: 'RU',
ext: '123'
}, 'NATIONAL', options).should.equal('8 (800) 555-35-35 доб. 123'); // Parse number from string.
formatNumber('+78005553535', 'NATIONAL', options).should.equal('8 (800) 555-35-35');
formatNumber('8005553535', 'RU', 'NATIONAL', options).should.equal('8 (800) 555-35-35');
});
it('should format with national prefix when specifically instructed', function () {
// With national prefix.
formatNumber('88005553535', 'RU', 'NATIONAL').should.equal('8 (800) 555-35-35'); // Without national prefix via an explicitly set option.
formatNumber('88005553535', 'RU', 'NATIONAL', {
nationalPrefix: false
}).should.equal('800 555-35-35');
});
it('should format valid phone numbers', function () {
// Switzerland
formatNumber({
country: 'CH',
phone: '446681800'
}, 'INTERNATIONAL').should.equal('+41 44 668 18 00');
formatNumber({
country: 'CH',
phone: '446681800'
}, 'E.164').should.equal('+41446681800');
formatNumber({
country: 'CH',
phone: '446681800'
}, 'RFC3966').should.equal('tel:+41446681800');
formatNumber({
country: 'CH',
phone: '446681800'
}, 'NATIONAL').should.equal('044 668 18 00'); // France
formatNumber({
country: 'FR',
phone: '169454850'
}, 'NATIONAL').should.equal('01 69 45 48 50'); // Kazakhstan
formatNumber('+7 702 211 1111', 'NATIONAL').should.deep.equal('8 (702) 211 1111');
});
it('should format national numbers with national prefix even if it\'s optional', function () {
// Russia
formatNumber({
country: 'RU',
phone: '9991234567'
}, 'NATIONAL').should.equal('8 (999) 123-45-67');
});
it('should work in edge cases', function () {
var thrower; // No phone number
formatNumber('', 'RU', 'INTERNATIONAL').should.equal('');
formatNumber('', 'RU', 'NATIONAL').should.equal('');
formatNumber({
country: 'RU',
phone: ''
}, 'INTERNATIONAL').should.equal('+7');
formatNumber({
country: 'RU',
phone: ''
}, 'NATIONAL').should.equal(''); // No suitable format
formatNumber('+121337342530', 'US', 'NATIONAL').should.equal('21337342530'); // No suitable format (leading digits mismatch)
formatNumber('28199999', 'AD', 'NATIONAL').should.equal('28199999'); // Numerical `value`
thrower = function thrower() {
return formatNumber(89150000000, 'RU', 'NATIONAL');
};
thrower.should["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');
};
thrower.should["throw"]('`format` argument not passed'); // Unknown format type
thrower = function thrower() {
return formatNumber('123', 'US', 'Gay');
};
thrower.should["throw"]('Unknown "format" argument'); // No metadata
thrower = function thrower() {
return _formatNumber('123', 'US', 'E.164');
};
thrower.should["throw"]('`metadata`'); // No formats
formatNumber('012345', 'AC', 'NATIONAL').should.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
formatNumber({
country: 'US',
phone: '2133734253',
ext: '123'
}, 'NATIONAL').should.equal('(213) 373-4253 ext. 123'); // International
formatNumber({
country: 'US',
phone: '2133734253',
ext: '123'
}, 'INTERNATIONAL').should.equal('+1 213 373 4253 ext. 123'); // International
formatNumber({
country: 'US',
phone: '2133734253',
ext: '123'
}, 'INTERNATIONAL').should.equal('+1 213 373 4253 ext. 123'); // E.164
formatNumber({
country: 'US',
phone: '2133734253',
ext: '123'
}, 'E.164').should.equal('+12133734253'); // RFC3966
formatNumber({
country: 'US',
phone: '2133734253',
ext: '123'
}, 'RFC3966').should.equal('tel:+12133734253;ext=123'); // Custom ext prefix.
formatNumber({
country: 'GB',
phone: '7912345678',
ext: '123'
}, 'INTERNATIONAL').should.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.
formatNumber({
country: 'AR',
phone: '3435551212'
}, 'INTERNATIONAL').should.equal('+54 3435 55 1212');
formatNumber({
country: 'AR',
phone: '3435551212'
}, 'NATIONAL').should.equal('03435 55-1212');
});
it('should work with Mexico numbers', function () {
// Fixed line.
formatNumber({
country: 'MX',
phone: '4499780001'
}, 'INTERNATIONAL').should.equal('+52 449 978 0001');
formatNumber({
country: 'MX',
phone: '4499780001'
}, 'NATIONAL').should.equal('449 978 0001'); // or '(449)978-0001'.
// Mobile.
// `1` is prepended before area code to mobile numbers in international format.
formatNumber({
country: 'MX',
phone: '3312345678'
}, 'INTERNATIONAL').should.equal('+52 33 1234 5678');
formatNumber({
country: 'MX',
phone: '3312345678'
}, 'NATIONAL').should.equal('33 1234 5678'); // or '045 33 1234-5678'.
});
it('should format possible numbers', function () {
formatNumber({
countryCallingCode: '7',
phone: '1111111111'
}, 'E.164').should.equal('+71111111111');
formatNumber({
countryCallingCode: '7',
phone: '1111111111'
}, 'NATIONAL').should.equal('1111111111');
formatNumber({
countryCallingCode: '7',
phone: '1111111111'
}, 'INTERNATIONAL').should.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.
formatNumber('+12133734253', 'IDD', {
fromCountry: 'CA',
humanReadable: true
}).should.equal('1 (213) 373-4253');
formatNumber('+78005553535', 'IDD', {
fromCountry: 'KZ',
humanReadable: true
}).should.equal('8 (800) 555-35-35'); // formatNumber('+78005553535', 'IDD', { fromCountry: 'US' }).should.equal('01178005553535')
formatNumber('+78005553535', 'IDD', {
fromCountry: 'US',
humanReadable: true
}).should.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
formatNumber('+870773111632', 'INTERNATIONAL').should.equal('+870 773 111 632');
formatNumber('+870773111632', 'NATIONAL').should.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).
formatNumber('+390236618300', 'IDD', {
fromCountry: 'BY'
}).should.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,110 @@
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
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) {
var _Array$prototype$slic = Array.prototype.slice.call(args),
_Array$prototype$slic2 = _slicedToArray(_Array$prototype$slic, 4),
arg_1 = _Array$prototype$slic2[0],
arg_2 = _Array$prototype$slic2[1],
arg_3 = _Array$prototype$slic2[2],
arg_4 = _Array$prototype$slic2[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(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
import metadata from '../../metadata.max.json' assert { 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 () {
getNumberType('9150000000', 'RU').should.equal('MOBILE');
getNumberType('7912345678', 'GB').should.equal('MOBILE');
getNumberType('51234567', 'EE').should.equal('MOBILE');
});
it('should infer phone number types', function () {
getNumberType('88005553535', 'RU').should.equal('TOLL_FREE');
getNumberType('8005553535', 'RU').should.equal('TOLL_FREE');
getNumberType('4957777777', 'RU').should.equal('FIXED_LINE');
getNumberType('8030000000', 'RU').should.equal('PREMIUM_RATE');
getNumberType('2133734253', 'US').should.equal('FIXED_LINE_OR_MOBILE');
getNumberType('5002345678', 'US').should.equal('PERSONAL_NUMBER');
});
it('should work when no country is passed', function () {
getNumberType('+79150000000').should.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
getNumberType({
phone: '8005553535',
country: 'RU'
}).should.equal('TOLL_FREE'); // Invalid phone number
type(getNumberType('123', 'RU')).should.equal('undefined'); // Invalid country
thrower = function thrower() {
return getNumberType({
phone: '8005553535',
country: 'RUS'
});
};
thrower.should["throw"]('Unknown country'); // Numerical `value`
thrower = function thrower() {
return getNumberType(89150000000, 'RU');
};
thrower.should["throw"]('A phone number must either be a string or an object of shape { phone, [country] }.'); // When `options` argument is passed.
getNumberType('8005553535', 'RU', {}).should.equal('TOLL_FREE');
getNumberType('+78005553535', {}).should.equal('TOLL_FREE');
getNumberType({
phone: '8005553535',
country: 'RU'
}, {}).should.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,31 @@
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","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,kBAAT,QAAmC,oBAAnC;AACA,OAAOC,iBAAP,MAA8B,kBAA9B;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,gBAAT,GAA4B;EAC1C,0BAAqCF,kBAAkB,CAACG,SAAD,CAAvD;EAAA,IAAQC,KAAR,uBAAQA,KAAR;EAAA,IAAeC,OAAf,uBAAeA,OAAf;EAAA,IAAwBC,QAAxB,uBAAwBA,QAAxB,CAD0C,CAE1C;;;EACA,IAAI,CAACF,KAAK,CAACG,KAAP,IAAgB,EAAEF,OAAO,IAAIA,OAAO,CAACG,EAArB,CAApB,EAA8C;IAC7C,OAAO,KAAP;EACA;;EACD,OAAOP,iBAAiB,CAACG,KAAD,EAAQC,OAAR,EAAiBC,QAAjB,CAAxB;AACA"}

View File

@@ -0,0 +1,78 @@
import metadata from '../../metadata.min.json' assert { 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 () {
isPossibleNumber('+79992223344').should.equal(true);
isPossibleNumber({
phone: '1112223344',
country: 'RU'
}).should.equal(true);
isPossibleNumber({
phone: '111222334',
country: 'RU'
}).should.equal(false);
isPossibleNumber({
phone: '11122233445',
country: 'RU'
}).should.equal(false);
isPossibleNumber({
phone: '1112223344',
countryCallingCode: 7
}).should.equal(true);
});
it('should work v2', function () {
isPossibleNumber({
nationalNumber: '111222334',
countryCallingCode: 7
}, {
v2: true
}).should.equal(false);
isPossibleNumber({
nationalNumber: '1112223344',
countryCallingCode: 7
}, {
v2: true
}).should.equal(true);
isPossibleNumber({
nationalNumber: '11122233445',
countryCallingCode: 7
}, {
v2: true
}).should.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 `{}`.
isPossibleNumber({}).should.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","parameters","push","apply","describe","it","should","equal","phone","country","countryCallingCode","nationalNumber","v2","expect","to"],"sources":["../../source/legacy/isPossibleNumber.test.js"],"sourcesContent":["import metadata from '../../metadata.min.json' assert { 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\tisPossibleNumber('+79992223344').should.equal(true)\r\n\r\n\t\tisPossibleNumber({ phone: '1112223344', country: 'RU' }).should.equal(true)\r\n\t\tisPossibleNumber({ phone: '111222334', country: 'RU' }).should.equal(false)\r\n\t\tisPossibleNumber({ phone: '11122233445', country: 'RU' }).should.equal(false)\r\n\r\n\t\tisPossibleNumber({ phone: '1112223344', countryCallingCode: 7 }).should.equal(true)\r\n\t})\r\n\r\n\tit('should work v2', () => {\r\n\t\tisPossibleNumber({ nationalNumber: '111222334', countryCallingCode: 7 }, { v2: true }).should.equal(false)\r\n\t\tisPossibleNumber({ nationalNumber: '1112223344', countryCallingCode: 7 }, { v2: true }).should.equal(true)\r\n\t\tisPossibleNumber({ nationalNumber: '11122233445', countryCallingCode: 7 }, { v2: true }).should.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\tisPossibleNumber({}).should.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,QAAP,MAAqB,yBAArB,UAAwDC,IAAI,EAAE,MAA9D;AACA,OAAOC,iBAAP,MAA8B,uBAA9B;;AAEA,SAASC,gBAAT,GAAyC;EAAA,kCAAZC,UAAY;IAAZA,UAAY;EAAA;;EACxCA,UAAU,CAACC,IAAX,CAAgBL,QAAhB;EACA,OAAOE,iBAAiB,CAACI,KAAlB,CAAwB,IAAxB,EAA8BF,UAA9B,CAAP;AACA;;AAEDG,QAAQ,CAAC,kBAAD,EAAqB,YAAM;EAClCC,EAAE,CAAC,aAAD,EAAgB,YAClB;IACCL,gBAAgB,CAAC,cAAD,CAAhB,CAAiCM,MAAjC,CAAwCC,KAAxC,CAA8C,IAA9C;IAEAP,gBAAgB,CAAC;MAAEQ,KAAK,EAAE,YAAT;MAAuBC,OAAO,EAAE;IAAhC,CAAD,CAAhB,CAAyDH,MAAzD,CAAgEC,KAAhE,CAAsE,IAAtE;IACAP,gBAAgB,CAAC;MAAEQ,KAAK,EAAE,WAAT;MAAsBC,OAAO,EAAE;IAA/B,CAAD,CAAhB,CAAwDH,MAAxD,CAA+DC,KAA/D,CAAqE,KAArE;IACAP,gBAAgB,CAAC;MAAEQ,KAAK,EAAE,aAAT;MAAwBC,OAAO,EAAE;IAAjC,CAAD,CAAhB,CAA0DH,MAA1D,CAAiEC,KAAjE,CAAuE,KAAvE;IAEAP,gBAAgB,CAAC;MAAEQ,KAAK,EAAE,YAAT;MAAuBE,kBAAkB,EAAE;IAA3C,CAAD,CAAhB,CAAiEJ,MAAjE,CAAwEC,KAAxE,CAA8E,IAA9E;EACA,CATC,CAAF;EAWAF,EAAE,CAAC,gBAAD,EAAmB,YAAM;IAC1BL,gBAAgB,CAAC;MAAEW,cAAc,EAAE,WAAlB;MAA+BD,kBAAkB,EAAE;IAAnD,CAAD,EAAyD;MAAEE,EAAE,EAAE;IAAN,CAAzD,CAAhB,CAAuFN,MAAvF,CAA8FC,KAA9F,CAAoG,KAApG;IACAP,gBAAgB,CAAC;MAAEW,cAAc,EAAE,YAAlB;MAAgCD,kBAAkB,EAAE;IAApD,CAAD,EAA0D;MAAEE,EAAE,EAAE;IAAN,CAA1D,CAAhB,CAAwFN,MAAxF,CAA+FC,KAA/F,CAAqG,IAArG;IACAP,gBAAgB,CAAC;MAAEW,cAAc,EAAE,aAAlB;MAAiCD,kBAAkB,EAAE;IAArD,CAAD,EAA2D;MAAEE,EAAE,EAAE;IAAN,CAA3D,CAAhB,CAAyFN,MAAzF,CAAgGC,KAAhG,CAAsG,KAAtG;EACA,CAJC,CAAF;EAMAF,EAAE,CAAC,2BAAD,EAA8B,YAAM;IACrC;IACAQ,MAAM,CAAC;MAAA,OAAMb,gBAAgB,CAAC,EAAD,EAAK;QAAEY,EAAE,EAAE;MAAN,CAAL,CAAtB;IAAA,CAAD,CAAN,CAAiDE,EAAjD,UAA0D,oCAA1D,EAFqC,CAIrC;IACA;IACA;;IACAd,gBAAgB,CAAC,EAAD,CAAhB,CAAqBM,MAArB,CAA4BC,KAA5B,CAAkC,KAAlC;IACAM,MAAM,CAAC;MAAA,OAAMb,gBAAgB,CAAC;QAAEQ,KAAK,EAAE;MAAT,CAAD,CAAtB;IAAA,CAAD,CAAN,CAAwDM,EAAxD,UAAiE,oCAAjE,EARqC,CAUrC;;IACAD,MAAM,CAAC;MAAA,OAAMb,gBAAgB,CAAC;QAAEQ,KAAK,EAAE,YAAT;QAAuBC,OAAO,EAAE;MAAhC,CAAD,CAAtB;IAAA,CAAD,CAAN,CAAuEK,EAAvE,UAAgF,iBAAhF;EACA,CAZC,CAAF;AAaA,CA/BO,CAAR"}

View File

@@ -0,0 +1,17 @@
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","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,cAAP,MAA2B,eAA3B;AACA,SAASC,kBAAT,QAAmC,oBAAnC,C,CAEA;;AACA,eAAe,SAASC,aAAT,GAAyB;EACvC,0BAAqCD,kBAAkB,CAACE,SAAD,CAAvD;EAAA,IAAQC,KAAR,uBAAQA,KAAR;EAAA,IAAeC,OAAf,uBAAeA,OAAf;EAAA,IAAwBC,QAAxB,uBAAwBA,QAAxB,CADuC,CAEvC;;;EACA,IAAI,CAACF,KAAK,CAACG,KAAX,EAAkB;IACjB,OAAO,KAAP;EACA;;EACD,OAAOP,cAAc,CAACI,KAAD,EAAQC,OAAR,EAAiBC,QAAjB,CAArB;AACA"}

View File

@@ -0,0 +1,94 @@
import metadata from '../../metadata.min.json' assert { 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 () {
isValidNumber('+1-213-373-4253').should.equal(true);
isValidNumber('+1-213-373').should.equal(false);
isValidNumber('+1-213-373-4253', undefined).should.equal(true);
isValidNumber('(213) 373-4253', 'US').should.equal(true);
isValidNumber('(213) 37', 'US').should.equal(false);
isValidNumber({
country: 'US',
phone: '2133734253'
}).should.equal(true); // No "types" info: should return `true`.
isValidNumber('+380972423740').should.equal(true);
isValidNumber('0912345678', 'TW').should.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.
isValidNumber('07624369230', 'GB').should.equal(true);
});
it('should refine phone number validation in case extended regular expressions are set for a country', function () {
// Germany general validation must pass
console.log('--------------------------');
isValidNumber('961111111', 'UZ').should.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
isValidNumber('961111111', 'UZ').should.equal(false); // Extended validation must pass for a valid phone number
isValidNumber('912345678', 'UZ').should.equal(true);
metadata.countries.UZ[11] = phoneNumberTypePatterns;
});
it('should work in edge cases', function () {
// No metadata
var thrower = function thrower() {
return _isValidNumber('+78005553535');
};
thrower.should["throw"]('`metadata` argument not passed'); // Non-phone-number characters in a phone number
isValidNumber('+499821958a').should.equal(false);
isValidNumber('88005553535x', 'RU').should.equal(false); // Doesn't have `types` regexps in default metadata.
isValidNumber({
country: 'UA',
phone: '300000000'
}).should.equal(true);
isValidNumber({
country: 'UA',
phone: '200000000'
}).should.equal(false); // Numerical `value`
thrower = function thrower() {
return isValidNumber(88005553535, 'RU');
};
thrower.should["throw"]('A phone number must either be a string or an object of shape { phone, [country] }.'); // Long country phone code
isValidNumber('+3725555555').should.equal(true); // Invalid country
thrower = function thrower() {
return isValidNumber({
phone: '8005553535',
country: 'RUS'
});
};
thrower.should["throw"]('Unknown country');
});
it('should accept phone number extensions', function () {
// International
isValidNumber('+12133734253 ext. 123').should.equal(true); // National
isValidNumber('88005553535 x123', 'RU').should.equal(true);
});
});
//# sourceMappingURL=isValidNumber.test.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,67 @@
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,mBAAP,MAAgC,mCAAhC;AACA,OAAOC,WAAP,MAAwB,aAAxB;AACA,OAAOC,uBAAP,MAAoC,8BAApC,C,CAEA;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,sBAAT,CAAgCC,MAAhC,EAAwCC,OAAxC,EAAiDC,QAAjD,EAA2D;EACzE,IAAI,OAAOF,MAAP,KAAkB,QAAtB,EAAgC;IAC/B,MAAM,IAAIG,SAAJ,CAAc,yBAAd,CAAN;EACA;;EACD,IAAI,OAAOF,OAAP,KAAmB,QAAvB,EAAiC;IAChC,MAAM,IAAIE,SAAJ,CAAc,0BAAd,CAAN;EACA,CANwE,CAOzE;EACA;EACA;EACA;EACA;;;EACA,IAAIC,KAAJ;;EACA,IAAIR,mBAAmB,CAACI,MAAD,CAAvB,EAAiC;IAChCI,KAAK,GAAGP,WAAW,CAACG,MAAD,EAAS;MAAEK,cAAc,EAAEJ;IAAlB,CAAT,EAAsCC,QAAtC,CAAnB;EACA,CAFD,MAEO;IACNE,KAAK,GAAG,EAAR;EACA;;EACD,OAAON,uBAAuB,CAACM,KAAD,EAAQH,OAAR,EAAiBK,SAAjB,EAA4BJ,QAA5B,CAA9B;AACA"}

View File

@@ -0,0 +1,37 @@
import metadata from '../../metadata.min.json' assert { 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 () {
isValidNumberForRegion('07624369230', 'GB').should.equal(false);
isValidNumberForRegion('07624369230', 'IM').should.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.
isValidNumberForRegion('7', 'GB').should.equal(false); // `options` argument `if/else` coverage.
_isValidNumberForRegion('07624369230', 'GB', {}, metadata).should.equal(false);
});
});
//# sourceMappingURL=isValidNumberForRegion.test.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"isValidNumberForRegion.test.js","names":["metadata","type","isValidNumberForRegionCustom","_isValidNumberForRegion","isValidNumberForRegion","parameters","push","apply","describe","it","should","equal","expect","phone","country","to"],"sources":["../../source/legacy/isValidNumberForRegion.test.js"],"sourcesContent":["import metadata from '../../metadata.min.json' assert { 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\tisValidNumberForRegion('07624369230', 'GB').should.equal(false)\r\n\t\tisValidNumberForRegion('07624369230', 'IM').should.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\tisValidNumberForRegion('7', 'GB').should.equal(false)\r\n\r\n\t\t// `options` argument `if/else` coverage.\r\n\t\t_isValidNumberForRegion('07624369230', 'GB', {}, metadata).should.equal(false)\r\n\t})\r\n})"],"mappings":"AAAA,OAAOA,QAAP,MAAqB,yBAArB,UAAwDC,IAAI,EAAE,MAA9D;AACA,OAAOC,4BAAP,MAAyC,6BAAzC;AACA,OAAOC,uBAAP,MAAoC,8BAApC;;AAEA,SAASC,sBAAT,GAA+C;EAAA,kCAAZC,UAAY;IAAZA,UAAY;EAAA;;EAC9CA,UAAU,CAACC,IAAX,CAAgBN,QAAhB;EACA,OAAOE,4BAA4B,CAACK,KAA7B,CAAmC,IAAnC,EAAyCF,UAAzC,CAAP;AACA;;AAEDG,QAAQ,CAAC,wBAAD,EAA2B,YAAM;EACxCC,EAAE,CAAC,6CAAD,EAAgD,YAAM;IACvDL,sBAAsB,CAAC,aAAD,EAAgB,IAAhB,CAAtB,CAA4CM,MAA5C,CAAmDC,KAAnD,CAAyD,KAAzD;IACAP,sBAAsB,CAAC,aAAD,EAAgB,IAAhB,CAAtB,CAA4CM,MAA5C,CAAmDC,KAAnD,CAAyD,IAAzD;EACA,CAHC,CAAF;EAKAF,EAAE,CAAC,2BAAD,EAA8B,YAAM;IACrCG,MAAM,CAAC;MAAA,OAAMR,sBAAsB,CAAC;QAAES,KAAK,EAAE,YAAT;QAAuBC,OAAO,EAAE;MAAhC,CAAD,CAA5B;IAAA,CAAD,CAAN,CAA6EC,EAA7E,UAAsF,yBAAtF;IACAH,MAAM,CAAC;MAAA,OAAMR,sBAAsB,CAAC,YAAD,CAA5B;IAAA,CAAD,CAAN,CAAmDW,EAAnD,UAA4D,0BAA5D;EACA,CAHC,CAAF;EAKAN,EAAE,CAAC,2BAAD,EAA8B,YAAM;IACrC;IACAL,sBAAsB,CAAC,GAAD,EAAM,IAAN,CAAtB,CAAkCM,MAAlC,CAAyCC,KAAzC,CAA+C,KAA/C,EAFqC,CAIrC;;IACAR,uBAAuB,CAAC,aAAD,EAAgB,IAAhB,EAAsB,EAAtB,EAA0BH,QAA1B,CAAvB,CAA2DU,MAA3D,CAAkEC,KAAlE,CAAwE,KAAxE;EACA,CANC,CAAF;AAOA,CAlBO,CAAR"}

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,aAAP,MAA0B,eAA1B;AAEA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,sBAAT,CAAgCC,KAAhC,EAAuCC,OAAvC,EAAgDC,OAAhD,EAAyDC,QAAzD,EAAmE;EACjF;EACA;EACAD,OAAO,GAAGA,OAAO,IAAI,EAArB;EACA,OAAOF,KAAK,CAACC,OAAN,KAAkBA,OAAlB,IAA6BH,aAAa,CAACE,KAAD,EAAQE,OAAR,EAAiBC,QAAjB,CAAjD;AACA"}

View File

@@ -0,0 +1,11 @@
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","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,YAAP,MAAyB,aAAzB;AACA,OAAOC,kBAAP,MAA+B,0BAA/B;AAEA,eAAe,SAASC,WAAT,GAAuB;EACrC,0BAAoCD,kBAAkB,CAACE,SAAD,CAAtD;EAAA,IAAQC,IAAR,uBAAQA,IAAR;EAAA,IAAcC,OAAd,uBAAcA,OAAd;EAAA,IAAuBC,QAAvB,uBAAuBA,QAAvB;;EACA,OAAON,YAAY,CAACI,IAAD,EAAOC,OAAP,EAAgBC,QAAhB,CAAnB;AACA"}

View File

@@ -0,0 +1,570 @@
import metadata from '../../metadata.min.json' assert { 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.
parseNumber('+7 (800) 55-35-35').should.deep.equal({}); // Too long.
parseNumber('+7 (800) 55-35-35-55').should.deep.equal({});
parseNumber('+7 (800) 55-35-35', 'US').should.deep.equal({});
parseNumber('(800) 55 35 35', {
defaultCountry: 'RU'
}).should.deep.equal({});
parseNumber('+1 187 215 5230', 'US').should.deep.equal({});
parseNumber('911231231', 'BE').should.deep.equal({});
});
it('should parse valid phone numbers', function () {
// Instant loans
// https://www.youtube.com/watch?v=6e1pMrYH5jI
//
// Restrict to RU
parseNumber('Phone: 8 (800) 555 35 35.', 'RU').should.deep.equal({
country: 'RU',
phone: '8005553535'
}); // International format
parseNumber('Phone: +7 (800) 555-35-35.').should.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
parseNumber('(800) 555 35 35', 'RU').should.deep.equal({
country: 'RU',
phone: '8005553535'
}); // Default to RU
parseNumber('8 (800) 555 35 35', {
defaultCountry: 'RU'
}).should.deep.equal({
country: 'RU',
phone: '8005553535'
}); // Gangster partyline
parseNumber('+1-213-373-4253').should.deep.equal({
country: 'US',
phone: '2133734253'
}); // Switzerland (just in case)
parseNumber('044 668 18 00', 'CH').should.deep.equal({
country: 'CH',
phone: '446681800'
}); // China, Beijing
parseNumber('010-852644821', 'CN').should.deep.equal({
country: 'CN',
phone: '10852644821'
}); // France
parseNumber('+33169454850').should.deep.equal({
country: 'FR',
phone: '169454850'
}); // UK (Jersey)
parseNumber('+44 7700 300000').should.deep.equal({
country: 'JE',
phone: '7700300000'
}); // KZ
parseNumber('+7 702 211 1111').should.deep.equal({
country: 'KZ',
phone: '7022111111'
}); // Brazil
parseNumber('11987654321', 'BR').should.deep.equal({
country: 'BR',
phone: '11987654321'
}); // Long country phone code.
parseNumber('+212659777777').should.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.
parseNumber('07624369230', 'GB').should.deep.equal({
country: 'IM',
phone: '7624369230'
});
});
it('should parse possible numbers', function () {
// Invalid phone number for a given country.
parseNumber('1112223344', 'RU', {
extended: true
}).should.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.
parseNumber('+71112223344').should.deep.equal({});
parseNumber('+71112223344', {
extended: true
}).should.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.
parseNumber('+33011222333', {
extended: true
}).should.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.
parseNumber('+7 (800) 55-35-35', {
extended: true
}).should.deep.equal({
country: undefined,
countryCallingCode: '7',
phone: '800553535',
carrierCode: undefined,
ext: undefined,
valid: false,
possible: false
}); // Too long.
parseNumber('+1 213 37342530', {
extended: true
}).should.deep.equal({
country: undefined,
countryCallingCode: '1',
phone: '21337342530',
carrierCode: undefined,
ext: undefined,
valid: false,
possible: false
}); // No national number to be parsed.
parseNumber('+996', {
extended: true
}).should.deep.equal({// countryCallingCode : '996'
}); // Valid number.
parseNumber('+78005553535', {
extended: true
}).should.deep.equal({
country: 'RU',
countryCallingCode: '7',
phone: '8005553535',
carrierCode: undefined,
ext: undefined,
valid: true,
possible: true
}); // https://github.com/catamphetamine/libphonenumber-js/issues/211
parseNumber('+966', {
extended: true
}).should.deep.equal({});
parseNumber('+9664', {
extended: true
}).should.deep.equal({});
parseNumber('+96645', {
extended: true
}).should.deep.equal({
carrierCode: undefined,
phone: '45',
ext: undefined,
country: 'SA',
countryCallingCode: '966',
possible: false,
valid: false
});
});
it('should parse non-European digits', function () {
parseNumber('+١٢١٢٢٣٢٣٢٣٢').should.deep.equal({
country: 'US',
phone: '2122323232'
});
});
it('should work in edge cases', function () {
var thrower; // No input
parseNumber('').should.deep.equal({}); // No country phone code
parseNumber('+').should.deep.equal({}); // No country at all (non international number and no explicit country code)
parseNumber('123').should.deep.equal({}); // No country metadata for this `require` country code
thrower = function thrower() {
return parseNumber('123', 'ZZ');
};
thrower.should["throw"]('Unknown country'); // No country metadata for this `default` country code
thrower = function thrower() {
return parseNumber('123', {
defaultCountry: 'ZZ'
});
};
thrower.should["throw"]('Unknown country'); // Invalid country phone code
parseNumber('+210').should.deep.equal({}); // Invalid country phone code (extended parsing mode)
parseNumber('+210', {
extended: true
}).should.deep.equal({}); // Too short of a number.
parseNumber('1', 'US', {
extended: true
}).should.deep.equal({}); // Too long of a number.
parseNumber('1111111111111111111', 'RU', {
extended: true
}).should.deep.equal({}); // Not a number.
parseNumber('abcdefg', 'US', {
extended: true
}).should.deep.equal({}); // Country phone code beginning with a '0'
parseNumber('+0123').should.deep.equal({}); // Barbados NANPA phone number
parseNumber('+12460000000').should.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
parseNumber('2', 'US').should.deep.equal({}); // National (significant) number too long
parseNumber('222222222222222222', 'US').should.deep.equal({}); // No `national_prefix_for_parsing`
parseNumber('41111', 'AC').should.deep.equal({
country: 'AC',
phone: '41111'
}); // https://github.com/catamphetamine/libphonenumber-js/issues/235
// `matchesEntirely()` bug fix.
parseNumber('+4915784846111').should.deep.equal({
country: 'DE',
phone: '15784846111'
}); // No metadata
thrower = function thrower() {
return _parseNumber('');
};
thrower.should["throw"]('`metadata` argument not passed'); // Numerical `value`
thrower = function thrower() {
return parseNumber(2141111111, 'US');
};
thrower.should["throw"]('A text for parsing must be a string.'); // Input string too long.
parseNumber('8005553535 ', 'RU').should.deep.equal({});
});
it('should parse phone number extensions', function () {
// "ext"
parseNumber('2134567890 ext 123', 'US').should.deep.equal({
country: 'US',
phone: '2134567890',
ext: '123'
}); // "ext."
parseNumber('+12134567890 ext. 12345', 'US').should.deep.equal({
country: 'US',
phone: '2134567890',
ext: '12345'
}); // "доб."
parseNumber('+78005553535 доб. 1234', 'RU').should.deep.equal({
country: 'RU',
phone: '8005553535',
ext: '1234'
}); // "#"
parseNumber('+12134567890#1234').should.deep.equal({
country: 'US',
phone: '2134567890',
ext: '1234'
}); // "x"
parseNumber('+78005553535 x1234').should.deep.equal({
country: 'RU',
phone: '8005553535',
ext: '1234'
}); // Not a valid extension
parseNumber('2134567890 ext. abc', 'US').should.deep.equal({
country: 'US',
phone: '2134567890'
});
});
it('should parse RFC 3966 phone numbers', function () {
parseNumber('tel:+78005553535;ext=123').should.deep.equal({
country: 'RU',
phone: '8005553535',
ext: '123'
}); // Should parse "visual separators".
parseNumber('tel:+7(800)555-35.35;ext=123').should.deep.equal({
country: 'RU',
phone: '8005553535',
ext: '123'
}); // Invalid number.
parseNumber('tel:+7x8005553535;ext=123').should.deep.equal({});
});
it('should parse invalid international numbers even if they are invalid', function () {
parseNumber('+7(8)8005553535', 'RU').should.deep.equal({
country: 'RU',
phone: '8005553535'
});
});
it('should parse carrier codes', function () {
parseNumber('0 15 21 5555-5555', 'BR', {
extended: true
}).should.deep.equal({
country: 'BR',
countryCallingCode: '55',
phone: '2155555555',
carrierCode: '15',
ext: undefined,
valid: true,
possible: true
});
});
it('should parse IDD prefixes', function () {
parseNumber('011 61 2 3456 7890', 'US').should.deep.equal({
phone: '234567890',
country: 'AU'
});
parseNumber('011 61 2 3456 7890', 'FR').should.deep.equal({});
parseNumber('00 61 2 3456 7890', 'US').should.deep.equal({});
parseNumber('810 61 2 3456 7890', 'RU').should.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.
parseNumber('+54 9 3435 55 1212').should.deep.equal({
country: 'AR',
phone: '93435551212'
});
parseNumber('0343 15-555-1212', 'AR').should.deep.equal({
country: 'AR',
phone: '93435551212'
});
});
it('should work with Mexico numbers', function () {
// Fixed line.
parseNumber('+52 449 978 0001').should.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'
// })
parseNumber('(449)978-0001', 'MX').should.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'
// })
parseNumber('+52 33 1234-5678', 'MX').should.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 () {
parseNumber('+870773111632').should.deep.equal(USE_NON_GEOGRAPHIC_COUNTRY_CODE ? {
country: '001',
phone: '773111632'
} : {});
});
it('should parse non-geographic numbering plan phone numbers (default country code)', function () {
parseNumber('773111632', {
defaultCallingCode: '870'
}).should.deep.equal(USE_NON_GEOGRAPHIC_COUNTRY_CODE ? {
country: '001',
phone: '773111632'
} : {});
});
it('should parse non-geographic numbering plan phone numbers (extended)', function () {
parseNumber('+870773111632', {
extended: true
}).should.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 () {
parseNumber('773111632', {
defaultCallingCode: '870',
extended: true
}).should.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 () {
parseNumber('88005553535', {
defaultCallingCode: '7'
}).should.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`.
parseNumber('+37582004910060').should.deep.equal({
country: 'BY',
phone: '82004910060'
});
});
it('should autocorrect numbers without a leading +', function () {
// https://github.com/catamphetamine/libphonenumber-js/issues/376
parseNumber('375447521111', 'BY').should.deep.equal({
country: 'BY',
phone: '447521111'
}); // https://github.com/catamphetamine/libphonenumber-js/issues/316
parseNumber('33612902554', 'FR').should.deep.equal({
country: 'FR',
phone: '612902554'
}); // https://github.com/catamphetamine/libphonenumber-js/issues/375
parseNumber('61438331999', 'AU').should.deep.equal({
country: 'AU',
phone: '438331999'
}); // A case when `49` is a country calling code of a number without a leading `+`.
parseNumber('4930123456', 'DE').should.deep.equal({
country: 'DE',
phone: '30123456'
}); // A case when `49` is a valid area code.
parseNumber('4951234567890', 'DE').should.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
parseNumber('33316005 ext 0', 'NZ').ext.should.equal('0');
parseNumber('33316005 ext 01234567890123456789', 'NZ').ext.should.equal('01234567890123456789'); // Extension too long.
expect(parseNumber('33316005 ext 012345678901234567890', 'NZ').ext).to.be.undefined; // Explicit extension label.
parseNumber('03 3316005ext:1', 'NZ').ext.should.equal('1');
parseNumber('03 3316005 xtn:12345678901234567890', 'NZ').ext.should.equal('12345678901234567890');
parseNumber('03 3316005 extension\t12345678901234567890', 'NZ').ext.should.equal('12345678901234567890');
parseNumber('03 3316005 xtensio:12345678901234567890', 'NZ').ext.should.equal('12345678901234567890');
parseNumber('03 3316005 xtensión, 12345678901234567890#', 'NZ').ext.should.equal('12345678901234567890');
parseNumber('03 3316005extension.12345678901234567890', 'NZ').ext.should.equal('12345678901234567890');
parseNumber('03 3316005 доб:12345678901234567890', 'NZ').ext.should.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 () {
parseNumber('+12679000000,,123456789012345#').ext.should.equal('123456789012345');
parseNumber('+12679000000;123456789012345#').ext.should.equal('123456789012345');
parseNumber('+442034000000,,123456789#').ext.should.equal('123456789'); // Extension too long.
expect(parseNumber('+12679000000,,1234567890123456#').ext).to.be.undefined;
});
it('should parse extensions (short extensions with ambiguous characters)', function () {
parseNumber('03 3316005 x 123456789', 'NZ').ext.should.equal('123456789');
parseNumber('03 3316005 x. 123456789', 'NZ').ext.should.equal('123456789');
parseNumber('03 3316005 #123456789#', 'NZ').ext.should.equal('123456789');
parseNumber('03 3316005 ~ 123456789', 'NZ').ext.should.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 () {
parseNumber('+1123-456-7890 666666#', {
v2: true
}).ext.should.equal('666666');
parseNumber('+11234567890-6#', {
v2: true
}).ext.should.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 _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
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","arguments","text","options","metadata","matcher","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,kBAAP,MAA+B,0BAA/B;AACA,OAAOC,kBAAP,MAA+B,0BAA/B;AAEA;AACA;AACA;;AACA,eAAe,SAASC,aAAT,GACf;EACC,0BAAoCF,kBAAkB,CAACG,SAAD,CAAtD;EAAA,IAAQC,IAAR,uBAAQA,IAAR;EAAA,IAAcC,OAAd,uBAAcA,OAAd;EAAA,IAAuBC,QAAvB,uBAAuBA,QAAvB;;EAEA,IAAMC,OAAO,GAAG,IAAIN,kBAAJ,CAAuBG,IAAvB,EAA6BC,OAA7B,EAAsCC,QAAtC,CAAhB;EAEA,2BACEE,MAAM,CAACC,QADT,cACqB;IACnB,OAAO;MACHC,IAAI,EAAE,gBAAM;QACX,IAAIH,OAAO,CAACI,OAAR,EAAJ,EAAuB;UACzB,OAAO;YACNC,IAAI,EAAE,KADA;YAENC,KAAK,EAAEN,OAAO,CAACG,IAAR;UAFD,CAAP;QAIA;;QACD,OAAO;UACNE,IAAI,EAAE;QADA,CAAP;MAGG;IAXE,CAAP;EAaA,CAfF;AAiBA"}

View File

@@ -0,0 +1,33 @@
function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } 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(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
import searchNumbers from './searchNumbers.js';
import metadata from '../../metadata.min.json' assert { 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;
number.should.deep.equal(expectedNumbers.shift());
}
expectedNumbers.length.should.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","number","should","deep","equal","shift","length"],"sources":["../../source/legacy/searchNumbers.test.js"],"sourcesContent":["import searchNumbers from './searchNumbers.js'\r\nimport metadata from '../../metadata.min.json' assert { 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\tnumber.should.deep.equal(expectedNumbers.shift())\r\n\t\t}\r\n\r\n\t\texpectedNumbers.length.should.equal(0)\r\n\t})\r\n})"],"mappings":";;;;;;AAAA,OAAOA,aAAP,MAA0B,oBAA1B;AACA,OAAOC,QAAP,MAAqB,yBAArB,UAAwDC,IAAI,EAAE,MAA9D;AAEAC,QAAQ,CAAC,eAAD,EAAkB,YAAM;EAC/BC,EAAE,CAAC,gBAAD,EAAmB,YAAM;IAC1B,IAAMC,eAAe,GAAE,CAAC;MACvBC,OAAO,EAAG,IADa;MAEvBC,KAAK,EAAK,YAFa;MAGvB;MACAC,QAAQ,EAAG,EAJY;MAKvBC,MAAM,EAAK;IALY,CAAD,EAMpB;MACFH,OAAO,EAAG,IADR;MAEFC,KAAK,EAAK,YAFR;MAGF;MACAC,QAAQ,EAAG,EAJT;MAKFC,MAAM,EAAK;IALT,CANoB,CAAvB;;IAcA,qDAAqBT,aAAa,CAAC,qFAAD,EAAwF,IAAxF,EAA8FC,QAA9F,CAAlC,wCAA2I;MAAA,IAAhIS,MAAgI;MAC1IA,MAAM,CAACC,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyBR,eAAe,CAACS,KAAhB,EAAzB;IACA;;IAEDT,eAAe,CAACU,MAAhB,CAAuBJ,MAAvB,CAA8BE,KAA9B,CAAoC,CAApC;EACA,CApBC,CAAF;AAqBA,CAtBO,CAAR"}