feat: Reinitialize frontend with SvelteKit and TypeScript

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

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

View File

@@ -0,0 +1,128 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _parse = _interopRequireDefault(require("../parse.js"));
var _isViablePhoneNumber = require("../helpers/isViablePhoneNumber.js");
var _parsePreCandidate = _interopRequireDefault(require("../findNumbers/parsePreCandidate.js"));
var _isValidPreCandidate = _interopRequireDefault(require("../findNumbers/isValidPreCandidate.js"));
var _isValidCandidate = _interopRequireDefault(require("../findNumbers/isValidCandidate.js"));
var _constants = require("../constants.js");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
var WHITESPACE_IN_THE_BEGINNING_PATTERN = new RegExp('^[' + _constants.WHITESPACE + ']+');
var PUNCTUATION_IN_THE_END_PATTERN = new RegExp('[' + _constants.VALID_PUNCTUATION + ']+$');
/**
* Extracts a parseable phone number including any opening brackets, etc.
* @param {string} text - Input.
* @return {object} `{ ?number, ?startsAt, ?endsAt }`.
*/
var PhoneNumberSearch = exports["default"] = /*#__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(_isViablePhoneNumber.VALID_PHONE_NUMBER_WITH_EXTENSION, 'ig');
}
return _createClass(PhoneNumberSearch, [{
key: "find",
value: function find() {
var matches = this.regexp.exec(this.text);
if (!matches) {
return;
}
var number = matches[0];
var startsAt = matches.index;
number = number.replace(WHITESPACE_IN_THE_BEGINNING_PATTERN, '');
startsAt += matches[0].length - number.length;
// Fixes not parsing numbers with whitespace in the end.
// Also fixes not parsing numbers with opening parentheses in the end.
// https://github.com/catamphetamine/libphonenumber-js/issues/252
number = number.replace(PUNCTUATION_IN_THE_END_PATTERN, '');
number = (0, _parsePreCandidate["default"])(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 (!(0, _isValidPreCandidate["default"])(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 (!(0, _isValidCandidate["default"])(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 = (0, _parse["default"])(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;
}
}]);
}();
//# sourceMappingURL=PhoneNumberSearch.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,22 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = findNumbers;
var _PhoneNumberMatcher = _interopRequireDefault(require("../PhoneNumberMatcher.js"));
var _normalizeArguments2 = _interopRequireDefault(require("../normalizeArguments.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function findNumbers() {
var _normalizeArguments = (0, _normalizeArguments2["default"])(arguments),
text = _normalizeArguments.text,
options = _normalizeArguments.options,
metadata = _normalizeArguments.metadata;
var matcher = new _PhoneNumberMatcher["default"](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","_interopRequireDefault","require","_normalizeArguments2","e","__esModule","findNumbers","_normalizeArguments","normalizeArguments","arguments","text","options","metadata","matcher","PhoneNumberMatcher","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,IAAAA,mBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,oBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAyD,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,gBAAAA,CAAA;AAE1C,SAASE,WAAWA,CAAA,EAAG;EACrC,IAAAC,mBAAA,GAAoC,IAAAC,+BAAkB,EAACC,SAAS,CAAC;IAAzDC,IAAI,GAAAH,mBAAA,CAAJG,IAAI;IAAEC,OAAO,GAAAJ,mBAAA,CAAPI,OAAO;IAAEC,QAAQ,GAAAL,mBAAA,CAARK,QAAQ;EAC/B,IAAMC,OAAO,GAAG,IAAIC,8BAAkB,CAACJ,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;EAC/D,IAAMG,OAAO,GAAG,EAAE;EAClB,OAAOF,OAAO,CAACG,OAAO,CAAC,CAAC,EAAE;IACzBD,OAAO,CAACE,IAAI,CAACJ,OAAO,CAACK,IAAI,CAAC,CAAC,CAAC;EAC7B;EACA,OAAOH,OAAO;AACf","ignoreList":[]}

View File

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

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,34 @@
"use strict";
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = findPhoneNumbers;
exports.searchPhoneNumbers = searchPhoneNumbers;
var _findPhoneNumbersInitialImplementation = _interopRequireWildcard(require("./findPhoneNumbersInitialImplementation.js"));
var _normalizeArguments3 = _interopRequireDefault(require("../normalizeArguments.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
// This is a legacy function.
// Use `findNumbers()` instead.
function findPhoneNumbers() {
var _normalizeArguments = (0, _normalizeArguments3["default"])(arguments),
text = _normalizeArguments.text,
options = _normalizeArguments.options,
metadata = _normalizeArguments.metadata;
return (0, _findPhoneNumbersInitialImplementation["default"])(text, options, metadata);
}
/**
* @return ES6 `for ... of` iterator.
*/
function searchPhoneNumbers() {
var _normalizeArguments2 = (0, _normalizeArguments3["default"])(arguments),
text = _normalizeArguments2.text,
options = _normalizeArguments2.options,
metadata = _normalizeArguments2.metadata;
return (0, _findPhoneNumbersInitialImplementation.searchPhoneNumbers)(text, options, metadata);
}
//# sourceMappingURL=findPhoneNumbers.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"findPhoneNumbers.js","names":["_findPhoneNumbersInitialImplementation","_interopRequireWildcard","require","_normalizeArguments3","_interopRequireDefault","e","__esModule","t","WeakMap","r","n","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","findPhoneNumbers","_normalizeArguments","normalizeArguments","arguments","text","options","metadata","_findPhoneNumbers","searchPhoneNumbers","_normalizeArguments2","_searchPhoneNumbers"],"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":";;;;;;;;AAGA,IAAAA,sCAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,oBAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAyD,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,gBAAAA,CAAA;AAAA,SAAAJ,wBAAAI,CAAA,EAAAE,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAP,uBAAA,YAAAA,wBAAAI,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,mBAAAT,CAAA,iBAAAA,CAAA,gBAAAU,OAAA,CAAAV,CAAA,0BAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,cAAAM,EAAA,IAAAd,CAAA,gBAAAc,EAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,EAAA,OAAAP,CAAA,IAAAD,CAAA,GAAAW,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAnB,CAAA,EAAAc,EAAA,OAAAP,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAM,EAAA,EAAAP,CAAA,IAAAC,CAAA,CAAAM,EAAA,IAAAd,CAAA,CAAAc,EAAA,WAAAN,CAAA,KAAAR,CAAA,EAAAE,CAAA;AAJzD;AACA;;AAKe,SAASkB,gBAAgBA,CAAA,EACxC;EACC,IAAAC,mBAAA,GAAoC,IAAAC,+BAAkB,EAACC,SAAS,CAAC;IAAzDC,IAAI,GAAAH,mBAAA,CAAJG,IAAI;IAAEC,OAAO,GAAAJ,mBAAA,CAAPI,OAAO;IAAEC,QAAQ,GAAAL,mBAAA,CAARK,QAAQ;EAC/B,OAAO,IAAAC,iDAAiB,EAACH,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;AAClD;;AAEA;AACA;AACA;AACO,SAASE,kBAAkBA,CAAA,EAClC;EACC,IAAAC,oBAAA,GAAoC,IAAAP,+BAAkB,EAACC,SAAS,CAAC;IAAzDC,IAAI,GAAAK,oBAAA,CAAJL,IAAI;IAAEC,OAAO,GAAAI,oBAAA,CAAPJ,OAAO;IAAEC,QAAQ,GAAAG,oBAAA,CAARH,QAAQ;EAC/B,OAAO,IAAAI,yDAAmB,EAACN,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;AACpD","ignoreList":[]}

View File

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

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,87 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.EXTN_PATTERNS_FOR_PARSING = void 0;
exports["default"] = findPhoneNumbers;
exports.searchPhoneNumbers = searchPhoneNumbers;
var _createExtensionPattern = _interopRequireDefault(require("../helpers/extension/createExtensionPattern.js"));
var _PhoneNumberSearch = _interopRequireDefault(require("./PhoneNumberSearch.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
// This is a legacy function.
// Use `findNumbers()` instead.
/**
* 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.
*/
var EXTN_PATTERNS_FOR_PARSING = exports.EXTN_PATTERNS_FOR_PARSING = (0, _createExtensionPattern["default"])('parsing');
// // Regular expression for getting opening brackets for a valid number
// // found using `PHONE_NUMBER_START_PATTERN` for prepending those brackets to the number.
// const BEFORE_NUMBER_DIGITS_PUNCTUATION = new RegExp('[' + OPENING_BRACKETS + ']+' + '[' + WHITESPACE + ']*' + '$')
// const VALID_PRECEDING_CHARACTER_PATTERN = /[^a-zA-Z0-9]/
function findPhoneNumbers(text, options, metadata) {
/* istanbul ignore if */
if (options === undefined) {
options = {};
}
var search = new _PhoneNumberSearch["default"](text, options, metadata);
var phones = [];
while (search.hasNext()) {
phones.push(search.next());
}
return phones;
}
/**
* @return ES6 `for ... of` iterator.
*/
function searchPhoneNumbers(text, options, metadata) {
/* istanbul ignore if */
if (options === undefined) {
options = {};
}
var search = new _PhoneNumberSearch["default"](text, options, metadata);
var iterator = function iterator() {
return {
next: function next() {
if (search.hasNext()) {
return {
done: false,
value: search.next()
};
}
return {
done: true
};
}
};
};
// This line of code didn't really work with `babel`/`istanbul`:
// for some weird reason, it showed code coverage less than 100%.
// That's because `babel`/`istanbul`, for some weird reason,
// apparently doesn't know how to properly exclude Babel polyfills from code coverage.
//
// const iterable = { [Symbol.iterator]: iterator }
var iterable = {};
iterable[Symbol.iterator] = iterator;
return iterable;
}
//# sourceMappingURL=findPhoneNumbersInitialImplementation.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"findPhoneNumbersInitialImplementation.js","names":["_createExtensionPattern","_interopRequireDefault","require","_PhoneNumberSearch","e","__esModule","EXTN_PATTERNS_FOR_PARSING","exports","createExtensionPattern","findPhoneNumbers","text","options","metadata","undefined","search","PhoneNumberSearch","phones","hasNext","push","next","searchPhoneNumbers","iterator","done","value","iterable","Symbol"],"sources":["../../source/legacy/findPhoneNumbersInitialImplementation.js"],"sourcesContent":["// This is a legacy function.\r\n// Use `findNumbers()` instead.\r\n\r\nimport createExtensionPattern from '../helpers/extension/createExtensionPattern.js'\r\n\r\nimport PhoneNumberSearch from './PhoneNumberSearch.js'\r\n\r\n/**\r\n * Regexp of all possible ways to write extensions, for use when parsing. This\r\n * will be run as a case-insensitive regexp match. Wide character versions are\r\n * also provided after each ASCII version. There are three regular expressions\r\n * here. The first covers RFC 3966 format, where the extension is added using\r\n * ';ext='. The second more generic one starts with optional white space and\r\n * ends with an optional full stop (.), followed by zero or more spaces/tabs\r\n * /commas and then the numbers themselves. The other one covers the special\r\n * case of American numbers where the extension is written with a hash at the\r\n * end, such as '- 503#'. Note that the only capturing groups should be around\r\n * the digits that you want to capture as part of the extension, or else parsing\r\n * will fail! We allow two options for representing the accented o - the\r\n * character itself, and one in the unicode decomposed form with the combining\r\n * acute accent.\r\n */\r\nexport const EXTN_PATTERNS_FOR_PARSING = createExtensionPattern('parsing')\r\n\r\n// // Regular expression for getting opening brackets for a valid number\r\n// // found using `PHONE_NUMBER_START_PATTERN` for prepending those brackets to the number.\r\n// const BEFORE_NUMBER_DIGITS_PUNCTUATION = new RegExp('[' + OPENING_BRACKETS + ']+' + '[' + WHITESPACE + ']*' + '$')\r\n\r\n// const VALID_PRECEDING_CHARACTER_PATTERN = /[^a-zA-Z0-9]/\r\n\r\nexport default function findPhoneNumbers(text, options, metadata) {\r\n\t/* istanbul ignore if */\r\n\tif (options === undefined) {\r\n\t\toptions = {}\r\n\t}\r\n\tconst search = new PhoneNumberSearch(text, options, metadata)\r\n\tconst phones = []\r\n\twhile (search.hasNext()) {\r\n\t\tphones.push(search.next())\r\n\t}\r\n\treturn phones\r\n}\r\n\r\n/**\r\n * @return ES6 `for ... of` iterator.\r\n */\r\nexport function searchPhoneNumbers(text, options, metadata) {\r\n\t/* istanbul ignore if */\r\n\tif (options === undefined) {\r\n\t\toptions = {}\r\n\t}\r\n\r\n\tconst search = new PhoneNumberSearch(text, options, metadata)\r\n\r\n\tconst iterator = () => {\r\n\t\treturn {\r\n\t\t\tnext: () => {\r\n\t\t\t\tif (search.hasNext()) {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tdone: false,\r\n\t\t\t\t\t\tvalue: search.next()\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn {\r\n\t\t\t\t\tdone: true\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// This line of code didn't really work with `babel`/`istanbul`:\r\n\t// for some weird reason, it showed code coverage less than 100%.\r\n\t// That's because `babel`/`istanbul`, for some weird reason,\r\n\t// apparently doesn't know how to properly exclude Babel polyfills from code coverage.\r\n\t//\r\n\t// const iterable = { [Symbol.iterator]: iterator }\r\n\r\n\tconst iterable = {}\r\n\titerable[Symbol.iterator] = iterator\r\n\treturn iterable\r\n}\r\n"],"mappings":";;;;;;;;AAGA,IAAAA,uBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,kBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAsD,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,gBAAAA,CAAA;AALtD;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,IAAME,yBAAyB,GAAAC,OAAA,CAAAD,yBAAA,GAAG,IAAAE,kCAAsB,EAAC,SAAS,CAAC;;AAE1E;AACA;AACA;;AAEA;;AAEe,SAASC,gBAAgBA,CAACC,IAAI,EAAEC,OAAO,EAAEC,QAAQ,EAAE;EACjE;EACA,IAAID,OAAO,KAAKE,SAAS,EAAE;IAC1BF,OAAO,GAAG,CAAC,CAAC;EACb;EACA,IAAMG,MAAM,GAAG,IAAIC,6BAAiB,CAACL,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;EAC7D,IAAMI,MAAM,GAAG,EAAE;EACjB,OAAOF,MAAM,CAACG,OAAO,CAAC,CAAC,EAAE;IACxBD,MAAM,CAACE,IAAI,CAACJ,MAAM,CAACK,IAAI,CAAC,CAAC,CAAC;EAC3B;EACA,OAAOH,MAAM;AACd;;AAEA;AACA;AACA;AACO,SAASI,kBAAkBA,CAACV,IAAI,EAAEC,OAAO,EAAEC,QAAQ,EAAE;EAC3D;EACA,IAAID,OAAO,KAAKE,SAAS,EAAE;IAC1BF,OAAO,GAAG,CAAC,CAAC;EACb;EAEA,IAAMG,MAAM,GAAG,IAAIC,6BAAiB,CAACL,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;EAE7D,IAAMS,QAAQ,GAAG,SAAXA,QAAQA,CAAA,EAAS;IACtB,OAAO;MACNF,IAAI,EAAE,SAANA,IAAIA,CAAA,EAAQ;QACX,IAAIL,MAAM,CAACG,OAAO,CAAC,CAAC,EAAE;UACrB,OAAO;YACNK,IAAI,EAAE,KAAK;YACXC,KAAK,EAAET,MAAM,CAACK,IAAI,CAAC;UACpB,CAAC;QACF;QACA,OAAO;UACNG,IAAI,EAAE;QACP,CAAC;MACF;IACD,CAAC;EACF,CAAC;;EAED;EACA;EACA;EACA;EACA;EACA;;EAEA,IAAME,QAAQ,GAAG,CAAC,CAAC;EACnBA,QAAQ,CAACC,MAAM,CAACJ,QAAQ,CAAC,GAAGA,QAAQ;EACpC,OAAOG,QAAQ;AAChB","ignoreList":[]}

View File

@@ -0,0 +1,103 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = formatNumber;
var _format = _interopRequireDefault(require("../format.js"));
var _parse = _interopRequireDefault(require("../parse.js"));
var _isObject = _interopRequireDefault(require("../helpers/isObject.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function formatNumber() {
var _normalizeArguments = normalizeArguments(arguments),
input = _normalizeArguments.input,
format = _normalizeArguments.format,
options = _normalizeArguments.options,
metadata = _normalizeArguments.metadata;
return (0, _format["default"])(input, format, options, metadata);
}
// Sort out arguments
function normalizeArguments(args) {
// This line of code appeared to not work correctly with `babel`/`istanbul`:
// for some weird reason, it caused coverage less than 100%.
// That's because `babel`/`istanbul`, for some weird reason,
// apparently doesn't know how to properly exclude Babel polyfills from code coverage.
//
// const [arg_1, arg_2, arg_3, arg_4, arg_5] = Array.prototype.slice.call(args)
var arg_1 = args[0];
var arg_2 = args[1];
var arg_3 = args[2];
var arg_4 = args[3];
var arg_5 = args[4];
var input;
var format;
var options;
var metadata;
// Sort out arguments.
// If the phone number is passed as a string.
// `format('8005553535', ...)`.
if (typeof arg_1 === 'string') {
// If country code is supplied.
// `format('8005553535', 'RU', 'NATIONAL', [options], metadata)`.
if (typeof arg_3 === 'string') {
format = arg_3;
if (arg_5) {
options = arg_4;
metadata = arg_5;
} else {
metadata = arg_4;
}
input = (0, _parse["default"])(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 = (0, _parse["default"])(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 ((0, _isObject["default"])(arg_1)) {
input = arg_1;
format = arg_2;
if (arg_4) {
options = arg_3;
metadata = arg_4;
} else {
metadata = arg_3;
}
} else throw new TypeError('A phone number must either be a string or an object of shape { phone, [country] }.');
// Legacy lowercase formats.
if (format === 'International') {
format = 'INTERNATIONAL';
} else if (format === 'National') {
format = 'NATIONAL';
}
return {
input: input,
format: format,
options: options,
metadata: metadata
};
}
//# sourceMappingURL=format.js.map

File diff suppressed because one or more lines are too long

View File

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

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,110 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = getNumberType;
exports.normalizeArguments = normalizeArguments;
var _isViablePhoneNumber = _interopRequireDefault(require("../helpers/isViablePhoneNumber.js"));
var _getNumberType2 = _interopRequireDefault(require("../helpers/getNumberType.js"));
var _isObject = _interopRequireDefault(require("../helpers/isObject.js"));
var _parse = _interopRequireDefault(require("../parse.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
// Finds out national phone number type (fixed line, mobile, etc)
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 (0, _getNumberType2["default"])(input, options, metadata);
}
// Sort out arguments
function normalizeArguments(args) {
// This line of code appeared to not work correctly with `babel`/`istanbul`:
// for some weird reason, it caused coverage less than 100%.
// That's because `babel`/`istanbul`, for some weird reason,
// apparently doesn't know how to properly exclude Babel polyfills from code coverage.
//
// const [arg_1, arg_2, arg_3, arg_4] = Array.prototype.slice.call(args)
var arg_1 = args[0];
var arg_2 = args[1];
var arg_3 = args[2];
var arg_4 = args[3];
var input;
var options = {};
var metadata;
// If the phone number is passed as a string.
// `getNumberType('88005553535', ...)`.
if (typeof arg_1 === 'string') {
// If "default country" argument is being passed
// then convert it to an `options` object.
// `getNumberType('88005553535', 'RU', metadata)`.
if (!(0, _isObject["default"])(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 ((0, _isViablePhoneNumber["default"])(arg_1)) {
input = (0, _parse["default"])(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 ((0, _isViablePhoneNumber["default"])(arg_1)) {
input = (0, _parse["default"])(arg_1, undefined, metadata);
} else {
input = {};
}
}
}
// If the phone number is passed as a parsed phone number.
// `getNumberType({ phone: '88005553535', country: 'RU' }, ...)`.
else if ((0, _isObject["default"])(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,78 @@
"use strict";
var _metadataMax = _interopRequireDefault(require("../../metadata.max.json"));
var _metadata = _interopRequireDefault(require("../metadata.js"));
var _getNumberType2 = _interopRequireDefault(require("./getNumberType.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function getNumberType() {
for (var _len = arguments.length, parameters = new Array(_len), _key = 0; _key < _len; _key++) {
parameters[_key] = arguments[_key];
}
parameters.push(_metadataMax["default"]);
return _getNumberType2["default"].apply(this, parameters);
}
describe('getNumberType', function () {
it('should infer phone number type MOBILE', function () {
expect(getNumberType('9150000000', 'RU')).to.equal('MOBILE');
expect(getNumberType('7912345678', 'GB')).to.equal('MOBILE');
expect(getNumberType('51234567', 'EE')).to.equal('MOBILE');
});
it('should infer phone number types', function () {
expect(getNumberType('88005553535', 'RU')).to.equal('TOLL_FREE');
expect(getNumberType('8005553535', 'RU')).to.equal('TOLL_FREE');
expect(getNumberType('4957777777', 'RU')).to.equal('FIXED_LINE');
expect(getNumberType('8030000000', 'RU')).to.equal('PREMIUM_RATE');
expect(getNumberType('2133734253', 'US')).to.equal('FIXED_LINE_OR_MOBILE');
expect(getNumberType('5002345678', 'US')).to.equal('PERSONAL_NUMBER');
});
it('should work when no country is passed', function () {
expect(getNumberType('+79150000000')).to.equal('MOBILE');
});
it('should return FIXED_LINE_OR_MOBILE when there is ambiguity', function () {
// (no such country in the metadata, therefore no unit test for this `if`)
});
it('should work in edge cases', function () {
var thrower;
// // No metadata
// thrower = () => _getNumberType({ phone: '+78005553535' })
// thrower.should.throw('`metadata` argument not passed')
// Parsed phone number
expect(getNumberType({
phone: '8005553535',
country: 'RU'
})).to.equal('TOLL_FREE');
// Invalid phone number
expect(type(getNumberType('123', 'RU'))).to.equal('undefined');
// Invalid country
thrower = function thrower() {
return getNumberType({
phone: '8005553535',
country: 'RUS'
});
};
expect(thrower).to["throw"]('Unknown country');
// Numerical `value`
thrower = function thrower() {
return getNumberType(89150000000, 'RU');
};
expect(thrower).to["throw"]('A phone number must either be a string or an object of shape { phone, [country] }.');
// When `options` argument is passed.
expect(getNumberType('8005553535', 'RU', {})).to.equal('TOLL_FREE');
expect(getNumberType('+78005553535', {})).to.equal('TOLL_FREE');
expect(getNumberType({
phone: '8005553535',
country: 'RU'
}, {})).to.equal('TOLL_FREE');
});
});
function type(something) {
return _typeof(something);
}
//# sourceMappingURL=getNumberType.test.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,35 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = isPossibleNumber;
var _getNumberType = require("./getNumberType.js");
var _isPossible = _interopRequireDefault(require("../isPossible.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
/**
* 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)
* ```
*/
function isPossibleNumber() {
var _normalizeArguments = (0, _getNumberType.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 (0, _isPossible["default"])(input, options, metadata);
}
//# sourceMappingURL=isPossibleNumber.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"isPossibleNumber.js","names":["_getNumberType","require","_isPossible","_interopRequireDefault","e","__esModule","isPossibleNumber","_normalizeArguments","normalizeArguments","arguments","input","options","metadata","phone","v2","_isPossibleNumber"],"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,IAAAA,cAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAgD,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,gBAAAA,CAAA;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASE,gBAAgBA,CAAA,EAAG;EAC1C,IAAAC,mBAAA,GAAqC,IAAAC,iCAAkB,EAACC,SAAS,CAAC;IAA1DC,KAAK,GAAAH,mBAAA,CAALG,KAAK;IAAEC,OAAO,GAAAJ,mBAAA,CAAPI,OAAO;IAAEC,QAAQ,GAAAL,mBAAA,CAARK,QAAQ;EAChC;EACA,IAAI,CAACF,KAAK,CAACG,KAAK,IAAI,EAAEF,OAAO,IAAIA,OAAO,CAACG,EAAE,CAAC,EAAE;IAC7C,OAAO,KAAK;EACb;EACA,OAAO,IAAAC,sBAAiB,EAACL,KAAK,EAAEC,OAAO,EAAEC,QAAQ,CAAC;AACnD","ignoreList":[]}

View File

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

View File

@@ -0,0 +1 @@
{"version":3,"file":"isPossibleNumber.test.js","names":["_metadataMin","_interopRequireDefault","require","_isPossibleNumber2","e","__esModule","isPossibleNumber","_len","arguments","length","parameters","Array","_key","push","metadata","_isPossibleNumber","apply","describe","it","expect","to","equal","phone","country","countryCallingCode","nationalNumber","v2"],"sources":["../../source/legacy/isPossibleNumber.test.js"],"sourcesContent":["import metadata from '../../metadata.min.json' with { type: 'json' }\r\nimport _isPossibleNumber from './isPossibleNumber.js'\r\n\r\nfunction isPossibleNumber(...parameters) {\r\n\tparameters.push(metadata)\r\n\treturn _isPossibleNumber.apply(this, parameters)\r\n}\r\n\r\ndescribe('isPossibleNumber', () => {\r\n\tit('should work', function()\r\n\t{\r\n\t\texpect(isPossibleNumber('+79992223344')).to.equal(true)\r\n\r\n\t\texpect(isPossibleNumber({ phone: '1112223344', country: 'RU' })).to.equal(true)\r\n\t\texpect(isPossibleNumber({ phone: '111222334', country: 'RU' })).to.equal(false)\r\n\t\texpect(isPossibleNumber({ phone: '11122233445', country: 'RU' })).to.equal(false)\r\n\r\n\t\texpect(isPossibleNumber({ phone: '1112223344', countryCallingCode: 7 })).to.equal(true)\r\n\t})\r\n\r\n\tit('should work v2', () => {\r\n\t\texpect(\r\n isPossibleNumber({ nationalNumber: '111222334', countryCallingCode: 7 }, { v2: true })\r\n ).to.equal(false)\r\n\t\texpect(\r\n isPossibleNumber({ nationalNumber: '1112223344', countryCallingCode: 7 }, { v2: true })\r\n ).to.equal(true)\r\n\t\texpect(\r\n isPossibleNumber({ nationalNumber: '11122233445', countryCallingCode: 7 }, { v2: true })\r\n ).to.equal(false)\r\n\t})\r\n\r\n\tit('should work in edge cases', () => {\r\n\t\t// Invalid `PhoneNumber` argument.\r\n\t\texpect(() => isPossibleNumber({}, { v2: true })).to.throw('Invalid phone number object passed')\r\n\r\n\t\t// Empty input is passed.\r\n\t\t// This is just to support `isValidNumber({})`\r\n\t\t// for cases when `parseNumber()` returns `{}`.\r\n\t\texpect(isPossibleNumber({})).to.equal(false)\r\n\t\texpect(() => isPossibleNumber({ phone: '1112223344' })).to.throw('Invalid phone number object passed')\r\n\r\n\t\t// Incorrect country.\r\n\t\texpect(() => isPossibleNumber({ phone: '1112223344', country: 'XX' })).to.throw('Unknown country')\r\n\t})\r\n})"],"mappings":";;AAAA,IAAAA,YAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,kBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAqD,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,gBAAAA,CAAA;AAErD,SAASE,gBAAgBA,CAAA,EAAgB;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAAZC,UAAU,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAVF,UAAU,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;EAAA;EACtCF,UAAU,CAACG,IAAI,CAACC,uBAAQ,CAAC;EACzB,OAAOC,6BAAiB,CAACC,KAAK,CAAC,IAAI,EAAEN,UAAU,CAAC;AACjD;AAEAO,QAAQ,CAAC,kBAAkB,EAAE,YAAM;EAClCC,EAAE,CAAC,aAAa,EAAE,YAClB;IACCC,MAAM,CAACb,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAACc,EAAE,CAACC,KAAK,CAAC,IAAI,CAAC;IAEvDF,MAAM,CAACb,gBAAgB,CAAC;MAAEgB,KAAK,EAAE,YAAY;MAAEC,OAAO,EAAE;IAAK,CAAC,CAAC,CAAC,CAACH,EAAE,CAACC,KAAK,CAAC,IAAI,CAAC;IAC/EF,MAAM,CAACb,gBAAgB,CAAC;MAAEgB,KAAK,EAAE,WAAW;MAAEC,OAAO,EAAE;IAAK,CAAC,CAAC,CAAC,CAACH,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;IAC/EF,MAAM,CAACb,gBAAgB,CAAC;MAAEgB,KAAK,EAAE,aAAa;MAAEC,OAAO,EAAE;IAAK,CAAC,CAAC,CAAC,CAACH,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;IAEjFF,MAAM,CAACb,gBAAgB,CAAC;MAAEgB,KAAK,EAAE,YAAY;MAAEE,kBAAkB,EAAE;IAAE,CAAC,CAAC,CAAC,CAACJ,EAAE,CAACC,KAAK,CAAC,IAAI,CAAC;EACxF,CAAC,CAAC;EAEFH,EAAE,CAAC,gBAAgB,EAAE,YAAM;IAC1BC,MAAM,CACIb,gBAAgB,CAAC;MAAEmB,cAAc,EAAE,WAAW;MAAED,kBAAkB,EAAE;IAAE,CAAC,EAAE;MAAEE,EAAE,EAAE;IAAK,CAAC,CACzF,CAAC,CAACN,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;IACvBF,MAAM,CACIb,gBAAgB,CAAC;MAAEmB,cAAc,EAAE,YAAY;MAAED,kBAAkB,EAAE;IAAE,CAAC,EAAE;MAAEE,EAAE,EAAE;IAAK,CAAC,CAC1F,CAAC,CAACN,EAAE,CAACC,KAAK,CAAC,IAAI,CAAC;IACtBF,MAAM,CACIb,gBAAgB,CAAC;MAAEmB,cAAc,EAAE,aAAa;MAAED,kBAAkB,EAAE;IAAE,CAAC,EAAE;MAAEE,EAAE,EAAE;IAAK,CAAC,CAC3F,CAAC,CAACN,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;EACxB,CAAC,CAAC;EAEFH,EAAE,CAAC,2BAA2B,EAAE,YAAM;IACrC;IACAC,MAAM,CAAC;MAAA,OAAMb,gBAAgB,CAAC,CAAC,CAAC,EAAE;QAAEoB,EAAE,EAAE;MAAK,CAAC,CAAC;IAAA,EAAC,CAACN,EAAE,SAAM,CAAC,oCAAoC,CAAC;;IAE/F;IACA;IACA;IACAD,MAAM,CAACb,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAACc,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;IAC5CF,MAAM,CAAC;MAAA,OAAMb,gBAAgB,CAAC;QAAEgB,KAAK,EAAE;MAAa,CAAC,CAAC;IAAA,EAAC,CAACF,EAAE,SAAM,CAAC,oCAAoC,CAAC;;IAEtG;IACAD,MAAM,CAAC;MAAA,OAAMb,gBAAgB,CAAC;QAAEgB,KAAK,EAAE,YAAY;QAAEC,OAAO,EAAE;MAAK,CAAC,CAAC;IAAA,EAAC,CAACH,EAAE,SAAM,CAAC,iBAAiB,CAAC;EACnG,CAAC,CAAC;AACH,CAAC,CAAC","ignoreList":[]}

View File

@@ -0,0 +1,22 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = isValidNumber;
var _isValid = _interopRequireDefault(require("../isValid.js"));
var _getNumberType = require("./getNumberType.js");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
// Finds out national phone number type (fixed line, mobile, etc)
function isValidNumber() {
var _normalizeArguments = (0, _getNumberType.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 (0, _isValid["default"])(input, options, metadata);
}
//# sourceMappingURL=isValidNumber.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"isValidNumber.js","names":["_isValid","_interopRequireDefault","require","_getNumberType","e","__esModule","isValidNumber","_normalizeArguments","normalizeArguments","arguments","input","options","metadata","phone","_isValidNumber"],"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,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,cAAA,GAAAD,OAAA;AAAuD,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,gBAAAA,CAAA;AAEvD;AACe,SAASE,aAAaA,CAAA,EAAG;EACvC,IAAAC,mBAAA,GAAqC,IAAAC,iCAAkB,EAACC,SAAS,CAAC;IAA1DC,KAAK,GAAAH,mBAAA,CAALG,KAAK;IAAEC,OAAO,GAAAJ,mBAAA,CAAPI,OAAO;IAAEC,QAAQ,GAAAL,mBAAA,CAARK,QAAQ;EAChC;EACA,IAAI,CAACF,KAAK,CAACG,KAAK,EAAE;IACjB,OAAO,KAAK;EACb;EACA,OAAO,IAAAC,mBAAc,EAACJ,KAAK,EAAEC,OAAO,EAAEC,QAAQ,CAAC;AAChD","ignoreList":[]}

View File

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

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,71 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = isValidNumberForRegion;
var _isViablePhoneNumber = _interopRequireDefault(require("../helpers/isViablePhoneNumber.js"));
var _parse = _interopRequireDefault(require("../parse.js"));
var _isValidNumberForRegion_ = _interopRequireDefault(require("./isValidNumberForRegion_.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
// 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.
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 ((0, _isViablePhoneNumber["default"])(number)) {
input = (0, _parse["default"])(number, {
defaultCountry: country
}, metadata);
} else {
input = {};
}
return (0, _isValidNumberForRegion_["default"])(input, country, undefined, metadata);
}
//# sourceMappingURL=isValidNumberForRegion.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"isValidNumberForRegion.js","names":["_isViablePhoneNumber","_interopRequireDefault","require","_parse","_isValidNumberForRegion_","e","__esModule","isValidNumberForRegion","number","country","metadata","TypeError","input","isViablePhoneNumber","parseNumber","defaultCountry","_isValidNumberForRegion","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,IAAAA,oBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,wBAAA,GAAAH,sBAAA,CAAAC,OAAA;AAAkE,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,gBAAAA,CAAA;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEe,SAASE,sBAAsBA,CAACC,MAAM,EAAEC,OAAO,EAAEC,QAAQ,EAAE;EACzE,IAAI,OAAOF,MAAM,KAAK,QAAQ,EAAE;IAC/B,MAAM,IAAIG,SAAS,CAAC,yBAAyB,CAAC;EAC/C;EACA,IAAI,OAAOF,OAAO,KAAK,QAAQ,EAAE;IAChC,MAAM,IAAIE,SAAS,CAAC,0BAA0B,CAAC;EAChD;EACA;EACA;EACA;EACA;EACA;EACA,IAAIC,KAAK;EACT,IAAI,IAAAC,+BAAmB,EAACL,MAAM,CAAC,EAAE;IAChCI,KAAK,GAAG,IAAAE,iBAAW,EAACN,MAAM,EAAE;MAAEO,cAAc,EAAEN;IAAQ,CAAC,EAAEC,QAAQ,CAAC;EACnE,CAAC,MAAM;IACNE,KAAK,GAAG,CAAC,CAAC;EACX;EACA,OAAO,IAAAI,mCAAuB,EAACJ,KAAK,EAAEH,OAAO,EAAEQ,SAAS,EAAEP,QAAQ,CAAC;AACpE","ignoreList":[]}

View File

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

View File

@@ -0,0 +1 @@
{"version":3,"file":"isValidNumberForRegion.test.js","names":["_metadataMin","_interopRequireDefault","require","_isValidNumberForRegion2","_isValidNumberForRegion_","e","__esModule","isValidNumberForRegion","_len","arguments","length","parameters","Array","_key","push","metadata","isValidNumberForRegionCustom","apply","describe","it","expect","to","equal","phone","country","_isValidNumberForRegion"],"sources":["../../source/legacy/isValidNumberForRegion.test.js"],"sourcesContent":["import metadata from '../../metadata.min.json' with { type: 'json' }\r\nimport isValidNumberForRegionCustom from './isValidNumberForRegion.js'\r\nimport _isValidNumberForRegion from './isValidNumberForRegion_.js'\r\n\r\nfunction isValidNumberForRegion(...parameters) {\r\n\tparameters.push(metadata)\r\n\treturn isValidNumberForRegionCustom.apply(this, parameters)\r\n}\r\n\r\ndescribe('isValidNumberForRegion', () => {\r\n\tit('should detect if is valid number for region', () => {\r\n\t\texpect(isValidNumberForRegion('07624369230', 'GB')).to.equal(false)\r\n\t\texpect(isValidNumberForRegion('07624369230', 'IM')).to.equal(true)\r\n\t})\r\n\r\n\tit('should validate arguments', () => {\r\n\t\texpect(() => isValidNumberForRegion({ phone: '7624369230', country: 'GB' })).to.throw('number must be a string')\r\n\t\texpect(() => isValidNumberForRegion('7624369230')).to.throw('country must be a string')\r\n\t})\r\n\r\n\tit('should work in edge cases', () => {\r\n\t\t// Not a \"viable\" phone number.\r\n\t\texpect(isValidNumberForRegion('7', 'GB')).to.equal(false)\r\n\r\n\t\t// `options` argument `if/else` coverage.\r\n\t\texpect(_isValidNumberForRegion('07624369230', 'GB', {}, metadata)).to.equal(false)\r\n\t})\r\n})"],"mappings":";;AAAA,IAAAA,YAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,wBAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,wBAAA,GAAAH,sBAAA,CAAAC,OAAA;AAAkE,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,gBAAAA,CAAA;AAElE,SAASE,sBAAsBA,CAAA,EAAgB;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAAZC,UAAU,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAVF,UAAU,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;EAAA;EAC5CF,UAAU,CAACG,IAAI,CAACC,uBAAQ,CAAC;EACzB,OAAOC,mCAA4B,CAACC,KAAK,CAAC,IAAI,EAAEN,UAAU,CAAC;AAC5D;AAEAO,QAAQ,CAAC,wBAAwB,EAAE,YAAM;EACxCC,EAAE,CAAC,6CAA6C,EAAE,YAAM;IACvDC,MAAM,CAACb,sBAAsB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAACc,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;IACnEF,MAAM,CAACb,sBAAsB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAACc,EAAE,CAACC,KAAK,CAAC,IAAI,CAAC;EACnE,CAAC,CAAC;EAEFH,EAAE,CAAC,2BAA2B,EAAE,YAAM;IACrCC,MAAM,CAAC;MAAA,OAAMb,sBAAsB,CAAC;QAAEgB,KAAK,EAAE,YAAY;QAAEC,OAAO,EAAE;MAAK,CAAC,CAAC;IAAA,EAAC,CAACH,EAAE,SAAM,CAAC,yBAAyB,CAAC;IAChHD,MAAM,CAAC;MAAA,OAAMb,sBAAsB,CAAC,YAAY,CAAC;IAAA,EAAC,CAACc,EAAE,SAAM,CAAC,0BAA0B,CAAC;EACxF,CAAC,CAAC;EAEFF,EAAE,CAAC,2BAA2B,EAAE,YAAM;IACrC;IACAC,MAAM,CAACb,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAACc,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;;IAEzD;IACAF,MAAM,CAAC,IAAAK,mCAAuB,EAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,EAAEV,uBAAQ,CAAC,CAAC,CAACM,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;EACnF,CAAC,CAAC;AACH,CAAC,CAAC","ignoreList":[]}

View File

@@ -0,0 +1,20 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = isValidNumberForRegion;
var _isValid = _interopRequireDefault(require("../isValid.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
/**
* 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
*/
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 && (0, _isValid["default"])(input, options, metadata);
}
//# sourceMappingURL=isValidNumberForRegion_.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"isValidNumberForRegion_.js","names":["_isValid","_interopRequireDefault","require","e","__esModule","isValidNumberForRegion","input","country","options","metadata","isValidNumber"],"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,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAyC,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,gBAAAA,CAAA;AAEzC;AACA;AACA;AACA;AACA;AACe,SAASE,sBAAsBA,CAACC,KAAK,EAAEC,OAAO,EAAEC,OAAO,EAAEC,QAAQ,EAAE;EACjF;EACA;EACAD,OAAO,GAAGA,OAAO,IAAI,CAAC,CAAC;EACvB,OAAOF,KAAK,CAACC,OAAO,KAAKA,OAAO,IAAI,IAAAG,mBAAa,EAACJ,KAAK,EAAEE,OAAO,EAAEC,QAAQ,CAAC;AAC5E","ignoreList":[]}

View File

@@ -0,0 +1,17 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = parseNumber;
var _parse = _interopRequireDefault(require("../parse.js"));
var _normalizeArguments2 = _interopRequireDefault(require("../normalizeArguments.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function parseNumber() {
var _normalizeArguments = (0, _normalizeArguments2["default"])(arguments),
text = _normalizeArguments.text,
options = _normalizeArguments.options,
metadata = _normalizeArguments.metadata;
return (0, _parse["default"])(text, options, metadata);
}
//# sourceMappingURL=parse.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"parse.js","names":["_parse","_interopRequireDefault","require","_normalizeArguments2","e","__esModule","parseNumber","_normalizeArguments","normalizeArguments","arguments","text","options","metadata","_parseNumber"],"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,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,oBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAyD,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,gBAAAA,CAAA;AAE1C,SAASE,WAAWA,CAAA,EAAG;EACrC,IAAAC,mBAAA,GAAoC,IAAAC,+BAAkB,EAACC,SAAS,CAAC;IAAzDC,IAAI,GAAAH,mBAAA,CAAJG,IAAI;IAAEC,OAAO,GAAAJ,mBAAA,CAAPI,OAAO;IAAEC,QAAQ,GAAAL,mBAAA,CAARK,QAAQ;EAC/B,OAAO,IAAAC,iBAAY,EAACH,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;AAC7C","ignoreList":[]}

View File

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

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,39 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = searchNumbers;
var _normalizeArguments2 = _interopRequireDefault(require("../normalizeArguments.js"));
var _PhoneNumberMatcher = _interopRequireDefault(require("../PhoneNumberMatcher.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
/**
* @return ES6 `for ... of` iterator.
*/
function searchNumbers() {
var _normalizeArguments = (0, _normalizeArguments2["default"])(arguments),
text = _normalizeArguments.text,
options = _normalizeArguments.options,
metadata = _normalizeArguments.metadata;
var matcher = new _PhoneNumberMatcher["default"](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":["_normalizeArguments2","_interopRequireDefault","require","_PhoneNumberMatcher","e","__esModule","_typeof","o","Symbol","iterator","constructor","prototype","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","toPrimitive","call","TypeError","String","Number","searchNumbers","_normalizeArguments","normalizeArguments","arguments","text","options","metadata","matcher","PhoneNumberMatcher","next","hasNext","done"],"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,IAAAA,oBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,mBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAyD,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,gBAAAA,CAAA;AAAA,SAAAE,QAAAC,CAAA,sCAAAD,OAAA,wBAAAE,MAAA,uBAAAA,MAAA,CAAAC,QAAA,aAAAF,CAAA,kBAAAA,CAAA,gBAAAA,CAAA,WAAAA,CAAA,yBAAAC,MAAA,IAAAD,CAAA,CAAAG,WAAA,KAAAF,MAAA,IAAAD,CAAA,KAAAC,MAAA,CAAAG,SAAA,qBAAAJ,CAAA,KAAAD,OAAA,CAAAC,CAAA;AAAA,SAAAK,gBAAAR,CAAA,EAAAS,CAAA,EAAAC,CAAA,YAAAD,CAAA,GAAAE,cAAA,CAAAF,CAAA,MAAAT,CAAA,GAAAY,MAAA,CAAAC,cAAA,CAAAb,CAAA,EAAAS,CAAA,IAAAK,KAAA,EAAAJ,CAAA,EAAAK,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAAjB,CAAA,CAAAS,CAAA,IAAAC,CAAA,EAAAV,CAAA;AAAA,SAAAW,eAAAD,CAAA,QAAAQ,CAAA,GAAAC,YAAA,CAAAT,CAAA,gCAAAR,OAAA,CAAAgB,CAAA,IAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAC,aAAAT,CAAA,EAAAD,CAAA,oBAAAP,OAAA,CAAAQ,CAAA,MAAAA,CAAA,SAAAA,CAAA,MAAAV,CAAA,GAAAU,CAAA,CAAAN,MAAA,CAAAgB,WAAA,kBAAApB,CAAA,QAAAkB,CAAA,GAAAlB,CAAA,CAAAqB,IAAA,CAAAX,CAAA,EAAAD,CAAA,gCAAAP,OAAA,CAAAgB,CAAA,UAAAA,CAAA,YAAAI,SAAA,yEAAAb,CAAA,GAAAc,MAAA,GAAAC,MAAA,EAAAd,CAAA;AAEzD;AACA;AACA;AACe,SAASe,aAAaA,CAAA,EACrC;EACC,IAAAC,mBAAA,GAAoC,IAAAC,+BAAkB,EAACC,SAAS,CAAC;IAAzDC,IAAI,GAAAH,mBAAA,CAAJG,IAAI;IAAEC,OAAO,GAAAJ,mBAAA,CAAPI,OAAO;IAAEC,QAAQ,GAAAL,mBAAA,CAARK,QAAQ;EAE/B,IAAMC,OAAO,GAAG,IAAIC,8BAAkB,CAACJ,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;EAE/D,OAAAvB,eAAA,KACEJ,MAAM,CAACC,QAAQ,cAAI;IACnB,OAAO;MACH6B,IAAI,EAAE,SAANA,IAAIA,CAAA,EAAQ;QACX,IAAIF,OAAO,CAACG,OAAO,CAAC,CAAC,EAAE;UACzB,OAAO;YACNC,IAAI,EAAE,KAAK;YACXtB,KAAK,EAAEkB,OAAO,CAACE,IAAI,CAAC;UACrB,CAAC;QACF;QACA,OAAO;UACNE,IAAI,EAAE;QACP,CAAC;MACC;IACJ,CAAC;EACF,CAAC;AAEH","ignoreList":[]}

View File

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

View File

@@ -0,0 +1 @@
{"version":3,"file":"searchNumbers.test.js","names":["_searchNumbers","_interopRequireDefault","require","_metadataMin","e","__esModule","_createForOfIteratorHelperLoose","r","t","Symbol","iterator","call","next","bind","Array","isArray","_unsupportedIterableToArray","length","o","done","value","TypeError","a","_arrayLikeToArray","toString","slice","constructor","name","from","test","n","describe","it","expectedNumbers","country","phone","startsAt","endsAt","_iterator","searchNumbers","metadata","_step","number","expect","to","deep","equal","shift"],"sources":["../../source/legacy/searchNumbers.test.js"],"sourcesContent":["import searchNumbers from './searchNumbers.js'\r\nimport metadata from '../../metadata.min.json' with { type: 'json' }\r\n\r\ndescribe('searchNumbers', () => {\r\n\tit('should iterate', () => {\r\n\t\tconst expectedNumbers =[{\r\n\t\t\tcountry : 'RU',\r\n\t\t\tphone : '8005553535',\r\n\t\t\t// number : '+7 (800) 555-35-35',\r\n\t\t\tstartsAt : 14,\r\n\t\t\tendsAt : 32\r\n\t\t}, {\r\n\t\t\tcountry : 'US',\r\n\t\t\tphone : '2133734253',\r\n\t\t\t// number : '(213) 373-4253',\r\n\t\t\tstartsAt : 41,\r\n\t\t\tendsAt : 55\r\n\t\t}]\r\n\r\n\t\tfor (const number of searchNumbers('The number is +7 (800) 555-35-35 and not (213) 373-4253 as written in the document.', 'US', metadata)) {\r\n\t\t\texpect(number).to.deep.equal(expectedNumbers.shift())\r\n\t\t}\r\n\r\n\t\texpect(expectedNumbers.length).to.equal(0)\r\n\t})\r\n})"],"mappings":";;AAAA,IAAAA,cAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAoE,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,gBAAAA,CAAA;AAAA,SAAAE,gCAAAC,CAAA,EAAAH,CAAA,QAAAI,CAAA,yBAAAC,MAAA,IAAAF,CAAA,CAAAE,MAAA,CAAAC,QAAA,KAAAH,CAAA,oBAAAC,CAAA,UAAAA,CAAA,GAAAA,CAAA,CAAAG,IAAA,CAAAJ,CAAA,GAAAK,IAAA,CAAAC,IAAA,CAAAL,CAAA,OAAAM,KAAA,CAAAC,OAAA,CAAAR,CAAA,MAAAC,CAAA,GAAAQ,2BAAA,CAAAT,CAAA,MAAAH,CAAA,IAAAG,CAAA,uBAAAA,CAAA,CAAAU,MAAA,IAAAT,CAAA,KAAAD,CAAA,GAAAC,CAAA,OAAAU,CAAA,kCAAAA,CAAA,IAAAX,CAAA,CAAAU,MAAA,KAAAE,IAAA,WAAAA,IAAA,MAAAC,KAAA,EAAAb,CAAA,CAAAW,CAAA,sBAAAG,SAAA;AAAA,SAAAL,4BAAAT,CAAA,EAAAe,CAAA,QAAAf,CAAA,2BAAAA,CAAA,SAAAgB,iBAAA,CAAAhB,CAAA,EAAAe,CAAA,OAAAd,CAAA,MAAAgB,QAAA,CAAAb,IAAA,CAAAJ,CAAA,EAAAkB,KAAA,6BAAAjB,CAAA,IAAAD,CAAA,CAAAmB,WAAA,KAAAlB,CAAA,GAAAD,CAAA,CAAAmB,WAAA,CAAAC,IAAA,aAAAnB,CAAA,cAAAA,CAAA,GAAAM,KAAA,CAAAc,IAAA,CAAArB,CAAA,oBAAAC,CAAA,+CAAAqB,IAAA,CAAArB,CAAA,IAAAe,iBAAA,CAAAhB,CAAA,EAAAe,CAAA;AAAA,SAAAC,kBAAAhB,CAAA,EAAAe,CAAA,aAAAA,CAAA,IAAAA,CAAA,GAAAf,CAAA,CAAAU,MAAA,MAAAK,CAAA,GAAAf,CAAA,CAAAU,MAAA,YAAAb,CAAA,MAAA0B,CAAA,GAAAhB,KAAA,CAAAQ,CAAA,GAAAlB,CAAA,GAAAkB,CAAA,EAAAlB,CAAA,IAAA0B,CAAA,CAAA1B,CAAA,IAAAG,CAAA,CAAAH,CAAA,UAAA0B,CAAA;AAEpEC,QAAQ,CAAC,eAAe,EAAE,YAAM;EAC/BC,EAAE,CAAC,gBAAgB,EAAE,YAAM;IAC1B,IAAMC,eAAe,GAAE,CAAC;MACvBC,OAAO,EAAG,IAAI;MACdC,KAAK,EAAK,YAAY;MACtB;MACAC,QAAQ,EAAG,EAAE;MACbC,MAAM,EAAK;IACZ,CAAC,EAAE;MACFH,OAAO,EAAG,IAAI;MACdC,KAAK,EAAK,YAAY;MACtB;MACAC,QAAQ,EAAG,EAAE;MACbC,MAAM,EAAK;IACZ,CAAC,CAAC;IAEF,SAAAC,SAAA,GAAAhC,+BAAA,CAAqB,IAAAiC,yBAAa,EAAC,qFAAqF,EAAE,IAAI,EAAEC,uBAAQ,CAAC,GAAAC,KAAA,IAAAA,KAAA,GAAAH,SAAA,IAAAnB,IAAA,GAAE;MAAA,IAAhIuB,MAAM,GAAAD,KAAA,CAAArB,KAAA;MAChBuB,MAAM,CAACD,MAAM,CAAC,CAACE,EAAE,CAACC,IAAI,CAACC,KAAK,CAACb,eAAe,CAACc,KAAK,CAAC,CAAC,CAAC;IACtD;IAEAJ,MAAM,CAACV,eAAe,CAAChB,MAAM,CAAC,CAAC2B,EAAE,CAACE,KAAK,CAAC,CAAC,CAAC;EAC3C,CAAC,CAAC;AACH,CAAC,CAAC","ignoreList":[]}