react-input-mask-format 2.3.0 → 2.5.0
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.
- package/README.md +100 -8
- package/dist/chunk-OMKRB5AE.js +27 -0
- package/dist/chunk-OMKRB5AE.js.map +1 -0
- package/dist/presets.cjs +216 -2
- package/dist/presets.cjs.map +1 -1
- package/dist/presets.d.cts +27 -1
- package/dist/presets.d.ts +27 -1
- package/dist/presets.js +175 -2
- package/dist/presets.js.map +1 -1
- package/dist/validators.cjs +198 -9
- package/dist/validators.cjs.map +1 -1
- package/dist/validators.d.cts +15 -1
- package/dist/validators.d.ts +15 -1
- package/dist/validators.js +169 -10
- package/dist/validators.js.map +1 -1
- package/package.json +11 -2
package/dist/presets.js
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
import {
|
|
2
|
+
RU_PLATE_LETTERS,
|
|
3
|
+
toRuPlateChar
|
|
4
|
+
} from "./chunk-OMKRB5AE.js";
|
|
5
|
+
|
|
6
|
+
// src/presets/generic.ts
|
|
2
7
|
var card = {
|
|
3
8
|
mask: "9999 9999 9999 9999",
|
|
4
9
|
maskPlaceholder: "_"
|
|
5
10
|
};
|
|
11
|
+
|
|
12
|
+
// src/presets/kz.ts
|
|
6
13
|
var kzPhone = {
|
|
7
14
|
mask: "+7 (799) 999-99-99",
|
|
8
15
|
maskPlaceholder: "_"
|
|
@@ -43,6 +50,150 @@ var kzPostal = {
|
|
|
43
50
|
mask: "999999",
|
|
44
51
|
maskPlaceholder: "_"
|
|
45
52
|
};
|
|
53
|
+
|
|
54
|
+
// src/presets/ru.ts
|
|
55
|
+
var DIGIT = /[0-9]/;
|
|
56
|
+
var ruPhone = {
|
|
57
|
+
// national number starts with 3/4/8/9; 6/7 belong to Kazakhstan
|
|
58
|
+
mask: [
|
|
59
|
+
"+",
|
|
60
|
+
"7",
|
|
61
|
+
" ",
|
|
62
|
+
"(",
|
|
63
|
+
/[3489]/,
|
|
64
|
+
DIGIT,
|
|
65
|
+
DIGIT,
|
|
66
|
+
")",
|
|
67
|
+
" ",
|
|
68
|
+
DIGIT,
|
|
69
|
+
DIGIT,
|
|
70
|
+
DIGIT,
|
|
71
|
+
"-",
|
|
72
|
+
DIGIT,
|
|
73
|
+
DIGIT,
|
|
74
|
+
"-",
|
|
75
|
+
DIGIT,
|
|
76
|
+
DIGIT
|
|
77
|
+
],
|
|
78
|
+
maskPlaceholder: "_"
|
|
79
|
+
};
|
|
80
|
+
var ruInnPerson = {
|
|
81
|
+
mask: "999999999999",
|
|
82
|
+
maskPlaceholder: "_"
|
|
83
|
+
};
|
|
84
|
+
var ruInnCompany = {
|
|
85
|
+
mask: "9999999999",
|
|
86
|
+
maskPlaceholder: "_"
|
|
87
|
+
};
|
|
88
|
+
var ruSnils = {
|
|
89
|
+
mask: "999-999-999 99",
|
|
90
|
+
maskPlaceholder: "_"
|
|
91
|
+
};
|
|
92
|
+
var ruOgrn = {
|
|
93
|
+
mask: "9999999999999",
|
|
94
|
+
maskPlaceholder: "_"
|
|
95
|
+
};
|
|
96
|
+
var ruOgrnip = {
|
|
97
|
+
mask: "999999999999999",
|
|
98
|
+
maskPlaceholder: "_"
|
|
99
|
+
};
|
|
100
|
+
var ruKpp = {
|
|
101
|
+
// positions 5-6 may be Latin A-Z
|
|
102
|
+
mask: "9999**999",
|
|
103
|
+
maskPlaceholder: "_",
|
|
104
|
+
transform: "uppercase"
|
|
105
|
+
};
|
|
106
|
+
var ruBik = {
|
|
107
|
+
mask: "999999999",
|
|
108
|
+
maskPlaceholder: "_"
|
|
109
|
+
};
|
|
110
|
+
var ruAccount = {
|
|
111
|
+
// balance account · currency · check key · branch · account
|
|
112
|
+
mask: "99999 999 9 9999 9999999",
|
|
113
|
+
maskPlaceholder: "_"
|
|
114
|
+
};
|
|
115
|
+
var ruIban = {
|
|
116
|
+
// RU + 2 check + BIK (9) + 5 digits + 15 alnum, grouped by 4
|
|
117
|
+
mask: "RU99 9999 9999 9999 99** **** **** **** *",
|
|
118
|
+
maskPlaceholder: "_",
|
|
119
|
+
transform: "uppercase"
|
|
120
|
+
};
|
|
121
|
+
var RU_PLATE_LETTER = new RegExp(`[${RU_PLATE_LETTERS}]`);
|
|
122
|
+
var ruPlate = {
|
|
123
|
+
// letter · 3 digits · 2 letters · region (2 or 3 digits). A 2-digit region
|
|
124
|
+
// leaves the trailing placeholder (А 123 ВС 77_), which isValidRuPlate accepts.
|
|
125
|
+
mask: [
|
|
126
|
+
RU_PLATE_LETTER,
|
|
127
|
+
" ",
|
|
128
|
+
DIGIT,
|
|
129
|
+
DIGIT,
|
|
130
|
+
DIGIT,
|
|
131
|
+
" ",
|
|
132
|
+
RU_PLATE_LETTER,
|
|
133
|
+
RU_PLATE_LETTER,
|
|
134
|
+
" ",
|
|
135
|
+
DIGIT,
|
|
136
|
+
DIGIT,
|
|
137
|
+
DIGIT
|
|
138
|
+
],
|
|
139
|
+
maskPlaceholder: "_",
|
|
140
|
+
transform: toRuPlateChar
|
|
141
|
+
};
|
|
142
|
+
var ruPostal = {
|
|
143
|
+
mask: "999999",
|
|
144
|
+
maskPlaceholder: "_"
|
|
145
|
+
};
|
|
146
|
+
var ruPassport = {
|
|
147
|
+
// series (4) + number (6), as entered on Gosuslugi
|
|
148
|
+
mask: "9999 999999",
|
|
149
|
+
maskPlaceholder: "_"
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// src/presets/uz.ts
|
|
153
|
+
var uzPhone = {
|
|
154
|
+
// "9" is a digit token, so the country code's 9s are escaped
|
|
155
|
+
mask: "+\\9\\98 (99) 999-99-99",
|
|
156
|
+
maskPlaceholder: "_"
|
|
157
|
+
};
|
|
158
|
+
var uzPinfl = {
|
|
159
|
+
mask: "99999999999999",
|
|
160
|
+
maskPlaceholder: "_"
|
|
161
|
+
};
|
|
162
|
+
var uzInn = {
|
|
163
|
+
mask: "999999999",
|
|
164
|
+
maskPlaceholder: "_"
|
|
165
|
+
};
|
|
166
|
+
var uzAccount = {
|
|
167
|
+
// balance account · currency · key · client code · serial
|
|
168
|
+
mask: "99999 999 9 99999999 999",
|
|
169
|
+
maskPlaceholder: "_"
|
|
170
|
+
};
|
|
171
|
+
var uzMfo = {
|
|
172
|
+
mask: "99999",
|
|
173
|
+
maskPlaceholder: "_"
|
|
174
|
+
};
|
|
175
|
+
var uzPlate = {
|
|
176
|
+
// individuals: region · letter · 3 digits · 2 letters
|
|
177
|
+
mask: "99 a 999 aa",
|
|
178
|
+
maskPlaceholder: "_",
|
|
179
|
+
transform: "uppercase"
|
|
180
|
+
};
|
|
181
|
+
var uzPlateCompany = {
|
|
182
|
+
// legal entities: region · 3 digits · 3 letters
|
|
183
|
+
mask: "99 999 aaa",
|
|
184
|
+
maskPlaceholder: "_",
|
|
185
|
+
transform: "uppercase"
|
|
186
|
+
};
|
|
187
|
+
var uzPostal = {
|
|
188
|
+
mask: "999999",
|
|
189
|
+
maskPlaceholder: "_"
|
|
190
|
+
};
|
|
191
|
+
var uzPassport = {
|
|
192
|
+
// passport / ID card: 2-letter series + 7 digits
|
|
193
|
+
mask: "aa9999999",
|
|
194
|
+
maskPlaceholder: "_",
|
|
195
|
+
transform: "uppercase"
|
|
196
|
+
};
|
|
46
197
|
export {
|
|
47
198
|
card,
|
|
48
199
|
kzBin,
|
|
@@ -50,6 +201,28 @@ export {
|
|
|
50
201
|
kzIin,
|
|
51
202
|
kzPhone,
|
|
52
203
|
kzPlate,
|
|
53
|
-
kzPostal
|
|
204
|
+
kzPostal,
|
|
205
|
+
ruAccount,
|
|
206
|
+
ruBik,
|
|
207
|
+
ruIban,
|
|
208
|
+
ruInnCompany,
|
|
209
|
+
ruInnPerson,
|
|
210
|
+
ruKpp,
|
|
211
|
+
ruOgrn,
|
|
212
|
+
ruOgrnip,
|
|
213
|
+
ruPassport,
|
|
214
|
+
ruPhone,
|
|
215
|
+
ruPlate,
|
|
216
|
+
ruPostal,
|
|
217
|
+
ruSnils,
|
|
218
|
+
uzAccount,
|
|
219
|
+
uzInn,
|
|
220
|
+
uzMfo,
|
|
221
|
+
uzPassport,
|
|
222
|
+
uzPhone,
|
|
223
|
+
uzPinfl,
|
|
224
|
+
uzPlate,
|
|
225
|
+
uzPlateCompany,
|
|
226
|
+
uzPostal
|
|
54
227
|
};
|
|
55
228
|
//# sourceMappingURL=presets.js.map
|
package/dist/presets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/presets/
|
|
1
|
+
{"version":3,"sources":["../src/presets/generic.ts","../src/presets/kz.ts","../src/presets/ru.ts","../src/presets/uz.ts"],"sourcesContent":["import type { MaskPreset } from \"./types\";\n\nexport const card: MaskPreset = {\n mask: \"9999 9999 9999 9999\",\n maskPlaceholder: \"_\"\n};\n","import type { MaskPreset } from \"./types\";\n\nexport const kzPhone: MaskPreset = {\n mask: \"+7 (799) 999-99-99\",\n maskPlaceholder: \"_\"\n};\n\nexport const kzIin: MaskPreset = {\n mask: \"999999999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const kzBin: MaskPreset = {\n mask: \"999999999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const kzIban: MaskPreset = {\n // KZ + 2 check + 3 bank digits + 13 alnum account, grouped by 4\n mask: \"KZ99 999* **** **** ****\",\n maskPlaceholder: \"_\",\n transform: \"uppercase\"\n};\n\nconst KZ_PLATE_LETTER = /[ABCEHKMNOPTXY]/i;\nexport const kzPlate: MaskPreset = {\n // 3 digits · 3 letters (Latin look-alikes of Cyrillic) · 2-digit region\n mask: [\n /[0-9]/, /[0-9]/, /[0-9]/, \" \",\n KZ_PLATE_LETTER, KZ_PLATE_LETTER, KZ_PLATE_LETTER, \" \",\n /[0-9]/, /[0-9]/\n ],\n maskPlaceholder: \"_\",\n transform: \"uppercase\"\n};\n\nexport const kzPostal: MaskPreset = {\n mask: \"999999\",\n maskPlaceholder: \"_\"\n};\n","import type { MaskPreset } from \"./types\";\nimport { RU_PLATE_LETTERS, toRuPlateChar } from \"../utils/ru-plate\";\n\nconst DIGIT = /[0-9]/;\n\nexport const ruPhone: MaskPreset = {\n // national number starts with 3/4/8/9; 6/7 belong to Kazakhstan\n mask: [\n \"+\", \"7\", \" \", \"(\", /[3489]/, DIGIT, DIGIT, \")\", \" \",\n DIGIT, DIGIT, DIGIT, \"-\", DIGIT, DIGIT, \"-\", DIGIT, DIGIT\n ],\n maskPlaceholder: \"_\"\n};\n\nexport const ruInnPerson: MaskPreset = {\n mask: \"999999999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const ruInnCompany: MaskPreset = {\n mask: \"9999999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const ruSnils: MaskPreset = {\n mask: \"999-999-999 99\",\n maskPlaceholder: \"_\"\n};\n\nexport const ruOgrn: MaskPreset = {\n mask: \"9999999999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const ruOgrnip: MaskPreset = {\n mask: \"999999999999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const ruKpp: MaskPreset = {\n // positions 5-6 may be Latin A-Z\n mask: \"9999**999\",\n maskPlaceholder: \"_\",\n transform: \"uppercase\"\n};\n\nexport const ruBik: MaskPreset = {\n mask: \"999999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const ruAccount: MaskPreset = {\n // balance account · currency · check key · branch · account\n mask: \"99999 999 9 9999 9999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const ruIban: MaskPreset = {\n // RU + 2 check + BIK (9) + 5 digits + 15 alnum, grouped by 4\n mask: \"RU99 9999 9999 9999 99** **** **** **** *\",\n maskPlaceholder: \"_\",\n transform: \"uppercase\"\n};\n\nconst RU_PLATE_LETTER = new RegExp(`[${RU_PLATE_LETTERS}]`);\nexport const ruPlate: MaskPreset = {\n // letter · 3 digits · 2 letters · region (2 or 3 digits). A 2-digit region\n // leaves the trailing placeholder (А 123 ВС 77_), which isValidRuPlate accepts.\n mask: [\n RU_PLATE_LETTER, \" \", DIGIT, DIGIT, DIGIT, \" \",\n RU_PLATE_LETTER, RU_PLATE_LETTER, \" \", DIGIT, DIGIT, DIGIT\n ],\n maskPlaceholder: \"_\",\n transform: toRuPlateChar\n};\n\nexport const ruPostal: MaskPreset = {\n mask: \"999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const ruPassport: MaskPreset = {\n // series (4) + number (6), as entered on Gosuslugi\n mask: \"9999 999999\",\n maskPlaceholder: \"_\"\n};\n","import type { MaskPreset } from \"./types\";\n\nexport const uzPhone: MaskPreset = {\n // \"9\" is a digit token, so the country code's 9s are escaped\n mask: \"+\\\\9\\\\98 (99) 999-99-99\",\n maskPlaceholder: \"_\"\n};\n\nexport const uzPinfl: MaskPreset = {\n mask: \"99999999999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const uzInn: MaskPreset = {\n mask: \"999999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const uzAccount: MaskPreset = {\n // balance account · currency · key · client code · serial\n mask: \"99999 999 9 99999999 999\",\n maskPlaceholder: \"_\"\n};\n\nexport const uzMfo: MaskPreset = {\n mask: \"99999\",\n maskPlaceholder: \"_\"\n};\n\nexport const uzPlate: MaskPreset = {\n // individuals: region · letter · 3 digits · 2 letters\n mask: \"99 a 999 aa\",\n maskPlaceholder: \"_\",\n transform: \"uppercase\"\n};\n\nexport const uzPlateCompany: MaskPreset = {\n // legal entities: region · 3 digits · 3 letters\n mask: \"99 999 aaa\",\n maskPlaceholder: \"_\",\n transform: \"uppercase\"\n};\n\nexport const uzPostal: MaskPreset = {\n mask: \"999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const uzPassport: MaskPreset = {\n // passport / ID card: 2-letter series + 7 digits\n mask: \"aa9999999\",\n maskPlaceholder: \"_\",\n transform: \"uppercase\"\n};\n"],"mappings":"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","names":[]}
|
package/dist/validators.cjs
CHANGED
|
@@ -23,12 +23,41 @@ __export(validators_exports, {
|
|
|
23
23
|
isValidBin: () => isValidBin,
|
|
24
24
|
isValidIin: () => isValidIin,
|
|
25
25
|
isValidKzIban: () => isValidKzIban,
|
|
26
|
+
isValidRuAccount: () => isValidRuAccount,
|
|
27
|
+
isValidRuBik: () => isValidRuBik,
|
|
28
|
+
isValidRuIban: () => isValidRuIban,
|
|
29
|
+
isValidRuInn: () => isValidRuInn,
|
|
30
|
+
isValidRuKpp: () => isValidRuKpp,
|
|
31
|
+
isValidRuOgrn: () => isValidRuOgrn,
|
|
32
|
+
isValidRuOgrnip: () => isValidRuOgrnip,
|
|
33
|
+
isValidRuPlate: () => isValidRuPlate,
|
|
34
|
+
isValidRuSnils: () => isValidRuSnils,
|
|
35
|
+
isValidUzInn: () => isValidUzInn,
|
|
36
|
+
isValidUzPinfl: () => isValidUzPinfl,
|
|
26
37
|
luhn: () => luhn
|
|
27
38
|
});
|
|
28
39
|
module.exports = __toCommonJS(validators_exports);
|
|
40
|
+
|
|
41
|
+
// src/validators/shared.ts
|
|
29
42
|
function digitsOnly(value) {
|
|
30
43
|
return (value != null ? value : "").replace(/\D/g, "");
|
|
31
44
|
}
|
|
45
|
+
function remainder(numeric, modulus) {
|
|
46
|
+
let r = 0;
|
|
47
|
+
for (let i = 0; i < numeric.length; i++) {
|
|
48
|
+
r = (r * 10 + (numeric.charCodeAt(i) - 48)) % modulus;
|
|
49
|
+
}
|
|
50
|
+
return r;
|
|
51
|
+
}
|
|
52
|
+
function isIbanChecksumValid(iban) {
|
|
53
|
+
const rearranged = iban.slice(4) + iban.slice(0, 4);
|
|
54
|
+
let numeric = "";
|
|
55
|
+
for (let i = 0; i < rearranged.length; i++) {
|
|
56
|
+
const ch = rearranged[i];
|
|
57
|
+
numeric += ch >= "A" && ch <= "Z" ? String(ch.charCodeAt(0) - 55) : ch;
|
|
58
|
+
}
|
|
59
|
+
return remainder(numeric, 97) === 1;
|
|
60
|
+
}
|
|
32
61
|
function luhn(value) {
|
|
33
62
|
const digits = digitsOnly(value);
|
|
34
63
|
if (digits.length === 0) {
|
|
@@ -49,6 +78,16 @@ function luhn(value) {
|
|
|
49
78
|
}
|
|
50
79
|
return sum % 10 === 0;
|
|
51
80
|
}
|
|
81
|
+
function isRealDate(year, month, day) {
|
|
82
|
+
if (month < 1 || month > 12 || day < 1) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
const leap = year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
|
|
86
|
+
const daysInMonth = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
87
|
+
return day <= daysInMonth[month - 1];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// src/validators/kz.ts
|
|
52
91
|
var IIN_W1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
|
|
53
92
|
var IIN_W2 = [3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2];
|
|
54
93
|
function iinBinChecksum(value) {
|
|
@@ -78,22 +117,172 @@ function isValidKzIban(value) {
|
|
|
78
117
|
if (s.length !== 20 || !s.startsWith("KZ") || !/^[0-9A-Z]+$/.test(s)) {
|
|
79
118
|
return false;
|
|
80
119
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
120
|
+
return isIbanChecksumValid(s);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// src/utils/ru-plate.ts
|
|
124
|
+
var RU_PLATE_LETTERS = "\u0410\u0412\u0415\u041A\u041C\u041D\u041E\u0420\u0421\u0422\u0423\u0425";
|
|
125
|
+
var LATIN_TO_CYRILLIC = {
|
|
126
|
+
A: "\u0410",
|
|
127
|
+
B: "\u0412",
|
|
128
|
+
E: "\u0415",
|
|
129
|
+
K: "\u041A",
|
|
130
|
+
M: "\u041C",
|
|
131
|
+
H: "\u041D",
|
|
132
|
+
O: "\u041E",
|
|
133
|
+
P: "\u0420",
|
|
134
|
+
C: "\u0421",
|
|
135
|
+
T: "\u0422",
|
|
136
|
+
Y: "\u0423",
|
|
137
|
+
X: "\u0425"
|
|
138
|
+
};
|
|
139
|
+
function toRuPlateChar(char) {
|
|
140
|
+
var _a;
|
|
141
|
+
const upper = char.toUpperCase();
|
|
142
|
+
return (_a = LATIN_TO_CYRILLIC[upper]) != null ? _a : upper;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// src/validators/ru.ts
|
|
146
|
+
var INN10_W = [2, 4, 10, 3, 5, 9, 4, 6, 8];
|
|
147
|
+
var INN12_W1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8];
|
|
148
|
+
var INN12_W2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8];
|
|
149
|
+
var SNILS_W = [9, 8, 7, 6, 5, 4, 3, 2, 1];
|
|
150
|
+
var SNILS_UNCHECKED_MAX = 1001998;
|
|
151
|
+
function toDigits(digits) {
|
|
152
|
+
return digits.split("").map((c) => c.charCodeAt(0) - 48);
|
|
153
|
+
}
|
|
154
|
+
function weightedSum(d, weights) {
|
|
155
|
+
return weights.reduce((sum, w, i) => sum + w * d[i], 0);
|
|
156
|
+
}
|
|
157
|
+
function isValidRuInn(value) {
|
|
158
|
+
const d = toDigits(digitsOnly(value));
|
|
159
|
+
if (d.length === 10) {
|
|
160
|
+
return weightedSum(d, INN10_W) % 11 % 10 === d[9];
|
|
161
|
+
}
|
|
162
|
+
if (d.length === 12) {
|
|
163
|
+
return weightedSum(d, INN12_W1) % 11 % 10 === d[10] && weightedSum(d, INN12_W2) % 11 % 10 === d[11];
|
|
164
|
+
}
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
function isValidRuSnils(value) {
|
|
168
|
+
const digits = digitsOnly(value);
|
|
169
|
+
if (digits.length !== 11) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
if (Number(digits.slice(0, 9)) <= SNILS_UNCHECKED_MAX) {
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
const d = toDigits(digits);
|
|
176
|
+
let control = weightedSum(d, SNILS_W) % 101;
|
|
177
|
+
if (control === 100) {
|
|
178
|
+
control = 0;
|
|
179
|
+
}
|
|
180
|
+
return control === d[9] * 10 + d[10];
|
|
181
|
+
}
|
|
182
|
+
function isValidRuOgrn(value) {
|
|
183
|
+
const digits = digitsOnly(value);
|
|
184
|
+
if (digits.length !== 13 || digits[0] !== "1" && digits[0] !== "5") {
|
|
185
|
+
return false;
|
|
89
186
|
}
|
|
90
|
-
return remainder ===
|
|
187
|
+
return remainder(digits.slice(0, 12), 11) % 10 === Number(digits[12]);
|
|
188
|
+
}
|
|
189
|
+
function isValidRuOgrnip(value) {
|
|
190
|
+
const digits = digitsOnly(value);
|
|
191
|
+
if (digits.length !== 15 || digits[0] !== "3") {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
return remainder(digits.slice(0, 14), 13) % 10 === Number(digits[14]);
|
|
195
|
+
}
|
|
196
|
+
function compactUpper(value) {
|
|
197
|
+
return (value != null ? value : "").replace(/\s+/g, "").toUpperCase();
|
|
198
|
+
}
|
|
199
|
+
function isValidRuKpp(value) {
|
|
200
|
+
return /^\d{4}[\dA-Z]{2}\d{3}$/.test(compactUpper(value));
|
|
201
|
+
}
|
|
202
|
+
function isValidRuBik(value) {
|
|
203
|
+
return /^[012]\d{8}$/.test(digitsOnly(value));
|
|
204
|
+
}
|
|
205
|
+
var ACCOUNT_W = [7, 1, 3];
|
|
206
|
+
function isValidRuAccount(account, bik) {
|
|
207
|
+
const a = digitsOnly(account);
|
|
208
|
+
const b = digitsOnly(bik);
|
|
209
|
+
if (a.length !== 20 || !isValidRuBik(b)) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
if (a.startsWith("03")) {
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
const rkcKeyed = a.startsWith("30101") || a.startsWith("40102");
|
|
216
|
+
const prefix = rkcKeyed ? "0" + b.slice(4, 6) : b.slice(6, 9);
|
|
217
|
+
const s = prefix + a;
|
|
218
|
+
let sum = 0;
|
|
219
|
+
for (let i = 0; i < s.length; i++) {
|
|
220
|
+
sum += (s.charCodeAt(i) - 48) * ACCOUNT_W[i % 3];
|
|
221
|
+
}
|
|
222
|
+
return sum % 10 === 0;
|
|
223
|
+
}
|
|
224
|
+
function isValidRuIban(value) {
|
|
225
|
+
const s = compactUpper(value);
|
|
226
|
+
if (s.length !== 33 || !s.startsWith("RU") || !/^[0-9A-Z]+$/.test(s)) {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
return isIbanChecksumValid(s);
|
|
230
|
+
}
|
|
231
|
+
var PLATE_RE = new RegExp(
|
|
232
|
+
`^[${RU_PLATE_LETTERS}](\\d{3})[${RU_PLATE_LETTERS}]{2}(\\d{2}|[1-9]\\d{2})$`
|
|
233
|
+
);
|
|
234
|
+
function isValidRuPlate(value) {
|
|
235
|
+
const s = (value != null ? value : "").replace(/\s+/g, "").replace(/_+$/, "").split("").map(toRuPlateChar).join("");
|
|
236
|
+
const m = PLATE_RE.exec(s);
|
|
237
|
+
if (!m) {
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
return m[1] !== "000" && Number(m[2]) !== 0;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// src/validators/uz.ts
|
|
244
|
+
var PINFL_W = [7, 3, 1, 7, 3, 1, 7, 3, 1, 7, 3, 1, 7];
|
|
245
|
+
var CENTURY_BY_FIRST_DIGIT = [0, 1800, 1800, 1900, 1900, 2e3, 2e3];
|
|
246
|
+
function isValidUzPinfl(value) {
|
|
247
|
+
const digits = digitsOnly(value);
|
|
248
|
+
if (digits.length !== 14) {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
const first = Number(digits[0]);
|
|
252
|
+
if (first < 1 || first > 6) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
const day = Number(digits.slice(1, 3));
|
|
256
|
+
const month = Number(digits.slice(3, 5));
|
|
257
|
+
const year = CENTURY_BY_FIRST_DIGIT[first] + Number(digits.slice(5, 7));
|
|
258
|
+
if (!isRealDate(year, month, day)) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
let sum = 0;
|
|
262
|
+
for (let i = 0; i < PINFL_W.length; i++) {
|
|
263
|
+
sum += (digits.charCodeAt(i) - 48) * PINFL_W[i];
|
|
264
|
+
}
|
|
265
|
+
return sum % 10 === Number(digits[13]);
|
|
266
|
+
}
|
|
267
|
+
function isValidUzInn(value) {
|
|
268
|
+
return digitsOnly(value).length === 9;
|
|
91
269
|
}
|
|
92
270
|
// Annotate the CommonJS export names for ESM import in node:
|
|
93
271
|
0 && (module.exports = {
|
|
94
272
|
isValidBin,
|
|
95
273
|
isValidIin,
|
|
96
274
|
isValidKzIban,
|
|
275
|
+
isValidRuAccount,
|
|
276
|
+
isValidRuBik,
|
|
277
|
+
isValidRuIban,
|
|
278
|
+
isValidRuInn,
|
|
279
|
+
isValidRuKpp,
|
|
280
|
+
isValidRuOgrn,
|
|
281
|
+
isValidRuOgrnip,
|
|
282
|
+
isValidRuPlate,
|
|
283
|
+
isValidRuSnils,
|
|
284
|
+
isValidUzInn,
|
|
285
|
+
isValidUzPinfl,
|
|
97
286
|
luhn
|
|
98
287
|
});
|
|
99
288
|
//# sourceMappingURL=validators.cjs.map
|
package/dist/validators.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/validators/index.ts"],"sourcesContent":["function digitsOnly(value: string): string {\n return (value ?? \"\").replace(/\\D/g, \"\");\n}\n\nexport function luhn(value: string): boolean {\n const digits = digitsOnly(value);\n if (digits.length === 0) {\n return false;\n }\n let sum = 0;\n let double = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n let d = digits.charCodeAt(i) - 48;\n if (double) {\n d *= 2;\n if (d > 9) {\n d -= 9;\n }\n }\n sum += d;\n double = !double;\n }\n return sum % 10 === 0;\n}\n\nconst IIN_W1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];\nconst IIN_W2 = [3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2];\n\nfunction iinBinChecksum(value: string): boolean {\n const digits = digitsOnly(value);\n if (digits.length !== 12) {\n return false;\n }\n const d = digits.split(\"\").map(c => c.charCodeAt(0) - 48);\n const weighted = (w: number[]): number =>\n w.reduce((sum, wi, i) => sum + wi * d[i], 0) % 11;\n let control = weighted(IIN_W1);\n if (control === 10) {\n control = weighted(IIN_W2);\n if (control === 10) {\n return false;\n }\n }\n return control === d[11];\n}\n\nexport function isValidIin(value: string): boolean {\n return iinBinChecksum(value);\n}\n\nexport function isValidBin(value: string): boolean {\n return iinBinChecksum(value);\n}\n\nexport function isValidKzIban(value: string): boolean {\n const s = (value ?? \"\").replace(/\\s+/g, \"\").toUpperCase();\n if (s.length !== 20 || !s.startsWith(\"KZ\") || !/^[0-9A-Z]+$/.test(s)) {\n return false;\n }\n const rearranged = s.slice(4) + s.slice(0, 4);\n let remainder = 0;\n for (let i = 0; i < rearranged.length; i++) {\n const ch = rearranged[i];\n // A→10 … Z→35, digits stay as-is\n const chunk = ch >= \"A\" && ch <= \"Z\" ? String(ch.charCodeAt(0) - 55) : ch;\n for (let j = 0; j < chunk.length; j++) {\n remainder = (remainder * 10 + (chunk.charCodeAt(j) - 48)) % 97;\n }\n }\n return remainder === 1;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,WAAW,OAAuB;AACzC,UAAQ,wBAAS,IAAI,QAAQ,OAAO,EAAE;AACxC;AAEO,SAAS,KAAK,OAAwB;AAC3C,QAAM,SAAS,WAAW,KAAK;AAC/B,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AACA,MAAI,MAAM;AACV,MAAI,SAAS;AACb,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,QAAI,IAAI,OAAO,WAAW,CAAC,IAAI;AAC/B,QAAI,QAAQ;AACV,WAAK;AACL,UAAI,IAAI,GAAG;AACT,aAAK;AAAA,MACP;AAAA,IACF;AACA,WAAO;AACP,aAAS,CAAC;AAAA,EACZ;AACA,SAAO,MAAM,OAAO;AACtB;AAEA,IAAM,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE;AACjD,IAAM,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,CAAC;AAEjD,SAAS,eAAe,OAAwB;AAC9C,QAAM,SAAS,WAAW,KAAK;AAC/B,MAAI,OAAO,WAAW,IAAI;AACxB,WAAO;AAAA,EACT;AACA,QAAM,IAAI,OAAO,MAAM,EAAE,EAAE,IAAI,OAAK,EAAE,WAAW,CAAC,IAAI,EAAE;AACxD,QAAM,WAAW,CAAC,MAChB,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM,MAAM,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI;AACjD,MAAI,UAAU,SAAS,MAAM;AAC7B,MAAI,YAAY,IAAI;AAClB,cAAU,SAAS,MAAM;AACzB,QAAI,YAAY,IAAI;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,YAAY,EAAE,EAAE;AACzB;AAEO,SAAS,WAAW,OAAwB;AACjD,SAAO,eAAe,KAAK;AAC7B;AAEO,SAAS,WAAW,OAAwB;AACjD,SAAO,eAAe,KAAK;AAC7B;AAEO,SAAS,cAAc,OAAwB;AACpD,QAAM,KAAK,wBAAS,IAAI,QAAQ,QAAQ,EAAE,EAAE,YAAY;AACxD,MAAI,EAAE,WAAW,MAAM,CAAC,EAAE,WAAW,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,GAAG;AACpE,WAAO;AAAA,EACT;AACA,QAAM,aAAa,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;AAC5C,MAAI,YAAY;AAChB,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,UAAM,KAAK,WAAW,CAAC;AAEvB,UAAM,QAAQ,MAAM,OAAO,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI;AACvE,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,mBAAa,YAAY,MAAM,MAAM,WAAW,CAAC,IAAI,OAAO;AAAA,IAC9D;AAAA,EACF;AACA,SAAO,cAAc;AACvB;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/validators/index.ts","../src/validators/shared.ts","../src/validators/kz.ts","../src/utils/ru-plate.ts","../src/validators/ru.ts","../src/validators/uz.ts"],"sourcesContent":["export { luhn } from \"./shared\";\nexport * from \"./kz\";\nexport * from \"./ru\";\nexport * from \"./uz\";\n","export function digitsOnly(value: string): string {\n return (value ?? \"\").replace(/\\D/g, \"\");\n}\n\n// Remainder of an arbitrary-length digit string (es2019 target: no BigInt literals)\nexport function remainder(numeric: string, modulus: number): number {\n let r = 0;\n for (let i = 0; i < numeric.length; i++) {\n r = (r * 10 + (numeric.charCodeAt(i) - 48)) % modulus;\n }\n return r;\n}\n\n// ISO 7064 MOD-97-10; expects a compact uppercase [0-9A-Z]+ string\nexport function isIbanChecksumValid(iban: string): boolean {\n const rearranged = iban.slice(4) + iban.slice(0, 4);\n let numeric = \"\";\n for (let i = 0; i < rearranged.length; i++) {\n const ch = rearranged[i];\n // A→10 … Z→35, digits stay as-is\n numeric += ch >= \"A\" && ch <= \"Z\" ? String(ch.charCodeAt(0) - 55) : ch;\n }\n return remainder(numeric, 97) === 1;\n}\n\nexport function luhn(value: string): boolean {\n const digits = digitsOnly(value);\n if (digits.length === 0) {\n return false;\n }\n let sum = 0;\n let double = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n let d = digits.charCodeAt(i) - 48;\n if (double) {\n d *= 2;\n if (d > 9) {\n d -= 9;\n }\n }\n sum += d;\n double = !double;\n }\n return sum % 10 === 0;\n}\n\n// Calendar check without the clock (validators must be deterministic)\nexport function isRealDate(year: number, month: number, day: number): boolean {\n if (month < 1 || month > 12 || day < 1) {\n return false;\n }\n const leap = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n const daysInMonth = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n return day <= daysInMonth[month - 1];\n}\n","import { digitsOnly, isIbanChecksumValid } from \"./shared\";\n\nconst IIN_W1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];\nconst IIN_W2 = [3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2];\n\nfunction iinBinChecksum(value: string): boolean {\n const digits = digitsOnly(value);\n if (digits.length !== 12) {\n return false;\n }\n const d = digits.split(\"\").map(c => c.charCodeAt(0) - 48);\n const weighted = (w: number[]): number =>\n w.reduce((sum, wi, i) => sum + wi * d[i], 0) % 11;\n let control = weighted(IIN_W1);\n if (control === 10) {\n control = weighted(IIN_W2);\n if (control === 10) {\n return false;\n }\n }\n return control === d[11];\n}\n\nexport function isValidIin(value: string): boolean {\n return iinBinChecksum(value);\n}\n\nexport function isValidBin(value: string): boolean {\n return iinBinChecksum(value);\n}\n\nexport function isValidKzIban(value: string): boolean {\n const s = (value ?? \"\").replace(/\\s+/g, \"\").toUpperCase();\n if (s.length !== 20 || !s.startsWith(\"KZ\") || !/^[0-9A-Z]+$/.test(s)) {\n return false;\n }\n return isIbanChecksumValid(s);\n}\n","// The 12 Cyrillic letters allowed on Russian plates (ГОСТ Р 50577-2018)\nexport const RU_PLATE_LETTERS = \"АВЕКМНОРСТУХ\";\n\n// Latin look-alikes a user may type on an English layout\nconst LATIN_TO_CYRILLIC: Record<string, string> = {\n A: \"А\", B: \"В\", E: \"Е\", K: \"К\", M: \"М\", H: \"Н\",\n O: \"О\", P: \"Р\", C: \"С\", T: \"Т\", Y: \"У\", X: \"Х\"\n};\n\nexport function toRuPlateChar(char: string): string {\n const upper = char.toUpperCase();\n return LATIN_TO_CYRILLIC[upper] ?? upper;\n}\n","import { digitsOnly, remainder, isIbanChecksumValid } from \"./shared\";\nimport { RU_PLATE_LETTERS, toRuPlateChar } from \"../utils/ru-plate\";\n\nconst INN10_W = [2, 4, 10, 3, 5, 9, 4, 6, 8];\nconst INN12_W1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8];\nconst INN12_W2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8];\nconst SNILS_W = [9, 8, 7, 6, 5, 4, 3, 2, 1];\n// SNILS numbers up to 001-001-998 were issued before the checksum existed\nconst SNILS_UNCHECKED_MAX = 1001998;\n\nfunction toDigits(digits: string): number[] {\n return digits.split(\"\").map(c => c.charCodeAt(0) - 48);\n}\n\nfunction weightedSum(d: number[], weights: number[]): number {\n return weights.reduce((sum, w, i) => sum + w * d[i], 0);\n}\n\nexport function isValidRuInn(value: string): boolean {\n const d = toDigits(digitsOnly(value));\n if (d.length === 10) {\n return weightedSum(d, INN10_W) % 11 % 10 === d[9];\n }\n if (d.length === 12) {\n return (\n weightedSum(d, INN12_W1) % 11 % 10 === d[10] &&\n weightedSum(d, INN12_W2) % 11 % 10 === d[11]\n );\n }\n return false;\n}\n\nexport function isValidRuSnils(value: string): boolean {\n const digits = digitsOnly(value);\n if (digits.length !== 11) {\n return false;\n }\n if (Number(digits.slice(0, 9)) <= SNILS_UNCHECKED_MAX) {\n return true;\n }\n const d = toDigits(digits);\n let control = weightedSum(d, SNILS_W) % 101;\n if (control === 100) {\n control = 0;\n }\n return control === d[9] * 10 + d[10];\n}\n\nexport function isValidRuOgrn(value: string): boolean {\n const digits = digitsOnly(value);\n // 1/5 = OGRN; 2, 6-9 are ГРН record numbers\n if (digits.length !== 13 || (digits[0] !== \"1\" && digits[0] !== \"5\")) {\n return false;\n }\n return remainder(digits.slice(0, 12), 11) % 10 === Number(digits[12]);\n}\n\nexport function isValidRuOgrnip(value: string): boolean {\n const digits = digitsOnly(value);\n if (digits.length !== 15 || digits[0] !== \"3\") {\n return false;\n }\n // the check digit is the last digit of the remainder (10-12 → 0-2)\n return remainder(digits.slice(0, 14), 13) % 10 === Number(digits[14]);\n}\n\nfunction compactUpper(value: string): string {\n return (value ?? \"\").replace(/\\s+/g, \"\").toUpperCase();\n}\n\nexport function isValidRuKpp(value: string): boolean {\n return /^\\d{4}[\\dA-Z]{2}\\d{3}$/.test(compactUpper(value));\n}\n\nexport function isValidRuBik(value: string): boolean {\n // 732-P: first digit 0 (direct), 1 (indirect), 2 (CBR client); legacy BIKs start with 04\n return /^[012]\\d{8}$/.test(digitsOnly(value));\n}\n\nconst ACCOUNT_W = [7, 1, 3];\n\nexport function isValidRuAccount(account: string, bik: string): boolean {\n const a = digitsOnly(account);\n const b = digitsOnly(bik);\n if (a.length !== 20 || !isValidRuBik(b)) {\n return false;\n }\n // Treasury accounts (03…) carry no control key under CBR order 515: structure only.\n if (a.startsWith(\"03\")) {\n return true;\n }\n // Correspondent accounts (30101…) and single treasury accounts (40102…, ЕКС) are keyed\n // with the RKC prefix \"0\" + BIK[4..5]; everything else with the last 3 BIK digits.\n const rkcKeyed = a.startsWith(\"30101\") || a.startsWith(\"40102\");\n const prefix = rkcKeyed ? \"0\" + b.slice(4, 6) : b.slice(6, 9);\n const s = prefix + a;\n let sum = 0;\n for (let i = 0; i < s.length; i++) {\n sum += (s.charCodeAt(i) - 48) * ACCOUNT_W[i % 3];\n }\n return sum % 10 === 0;\n}\n\nexport function isValidRuIban(value: string): boolean {\n const s = compactUpper(value);\n if (s.length !== 33 || !s.startsWith(\"RU\") || !/^[0-9A-Z]+$/.test(s)) {\n return false;\n }\n return isIbanChecksumValid(s);\n}\n\nconst PLATE_RE = new RegExp(\n `^[${RU_PLATE_LETTERS}](\\\\d{3})[${RU_PLATE_LETTERS}]{2}(\\\\d{2}|[1-9]\\\\d{2})$`\n);\n\nexport function isValidRuPlate(value: string): boolean {\n const s = (value ?? \"\").replace(/\\s+/g, \"\").replace(/_+$/, \"\").split(\"\").map(toRuPlateChar).join(\"\");\n const m = PLATE_RE.exec(s);\n if (!m) {\n return false;\n }\n // 000 is never issued; region 00 does not exist\n return m[1] !== \"000\" && Number(m[2]) !== 0;\n}\n","import { digitsOnly, isRealDate } from \"./shared\";\n\n// Cabinet of Ministers resolution No. 177 (12.04.2022): mod 10 with repeating weights 7-3-1\nconst PINFL_W = [7, 3, 1, 7, 3, 1, 7, 3, 1, 7, 3, 1, 7];\n// first digit = sex + century: 1-2 → 1800s, 3-4 → 1900s, 5-6 → 2000s\nconst CENTURY_BY_FIRST_DIGIT = [0, 1800, 1800, 1900, 1900, 2000, 2000];\n\nexport function isValidUzPinfl(value: string): boolean {\n const digits = digitsOnly(value);\n if (digits.length !== 14) {\n return false;\n }\n const first = Number(digits[0]);\n if (first < 1 || first > 6) {\n return false;\n }\n const day = Number(digits.slice(1, 3));\n const month = Number(digits.slice(3, 5));\n const year = CENTURY_BY_FIRST_DIGIT[first] + Number(digits.slice(5, 7));\n if (!isRealDate(year, month, day)) {\n return false;\n }\n let sum = 0;\n for (let i = 0; i < PINFL_W.length; i++) {\n sum += (digits.charCodeAt(i) - 48) * PINFL_W[i];\n }\n return sum % 10 === Number(digits[13]);\n}\n\n// The INN control digit algorithm is not published — length only\nexport function isValidUzInn(value: string): boolean {\n return digitsOnly(value).length === 9;\n}\n"],"mappings":"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","names":[]}
|
package/dist/validators.d.cts
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
declare function luhn(value: string): boolean;
|
|
2
|
+
|
|
2
3
|
declare function isValidIin(value: string): boolean;
|
|
3
4
|
declare function isValidBin(value: string): boolean;
|
|
4
5
|
declare function isValidKzIban(value: string): boolean;
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
declare function isValidRuInn(value: string): boolean;
|
|
8
|
+
declare function isValidRuSnils(value: string): boolean;
|
|
9
|
+
declare function isValidRuOgrn(value: string): boolean;
|
|
10
|
+
declare function isValidRuOgrnip(value: string): boolean;
|
|
11
|
+
declare function isValidRuKpp(value: string): boolean;
|
|
12
|
+
declare function isValidRuBik(value: string): boolean;
|
|
13
|
+
declare function isValidRuAccount(account: string, bik: string): boolean;
|
|
14
|
+
declare function isValidRuIban(value: string): boolean;
|
|
15
|
+
declare function isValidRuPlate(value: string): boolean;
|
|
16
|
+
|
|
17
|
+
declare function isValidUzPinfl(value: string): boolean;
|
|
18
|
+
declare function isValidUzInn(value: string): boolean;
|
|
19
|
+
|
|
20
|
+
export { isValidBin, isValidIin, isValidKzIban, isValidRuAccount, isValidRuBik, isValidRuIban, isValidRuInn, isValidRuKpp, isValidRuOgrn, isValidRuOgrnip, isValidRuPlate, isValidRuSnils, isValidUzInn, isValidUzPinfl, luhn };
|
package/dist/validators.d.ts
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
declare function luhn(value: string): boolean;
|
|
2
|
+
|
|
2
3
|
declare function isValidIin(value: string): boolean;
|
|
3
4
|
declare function isValidBin(value: string): boolean;
|
|
4
5
|
declare function isValidKzIban(value: string): boolean;
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
declare function isValidRuInn(value: string): boolean;
|
|
8
|
+
declare function isValidRuSnils(value: string): boolean;
|
|
9
|
+
declare function isValidRuOgrn(value: string): boolean;
|
|
10
|
+
declare function isValidRuOgrnip(value: string): boolean;
|
|
11
|
+
declare function isValidRuKpp(value: string): boolean;
|
|
12
|
+
declare function isValidRuBik(value: string): boolean;
|
|
13
|
+
declare function isValidRuAccount(account: string, bik: string): boolean;
|
|
14
|
+
declare function isValidRuIban(value: string): boolean;
|
|
15
|
+
declare function isValidRuPlate(value: string): boolean;
|
|
16
|
+
|
|
17
|
+
declare function isValidUzPinfl(value: string): boolean;
|
|
18
|
+
declare function isValidUzInn(value: string): boolean;
|
|
19
|
+
|
|
20
|
+
export { isValidBin, isValidIin, isValidKzIban, isValidRuAccount, isValidRuBik, isValidRuIban, isValidRuInn, isValidRuKpp, isValidRuOgrn, isValidRuOgrnip, isValidRuPlate, isValidRuSnils, isValidUzInn, isValidUzPinfl, luhn };
|