all files / src/ iban.js

100% Statements 24/24
100% Branches 15/15
100% Functions 5/5
100% Lines 19/19
1 branch Ignored     
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120                                                                                                                                                                                   363× 363× 276×                   171× 557×   171× 171× 679× 679×   171×    
import Validators from './index'
import { prepareMsg, prepare, memoize, HAS_PROP } from './helpers'
 
const COUNTRY_REG = {
  AD: /^([0-9]{4})([0-9]{4})([0-9A-Za-z]{12})$/,
  AE: /^([0-9]{3})([0-9]{16})$/,
  AL: /^([0-9]{8})([0-9A-Za-z]{16})$/,
  AO: /^([0-9]{21})$/,
  AT: /^([0-9]{5})([0-9]{11})$/,
  AZ: /^([A-Z]{4})([0-9A-Za-z]{20})$/,
  BA: /^([0-9]{3})([0-9]{3})([0-9]{8})([0-9]{2})$/,
  BE: /^([0-9]{3})([0-9]{7})([0-9]{2})$/,
  BF: /^([0-9]{23})$/,
  BG: /^([A-Z]{4})([0-9]{4})([0-9]{2})([0-9A-Za-z]{8})$/,
  BH: /^([A-Z]{4})([0-9A-Za-z]{14})$/,
  BI: /^([0-9]{12})$/,
  BJ: /^([0-9]{24})$/,
  BR: /^([0-9]{8})([0-9]{5})([0-9]{10})([A-Z]{1})([0-9A-Za-z]{1})$/,
  CH: /^([0-9]{5})([0-9A-Za-z]{12})$/,
  CI: /^([A-Z]{1})([0-9]{23})$/,
  CM: /^([0-9]{23})$/,
  CR: /^([0-9]{4})([0-9]{14})$/,
  CV: /^([0-9]{21})$/,
  CY: /^([0-9]{3})([0-9]{5})([0-9A-Za-z]{16})$/,
  CZ: /^([0-9]{4})([0-9]{6})([0-9]{10})$/,
  DE: /^([0-9]{8})([0-9]{10})$/,
  DK: /^([0-9]{4})([0-9]{9})([0-9]{1})$/,
  DO: /^([A-Z]{4})([0-9]{20})$/,
  DZ: /^([0-9]{20})$/,
  EE: /^([0-9]{2})([0-9]{2})([0-9]{11})([0-9]{1})$/,
  ES: /^([0-9]{4})([0-9]{4})([0-9]{1})([0-9]{1})([0-9]{10})$/,
  FI: /^([0-9]{6})([0-9]{7})([0-9]{1})$/,
  FO: /^([0-9]{4})([0-9]{9})([0-9]{1})$/,
  FR: /^([0-9]{5})([0-9]{5})([0-9A-Za-z]{11})([0-9]{2})$/,
  GB: /^([A-Z]{4})([0-9]{6})([0-9]{8})$/,
  GE: /^([A-Z]{2})([0-9]{16})$/,
  GI: /^([A-Z]{4})([0-9A-Za-z]{15})$/,
  GL: /^([0-9]{4})([0-9]{9})([0-9]{1})$/,
  GR: /^([0-9]{3})([0-9]{4})([0-9A-Za-z]{16})$/,
  GT: /^([0-9A-Za-z]{4})([0-9A-Za-z]{20})$/,
  HR: /^([0-9]{7})([0-9]{10})$/,
  HU: /^([0-9]{3})([0-9]{4})([0-9]{1})([0-9]{15})([0-9]{1})$/,
  IE: /^([A-Z]{4})([0-9]{6})([0-9]{8})$/,
  IL: /^([0-9]{3})([0-9]{3})([0-9]{13})$/,
  IR: /^([0-9]{22})$/,
  IS: /^([0-9]{4})([0-9]{2})([0-9]{6})([0-9]{10})$/,
  IT: /^([A-Z]{1})([0-9]{5})([0-9]{5})([0-9A-Za-z]{12})$/,
  JO: /^([0-9A-Za-z]{4})([0-9]{22})$/,
  KW: /^([A-Z]{4})([0-9A-Za-z]{22})$/,
  KZ: /^([0-9]{3})([0-9A-Za-z]{13})$/,
  LB: /^([0-9]{4})([0-9A-Za-z]{20})$/,
  LC: /^([A-Z]{4})([0-9]{24})$/,
  LI: /^([0-9]{5})([0-9A-Za-z]{12})$/,
  LT: /^([0-9]{5})([0-9]{11})$/,
  LU: /^([0-9]{3})([0-9A-Za-z]{13})$/,
  LV: /^([A-Z]{4})([0-9A-Za-z]{13})$/,
  MC: /^([0-9]{5})([0-9]{5})([0-9A-Za-z]{11})([0-9]{2})$/,
  MD: /^([A-Z]{2})([0-9A-Za-z]{18})$/,
  ME: /^([0-9]{3})([0-9]{13})([0-9]{2})$/,
  MG: /^([0-9]{23})$/,
  MK: /^([0-9]{3})([0-9A-Za-z]{10})([0-9]{2})$/,
  ML: /^([A-Z]{1})([0-9]{23})$/,
  MR: /^([0-9]{5})([0-9]{5})([0-9]{11})([0-9]{2})$/,
  MT: /^([A-Z]{4})([0-9]{5})([0-9A-Za-z]{18})$/,
  MU: /^([A-Z]{4})([0-9]{2})([0-9]{2})([0-9]{12})([0-9]{3})([A-Z]{3})$/,
  MZ: /^([0-9]{21})$/,
  NL: /^([A-Z]{4})([0-9]{10})$/,
  NO: /^([0-9]{4})([0-9]{6})([0-9]{1})$/,
  PK: /^([A-Z]{4})([0-9A-Za-z]{16})$/,
  PL: /^([0-9]{8})([0-9]{16})$/,
  PS: /^([A-Z]{4})([0-9A-Za-z]{21})$/,
  PT: /^([0-9]{4})([0-9]{4})([0-9]{11})([0-9]{2})$/,
  QA: /^([A-Z]{4})([0-9A-Za-z]{21})$/,
  RO: /^([A-Z]{4})([0-9A-Za-z]{16})$/,
  RS: /^([0-9]{3})([0-9]{13})([0-9]{2})$/,
  SA: /^([0-9]{2})([0-9A-Za-z]{18})$/,
  SE: /^([0-9]{3})([0-9]{16})([0-9]{1})$/,
  SI: /^([0-9]{5})([0-9]{8})([0-9]{2})$/,
  SK: /^([0-9]{4})([0-9]{6})([0-9]{10})$/,
  SM: /^([A-Z]{1})([0-9]{5})([0-9]{5})([0-9A-Za-z]{12})$/,
  SN: /^([A-Z]{1})([0-9]{23})$/,
  ST: /^([0-9]{8})([0-9]{11})([0-9]{2})$/,
  TL: /^([0-9]{3})([0-9]{14})([0-9]{2})$/,
  TN: /^([0-9]{2})([0-9]{3})([0-9]{13})([0-9]{2})$/,
  TR: /^([0-9]{5})([0-9]{1})([0-9A-Za-z]{16})$/,
  UA: /^([0-9]{25})$/,
  VG: /^([A-Z]{4})([0-9]{16})$/,
  XK: /^([0-9]{4})([0-9]{10})([0-9]{2})$/
}
 
 
let iban = memoize(function ({ message, msg, 'if': ifCond, unless, allowBlank }={}) {
  msg = msg || message
 
  return prepare(ifCond, unless, allowBlank, function (value) {
    let country = value.slice(0, 2)
    if (!HAS_PROP.call(COUNTRY_REG, country) || !COUNTRY_REG[country].test(value.slice(4)) || 1 !== mod97(value)) {
      return Validators.formatMessage(prepareMsg(msg, 'iban'))
    }
  })
})
 
export default iban
 
 
// private
const ALPHA_REG = /[A-Za-z]/g
 
function mod97 (iban) {
  let remainder = (iban.slice(4) + iban.slice(0, 4)).replace(ALPHA_REG, function (char) {
    return char.toUpperCase().charCodeAt(0) - 55
  })
  let block
  while (remainder.length > 2) {
    block = remainder.slice(0, 9)
    remainder = (+block % 97) + remainder.slice(block.length)
  }
  return +remainder % 97
}