Skip to content

Instantly share code, notes, and snippets.

@devsnek
Last active April 1, 2017 16:45
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save devsnek/904f0b3f1a5c94522a1cb7afec925a12 to your computer and use it in GitHub Desktop.
Save devsnek/904f0b3f1a5c94522a1cb7afec925a12 to your computer and use it in GitHub Desktop.
function range(start, end) {
return Array(end - start + 1).fill().map((_, idx) => start + idx)
}
const IIN = [
{
ISSUING_NETWORK: "American Express",
IIN_RANGES: [34, 37],
ACTIVE: true,
LENGTH: [15],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Bankcard",
IIN_RANGES: [5610, 560221, 560222, 560223, 560224, 560225],
ACTIVE: false,
LENGTH: [16],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "China UnionPay",
IIN_RANGES: [62],
ACTIVE: true,
LENGTH: [16, 17, 18, 19],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Diners Club Carte Blanche",
IIN_RANGES: range(300, 305),
ACTIVE: true,
LENGTH: [14],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Diners Club enRoute",
IIN_RANGES: [2014, 2149],
ACTIVE: false,
LENGTH: [16],
VALIDATION: false
},
{
ISSUING_NETWORK: "Diners Club International",
IIN_RANGES: [...range(300, 305), 309, 36],
ACTIVE: true,
LENGTH: [14],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Diners Club International",
IIN_RANGES: [38, 39],
ACTIVE: true,
LENGTH: [14],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Diners Club United States & Canada",
IIN_RANGES: [54, 55],
ACTIVE: true,
LENGTH: [16],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Discover Card",
IIN_RANGES: [6011, ...range(622126, 622925), ...range(644, 649), 65],
ACTIVE: "Yes",
LENGTH: "16, 19",
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "InterPayment",
IIN_RANGES: [636],
ACTIVE: true,
LENGTH: range(16, 19),
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "InstaPayment",
IIN_RANGES: range(637, 639),
ACTIVE: true,
LENGTH: [16],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "JCB",
IIN_RANGES: range(3528, 3589),
ACTIVE: true,
LENGTH: [16],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Laser",
IIN_RANGES: [6304, 6706, 6771, 6709],
ACTIVE: false,
LENGTH: range(16, 19),
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Maestro",
IIN_RANGES: [50, 56, 57, 58, 6],
ACTIVE: true,
LENGTH: range(12, 19),
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Dankort",
IIN_RANGES: [5019],
ACTIVE: true,
LENGTH: [16],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Dankort",
IIN_RANGES: ["4XXX", 4175, 4571],
ACTIVE: true,
LENGTH: [16],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "MIR",
IIN_RANGES: range(2200, 2204),
ACTIVE: true,
LENGTH: [16],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "MasterCard",
IIN_RANGES: range(2221, 2720),
ACTIVE: true,
LENGTH: [16],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "MasterCard",
IIN_RANGES: range(51, 55),
ACTIVE: true,
LENGTH: [16],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Solo",
IIN_RANGES: [6334, 6767],
ACTIVE: false,
LENGTH: [16, 18, 19],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Switch",
IIN_RANGES: [4903, 4905, 4911, 4936, 564182, 633110, 6333, 6759],
ACTIVE: false,
LENGTH: [16, 18, 19],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Visa",
IIN_RANGES: [4],
ACTIVE: true,
LENGTH: [13, 16, 19],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "UATP",
IIN_RANGES: [1],
ACTIVE: true,
LENGTH: [15],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "Verve",
IIN_RANGES: [...range(506099, 506198), ...range(650002, 650027)],
ACTIVE: true,
LENGTH: [16, 19],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "CARDGUARD EAD BG ILS",
IIN_RANGES: [5392],
ACTIVE: true,
LENGTH: [16],
VALIDATION: "luhn"
},
{
ISSUING_NETWORK: "CIBC Convenience Card",
IIN_RANGES: [4506],
ACTIVE: true,
LENGTH: [16]
},
{
ISSUING_NETWORK: "Royal Bank of Canada Client Card",
IIN_RANGES: [45],
ACTIVE: true,
LENGTH: [16]
},
{
ISSUING_NETWORK: "TD Canada Trust Access Card",
IIN_RANGES: [589297],
ACTIVE: true,
LENGTH: [19]
},
{
ISSUING_NETWORK: "Scotiabank Scotia Card",
IIN_RANGES: [4536],
ACTIVE: true,
LENGTH: [16]
},
{
ISSUING_NETWORK: "BMO ABM Card",
IIN_RANGES: [500],
ACTIVE: true,
LENGTH: [16]
},
{
ISSUING_NETWORK: "HSBC Canada Card",
IIN_RANGES: [56],
ACTIVE: true,
LENGTH: [16]
}
]
function isValid(value) {
if (/[^0-9-\s]+/.test(value)) return false;
value = value.replace(/\D/g, "");
let check = 0;
for (let n = value.length - 1; n >= 0; n--) {
let digit = parseInt(value.charAt(n), 10);
if (!(n % 2) && (digit *= 2) > 9) digit -= 9;
check += digit;
}
return (check % 10) === 0;
}
function whatIssuer(value, length = false) {
if (!isValid(value)) return [];
value = value.replace(/\D/g, "");
return IIN.filter(issuer => length ? issuer.LENGTH.includes(value.length) : true)
.filter(issuer => {
return issuer.IIN_RANGES.map(x => x.toString())
.some(num => value.startsWith(num))
});
}
module.exports = { isValid, whatIssuer };
@motiond3v
Copy link

eeeeeeeeeeeeeeeeee

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment