inferred-types 0.55.6 → 0.55.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -242,6 +242,7 @@ __export(index_exports, {
242
242
  box: () => box,
243
243
  boxDictionaryValues: () => boxDictionaryValues,
244
244
  capitalize: () => capitalize,
245
+ cardType: () => cardType,
245
246
  choices: () => choices,
246
247
  createConstant: () => createConstant,
247
248
  createConverter: () => createConverter,
@@ -452,6 +453,7 @@ __export(index_exports, {
452
453
  isMapToken: () => isMapToken,
453
454
  isMassMetric: () => isMassMetric,
454
455
  isMassUom: () => isMassUom,
456
+ isMastercard: () => isMastercard,
455
457
  isMetric: () => isMetric,
456
458
  isMexicanNewsUrl: () => isMexicanNewsUrl,
457
459
  isMoment: () => isMoment,
@@ -557,6 +559,7 @@ __export(index_exports, {
557
559
  isUsStateAbbreviation: () => isUsStateAbbreviation,
558
560
  isUsStateName: () => isUsStateName,
559
561
  isVariable: () => isVariable,
562
+ isVisa: () => isVisa,
560
563
  isVisaMastercard: () => isVisaMastercard,
561
564
  isVoltageMetric: () => isVoltageMetric,
562
565
  isVoltageUom: () => isVoltageUom,
@@ -7160,13 +7163,23 @@ function isYesterday(test) {
7160
7163
  }
7161
7164
  return false;
7162
7165
  }
7163
- function isVisaMastercard(val) {
7164
- if (isString(val)) {
7166
+ function isVisa(val) {
7167
+ if (isString(val) && val.startsWith("4")) {
7165
7168
  const parts = val.split(" ");
7166
7169
  return parts.length === 4 && parts.every((i) => isNumberLike(i) && i.length === 4);
7167
7170
  }
7168
7171
  return false;
7169
7172
  }
7173
+ function isMastercard(val) {
7174
+ if (isString(val) && val.startsWith("4")) {
7175
+ const parts = val.split(" ");
7176
+ return parts.length === 4 && parts.every((i) => isNumberLike(i) && i.length === 4) && ["51", "55", "22", "23", "24", "25", "26", "27"].some((i) => val.startsWith(i));
7177
+ }
7178
+ return false;
7179
+ }
7180
+ function isVisaMastercard(val) {
7181
+ return isVisa(val) || isMastercard(val);
7182
+ }
7170
7183
  function isAmericanExpress(val) {
7171
7184
  if (isString(val)) {
7172
7185
  const parts = val.split(" ");
@@ -7179,6 +7192,57 @@ function isAmericanExpress(val) {
7179
7192
  function isCreditCard(val) {
7180
7193
  return isVisaMastercard(val) || isAmericanExpress(val);
7181
7194
  }
7195
+ function cardType(cardNumber) {
7196
+ const cleanedNumber = String(cardNumber).replace(/\D/g, "");
7197
+ const length = cleanedNumber.length;
7198
+ if (!isValidLength(length)) {
7199
+ return "invalid";
7200
+ }
7201
+ if (!luhnCheck(cleanedNumber)) {
7202
+ return "invalid";
7203
+ }
7204
+ const cardTypes = [
7205
+ { name: "Visa", lengths: [16], prefixes: [/^4/] },
7206
+ { name: "Mastercard", lengths: [16], prefixes: [/^(51|52|53|54|55|222[1-9]|22[3-9]\d|2[3-6]\d{2}|27[01]\d|2720)/] },
7207
+ { name: "American Express", lengths: [15], prefixes: [/^3[47]/] },
7208
+ { name: "Discover", lengths: [16], prefixes: [/^(6011|622(12[6-9]|1[3-9]\d|2[0-4]\d|25\d|6[4-9]|7[0-4]|8[0-4]|9\d)|64[4-9]|65)/] },
7209
+ { name: "JCB", lengths: [16], prefixes: [/^(35|2131|1800)/] },
7210
+ { name: "Diners Club", lengths: [14, 16], prefixes: [/^(30[0-5]|36|38)/] },
7211
+ { name: "China UnionPay", lengths: [16, 17, 18, 19], prefixes: [/^(62|88)/] },
7212
+ { name: "Maestro", lengths: [12, 13, 14, 15, 16, 17, 18, 19], prefixes: [/^(5018|5020|5038|6304)/] },
7213
+ { name: "Solo", lengths: [16, 18, 19], prefixes: [/^(6334|6767)/] }
7214
+ ];
7215
+ for (const type of cardTypes) {
7216
+ if (type.lengths.includes(length)) {
7217
+ for (const prefix of type.prefixes) {
7218
+ if (prefix.test(cleanedNumber)) {
7219
+ return type.name;
7220
+ }
7221
+ }
7222
+ }
7223
+ }
7224
+ return "invalid";
7225
+ }
7226
+ function isValidLength(length) {
7227
+ const validLengths = [13, 14, 15, 16, 17, 18, 19];
7228
+ return validLengths.includes(length);
7229
+ }
7230
+ function luhnCheck(num) {
7231
+ let sum = 0;
7232
+ let double = false;
7233
+ for (let i = num.length - 1; i >= 0; i--) {
7234
+ let n = Number.parseInt(num.charAt(i), 10);
7235
+ if (double) {
7236
+ n *= 2;
7237
+ if (n > 9) {
7238
+ n -= 9;
7239
+ }
7240
+ }
7241
+ sum += n;
7242
+ double = !double;
7243
+ }
7244
+ return sum % 10 === 0;
7245
+ }
7182
7246
  function isString(value) {
7183
7247
  return typeof value === "string";
7184
7248
  }
@@ -8697,6 +8761,7 @@ var ExifSaturation = /* @__PURE__ */ ((ExifSaturation2) => {
8697
8761
  box,
8698
8762
  boxDictionaryValues,
8699
8763
  capitalize,
8764
+ cardType,
8700
8765
  choices,
8701
8766
  createConstant,
8702
8767
  createConverter,
@@ -8907,6 +8972,7 @@ var ExifSaturation = /* @__PURE__ */ ((ExifSaturation2) => {
8907
8972
  isMapToken,
8908
8973
  isMassMetric,
8909
8974
  isMassUom,
8975
+ isMastercard,
8910
8976
  isMetric,
8911
8977
  isMexicanNewsUrl,
8912
8978
  isMoment,
@@ -9012,6 +9078,7 @@ var ExifSaturation = /* @__PURE__ */ ((ExifSaturation2) => {
9012
9078
  isUsStateAbbreviation,
9013
9079
  isUsStateName,
9014
9080
  isVariable,
9081
+ isVisa,
9015
9082
  isVisaMastercard,
9016
9083
  isVoltageMetric,
9017
9084
  isVoltageUom,