libphonenumber-js
Version:
A simpler (and smaller) rewrite of Google Android's popular libphonenumber library
180 lines (144 loc) • 5.64 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = get_number_type;
exports.is_of_type = is_of_type;
exports.sort_out_arguments = sort_out_arguments;
var _parse = require('./parse');
var _parse2 = _interopRequireDefault(_parse);
var _common = require('./common');
var _metadata = require('./metadata');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Finds out national phone number type (fixed line, mobile, etc)
function get_number_type(first_argument, second_argument, third_argument) {
var _sort_out_arguments = sort_out_arguments(first_argument, second_argument, third_argument),
input = _sort_out_arguments.input,
metadata = _sort_out_arguments.metadata;
// Sanity check
if (!metadata) {
throw new Error('Metadata not passed');
}
// When no input was passed
if (!input) {
return;
}
// When `parse()` returned `{}`
// meaning that the phone number is not a valid one.
if (!input.country) {
return;
}
var national_number = input.phone;
var country_metadata = metadata.countries[input.country];
// The following is copy-pasted from the original function:
// https://github.com/googlei18n/libphonenumber/blob/3ea547d4fbaa2d0b67588904dfa5d3f2557c27ff/javascript/i18n/phonenumbers/phonenumberutil.js#L2835
// Is this national number even valid for this country
if (!is_of_type(national_number, (0, _metadata.get_national_number_pattern)(country_metadata))) {
return; // 'UNKNOWN'
}
if (is_of_type(national_number, (0, _metadata.get_type_premium_rate)(country_metadata))) {
return 'PREMIUM_RATE';
}
if (is_of_type(national_number, (0, _metadata.get_type_toll_free)(country_metadata))) {
return 'TOLL_FREE';
}
/* istanbul ignore if */
if (is_of_type(national_number, (0, _metadata.get_type_shared_cost)(country_metadata))) {
return 'SHARED_COST';
}
/* istanbul ignore if */
if (is_of_type(national_number, (0, _metadata.get_type_voip)(country_metadata))) {
return 'VOIP';
}
if (is_of_type(national_number, (0, _metadata.get_type_personal_number)(country_metadata))) {
return 'PERSONAL_NUMBER';
}
/* istanbul ignore if */
if (is_of_type(national_number, (0, _metadata.get_type_pager)(country_metadata))) {
return 'PAGER';
}
/* istanbul ignore if */
if (is_of_type(national_number, (0, _metadata.get_type_uan)(country_metadata))) {
return 'UAN';
}
/* istanbul ignore if */
if (is_of_type(national_number, (0, _metadata.get_type_voice_mail)(country_metadata))) {
return 'VOICEMAIL';
}
// Is it fixed line number
if (is_of_type(national_number, (0, _metadata.get_type_fixed_line)(country_metadata))) {
// Because duplicate regular expressions are removed
// to reduce metadata size, if there's no "mobile" pattern
// then it means it was removed due to being a duplicate of some other pattern.
//
if (!(0, _metadata.get_type_mobile)(country_metadata)) {
return 'FIXED_LINE_OR_MOBILE';
}
// Check if the number happens to qualify as both fixed line and mobile.
// (no such country in the minimal metadata set)
/* istanbul ignore if */
if (is_of_type(national_number, (0, _metadata.get_type_mobile)(country_metadata))) {
return 'FIXED_LINE_OR_MOBILE';
}
return 'FIXED_LINE';
}
if (is_of_type(national_number, (0, _metadata.get_type_mobile)(country_metadata))) {
return 'MOBILE';
}
// return 'UNKNOWN'
}
function is_of_type(national_number, type) {
// // Check if any possible number lengths are present;
// // if so, we use them to avoid checking
// // the validation pattern if they don't match.
// // If they are absent, this means they match
// // the general description, which we have
// // already checked before a specific number type.
// if (get_possible_lengths(type) &&
// get_possible_lengths(type).indexOf(national_number.length) === -1)
// {
// return false
// }
// get_type_pattern(type) === type
return (0, _common.matches_entirely)(national_number, type);
}
// Sort out arguments
function sort_out_arguments(first_argument, second_argument, third_argument) {
var input = void 0;
var metadata = void 0;
if (typeof first_argument === 'string') {
// If country code is supplied
if (typeof second_argument === 'string') {
metadata = third_argument;
// `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 `is_viable_phone_number` check.
if ((0, _parse.is_viable_phone_number)(first_argument)) {
input = (0, _parse2.default)(first_argument, second_argument, metadata);
}
}
// Just an international phone number is supplied
else {
metadata = second_argument;
// `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 `is_viable_phone_number` check.
if ((0, _parse.is_viable_phone_number)(first_argument)) {
input = (0, _parse2.default)(first_argument, metadata);
}
}
} else {
// The `first_argument` must be a valid phone number
// as a whole, not just a part of it which gets parsed here.
if (first_argument && first_argument.phone && (0, _parse.is_viable_phone_number)(first_argument.phone)) {
input = first_argument;
}
metadata = second_argument;
}
return { input: input, metadata: metadata };
}
//# sourceMappingURL=get number type.js.map
;