Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

nmPhone

Package Overview
Dependencies
Maintainers
2
Versions
8
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

nmPhone - npm Package Compare versions

Comparing version 1.0.5 to 1.0.6

src/directive.js

2

bower.json

@@ -19,4 +19,4 @@ {

"angular": "~1.3.13",
"lodash": "2.4.1"
"lodash": "~4.5.1"
}
}
{
"name": "nmPhone",
"version": "1.0.5",
"version": "1.0.6",
"description": "Angular directives and a separate module to validate international phone numbers.",

@@ -13,3 +13,3 @@ "main": "index.js",

"dependencies": {
"lodash": "4.5.1"
"lodash": "^4.5.1"
},

@@ -16,0 +16,0 @@ "devDependencies": {

@@ -15,16 +15,9 @@ # nmPhone

If you need only the `nmPhoneUtils` library you can include `dist/utils.js`.
You will need to include 2 files into your app:
* `dist/utils.js`: it will load `nmPhoneUtils` module (use by the directives)
* `src/directive.js`: it will load `nmPhoneNumberSingleInput` and `nmPhoneNumber` directives
To use the directives you need to include `src/nmPhoneNumber.js` as the first file (it will register the module `namshi.nmPhoneNumber`), then, based on what you want to use, you will need to include:
If you want to use the directives remember to add the module name into the app definition
* `dist/utils.js` + `src/nmPhoneUtils.js`: it will attach the `nmPhoneUtils` module as a service in your angular app
* `src/nmNumeric.js`: it's a directive that will make sure whatever you type will retain only numbers
* `src/nmRangeLength.js`: it's a directive that will make sure whatever you type will be between a min and max length
* `src/PhoneNumberSingleInput`: it's a directive that will make sure you are typing an international number (+<prefix>[-<carrier>]-<number>)
* `src/PhoneNumberMultiInput`: it's a directive that will give you some utilities to handle the validation of an international number given as a form with 3 different inputs: country, carrier, number.
Remember to add the module name into the app definition
```

@@ -31,0 +24,0 @@ angular.module('my_App', [..., 'namshi.nmPhoneNumber', ...]);

@@ -9,26 +9,5 @@ 'use strict';

function contains(list, item) {
return _(list).map(function(litem) {return litem.toString()}).includes(item.toString());
return _(list).map(_.toString).includes(_.toString(item));
};
/**
* Extracts only the numeric characters from a string.
*
* @param {String} value
* @return {String}
*/
function extractNumbers(value) {
return value ? value.replace(/[^0-9]+/g, '') : '';
};
/**
* Shorten a string to a given length if it is longr than that.
*
* @param {String} value
* @param {Number} length
* @return {String}
*/
function shortenToLength(value, length) {
return value.substring(0, length);
};
var emptyPhoneObject = {

@@ -46,3 +25,3 @@ fkCountry: '',

*/
var phoneRegex = /^(00|\+)[0-9]{1,3}[\-\s0-9]{8,14}$/;
var phoneRegex = /^[00|\+]+([0-9]{2,3})(\-([0-9]{1,2}))?[\-]?([0-9]{6,8})$/;

@@ -53,30 +32,2 @@ var nmPhoneUtils = {

/**
* load country codes (971, 973, etc.) from config
*
* @param {Object} phoneSettings
* @return {Array}
*/
loadCountryCodes: function loadCountryCodes(phoneSettings) {
return _.map(phoneSettings, function (item) {
return item.phoneCodes.country;
});
},
/**
* Get country specific `phoneSetting` object
*
* @param {Object} phoneSettings
* @param {string|integer} countryCode
* @return {Object}
*/
getCountryPhoneSettings: function getCountryPhoneSettings(phoneSettings, countryCode) {
var phoneSetting = _(phoneSettings).filter(function(item) {
return ''+item.phoneCodes.country === ''+countryCode;
}).value().shift();
return phoneSetting && phoneSetting.phoneCodes;
},
/**
* Will verfy that a given value is in a phone number format.

@@ -88,3 +39,3 @@ * The format is defined by a regex (see phoneRegex variable)

*/
isValidPhoneNumber: function isValidPhoneNumber(value) {
isValidPhoneNumber: function(value) {
return phoneRegex.test(value);

@@ -109,15 +60,6 @@ },

* but all the values are going to be empty.
*
* If the contextCountry is different from the phone one it
* will be returned an empty object with just the countryCode
* as the contextCountry specifies.
*/
parsePhone: function parsePhone(phone, phoneSettings, contextCountry) {
var eo = _.clone(emptyPhoneObject);
parsePhone: function(phone, phoneSettings) {
if (!phone || !phoneRegex.test(phone)) {
eo.fkCountry = contextCountry || '';
eo.cellTokens.countryCode = phoneSettings[contextCountry] ? phoneSettings[contextCountry].phoneCodes.country : '';
return eo;
return emptyPhoneObject;
}

@@ -131,7 +73,4 @@

if (!phoneCountryConfig || (contextCountry && (contextCountry.toLowerCase() !== phoneCountryConfig.iso2Code.toLowerCase()))) {
eo.fkCountry = contextCountry || '';
eo.cellTokens.countryCode = phoneSettings[contextCountry] ? phoneSettings[contextCountry].phoneCodes.country : '';
return eo;
if (!phoneCountryConfig) {
return emptyPhoneObject;
}

@@ -143,7 +82,7 @@

return {
fkCountry: ''+phoneCountryConfig.iso2Code,
fkCountry: phoneCountryConfig.iso2Code,
cellTokens: {
countryCode: !!countryCode ? Number(countryCode) : "",
carrierCode: !!carrierCode ? Number(carrierCode) : "",
number: ''+number
countryCode: countryCode,
carrierCode: carrierCode,
number: number
}

@@ -171,3 +110,3 @@ };

*/
validateCountry: function validateCountry(countryId, phoneSettings) {
validateCountry: function(countryId, phoneSettings) {
if (!countryId) {

@@ -202,3 +141,3 @@ return {valid: false, errors: ['empty']};

*/
validateCarrierCode: function validateCarrierCode(carrierCode, countryId, phoneSettings) {
validateCarrierCode: function(carrierCode, countryId, phoneSettings) {
if (!countryId) {

@@ -254,3 +193,3 @@ return {

*/
validateNumber: function validateNumber(number, min, max) {
validateNumber: function(number, min, max) {
if (!number) {

@@ -295,3 +234,5 @@ return {

*/
extractNumbers: extractNumbers,
extractNumbers: function (value) {
return value.replace(/[^\d]+/g, '');
},

@@ -305,94 +246,4 @@ /**

*/
shortenToLength: shortenToLength,
/**
* Format the phoneData object into a string of the form:
*
* +<countrycode>-[<carriercode>-]<number>
*
* @param {Object} phoneData
* @return {String}
*/
getFormattedNumber: function getFormattedNumber(phoneData) {
if (!phoneData.cellTokens) {
return '';
}
var data = phoneData.cellTokens;
return [
(data.countryCode ? '+' + data.countryCode : ''),
data.carrierCode,
data.number
].filter(function(v) { return !!v ; }).join('-');
},
isPhoneDataValid: function isPhoneDataValid(phoneData, phoneSettings, min, max) {
return (
!!phoneData.fkCountry &&
this.validateCountry(phoneData.fkCountry, phoneSettings).valid &&
this.validateCarrierCode(phoneData.cellTokens.carrierCode, phoneData.fkCountry, phoneSettings).valid &&
!!phoneData.cellTokens.number &&
this.validateNumber(phoneData.cellTokens.number, min, max).valid
);
},
/**
* Return the numeric validator function.
* The numericValidator function will filter out non numeric characters from the given input and call the callback.
* The callback is invoked only if one or more characters are removed from the input string
*
* @param callback
* @returns {*}
*/
getNumericValidator: function getNumericValidator(callback) {
return function numericValidator(input) {
var output;
if (_.isString(input)) {
output = extractNumbers(input);
if (input !== output) {
callback(output);
}
}
return output;
};
},
/**
* Parser and formatter to invalidate a field which its value length exceeded the maximum number of
* allowed characters
*
* @param value
* @returns {*}
*/
getMaxLengthValidator: function getMaxLengthValidator(maxlength, callback) {
return function maxLengthValidator(value) {
var isValid = !value || value.length <= maxlength;
if (!isValid && !!value) {
value = value.substring(0, maxlength);
}
callback(isValid, value);
return value;
}
},
/**
* Parser and Formatter to invalidate a field which its value length goes below the minimum number of
* allowed characters
*
* @param value
* @returns {*}
*/
getMinLengthValidator: function getMinLengthValidator(minlength, callback) {
return function minLengthValidator(value) {
var isValid = !value || value.length >= minlength;
callback(isValid, value);
return value;
}
shortenToLength: function (value, length) {
return value.substring(0, length);
}

@@ -399,0 +250,0 @@ }

@@ -40,4 +40,4 @@ 'use strict';

"cellTokens": {
"carrierCode": 52,
"countryCode": 971,
"carrierCode": "52",
"countryCode": "971",
"number": "000000"

@@ -48,6 +48,6 @@ },

expect(utils.parsePhone('+966-50-000000', phoneSettings)).to.deep.equal({
expect(utils.parsePhone('+966-00-000000', phoneSettings)).to.deep.equal({
"cellTokens": {
"carrierCode": 50,
"countryCode": 966,
"carrierCode": "00",
"countryCode": "966",
"number": "000000"

@@ -61,3 +61,3 @@ },

"carrierCode": "",
"countryCode": 973,
"countryCode": "973",
"number": "000000"

@@ -71,3 +71,3 @@ },

"carrierCode": "",
"countryCode": 973,
"countryCode": "973",
"number": "000000"

@@ -78,3 +78,3 @@ },

expect(utils.parsePhone('+not-50-valid', phoneSettings)).to.deep.equal({
expect(utils.parsePhone('+not-00-valid', phoneSettings)).to.deep.equal({
"cellTokens": {

@@ -97,3 +97,3 @@ "carrierCode": "",

expect(utils.parsePhone('+999-50-000000', phoneSettings)).to.deep.equal({
expect(utils.parsePhone('+999-00-000000', phoneSettings)).to.deep.equal({
"cellTokens": {

@@ -107,11 +107,2 @@ "carrierCode": "",

expect(utils.parsePhone('+971-52-0000000', phoneSettings, 'sa')).to.deep.equal({
"cellTokens": {
"carrierCode": "",
"countryCode": 966,
"number": ""
},
"fkCountry": "sa"
});
done();

@@ -204,228 +195,2 @@ });

});
describe('extractNumbers', function() {
it('should return only numbers inside a string and an empty string if none is found', function(done) {
expect(utils.extractNumbers('h8h48hf8h4hf38h92')).to.equal('848843892');
expect(utils.extractNumbers('12345')).to.equal('12345');
expect(utils.extractNumbers('')).to.equal('');
expect(utils.extractNumbers(undefined)).to.equal('');
expect(utils.extractNumbers('hello')).to.equal('');
done();
});
});
describe('getFormattedNumber', function() {
it('should return the phone number as a tring given an object', function(done) {
var phoneData = {
"cellTokens": {
"carrierCode": 50,
"countryCode": 971,
"number": "0000000"
},
"fkCountry": "AE"
};
expect(utils.getFormattedNumber(phoneData)).to.equal('+971-50-0000000');
done();
});
it('should return the phone number as a tring given an object without carrier code', function(done) {
var phoneData = {
"cellTokens": {
"carrierCode": "",
"countryCode": 444,
"number": "0000000"
},
"fkCountry": ""
};
expect(utils.getFormattedNumber(phoneData)).to.equal('+444-0000000');
done();
});
it('should return an empty string for an empty object or empty fields', function(done) {
var phoneData = {
"cellTokens": {
"carrierCode": "",
"countryCode": "",
"number": ""
},
"fkCountry": ""
};
expect(utils.getFormattedNumber(phoneData)).to.equal('');
expect(utils.getFormattedNumber({})).to.equal('');
done();
});
});
describe('isPhoneDataValid', function() {
it('should return true for a valid phoneDataObject', function(done) {
var phoneData = {
"cellTokens": {
"carrierCode": 50,
"countryCode": 971,
"number": "0000000"
},
"fkCountry": "AE"
};
expect(utils.isPhoneDataValid(phoneData, phoneSettings)).to.equal(true);
done();
});
it('should return true for a valid phoneDataObject', function(done) {
var phoneData = {
"cellTokens": {
"carrierCode": "",
"countryCode": 973,
"number": "000000"
},
"fkCountry": "BH"
};
expect(utils.isPhoneDataValid(phoneData, phoneSettings)).to.equal(true);
done();
});
it('should return false for an invalid phoneData object', function(done) {
expect(utils.isPhoneDataValid({}, phoneSettings, 7, 7)).to.equal(false);
expect(utils.isPhoneDataValid({"cellTokens": {}}, phoneSettings, 7, 7)).to.equal(false);
expect(utils.isPhoneDataValid({"fkCountry": ""}, phoneSettings, 7, 7)).to.equal(false);
expect(utils.isPhoneDataValid({
"cellTokens": {
"carrierCode": "",
"countryCode": "971",
"number": "0000000"
},
"fkCountry": "AE"
}, phoneSettings, 7, 7)).to.equal(false);
expect(utils.isPhoneDataValid({
"cellTokens": {
"carrierCode": "50",
"countryCode": "",
"number": "0000000"
},
"fkCountry": ""
}, phoneSettings, 7, 7)).to.equal(false);
expect(utils.isPhoneDataValid({
"cellTokens": {
"carrierCode": "50",
"countryCode": "971",
"number": ""
},
"fkCountry": "AE"
}, phoneSettings, 7, 7)).to.equal(false);
expect(utils.isPhoneDataValid({
"cellTokens": {
"carrierCode": "50",
"countryCode": "971",
"number": "000"
},
"fkCountry": "AE"
}, phoneSettings, 7, 7)).to.equal(false);
expect(utils.isPhoneDataValid({
"cellTokens": {
"carrierCode": "50",
"countryCode": "971",
"number": "00000000"
},
"fkCountry": "AE"
}, phoneSettings, 7, 7)).to.equal(false);
/** NOTE: TO BE FIXED. This will end up returning true ! */
// expect(utils.isPhoneDataValid({
// "cellTokens": {
// "carrierCode": "50",
// "countryCode": "",
// "number": "0000000"
// },
// "fkCountry": "AE"
// }, phoneSettings, 7, 7)).to.equal(false);
done();
});
it('should return an empty string for an empty object or empty fields', function(done) {
var phoneData = {
"cellTokens": {
"carrierCode": "",
"countryCode": "",
"number": ""
},
"fkCountry": ""
};
expect(utils.getFormattedNumber(phoneData)).to.equal('');
expect(utils.getFormattedNumber({})).to.equal('');
done();
});
});
describe('loadCountryCodes', function() {
it('should return the list of country codes in the settings', function(done) {
expect(utils.loadCountryCodes(phoneSettings)).to.deep.equal([971, 966, 973]);
done();
});
});
describe('getCountryPhoneSettings', function() {
it('should return the country phone setting object for the given country, or return undefined', function(done) {
expect(utils.getCountryPhoneSettings(phoneSettings, 971)).to.deep.equal({
"carrierCodes": [50,52,54,55,56],
"country": 971,
"maxlength": 7,
"minlength": 7
});
expect(utils.getCountryPhoneSettings(phoneSettings, 39)).to.equal(undefined);
done();
});
});
describe('getNumericValidator', function() {
it('should return a function that will filter out not numeric characters', function(done) {
var test = function(result) {
expect(result).to.equal('012345');
done();
}
utils.getNumericValidator(test)('a0123b45');
});
it('should not call the callback if the the input it is already numeric', function(done) {
var counter = 0;
var test = function(result) {
counter++;
expect(result).to.equal('012345');
}
var result =utils.getNumericValidator(test)('a0123b45');
result = utils.getNumericValidator(test)('012345');
expect(result).to.equal('012345');
expect(counter).to.equal(1);
done();
});
});
});

@@ -432,0 +197,0 @@

@@ -11,7 +11,3 @@ var path = require('path');

library: "nmPhoneUtils"
},
target: "web",
externals: [
{"lodash": "_"}
]
}
};

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc