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 | 1×
1×
1×
8×
8×
8×
363×
363×
276×
1×
1×
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
}
|