react-input-mask-format 2.4.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 +43 -6
- package/dist/presets.cjs +66 -2
- package/dist/presets.cjs.map +1 -1
- package/dist/presets.d.cts +11 -1
- package/dist/presets.d.ts +11 -1
- package/dist/presets.js +56 -1
- package/dist/presets.js.map +1 -1
- package/dist/validators.cjs +40 -0
- package/dist/validators.cjs.map +1 -1
- package/dist/validators.d.cts +4 -1
- package/dist/validators.d.ts +4 -1
- package/dist/validators.js +38 -0
- package/dist/validators.js.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -5,20 +5,25 @@
|
|
|
5
5
|
[](https://github.com/Temirtator/react-input-mask-format/actions/workflows/ci.yml)
|
|
6
6
|
|
|
7
7
|
General-purpose input masking for React — dates, phone numbers, cards, custom
|
|
8
|
-
tokens, and a growing set of ready-made country packs (Kazakhstan, Russia).
|
|
8
|
+
tokens, and a growing set of ready-made country packs (Kazakhstan, Russia, Uzbekistan).
|
|
9
9
|
Made with attention to UX.
|
|
10
10
|
|
|
11
11
|
A maintained fork of [react-input-mask](https://github.com/sanniassin/react-input-mask).
|
|
12
12
|
|
|
13
13
|
**Live demo:** https://temirtator.github.io/react-input-mask-format/
|
|
14
14
|
|
|
15
|
-
## What's new in 2.
|
|
15
|
+
## What's new in 2.5
|
|
16
16
|
|
|
17
|
-
-
|
|
18
|
-
-
|
|
17
|
+
- Uzbekistan country pack in `react-input-mask-format/presets` — phone, PINFL, INN, bank account, MFO, car plates (individual and company), postal code, passport / ID card, see [Presets](#presets)
|
|
18
|
+
- `isValidUzPinfl` (official 7-3-1 checksum + embedded birth date) and `isValidUzInn` (format) in `react-input-mask-format/validators`, see [Validators](#validators)
|
|
19
19
|
|
|
20
20
|
All additive — no migration needed.
|
|
21
21
|
|
|
22
|
+
### 2.4
|
|
23
|
+
|
|
24
|
+
- Russia country pack in `react-input-mask-format/presets` — phone, INN, SNILS, OGRN/OGRNIP, KPP, BIK, bank account, IBAN, car plate, postal code, passport, see [Presets](#presets)
|
|
25
|
+
- Russian validators in `react-input-mask-format/validators` — INN, SNILS, OGRN/OGRNIP, bank account key (with BIK), IBAN, plate, KPP/BIK format, see [Validators](#validators)
|
|
26
|
+
|
|
22
27
|
### 2.3
|
|
23
28
|
|
|
24
29
|
- `react-input-mask-format/time` — HH:MM (24h) masked input with clamping, see [Time](#time--react-input-mask-formattime)
|
|
@@ -153,7 +158,7 @@ import { kzPhone, kzIban } from "react-input-mask-format/presets";
|
|
|
153
158
|
<InputMask {...kzIban} value={iban} onChange={onChange} />
|
|
154
159
|
```
|
|
155
160
|
|
|
156
|
-
Presets are a country-agnostic system with country packs for Kazakhstan and
|
|
161
|
+
Presets are a country-agnostic system with country packs for Kazakhstan, Russia and Uzbekistan —
|
|
157
162
|
PRs adding other countries are welcome.
|
|
158
163
|
|
|
159
164
|
### Generic
|
|
@@ -199,6 +204,34 @@ Notes:
|
|
|
199
204
|
- `ruPhone` expects the 10-digit national number. A number typed with the domestic
|
|
200
205
|
trunk prefix `8` (`8 912 …`) is read as area code `891`; `+7…` and `7…` input is handled.
|
|
201
206
|
|
|
207
|
+
### Uzbekistan
|
|
208
|
+
|
|
209
|
+
| export | mask | example |
|
|
210
|
+
| --- | --- | --- |
|
|
211
|
+
| `uzPhone` | `+998 (99) 999-99-99` | `+998 (90) 123-45-67` |
|
|
212
|
+
| `uzPinfl` | `99999999999999` | `31210932040247` |
|
|
213
|
+
| `uzInn` | `999999999` | `207086151` |
|
|
214
|
+
| `uzAccount` | `99999 999 9 99999999 999` | `20208 000 9 00600293 001` |
|
|
215
|
+
| `uzMfo` | `99999` | `00417` |
|
|
216
|
+
| `uzPlate` | `99 a 999 aa` (uppercase) | `01 A 123 BC` |
|
|
217
|
+
| `uzPlateCompany` | `99 999 aaa` (uppercase) | `01 123 ABC` |
|
|
218
|
+
| `uzPostal` | `999999` | `100123` |
|
|
219
|
+
| `uzPassport` | `aa9999999` (uppercase) | `AA1234567` |
|
|
220
|
+
|
|
221
|
+
Notes:
|
|
222
|
+
- `uzPhone` takes the 9-digit national number (`90 123 45 67`): type or paste it without the country code.
|
|
223
|
+
Known limitations (a core fix is planned):
|
|
224
|
+
- pasting an international number (`+998 90 123 45 67`, `998901234567`) or a domestic `8 90 …` number
|
|
225
|
+
misreads the prefix — e.g. `+998 90 123 45 67` becomes `+998 (99) 890-12-34`;
|
|
226
|
+
- when setting `value` programmatically, pass the international form (`+998901234567`) or the formatted
|
|
227
|
+
value — bare national digits starting with `9` are misread (`"901234567"` renders `+998 (01) 234-56-7_`).
|
|
228
|
+
Store phones as `+998…`.
|
|
229
|
+
- In the table the mask is shown as users see it; in source the country-code 9s are escaped
|
|
230
|
+
(`"+\\9\\98 (99) 999-99-99"`), because `9` is the digit token.
|
|
231
|
+
- `uzPlate` / `uzPlateCompany` cover the standard individual and company plates;
|
|
232
|
+
personalised plates (since 2026), diplomatic and foreign plates are not supported.
|
|
233
|
+
- Uzbekistan is not in the IBAN registry; bank accounts are 20 digits plus a 5-digit MFO bank code.
|
|
234
|
+
|
|
202
235
|
## Validators
|
|
203
236
|
|
|
204
237
|
Optional checksum validators, separate entry point, zero-deps. Accept raw or formatted
|
|
@@ -208,7 +241,8 @@ input; return `false` on empty/invalid.
|
|
|
208
241
|
import {
|
|
209
242
|
isValidIin, isValidBin, isValidKzIban, luhn,
|
|
210
243
|
isValidRuInn, isValidRuSnils, isValidRuOgrn, isValidRuOgrnip,
|
|
211
|
-
isValidRuKpp, isValidRuBik, isValidRuAccount, isValidRuIban, isValidRuPlate
|
|
244
|
+
isValidRuKpp, isValidRuBik, isValidRuAccount, isValidRuIban, isValidRuPlate,
|
|
245
|
+
isValidUzPinfl, isValidUzInn
|
|
212
246
|
} from "react-input-mask-format/validators";
|
|
213
247
|
|
|
214
248
|
isValidIin("901010123458"); // KZ IIN/BIN mod-11 checksum
|
|
@@ -223,6 +257,9 @@ isValidRuAccount("03100643000000018500", "017003983"); // treasury 03… account
|
|
|
223
257
|
isValidRuIban("RU03 0445 2522 5408 1781 0538 0913 1041 9");
|
|
224
258
|
isValidRuPlate("А 123 ВС 77"); // region 2–3 digits, Latin look-alikes OK
|
|
225
259
|
isValidRuKpp("7707AB001"); isValidRuBik("044525225"); // format only (no checksum exists)
|
|
260
|
+
|
|
261
|
+
isValidUzPinfl("31210932040247"); // PINFL: 7-3-1 checksum + birth date
|
|
262
|
+
isValidUzInn("207086151"); // format only (checksum not published)
|
|
226
263
|
```
|
|
227
264
|
|
|
228
265
|
## `useMask` hook
|
package/dist/presets.cjs
CHANGED
|
@@ -39,7 +39,16 @@ __export(presets_exports, {
|
|
|
39
39
|
ruPhone: () => ruPhone,
|
|
40
40
|
ruPlate: () => ruPlate,
|
|
41
41
|
ruPostal: () => ruPostal,
|
|
42
|
-
ruSnils: () => ruSnils
|
|
42
|
+
ruSnils: () => ruSnils,
|
|
43
|
+
uzAccount: () => uzAccount,
|
|
44
|
+
uzInn: () => uzInn,
|
|
45
|
+
uzMfo: () => uzMfo,
|
|
46
|
+
uzPassport: () => uzPassport,
|
|
47
|
+
uzPhone: () => uzPhone,
|
|
48
|
+
uzPinfl: () => uzPinfl,
|
|
49
|
+
uzPlate: () => uzPlate,
|
|
50
|
+
uzPlateCompany: () => uzPlateCompany,
|
|
51
|
+
uzPostal: () => uzPostal
|
|
43
52
|
});
|
|
44
53
|
module.exports = __toCommonJS(presets_exports);
|
|
45
54
|
|
|
@@ -210,6 +219,52 @@ var ruPassport = {
|
|
|
210
219
|
mask: "9999 999999",
|
|
211
220
|
maskPlaceholder: "_"
|
|
212
221
|
};
|
|
222
|
+
|
|
223
|
+
// src/presets/uz.ts
|
|
224
|
+
var uzPhone = {
|
|
225
|
+
// "9" is a digit token, so the country code's 9s are escaped
|
|
226
|
+
mask: "+\\9\\98 (99) 999-99-99",
|
|
227
|
+
maskPlaceholder: "_"
|
|
228
|
+
};
|
|
229
|
+
var uzPinfl = {
|
|
230
|
+
mask: "99999999999999",
|
|
231
|
+
maskPlaceholder: "_"
|
|
232
|
+
};
|
|
233
|
+
var uzInn = {
|
|
234
|
+
mask: "999999999",
|
|
235
|
+
maskPlaceholder: "_"
|
|
236
|
+
};
|
|
237
|
+
var uzAccount = {
|
|
238
|
+
// balance account · currency · key · client code · serial
|
|
239
|
+
mask: "99999 999 9 99999999 999",
|
|
240
|
+
maskPlaceholder: "_"
|
|
241
|
+
};
|
|
242
|
+
var uzMfo = {
|
|
243
|
+
mask: "99999",
|
|
244
|
+
maskPlaceholder: "_"
|
|
245
|
+
};
|
|
246
|
+
var uzPlate = {
|
|
247
|
+
// individuals: region · letter · 3 digits · 2 letters
|
|
248
|
+
mask: "99 a 999 aa",
|
|
249
|
+
maskPlaceholder: "_",
|
|
250
|
+
transform: "uppercase"
|
|
251
|
+
};
|
|
252
|
+
var uzPlateCompany = {
|
|
253
|
+
// legal entities: region · 3 digits · 3 letters
|
|
254
|
+
mask: "99 999 aaa",
|
|
255
|
+
maskPlaceholder: "_",
|
|
256
|
+
transform: "uppercase"
|
|
257
|
+
};
|
|
258
|
+
var uzPostal = {
|
|
259
|
+
mask: "999999",
|
|
260
|
+
maskPlaceholder: "_"
|
|
261
|
+
};
|
|
262
|
+
var uzPassport = {
|
|
263
|
+
// passport / ID card: 2-letter series + 7 digits
|
|
264
|
+
mask: "aa9999999",
|
|
265
|
+
maskPlaceholder: "_",
|
|
266
|
+
transform: "uppercase"
|
|
267
|
+
};
|
|
213
268
|
// Annotate the CommonJS export names for ESM import in node:
|
|
214
269
|
0 && (module.exports = {
|
|
215
270
|
card,
|
|
@@ -231,6 +286,15 @@ var ruPassport = {
|
|
|
231
286
|
ruPhone,
|
|
232
287
|
ruPlate,
|
|
233
288
|
ruPostal,
|
|
234
|
-
ruSnils
|
|
289
|
+
ruSnils,
|
|
290
|
+
uzAccount,
|
|
291
|
+
uzInn,
|
|
292
|
+
uzMfo,
|
|
293
|
+
uzPassport,
|
|
294
|
+
uzPhone,
|
|
295
|
+
uzPinfl,
|
|
296
|
+
uzPlate,
|
|
297
|
+
uzPlateCompany,
|
|
298
|
+
uzPostal
|
|
235
299
|
});
|
|
236
300
|
//# sourceMappingURL=presets.cjs.map
|
package/dist/presets.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/presets/index.ts","../src/presets/generic.ts","../src/presets/kz.ts","../src/utils/ru-plate.ts","../src/presets/ru.ts"],"sourcesContent":["export type { MaskPreset } from \"./types\";\nexport * from \"./generic\";\nexport * from \"./kz\";\nexport * from \"./ru\";\n","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","// 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 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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/presets/index.ts","../src/presets/generic.ts","../src/presets/kz.ts","../src/utils/ru-plate.ts","../src/presets/ru.ts","../src/presets/uz.ts"],"sourcesContent":["export type { MaskPreset } from \"./types\";\nexport * from \"./generic\";\nexport * from \"./kz\";\nexport * from \"./ru\";\nexport * from \"./uz\";\n","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","// 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 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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,OAAmB;AAAA,EAC9B,MAAM;AAAA,EACN,iBAAiB;AACnB;;;ACHO,IAAM,UAAsB;AAAA,EACjC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,SAAqB;AAAA;AAAA,EAEhC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEA,IAAM,kBAAkB;AACjB,IAAM,UAAsB;AAAA;AAAA,EAEjC,MAAM;AAAA,IACJ;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAC3B;AAAA,IAAiB;AAAA,IAAiB;AAAA,IAAiB;AAAA,IACnD;AAAA,IAAS;AAAA,EACX;AAAA,EACA,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,iBAAiB;AACnB;;;ACtCO,IAAM,mBAAmB;AAGhC,IAAM,oBAA4C;AAAA,EAChD,GAAG;AAAA,EAAK,GAAG;AAAA,EAAK,GAAG;AAAA,EAAK,GAAG;AAAA,EAAK,GAAG;AAAA,EAAK,GAAG;AAAA,EAC3C,GAAG;AAAA,EAAK,GAAG;AAAA,EAAK,GAAG;AAAA,EAAK,GAAG;AAAA,EAAK,GAAG;AAAA,EAAK,GAAG;AAC7C;AAEO,SAAS,cAAc,MAAsB;AATpD;AAUE,QAAM,QAAQ,KAAK,YAAY;AAC/B,UAAO,uBAAkB,KAAK,MAAvB,YAA4B;AACrC;;;ACTA,IAAM,QAAQ;AAEP,IAAM,UAAsB;AAAA;AAAA,EAEjC,MAAM;AAAA,IACJ;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAU;AAAA,IAAO;AAAA,IAAO;AAAA,IAAK;AAAA,IACjD;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAK;AAAA,IAAO;AAAA,IAAO;AAAA,IAAK;AAAA,IAAO;AAAA,EACtD;AAAA,EACA,iBAAiB;AACnB;AAEO,IAAM,cAA0B;AAAA,EACrC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,eAA2B;AAAA,EACtC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,UAAsB;AAAA,EACjC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,SAAqB;AAAA,EAChC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA;AAAA,EAE/B,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,YAAwB;AAAA;AAAA,EAEnC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,SAAqB;AAAA;AAAA,EAEhC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEA,IAAM,kBAAkB,IAAI,OAAO,IAAI,gBAAgB,GAAG;AACnD,IAAM,UAAsB;AAAA;AAAA;AAAA,EAGjC,MAAM;AAAA,IACJ;AAAA,IAAiB;AAAA,IAAK;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAC3C;AAAA,IAAiB;AAAA,IAAiB;AAAA,IAAK;AAAA,IAAO;AAAA,IAAO;AAAA,EACvD;AAAA,EACA,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,aAAyB;AAAA;AAAA,EAEpC,MAAM;AAAA,EACN,iBAAiB;AACnB;;;ACnFO,IAAM,UAAsB;AAAA;AAAA,EAEjC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,UAAsB;AAAA,EACjC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,YAAwB;AAAA;AAAA,EAEnC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,UAAsB;AAAA;AAAA,EAEjC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,iBAA6B;AAAA;AAAA,EAExC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,aAAyB;AAAA;AAAA,EAEpC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;","names":[]}
|
package/dist/presets.d.cts
CHANGED
|
@@ -31,4 +31,14 @@ declare const ruPlate: MaskPreset;
|
|
|
31
31
|
declare const ruPostal: MaskPreset;
|
|
32
32
|
declare const ruPassport: MaskPreset;
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
declare const uzPhone: MaskPreset;
|
|
35
|
+
declare const uzPinfl: MaskPreset;
|
|
36
|
+
declare const uzInn: MaskPreset;
|
|
37
|
+
declare const uzAccount: MaskPreset;
|
|
38
|
+
declare const uzMfo: MaskPreset;
|
|
39
|
+
declare const uzPlate: MaskPreset;
|
|
40
|
+
declare const uzPlateCompany: MaskPreset;
|
|
41
|
+
declare const uzPostal: MaskPreset;
|
|
42
|
+
declare const uzPassport: MaskPreset;
|
|
43
|
+
|
|
44
|
+
export { type MaskPreset, card, kzBin, kzIban, kzIin, kzPhone, kzPlate, kzPostal, ruAccount, ruBik, ruIban, ruInnCompany, ruInnPerson, ruKpp, ruOgrn, ruOgrnip, ruPassport, ruPhone, ruPlate, ruPostal, ruSnils, uzAccount, uzInn, uzMfo, uzPassport, uzPhone, uzPinfl, uzPlate, uzPlateCompany, uzPostal };
|
package/dist/presets.d.ts
CHANGED
|
@@ -31,4 +31,14 @@ declare const ruPlate: MaskPreset;
|
|
|
31
31
|
declare const ruPostal: MaskPreset;
|
|
32
32
|
declare const ruPassport: MaskPreset;
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
declare const uzPhone: MaskPreset;
|
|
35
|
+
declare const uzPinfl: MaskPreset;
|
|
36
|
+
declare const uzInn: MaskPreset;
|
|
37
|
+
declare const uzAccount: MaskPreset;
|
|
38
|
+
declare const uzMfo: MaskPreset;
|
|
39
|
+
declare const uzPlate: MaskPreset;
|
|
40
|
+
declare const uzPlateCompany: MaskPreset;
|
|
41
|
+
declare const uzPostal: MaskPreset;
|
|
42
|
+
declare const uzPassport: MaskPreset;
|
|
43
|
+
|
|
44
|
+
export { type MaskPreset, card, kzBin, kzIban, kzIin, kzPhone, kzPlate, kzPostal, ruAccount, ruBik, ruIban, ruInnCompany, ruInnPerson, ruKpp, ruOgrn, ruOgrnip, ruPassport, ruPhone, ruPlate, ruPostal, ruSnils, uzAccount, uzInn, uzMfo, uzPassport, uzPhone, uzPinfl, uzPlate, uzPlateCompany, uzPostal };
|
package/dist/presets.js
CHANGED
|
@@ -148,6 +148,52 @@ var ruPassport = {
|
|
|
148
148
|
mask: "9999 999999",
|
|
149
149
|
maskPlaceholder: "_"
|
|
150
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
|
+
};
|
|
151
197
|
export {
|
|
152
198
|
card,
|
|
153
199
|
kzBin,
|
|
@@ -168,6 +214,15 @@ export {
|
|
|
168
214
|
ruPhone,
|
|
169
215
|
ruPlate,
|
|
170
216
|
ruPostal,
|
|
171
|
-
ruSnils
|
|
217
|
+
ruSnils,
|
|
218
|
+
uzAccount,
|
|
219
|
+
uzInn,
|
|
220
|
+
uzMfo,
|
|
221
|
+
uzPassport,
|
|
222
|
+
uzPhone,
|
|
223
|
+
uzPinfl,
|
|
224
|
+
uzPlate,
|
|
225
|
+
uzPlateCompany,
|
|
226
|
+
uzPostal
|
|
172
227
|
};
|
|
173
228
|
//# sourceMappingURL=presets.js.map
|
package/dist/presets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/presets/generic.ts","../src/presets/kz.ts","../src/presets/ru.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"],"mappings":";;;;;;AAEO,IAAM,OAAmB;AAAA,EAC9B,MAAM;AAAA,EACN,iBAAiB;AACnB;;;ACHO,IAAM,UAAsB;AAAA,EACjC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,SAAqB;AAAA;AAAA,EAEhC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEA,IAAM,kBAAkB;AACjB,IAAM,UAAsB;AAAA;AAAA,EAEjC,MAAM;AAAA,IACJ;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAC3B;AAAA,IAAiB;AAAA,IAAiB;AAAA,IAAiB;AAAA,IACnD;AAAA,IAAS;AAAA,EACX;AAAA,EACA,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,iBAAiB;AACnB;;;ACpCA,IAAM,QAAQ;AAEP,IAAM,UAAsB;AAAA;AAAA,EAEjC,MAAM;AAAA,IACJ;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAU;AAAA,IAAO;AAAA,IAAO;AAAA,IAAK;AAAA,IACjD;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAK;AAAA,IAAO;AAAA,IAAO;AAAA,IAAK;AAAA,IAAO;AAAA,EACtD;AAAA,EACA,iBAAiB;AACnB;AAEO,IAAM,cAA0B;AAAA,EACrC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,eAA2B;AAAA,EACtC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,UAAsB;AAAA,EACjC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,SAAqB;AAAA,EAChC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA;AAAA,EAE/B,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,YAAwB;AAAA;AAAA,EAEnC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,SAAqB;AAAA;AAAA,EAEhC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEA,IAAM,kBAAkB,IAAI,OAAO,IAAI,gBAAgB,GAAG;AACnD,IAAM,UAAsB;AAAA;AAAA;AAAA,EAGjC,MAAM;AAAA,IACJ;AAAA,IAAiB;AAAA,IAAK;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAC3C;AAAA,IAAiB;AAAA,IAAiB;AAAA,IAAK;AAAA,IAAO;AAAA,IAAO;AAAA,EACvD;AAAA,EACA,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,aAAyB;AAAA;AAAA,EAEpC,MAAM;AAAA,EACN,iBAAiB;AACnB;","names":[]}
|
|
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":";;;;;;AAEO,IAAM,OAAmB;AAAA,EAC9B,MAAM;AAAA,EACN,iBAAiB;AACnB;;;ACHO,IAAM,UAAsB;AAAA,EACjC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,SAAqB;AAAA;AAAA,EAEhC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEA,IAAM,kBAAkB;AACjB,IAAM,UAAsB;AAAA;AAAA,EAEjC,MAAM;AAAA,IACJ;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAC3B;AAAA,IAAiB;AAAA,IAAiB;AAAA,IAAiB;AAAA,IACnD;AAAA,IAAS;AAAA,EACX;AAAA,EACA,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,iBAAiB;AACnB;;;ACpCA,IAAM,QAAQ;AAEP,IAAM,UAAsB;AAAA;AAAA,EAEjC,MAAM;AAAA,IACJ;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAU;AAAA,IAAO;AAAA,IAAO;AAAA,IAAK;AAAA,IACjD;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAK;AAAA,IAAO;AAAA,IAAO;AAAA,IAAK;AAAA,IAAO;AAAA,EACtD;AAAA,EACA,iBAAiB;AACnB;AAEO,IAAM,cAA0B;AAAA,EACrC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,eAA2B;AAAA,EACtC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,UAAsB;AAAA,EACjC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,SAAqB;AAAA,EAChC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA;AAAA,EAE/B,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,YAAwB;AAAA;AAAA,EAEnC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,SAAqB;AAAA;AAAA,EAEhC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEA,IAAM,kBAAkB,IAAI,OAAO,IAAI,gBAAgB,GAAG;AACnD,IAAM,UAAsB;AAAA;AAAA;AAAA,EAGjC,MAAM;AAAA,IACJ;AAAA,IAAiB;AAAA,IAAK;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAC3C;AAAA,IAAiB;AAAA,IAAiB;AAAA,IAAK;AAAA,IAAO;AAAA,IAAO;AAAA,EACvD;AAAA,EACA,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,aAAyB;AAAA;AAAA,EAEpC,MAAM;AAAA,EACN,iBAAiB;AACnB;;;ACnFO,IAAM,UAAsB;AAAA;AAAA,EAEjC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,UAAsB;AAAA,EACjC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,YAAwB;AAAA;AAAA,EAEnC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,UAAsB;AAAA;AAAA,EAEjC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,iBAA6B;AAAA;AAAA,EAExC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,aAAyB;AAAA;AAAA,EAEpC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;","names":[]}
|
package/dist/validators.cjs
CHANGED
|
@@ -32,6 +32,8 @@ __export(validators_exports, {
|
|
|
32
32
|
isValidRuOgrnip: () => isValidRuOgrnip,
|
|
33
33
|
isValidRuPlate: () => isValidRuPlate,
|
|
34
34
|
isValidRuSnils: () => isValidRuSnils,
|
|
35
|
+
isValidUzInn: () => isValidUzInn,
|
|
36
|
+
isValidUzPinfl: () => isValidUzPinfl,
|
|
35
37
|
luhn: () => luhn
|
|
36
38
|
});
|
|
37
39
|
module.exports = __toCommonJS(validators_exports);
|
|
@@ -76,6 +78,14 @@ function luhn(value) {
|
|
|
76
78
|
}
|
|
77
79
|
return sum % 10 === 0;
|
|
78
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
|
+
}
|
|
79
89
|
|
|
80
90
|
// src/validators/kz.ts
|
|
81
91
|
var IIN_W1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
|
|
@@ -229,6 +239,34 @@ function isValidRuPlate(value) {
|
|
|
229
239
|
}
|
|
230
240
|
return m[1] !== "000" && Number(m[2]) !== 0;
|
|
231
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;
|
|
269
|
+
}
|
|
232
270
|
// Annotate the CommonJS export names for ESM import in node:
|
|
233
271
|
0 && (module.exports = {
|
|
234
272
|
isValidBin,
|
|
@@ -243,6 +281,8 @@ function isValidRuPlate(value) {
|
|
|
243
281
|
isValidRuOgrnip,
|
|
244
282
|
isValidRuPlate,
|
|
245
283
|
isValidRuSnils,
|
|
284
|
+
isValidUzInn,
|
|
285
|
+
isValidUzPinfl,
|
|
246
286
|
luhn
|
|
247
287
|
});
|
|
248
288
|
//# sourceMappingURL=validators.cjs.map
|
package/dist/validators.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"],"sourcesContent":["export { luhn } from \"./shared\";\nexport * from \"./kz\";\nexport * from \"./ru\";\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","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"],"mappings":"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","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
|
@@ -14,4 +14,7 @@ declare function isValidRuAccount(account: string, bik: string): boolean;
|
|
|
14
14
|
declare function isValidRuIban(value: string): boolean;
|
|
15
15
|
declare function isValidRuPlate(value: string): boolean;
|
|
16
16
|
|
|
17
|
-
|
|
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
|
@@ -14,4 +14,7 @@ declare function isValidRuAccount(account: string, bik: string): boolean;
|
|
|
14
14
|
declare function isValidRuIban(value: string): boolean;
|
|
15
15
|
declare function isValidRuPlate(value: string): boolean;
|
|
16
16
|
|
|
17
|
-
|
|
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.js
CHANGED
|
@@ -43,6 +43,14 @@ function luhn(value) {
|
|
|
43
43
|
}
|
|
44
44
|
return sum % 10 === 0;
|
|
45
45
|
}
|
|
46
|
+
function isRealDate(year, month, day) {
|
|
47
|
+
if (month < 1 || month > 12 || day < 1) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
const leap = year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
|
|
51
|
+
const daysInMonth = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
52
|
+
return day <= daysInMonth[month - 1];
|
|
53
|
+
}
|
|
46
54
|
|
|
47
55
|
// src/validators/kz.ts
|
|
48
56
|
var IIN_W1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
|
|
@@ -174,6 +182,34 @@ function isValidRuPlate(value) {
|
|
|
174
182
|
}
|
|
175
183
|
return m[1] !== "000" && Number(m[2]) !== 0;
|
|
176
184
|
}
|
|
185
|
+
|
|
186
|
+
// src/validators/uz.ts
|
|
187
|
+
var PINFL_W = [7, 3, 1, 7, 3, 1, 7, 3, 1, 7, 3, 1, 7];
|
|
188
|
+
var CENTURY_BY_FIRST_DIGIT = [0, 1800, 1800, 1900, 1900, 2e3, 2e3];
|
|
189
|
+
function isValidUzPinfl(value) {
|
|
190
|
+
const digits = digitsOnly(value);
|
|
191
|
+
if (digits.length !== 14) {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
const first = Number(digits[0]);
|
|
195
|
+
if (first < 1 || first > 6) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
const day = Number(digits.slice(1, 3));
|
|
199
|
+
const month = Number(digits.slice(3, 5));
|
|
200
|
+
const year = CENTURY_BY_FIRST_DIGIT[first] + Number(digits.slice(5, 7));
|
|
201
|
+
if (!isRealDate(year, month, day)) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
let sum = 0;
|
|
205
|
+
for (let i = 0; i < PINFL_W.length; i++) {
|
|
206
|
+
sum += (digits.charCodeAt(i) - 48) * PINFL_W[i];
|
|
207
|
+
}
|
|
208
|
+
return sum % 10 === Number(digits[13]);
|
|
209
|
+
}
|
|
210
|
+
function isValidUzInn(value) {
|
|
211
|
+
return digitsOnly(value).length === 9;
|
|
212
|
+
}
|
|
177
213
|
export {
|
|
178
214
|
isValidBin,
|
|
179
215
|
isValidIin,
|
|
@@ -187,6 +223,8 @@ export {
|
|
|
187
223
|
isValidRuOgrnip,
|
|
188
224
|
isValidRuPlate,
|
|
189
225
|
isValidRuSnils,
|
|
226
|
+
isValidUzInn,
|
|
227
|
+
isValidUzPinfl,
|
|
190
228
|
luhn
|
|
191
229
|
};
|
|
192
230
|
//# sourceMappingURL=validators.js.map
|
package/dist/validators.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/validators/shared.ts","../src/validators/kz.ts","../src/validators/ru.ts"],"sourcesContent":["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","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","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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/validators/shared.ts","../src/validators/kz.ts","../src/validators/ru.ts","../src/validators/uz.ts"],"sourcesContent":["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","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/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-input-mask-format",
|
|
3
3
|
"description": "Masked input component for React",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.5.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://github.com/Temirtator/react-input-mask-format",
|
|
7
7
|
"license": "MIT",
|
|
@@ -17,7 +17,9 @@
|
|
|
17
17
|
"inn",
|
|
18
18
|
"snils",
|
|
19
19
|
"ogrn",
|
|
20
|
-
"kazakhstan"
|
|
20
|
+
"kazakhstan",
|
|
21
|
+
"uzbekistan",
|
|
22
|
+
"pinfl"
|
|
21
23
|
],
|
|
22
24
|
"peerDependencies": {
|
|
23
25
|
"react": ">=16.8.0"
|