Socket
Socket
Sign inDemoInstall

credit-card

Package Overview
Dependencies
1
Maintainers
2
Versions
12
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.2.2 to 2.0.0

100

lib/index.js
'use strict';
var Hoek = require('hoek');
const Reach = require('reach');
var _defaults = {
let _defaults = {
cardTypes: {

@@ -69,3 +69,3 @@ VISA: {

// Store original defaults. This must happen after aliases are setup
var _originalDefaults = Hoek.clone(_defaults);
const _originalDefaults = Object.assign({}, _defaults);

@@ -75,13 +75,13 @@ function validate (card, options) {

var settings = Hoek.applyToDefaults(_defaults, options || {});
var schema = settings.schema;
var cardType = Hoek.reach(card, schema.cardType);
var number = sanitizeNumberString(Hoek.reach(card, schema.number));
var expiryMonth = Hoek.reach(card, schema.expiryMonth);
var expiryYear = Hoek.reach(card, schema.expiryYear);
var cvv = sanitizeNumberString(Hoek.reach(card, schema.cvv));
var customValidationFn = settings.customValidation;
var customValidation;
const settings = Object.assign({}, _defaults, options);
const schema = settings.schema;
const cardType = Reach(card, schema.cardType);
const number = sanitizeNumberString(Reach(card, schema.number));
const expiryMonth = Reach(card, schema.expiryMonth);
const expiryYear = Reach(card, schema.expiryYear);
const cvv = sanitizeNumberString(Reach(card, schema.cvv));
const customValidationFn = settings.customValidation;
let customValidation;
// optional custom validation
// Optional custom validation
if (typeof customValidationFn === 'function') {

@@ -92,3 +92,3 @@ customValidation = customValidationFn(card, settings);

return {
card: card,
card,
validCardNumber: isValidCardNumber(number, cardType, settings.cardTypes),

@@ -99,3 +99,3 @@ validExpiryMonth: isValidExpiryMonth(expiryMonth, settings.expiryMonths),

isExpired: isExpired(expiryMonth, expiryYear),
customValidation: customValidation
customValidation
};

@@ -105,11 +105,11 @@ }

function determineCardType (number, options) {
var settings = Hoek.applyToDefaults(_defaults, options || {});
var cardTypes = settings.cardTypes;
var keys = Object.keys(cardTypes);
const settings = Object.assign({}, _defaults, options);
const cardTypes = settings.cardTypes;
const keys = Object.keys(cardTypes);
number = sanitizeNumberString(number);
for (var i = 0, il = keys.length; i < il; ++i) {
var key = keys[i];
var type = cardTypes[key];
for (let i = 0; i < keys.length; ++i) {
const key = keys[i];
const type = cardTypes[key];

@@ -130,3 +130,3 @@ if (type.cardPattern.test(number) ||

function isValidExpiryMonth (month, options) {
var settings = Hoek.applyToDefaults(_defaults.expiryMonths, options || {});
const settings = Object.assign({}, _defaults.expiryMonths, options);

@@ -142,3 +142,3 @@ if (typeof month === 'string' && month.length > 2) {

function isValidExpiryYear (year, options) {
var settings = Hoek.applyToDefaults(_defaults.expiryYears, options || {});
const settings = Object.assign({}, _defaults.expiryYears, options);

@@ -154,4 +154,4 @@ if (typeof year === 'string' && year.length !== 4) {

function doesNumberMatchType (number, type, options) {
var settings = Hoek.applyToDefaults(_defaults.cardTypes, options || {});
var patterns = settings[type];
const settings = Object.assign({}, _defaults.cardTypes, options);
const patterns = settings[type];

@@ -166,4 +166,4 @@ if (!patterns) {

function doesCvvMatchType (number, type, options) {
var settings = Hoek.applyToDefaults(_defaults.cardTypes, options || {});
var patterns = settings[type];
const settings = Object.assign({}, _defaults.cardTypes, options);
const patterns = settings[type];

@@ -181,5 +181,5 @@ if (!patterns) {

// cards are good until the end of the month
// Cards are good until the end of the month
// http://stackoverflow.com/questions/54037/credit-card-expiration-dates-inclusive-or-exclusive
var expiration = new Date(year, month);
const expiration = new Date(year, month);

@@ -190,3 +190,3 @@ return Date.now() >= expiration;

function luhn (number) {
// credit - https://gist.github.com/DiegoSalazar/4075533
// Source - https://gist.github.com/DiegoSalazar/4075533

@@ -197,7 +197,7 @@ if (/[^\d]+/.test(number) || typeof number !== 'string' || !number) {

var nCheck = 0;
var bEven = false;
var nDigit;
let nCheck = 0;
let bEven = false;
let nDigit;
for (var i = number.length - 1; i >= 0; --i) {
for (let i = number.length - 1; i >= 0; --i) {
nDigit = ~~number.charAt(i);

@@ -230,5 +230,5 @@

if (overwrite === true) {
_defaults = Hoek.clone(options);
_defaults = Object.assign({}, options);
} else {
_defaults = Hoek.applyToDefaults(_defaults, options);
_defaults = Object.assign({}, _defaults, options);
}

@@ -240,3 +240,3 @@

function reset () {
_defaults = Hoek.clone(_originalDefaults);
_defaults = Object.assign({}, _originalDefaults);
return _defaults;

@@ -246,3 +246,3 @@ }

function _setupCardTypeAliases (type, aliases) {
for (var i = 0, il = aliases.length; i < il; ++i) {
for (let i = 0; i < aliases.length; ++i) {
_defaults.cardTypes[aliases[i]] = _defaults.cardTypes[type];

@@ -253,14 +253,14 @@ }

module.exports = {
validate: validate,
determineCardType: determineCardType,
isValidCardNumber: isValidCardNumber,
isValidExpiryMonth: isValidExpiryMonth,
isValidExpiryYear: isValidExpiryYear,
doesNumberMatchType: doesNumberMatchType,
doesCvvMatchType: doesCvvMatchType,
isExpired: isExpired,
luhn: luhn,
sanitizeNumberString: sanitizeNumberString,
defaults: defaults,
reset: reset
validate,
determineCardType,
isValidCardNumber,
isValidExpiryMonth,
isValidExpiryYear,
doesNumberMatchType,
doesCvvMatchType,
isExpired,
luhn,
sanitizeNumberString,
defaults,
reset
};
{
"name": "credit-card",
"version": "1.2.2",
"version": "2.0.0",
"description": "credit card validation",
"author": "Continuation Labs <contact@continuation.io> (http://continuation.io/)",
"main": "lib/index.js",
"author": "Continuation Labs <contact@continuation.io> (http://continuation.io/)",
"homepage": "https://github.com/continuationlabs/credit-card",
"repository": {

@@ -11,23 +12,23 @@ "type": "git",

},
"bugs": {
"url": "https://github.com/continuationlabs/credit-card/issues"
},
"license": "MIT",
"scripts": {
"test": "belly-button && lab -v -t 100 -a code"
},
"keywords": [
"credit card"
],
"bugs": {
"url": "https://github.com/continuationlabs/credit-card/issues"
"engines": {
"node": ">=4.0.0"
},
"dependencies": {
"hoek": "2.x.x"
"reach": "1.x.x"
},
"devDependencies": {
"belly-button": "1.x.x",
"code": "1.x.x",
"lab": "6.x.x"
"code": "2.x.x",
"lab": "8.x.x"
},
"directories": {
"test": "test"
},
"license": "MIT"
"keywords": [
"credit card"
]
}

@@ -6,4 +6,5 @@ # credit-card

![Dependencies](http://img.shields.io/david/continuationlabs/credit-card.svg)
![devDependencies](http://img.shields.io/david/dev/continuationlabs/credit-card.svg)
[![belly-button-style](https://cdn.rawgit.com/continuationlabs/belly-button/master/badge.svg)](https://github.com/continuationlabs/belly-button)
Module for performing credit card validation.

@@ -277,1 +278,5 @@

```
## Test Card Numbers
A list of test credit cards is available from [http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm](PayPal).
'use strict';
var Code = require('code');
var Lab = require('lab');
var CreditCard = require('../');
const Code = require('code');
const Lab = require('lab');
const CreditCard = require('../');
var lab = exports.lab = Lab.script();
var expect = Code.expect;
var describe = lab.describe;
var it = lab.it;
const lab = exports.lab = Lab.script();
const expect = Code.expect;
const describe = lab.describe;
const it = lab.it;
// a list of test credit cards is available at:
// http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
describe('CreditCard', function () {
lab.beforeEach(function (done) {
describe('CreditCard', () => {
lab.beforeEach((done) => {
CreditCard.reset();

@@ -20,5 +18,5 @@ done();

describe('#validate()', function () {
it('no invalid responses on valid card', function (done) {
var card = {
describe('#validate()', () => {
it('no invalid responses on valid card', (done) => {
const card = {
cardType: 'VISA',

@@ -30,3 +28,3 @@ number: '4111111111111111',

};
var validation = CreditCard.validate(card);
const validation = CreditCard.validate(card);

@@ -43,4 +41,4 @@ expect(validation.card).to.deep.equal(card);

it('validates a card using a custom schema', function (done) {
var schema = {
it('validates a card using a custom schema', (done) => {
const schema = {
cardType: 'type',

@@ -52,3 +50,3 @@ number: 'number',

};
var card = {
const card = {
type: 'visa',

@@ -60,5 +58,3 @@ number: '4111111111111111',

};
var validation = CreditCard.validate(card, {
schema: schema
});
const validation = CreditCard.validate(card, { schema });

@@ -75,4 +71,4 @@ expect(validation.card).to.deep.equal(card);

it('no invalid responses on valid card by alias', function (done) {
var card = {
it('no invalid responses on valid card by alias', (done) => {
const card = {
cardType: 'VC',

@@ -84,3 +80,3 @@ number: '4111111111111111',

};
var validation = CreditCard.validate(card);
const validation = CreditCard.validate(card);

@@ -97,4 +93,4 @@ expect(validation.card).to.deep.equal(card);

it('invalid responses on invalid card', function (done) {
var card = {
it('invalid responses on invalid card', (done) => {
const card = {
cardType: 'VISA',

@@ -106,3 +102,3 @@ number: '4111111111111112',

};
var validation = CreditCard.validate(card);
const validation = CreditCard.validate(card);

@@ -119,4 +115,4 @@ expect(validation.card).to.deep.equal(card);

it('invalid responses on no card', function (done) {
var validation = CreditCard.validate();
it('invalid responses on no card', (done) => {
const validation = CreditCard.validate();

@@ -133,4 +129,4 @@ expect(validation.card).to.deep.equal({});

it('provides custom validation function', function (done) {
var card = {
it('provides custom validation function', (done) => {
const card = {
cardType: 'VISA',

@@ -143,8 +139,8 @@ number: '4111111111111111',

};
var options = {
customValidation: function (card, settings) {
const options = {
customValidation: (card, settings) => {
return card.pin === '7890';
}
};
var validation = CreditCard.validate(card, options);
const validation = CreditCard.validate(card, options);

@@ -161,4 +157,4 @@ expect(validation.card).to.deep.equal(card);

it('defines a new card type', function (done) {
var card1 = {
it('defines a new card type', (done) => {
const card1 = {
cardType: 'VISA',

@@ -170,3 +166,3 @@ number: '4111111111111111',

};
var card2 = {
const card2 = {
cardType: 'GIFT_CARD',

@@ -178,3 +174,3 @@ number: '4111111111111111',

};
var options = {
const options = {
cardTypes: {

@@ -186,3 +182,3 @@ GIFT_CARD: {

},
customValidation: function (card, settings) {
customValidation: (card, settings) => {
if (card.cardType === 'GIFT_CARD') {

@@ -193,6 +189,6 @@ return card.pin === '7890';

};
var validation1 = CreditCard.validate(card1, options);
var validation2 = CreditCard.validate(card2, options);
const validation1 = CreditCard.validate(card1, options);
const validation2 = CreditCard.validate(card2, options);
// verify that existing validation still works
// Verify that existing validation still works
expect(validation1.card).to.deep.equal(card1);

@@ -206,3 +202,3 @@ expect(validation1.validCardNumber).to.equal(true);

// verify that custom type validation works
// Verify that custom type validation works
expect(validation2.card).to.deep.equal(card2);

@@ -220,4 +216,4 @@ expect(validation2.validCardNumber).to.equal(true);

describe('#determineCardType()', function () {
it('successfully detects full numbers', function (done) {
describe('#determineCardType()', () => {
it('successfully detects full numbers', (done) => {
expect(CreditCard.determineCardType('378282246310005')).to.equal('AMERICANEXPRESS');

@@ -241,3 +237,3 @@ expect(CreditCard.determineCardType('371449635398431')).to.equal('AMERICANEXPRESS');

it('successfully detects partial numbers if allowPartial is true', function (done) {
it('successfully detects partial numbers if allowPartial is true', (done) => {
expect(CreditCard.determineCardType('37', {allowPartial: true})).to.equal('AMERICANEXPRESS');

@@ -260,3 +256,3 @@ expect(CreditCard.determineCardType('34', {allowPartial: true})).to.equal('AMERICANEXPRESS');

it('does not allow partial matches if allowPartial is false', function (done) {
it('does not allow partial matches if allowPartial is false', (done) => {
expect(CreditCard.determineCardType('5555555')).to.equal(null);

@@ -268,4 +264,4 @@ expect(CreditCard.determineCardType('4', {allowPartial: false})).to.equal(null);

describe('#isValidCardNumber()', function () {
it('returns true for valid cards', function (done) {
describe('#isValidCardNumber()', () => {
it('returns true for valid cards', (done) => {
expect(CreditCard.isValidCardNumber('378282246310005', 'AMERICANEXPRESS')).to.equal(true);

@@ -288,3 +284,3 @@ expect(CreditCard.isValidCardNumber('371449635398431', 'AMERICANEXPRESS')).to.equal(true);

it('returns false for numbers that pass luhn but fail are invalid', function (done) {
it('returns false for numbers that pass luhn but fail are invalid', (done) => {
expect(CreditCard.isValidCardNumber('123', 'AMERICANEXPRESS')).to.equal(false);

@@ -295,4 +291,4 @@ done();

describe('#doesNumberMatchType()', function () {
it('returns true for valid card matches', function (done) {
describe('#doesNumberMatchType()', () => {
it('returns true for valid card matches', (done) => {
expect(CreditCard.doesNumberMatchType('378282246310005', 'AMERICANEXPRESS')).to.equal(true);

@@ -315,3 +311,3 @@ expect(CreditCard.doesNumberMatchType('371449635398431', 'AMERICANEXPRESS')).to.equal(true);

it('returns false for invalid cards', function (done) {
it('returns false for invalid cards', (done) => {
expect(CreditCard.doesNumberMatchType('4111111111111111', 'AMERICANEXPRESS')).to.equal(false);

@@ -326,3 +322,3 @@ expect(CreditCard.doesNumberMatchType('5555555555554444', 'DINERSCLUB')).to.equal(false);

it('returns false for unknown card types', function (done) {
it('returns false for unknown card types', (done) => {
expect(CreditCard.doesNumberMatchType('4111111111111111', '')).to.equal(false);

@@ -333,3 +329,3 @@ expect(CreditCard.doesNumberMatchType('378282246310005', 'foo')).to.equal(false);

it('returns true for custom card types', function (done) {
it('returns true for custom card types', (done) => {
expect(CreditCard.doesNumberMatchType('911', 'foo', {

@@ -345,4 +341,4 @@ foo: {

describe('#doesCvvMatchType()', function () {
it('returns true for valid cvv matches', function (done) {
describe('#doesCvvMatchType()', () => {
it('returns true for valid cvv matches', (done) => {
expect(CreditCard.doesCvvMatchType('1234', 'AMERICANEXPRESS')).to.equal(true);

@@ -357,3 +353,3 @@ expect(CreditCard.doesCvvMatchType('123', 'DINERSCLUB')).to.equal(true);

it('returns false for invalid cvvs', function (done) {
it('returns false for invalid cvvs', (done) => {
expect(CreditCard.doesCvvMatchType('123', 'AMERICANEXPRESS')).to.equal(false);

@@ -368,3 +364,3 @@ expect(CreditCard.doesCvvMatchType('1234', 'DINERSCLUB')).to.equal(false);

it('returns false for unknown card types', function (done) {
it('returns false for unknown card types', (done) => {
expect(CreditCard.doesCvvMatchType('999', '')).to.equal(false);

@@ -375,3 +371,3 @@ expect(CreditCard.doesCvvMatchType('x', 'foo')).to.equal(false);

it('returns true for custom card types', function (done) {
it('returns true for custom card types', (done) => {
expect(CreditCard.doesCvvMatchType('abc', 'foo', {

@@ -387,4 +383,4 @@ foo: {

describe('#isValidExpiryMonth()', function () {
it('returns true for valid month', function (done) {
describe('#isValidExpiryMonth()', () => {
it('returns true for valid month', (done) => {
expect(CreditCard.isValidExpiryMonth('01')).to.equal(true);

@@ -405,3 +401,3 @@ expect(CreditCard.isValidExpiryMonth('02')).to.equal(true);

it('returns false for invalid month', function (done) {
it('returns false for invalid month', (done) => {
expect(CreditCard.isValidExpiryMonth('001')).to.equal(false);

@@ -413,4 +409,4 @@ expect(CreditCard.isValidExpiryMonth(0)).to.equal(false);

it('returns true for month in specified range', function (done) {
var valid = CreditCard.isValidExpiryMonth(13, {
it('returns true for month in specified range', (done) => {
const valid = CreditCard.isValidExpiryMonth(13, {
min: 13,

@@ -425,4 +421,4 @@ max: 13

describe('#isValidExpiryYear()', function () {
it('returns true for valid year', function (done) {
describe('#isValidExpiryYear()', () => {
it('returns true for valid year', (done) => {
expect(CreditCard.isValidExpiryYear('2014')).to.equal(true);

@@ -436,3 +432,3 @@ expect(CreditCard.isValidExpiryYear(1990)).to.equal(true);

it('returns false for invalid year', function (done) {
it('returns false for invalid year', (done) => {
expect(CreditCard.isValidExpiryYear('100')).to.equal(false);

@@ -444,4 +440,4 @@ expect(CreditCard.isValidExpiryYear(1899)).to.equal(false);

it('returns true for year in specified range', function (done) {
var valid = CreditCard.isValidExpiryYear(1800, {
it('returns true for year in specified range', (done) => {
const valid = CreditCard.isValidExpiryYear(1800, {
min: 1800,

@@ -456,4 +452,4 @@ max: 1800

describe('#isExpired()', function () {
it('returns true for an expired card', function (done) {
describe('#isExpired()', () => {
it('returns true for an expired card', (done) => {
expect(CreditCard.isExpired(12, 2013)).to.equal(true);

@@ -463,3 +459,3 @@ done();

it('returns false for non-expired card', function (done) {
it('returns false for non-expired card', (done) => {
expect(CreditCard.isExpired(1, 2100)).to.equal(false);

@@ -469,4 +465,4 @@ done();

it('returns true when card expired last month', function (done) {
var date = new Date();
it('returns true when card expired last month', (done) => {
const date = new Date();

@@ -478,4 +474,4 @@ date.setMonth(date.getMonth() - 1); // last month

it('returns false when card expires this month', function (done) {
var date = new Date();
it('returns false when card expires this month', (done) => {
const date = new Date();

@@ -487,4 +483,4 @@ expect(CreditCard.isExpired(date.getMonth() + 1, date.getFullYear())).to.equal(false);

describe('#luhn()', function () {
it('returns true for valid cards', function (done) {
describe('#luhn()', () => {
it('returns true for valid cards', (done) => {
expect(CreditCard.luhn('378282246310005')).to.equal(true);

@@ -510,3 +506,3 @@ expect(CreditCard.luhn('371449635398431')).to.equal(true);

it('returns false for invalid cards', function (done) {
it('returns false for invalid cards', (done) => {
expect(CreditCard.luhn('5105105105105101')).to.equal(false);

@@ -523,5 +519,5 @@ expect(CreditCard.luhn('4111111111111112')).to.equal(false);

describe('#sanitizeNumberString()', function () {
it('returns a string stripped of all non-numeric characters', function (done) {
var str = CreditCard.sanitizeNumberString('4111-1111-1111-1111');
describe('#sanitizeNumberString()', () => {
it('returns a string stripped of all non-numeric characters', (done) => {
const str = CreditCard.sanitizeNumberString('4111-1111-1111-1111');

@@ -532,3 +528,3 @@ expect(str).to.equal('4111111111111111');

it('returns empty string for non-string input', function (done) {
it('returns empty string for non-string input', (done) => {
expect(CreditCard.sanitizeNumberString()).to.equal('');

@@ -544,6 +540,6 @@ expect(CreditCard.sanitizeNumberString(undefined)).to.equal('');

describe('#defaults()', function () {
it('adds to defaults', function (done) {
var original = CreditCard.reset();
var updated = CreditCard.defaults({
describe('#defaults()', () => {
it('adds to defaults', (done) => {
const original = CreditCard.reset();
const updated = CreditCard.defaults({
cardTypes: {

@@ -561,5 +557,5 @@ foo: {

it('makes no changes without arguments', function (done) {
var original = CreditCard.reset();
var updated = CreditCard.defaults();
it('makes no changes without arguments', (done) => {
const original = CreditCard.reset();
const updated = CreditCard.defaults();

@@ -570,5 +566,5 @@ expect(original).to.deep.equal(updated);

it('does not overwrite by default', function (done) {
var original = CreditCard.reset();
var updated = CreditCard.defaults({});
it('does not overwrite by default', (done) => {
const original = CreditCard.reset();
const updated = CreditCard.defaults({});

@@ -579,4 +575,4 @@ expect(original).to.deep.equal(updated);

it('overwrites when second argument is true', function (done) {
var updated = CreditCard.defaults({}, true);
it('overwrites when second argument is true', (done) => {
const updated = CreditCard.defaults({}, true);

@@ -587,5 +583,5 @@ expect(updated).to.deep.equal({});

it('does not overwrite when second argument is false', function (done) {
var original = CreditCard.reset();
var updated = CreditCard.defaults({}, false);
it('does not overwrite when second argument is false', (done) => {
const original = CreditCard.reset();
const updated = CreditCard.defaults({}, false);

@@ -596,4 +592,4 @@ expect(original).to.deep.equal(updated);

it('sets a custom schema', function (done) {
var schema = {
it('sets a custom schema', (done) => {
const schema = {
cardType: 'type',

@@ -605,3 +601,3 @@ number: 'number',

};
var card = {
const card = {
type: 'visa',

@@ -613,8 +609,5 @@ number: '4111111111111111',

};
var validation;
CreditCard.defaults({
schema: schema
});
validation = CreditCard.validate(card);
CreditCard.defaults({ schema });
const validation = CreditCard.validate(card);

@@ -632,7 +625,7 @@ expect(validation.card).to.deep.equal(card);

describe('#reset()', function () {
it('resets to original defaults', function (done) {
var original = CreditCard.reset();
var updated = CreditCard.defaults({}, true);
var reset = CreditCard.reset();
describe('#reset()', () => {
it('resets to original defaults', (done) => {
const original = CreditCard.reset();
const updated = CreditCard.defaults({}, true);
const reset = CreditCard.reset();

@@ -639,0 +632,0 @@ expect(updated).to.deep.equal({});

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

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

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc