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 CHANGED
@@ -5,12 +5,26 @@
5
5
  [![CI](https://github.com/Temirtator/react-input-mask-format/actions/workflows/ci.yml/badge.svg)](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 ships first).
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
- ## What's new in 2.3
13
+ **Live demo:** https://temirtator.github.io/react-input-mask-format/
14
+
15
+ ## What's new in 2.5
16
+
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
+
20
+ All additive — no migration needed.
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
+
27
+ ### 2.3
14
28
 
15
29
  - `react-input-mask-format/time` — HH:MM (24h) masked input with clamping, see [Time](#time--react-input-mask-formattime)
16
30
 
@@ -144,12 +158,19 @@ import { kzPhone, kzIban } from "react-input-mask-format/presets";
144
158
  <InputMask {...kzIban} value={iban} onChange={onChange} />
145
159
  ```
146
160
 
147
- Presets are a country-agnostic system; Kazakhstan is the first (flagship) country pack —
161
+ Presets are a country-agnostic system with country packs for Kazakhstan, Russia and Uzbekistan —
148
162
  PRs adding other countries are welcome.
149
163
 
164
+ ### Generic
165
+
150
166
  | export | mask | example |
151
167
  | --- | --- | --- |
152
168
  | `card` | `9999 9999 9999 9999` | `4242 4242 4242 4242` |
169
+
170
+ ### Kazakhstan
171
+
172
+ | export | mask | example |
173
+ | --- | --- | --- |
153
174
  | `kzPhone` | `+7 (799) 999-99-99` | `+7 (701) 234-56-78` |
154
175
  | `kzIin` | `999999999999` | `901010123458` |
155
176
  | `kzBin` | `999999999999` | `150340004984` |
@@ -157,17 +178,88 @@ PRs adding other countries are welcome.
157
178
  | `kzPlate` | `123 ABC 02` (letters `ABCEHKMNOPTXY`, uppercase) | `123 ABC 02` |
158
179
  | `kzPostal` | `999999` | `050000` |
159
180
 
181
+ ### Russia
182
+
183
+ | export | mask | example |
184
+ | --- | --- | --- |
185
+ | `ruPhone` | `+7 (999) 999-99-99` (first digit 3/4/8/9) | `+7 (912) 345-67-89` |
186
+ | `ruInnPerson` | `999999999999` | `500100732259` |
187
+ | `ruInnCompany` | `9999999999` | `7707083893` |
188
+ | `ruSnils` | `999-999-999 99` | `112-233-445 95` |
189
+ | `ruOgrn` | `9999999999999` | `1027700132195` |
190
+ | `ruOgrnip` | `999999999999999` | `304500116000157` |
191
+ | `ruKpp` | `9999**999` (uppercase) | `7707AB001` |
192
+ | `ruBik` | `999999999` | `044525225` |
193
+ | `ruAccount` | `99999 999 9 9999 9999999` | `40817 810 5 3809 1310419` |
194
+ | `ruIban` | `RU99 9999 9999 9999 99** **** **** **** *` (uppercase) | `RU03 0445 2522 5408 1781 0538 0913 1041 9` |
195
+ | `ruPlate` | `А 999 АА 999` (letters `АВЕКМНОРСТУХ`) | `А 123 ВС 77` |
196
+ | `ruPostal` | `999999` | `101000` |
197
+ | `ruPassport` | `9999 999999` | `4506 123456` |
198
+
199
+ Notes:
200
+ - `ruPlate` accepts Latin look-alikes (`A B E K M H O P C T Y X`) and stores **Cyrillic**.
201
+ Regions are 2 or 3 digits: with a 2-digit region the value ends with the placeholder
202
+ (`А 123 ВС 77_`). `isValidRuPlate` accepts both forms (a gap inside the plate is invalid); strip `_` before storing if you need the bare plate.
203
+ - `ruPlate` covers type-1 (passenger car) plates only — not taxi, trailer, motorcycle, or diplomatic plates.
204
+ - `ruPhone` expects the 10-digit national number. A number typed with the domestic
205
+ trunk prefix `8` (`8 912 …`) is read as area code `891`; `+7…` and `7…` input is handled.
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
+
160
235
  ## Validators
161
236
 
162
237
  Optional checksum validators, separate entry point, zero-deps. Accept raw or formatted
163
238
  input; return `false` on empty/invalid.
164
239
 
165
240
  ```jsx
166
- import { isValidIin, isValidBin, isValidKzIban, luhn } from "react-input-mask-format/validators";
167
-
168
- isValidIin("901010123458"); // KZ IIN/BIN mod-11 checksum
169
- isValidKzIban("KZ86 125K ZT50 0410 0100"); // ISO 7064 MOD-97
170
- luhn("4242 4242 4242 4242"); // card Luhn
241
+ import {
242
+ isValidIin, isValidBin, isValidKzIban, luhn,
243
+ isValidRuInn, isValidRuSnils, isValidRuOgrn, isValidRuOgrnip,
244
+ isValidRuKpp, isValidRuBik, isValidRuAccount, isValidRuIban, isValidRuPlate,
245
+ isValidUzPinfl, isValidUzInn
246
+ } from "react-input-mask-format/validators";
247
+
248
+ isValidIin("901010123458"); // KZ IIN/BIN mod-11 checksum
249
+ isValidKzIban("KZ86 125K ZT50 0410 0100"); // ISO 7064 MOD-97
250
+ luhn("4242 4242 4242 4242"); // card Luhn
251
+
252
+ isValidRuInn("7707083893"); // 10 (company) or 12 (person) digits
253
+ isValidRuSnils("112-233-445 95"); // mod-101; ≤ 001-001-998 not checked
254
+ isValidRuOgrn("1027700132195"); // OGRN (13) · isValidRuOgrnip — 15
255
+ isValidRuAccount("40817810538091310419", "044525225"); // account control key with BIK
256
+ isValidRuAccount("03100643000000018500", "017003983"); // treasury 03… accounts: structure only (no control key)
257
+ isValidRuIban("RU03 0445 2522 5408 1781 0538 0913 1041 9");
258
+ isValidRuPlate("А 123 ВС 77"); // region 2–3 digits, Latin look-alikes OK
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)
171
263
  ```
172
264
 
173
265
  ## `useMask` hook
@@ -0,0 +1,27 @@
1
+ // src/utils/ru-plate.ts
2
+ var RU_PLATE_LETTERS = "\u0410\u0412\u0415\u041A\u041C\u041D\u041E\u0420\u0421\u0422\u0423\u0425";
3
+ var LATIN_TO_CYRILLIC = {
4
+ A: "\u0410",
5
+ B: "\u0412",
6
+ E: "\u0415",
7
+ K: "\u041A",
8
+ M: "\u041C",
9
+ H: "\u041D",
10
+ O: "\u041E",
11
+ P: "\u0420",
12
+ C: "\u0421",
13
+ T: "\u0422",
14
+ Y: "\u0423",
15
+ X: "\u0425"
16
+ };
17
+ function toRuPlateChar(char) {
18
+ var _a;
19
+ const upper = char.toUpperCase();
20
+ return (_a = LATIN_TO_CYRILLIC[upper]) != null ? _a : upper;
21
+ }
22
+
23
+ export {
24
+ RU_PLATE_LETTERS,
25
+ toRuPlateChar
26
+ };
27
+ //# sourceMappingURL=chunk-OMKRB5AE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/ru-plate.ts"],"sourcesContent":["// 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"],"mappings":";AACO,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;","names":[]}
package/dist/presets.cjs CHANGED
@@ -26,13 +26,39 @@ __export(presets_exports, {
26
26
  kzIin: () => kzIin,
27
27
  kzPhone: () => kzPhone,
28
28
  kzPlate: () => kzPlate,
29
- kzPostal: () => kzPostal
29
+ kzPostal: () => kzPostal,
30
+ ruAccount: () => ruAccount,
31
+ ruBik: () => ruBik,
32
+ ruIban: () => ruIban,
33
+ ruInnCompany: () => ruInnCompany,
34
+ ruInnPerson: () => ruInnPerson,
35
+ ruKpp: () => ruKpp,
36
+ ruOgrn: () => ruOgrn,
37
+ ruOgrnip: () => ruOgrnip,
38
+ ruPassport: () => ruPassport,
39
+ ruPhone: () => ruPhone,
40
+ ruPlate: () => ruPlate,
41
+ ruPostal: () => ruPostal,
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
30
52
  });
31
53
  module.exports = __toCommonJS(presets_exports);
54
+
55
+ // src/presets/generic.ts
32
56
  var card = {
33
57
  mask: "9999 9999 9999 9999",
34
58
  maskPlaceholder: "_"
35
59
  };
60
+
61
+ // src/presets/kz.ts
36
62
  var kzPhone = {
37
63
  mask: "+7 (799) 999-99-99",
38
64
  maskPlaceholder: "_"
@@ -73,6 +99,172 @@ var kzPostal = {
73
99
  mask: "999999",
74
100
  maskPlaceholder: "_"
75
101
  };
102
+
103
+ // src/utils/ru-plate.ts
104
+ var RU_PLATE_LETTERS = "\u0410\u0412\u0415\u041A\u041C\u041D\u041E\u0420\u0421\u0422\u0423\u0425";
105
+ var LATIN_TO_CYRILLIC = {
106
+ A: "\u0410",
107
+ B: "\u0412",
108
+ E: "\u0415",
109
+ K: "\u041A",
110
+ M: "\u041C",
111
+ H: "\u041D",
112
+ O: "\u041E",
113
+ P: "\u0420",
114
+ C: "\u0421",
115
+ T: "\u0422",
116
+ Y: "\u0423",
117
+ X: "\u0425"
118
+ };
119
+ function toRuPlateChar(char) {
120
+ var _a;
121
+ const upper = char.toUpperCase();
122
+ return (_a = LATIN_TO_CYRILLIC[upper]) != null ? _a : upper;
123
+ }
124
+
125
+ // src/presets/ru.ts
126
+ var DIGIT = /[0-9]/;
127
+ var ruPhone = {
128
+ // national number starts with 3/4/8/9; 6/7 belong to Kazakhstan
129
+ mask: [
130
+ "+",
131
+ "7",
132
+ " ",
133
+ "(",
134
+ /[3489]/,
135
+ DIGIT,
136
+ DIGIT,
137
+ ")",
138
+ " ",
139
+ DIGIT,
140
+ DIGIT,
141
+ DIGIT,
142
+ "-",
143
+ DIGIT,
144
+ DIGIT,
145
+ "-",
146
+ DIGIT,
147
+ DIGIT
148
+ ],
149
+ maskPlaceholder: "_"
150
+ };
151
+ var ruInnPerson = {
152
+ mask: "999999999999",
153
+ maskPlaceholder: "_"
154
+ };
155
+ var ruInnCompany = {
156
+ mask: "9999999999",
157
+ maskPlaceholder: "_"
158
+ };
159
+ var ruSnils = {
160
+ mask: "999-999-999 99",
161
+ maskPlaceholder: "_"
162
+ };
163
+ var ruOgrn = {
164
+ mask: "9999999999999",
165
+ maskPlaceholder: "_"
166
+ };
167
+ var ruOgrnip = {
168
+ mask: "999999999999999",
169
+ maskPlaceholder: "_"
170
+ };
171
+ var ruKpp = {
172
+ // positions 5-6 may be Latin A-Z
173
+ mask: "9999**999",
174
+ maskPlaceholder: "_",
175
+ transform: "uppercase"
176
+ };
177
+ var ruBik = {
178
+ mask: "999999999",
179
+ maskPlaceholder: "_"
180
+ };
181
+ var ruAccount = {
182
+ // balance account · currency · check key · branch · account
183
+ mask: "99999 999 9 9999 9999999",
184
+ maskPlaceholder: "_"
185
+ };
186
+ var ruIban = {
187
+ // RU + 2 check + BIK (9) + 5 digits + 15 alnum, grouped by 4
188
+ mask: "RU99 9999 9999 9999 99** **** **** **** *",
189
+ maskPlaceholder: "_",
190
+ transform: "uppercase"
191
+ };
192
+ var RU_PLATE_LETTER = new RegExp(`[${RU_PLATE_LETTERS}]`);
193
+ var ruPlate = {
194
+ // letter · 3 digits · 2 letters · region (2 or 3 digits). A 2-digit region
195
+ // leaves the trailing placeholder (А 123 ВС 77_), which isValidRuPlate accepts.
196
+ mask: [
197
+ RU_PLATE_LETTER,
198
+ " ",
199
+ DIGIT,
200
+ DIGIT,
201
+ DIGIT,
202
+ " ",
203
+ RU_PLATE_LETTER,
204
+ RU_PLATE_LETTER,
205
+ " ",
206
+ DIGIT,
207
+ DIGIT,
208
+ DIGIT
209
+ ],
210
+ maskPlaceholder: "_",
211
+ transform: toRuPlateChar
212
+ };
213
+ var ruPostal = {
214
+ mask: "999999",
215
+ maskPlaceholder: "_"
216
+ };
217
+ var ruPassport = {
218
+ // series (4) + number (6), as entered on Gosuslugi
219
+ mask: "9999 999999",
220
+ maskPlaceholder: "_"
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
+ };
76
268
  // Annotate the CommonJS export names for ESM import in node:
77
269
  0 && (module.exports = {
78
270
  card,
@@ -81,6 +273,28 @@ var kzPostal = {
81
273
  kzIin,
82
274
  kzPhone,
83
275
  kzPlate,
84
- kzPostal
276
+ kzPostal,
277
+ ruAccount,
278
+ ruBik,
279
+ ruIban,
280
+ ruInnCompany,
281
+ ruInnPerson,
282
+ ruKpp,
283
+ ruOgrn,
284
+ ruOgrnip,
285
+ ruPassport,
286
+ ruPhone,
287
+ ruPlate,
288
+ ruPostal,
289
+ ruSnils,
290
+ uzAccount,
291
+ uzInn,
292
+ uzMfo,
293
+ uzPassport,
294
+ uzPhone,
295
+ uzPinfl,
296
+ uzPlate,
297
+ uzPlateCompany,
298
+ uzPostal
85
299
  });
86
300
  //# sourceMappingURL=presets.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/presets/index.ts"],"sourcesContent":["import type { Mask, Transform, FormatChars } from \"../types\";\n\nexport interface MaskPreset {\n mask: Mask;\n maskPlaceholder?: string | null;\n transform?: Transform;\n formatChars?: FormatChars;\n}\n\n// ── Generic (country-agnostic) ───────────────────────────────\nexport const card: MaskPreset = {\n mask: \"9999 9999 9999 9999\",\n maskPlaceholder: \"_\"\n};\n\n// ── Kazakhstan ───────────────────────────────────────────────\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"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUO,IAAM,OAAmB;AAAA,EAC9B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAGO,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;","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":"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","names":[]}
@@ -7,7 +7,9 @@ interface MaskPreset {
7
7
  transform?: Transform;
8
8
  formatChars?: FormatChars;
9
9
  }
10
+
10
11
  declare const card: MaskPreset;
12
+
11
13
  declare const kzPhone: MaskPreset;
12
14
  declare const kzIin: MaskPreset;
13
15
  declare const kzBin: MaskPreset;
@@ -15,4 +17,28 @@ declare const kzIban: MaskPreset;
15
17
  declare const kzPlate: MaskPreset;
16
18
  declare const kzPostal: MaskPreset;
17
19
 
18
- export { type MaskPreset, card, kzBin, kzIban, kzIin, kzPhone, kzPlate, kzPostal };
20
+ declare const ruPhone: MaskPreset;
21
+ declare const ruInnPerson: MaskPreset;
22
+ declare const ruInnCompany: MaskPreset;
23
+ declare const ruSnils: MaskPreset;
24
+ declare const ruOgrn: MaskPreset;
25
+ declare const ruOgrnip: MaskPreset;
26
+ declare const ruKpp: MaskPreset;
27
+ declare const ruBik: MaskPreset;
28
+ declare const ruAccount: MaskPreset;
29
+ declare const ruIban: MaskPreset;
30
+ declare const ruPlate: MaskPreset;
31
+ declare const ruPostal: MaskPreset;
32
+ declare const ruPassport: MaskPreset;
33
+
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
@@ -7,7 +7,9 @@ interface MaskPreset {
7
7
  transform?: Transform;
8
8
  formatChars?: FormatChars;
9
9
  }
10
+
10
11
  declare const card: MaskPreset;
12
+
11
13
  declare const kzPhone: MaskPreset;
12
14
  declare const kzIin: MaskPreset;
13
15
  declare const kzBin: MaskPreset;
@@ -15,4 +17,28 @@ declare const kzIban: MaskPreset;
15
17
  declare const kzPlate: MaskPreset;
16
18
  declare const kzPostal: MaskPreset;
17
19
 
18
- export { type MaskPreset, card, kzBin, kzIban, kzIin, kzPhone, kzPlate, kzPostal };
20
+ declare const ruPhone: MaskPreset;
21
+ declare const ruInnPerson: MaskPreset;
22
+ declare const ruInnCompany: MaskPreset;
23
+ declare const ruSnils: MaskPreset;
24
+ declare const ruOgrn: MaskPreset;
25
+ declare const ruOgrnip: MaskPreset;
26
+ declare const ruKpp: MaskPreset;
27
+ declare const ruBik: MaskPreset;
28
+ declare const ruAccount: MaskPreset;
29
+ declare const ruIban: MaskPreset;
30
+ declare const ruPlate: MaskPreset;
31
+ declare const ruPostal: MaskPreset;
32
+ declare const ruPassport: MaskPreset;
33
+
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 };