myanmar-nrc-validator 1.0.0 → 1.0.2

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.
@@ -0,0 +1,336 @@
1
+ {
2
+ "stateCode": "12",
3
+ "stateNameEn": "Yangon Region",
4
+ "stateNameMm": "ရန်ကုန်တိုင်းဒေသကြီး",
5
+ "townships": [
6
+ {
7
+ "en": "ALANA",
8
+ "mm": "အလန",
9
+ "code": 12,
10
+ "fullEn": "AaLaNa",
11
+ "fullMm": "အလုံ"
12
+ },
13
+ {
14
+ "en": "BAHANA",
15
+ "mm": "ဗဟန",
16
+ "code": 12,
17
+ "fullEn": "BaHaNa",
18
+ "fullMm": "ဗဟန်း"
19
+ },
20
+ {
21
+ "en": "BATATHA",
22
+ "mm": "ဗတထ",
23
+ "code": 12,
24
+ "fullEn": "BaTaHta",
25
+ "fullMm": "ဗိုလ်တထောင်"
26
+ },
27
+ {
28
+ "en": "KAKAKA",
29
+ "mm": "ကကက",
30
+ "code": 12,
31
+ "fullEn": "KaKaKa",
32
+ "fullMm": "ကိုကိုးကျွန်း"
33
+ },
34
+ {
35
+ "en": "DAGANA",
36
+ "mm": "ဒဂန",
37
+ "code": 12,
38
+ "fullEn": "DaGaNa",
39
+ "fullMm": "ဒဂုံ"
40
+ },
41
+ {
42
+ "en": "DAGARA",
43
+ "mm": "ဒဂရ",
44
+ "code": 12,
45
+ "fullEn": "DaGaYa",
46
+ "fullMm": "ဒဂုံမြို့သစ်(အရှေ့ပိုင်း)"
47
+ },
48
+ {
49
+ "en": "DAGAMA",
50
+ "mm": "ဒဂမ",
51
+ "code": 12,
52
+ "fullEn": "DaGaMa",
53
+ "fullMm": "ဒဂုံမြို့သစ်(မြောက်ပိုင်း)"
54
+ },
55
+ {
56
+ "en": "DACHAKA",
57
+ "mm": "ဒဆက",
58
+ "code": 12,
59
+ "fullEn": "DaSaKa",
60
+ "fullMm": "ဒဂုံမြို့သစ်ဆိပ်ကမ်း"
61
+ },
62
+ {
63
+ "en": "DAGATA",
64
+ "mm": "ဒဂတ",
65
+ "code": 12,
66
+ "fullEn": "DaGaTa",
67
+ "fullMm": "ဒဂုံမြို့သစ်(တောင်ပိုင်း)"
68
+ },
69
+ {
70
+ "en": "DALANA",
71
+ "mm": "ဒလန",
72
+ "code": 12,
73
+ "fullEn": "DaLaNa",
74
+ "fullMm": "ဒလ"
75
+ },
76
+ {
77
+ "en": "DAPANA",
78
+ "mm": "ဒပန",
79
+ "code": 12,
80
+ "fullEn": "DaPaNa",
81
+ "fullMm": "ဒေါပုံ"
82
+ },
83
+ {
84
+ "en": "LAMANA",
85
+ "mm": "လမန",
86
+ "code": 12,
87
+ "fullEn": "LaMaNa",
88
+ "fullMm": "လှိုင်"
89
+ },
90
+ {
91
+ "en": "LASAYA",
92
+ "mm": "လသယ",
93
+ "code": 12,
94
+ "fullEn": "LaThaYa",
95
+ "fullMm": "လှိုင်သာယာ"
96
+ },
97
+ {
98
+ "en": "LAKANA",
99
+ "mm": "လကန",
100
+ "code": 12,
101
+ "fullEn": "LaKaNa",
102
+ "fullMm": "လှည်းကူး"
103
+ },
104
+ {
105
+ "en": "MABHANA",
106
+ "mm": "မဘန",
107
+ "code": 12,
108
+ "fullEn": "MaBaNa",
109
+ "fullMm": "မှော်ဘီ"
110
+ },
111
+ {
112
+ "en": "THATAPA",
113
+ "mm": "ထတပ",
114
+ "code": 12,
115
+ "fullEn": "HtaTaPa",
116
+ "fullMm": "ထန်းတပင်"
117
+ },
118
+ {
119
+ "en": "ACANA",
120
+ "mm": "အစန",
121
+ "code": 12,
122
+ "fullEn": "AhSaNa",
123
+ "fullMm": "အင်းစိန်"
124
+ },
125
+ {
126
+ "en": "KAMARA",
127
+ "mm": "ကမရ",
128
+ "code": 12,
129
+ "fullEn": "KaMaYa",
130
+ "fullMm": "ကမာရွတ်"
131
+ },
132
+ {
133
+ "en": "KAMANA",
134
+ "mm": "ကမန",
135
+ "code": 12,
136
+ "fullEn": "KaMaNa",
137
+ "fullMm": "ကော့မှုုး"
138
+ },
139
+ {
140
+ "en": "KHARANA",
141
+ "mm": "ခရန",
142
+ "code": 12,
143
+ "fullEn": "KhaYaNa",
144
+ "fullMm": "ခရမ်း"
145
+ },
146
+ {
147
+ "en": "KAKHAKA",
148
+ "mm": "ကခက",
149
+ "code": 12,
150
+ "fullEn": "KaKhaKa",
151
+ "fullMm": "ကွမ်းခြံကုန်း"
152
+ },
153
+ {
154
+ "en": "KATATA",
155
+ "mm": "ကတတ",
156
+ "code": 12,
157
+ "fullEn": "KaTaTa",
158
+ "fullMm": "ကျောက်တံတား"
159
+ },
160
+ {
161
+ "en": "KATANA",
162
+ "mm": "ကတန",
163
+ "code": 12,
164
+ "fullEn": "KaTaNa",
165
+ "fullMm": "ကျောက်တန်း"
166
+ },
167
+ {
168
+ "en": "KAMATA",
169
+ "mm": "ကမတ",
170
+ "code": 12,
171
+ "fullEn": "KaMaTa",
172
+ "fullMm": "ကြည့်မြင်တိုင်"
173
+ },
174
+ {
175
+ "en": "LAMATA",
176
+ "mm": "လမတ",
177
+ "code": 12,
178
+ "fullEn": "LaMata",
179
+ "fullMm": "လမ်းမတော်"
180
+ },
181
+ {
182
+ "en": "LASANA",
183
+ "mm": "လသန",
184
+ "code": 12,
185
+ "fullEn": "LaThaNa",
186
+ "fullMm": "လသာ"
187
+ },
188
+ {
189
+ "en": "MARAKA",
190
+ "mm": "မရက",
191
+ "code": 12,
192
+ "fullEn": "MaYaKa",
193
+ "fullMm": "မရမ်းကုန်း"
194
+ },
195
+ {
196
+ "en": "MAGATA",
197
+ "mm": "မဂတ",
198
+ "code": 12,
199
+ "fullEn": "MaGaTa",
200
+ "fullMm": "မင်္ဂလာတောင်ညွှန့်"
201
+ },
202
+ {
203
+ "en": "MAGADA",
204
+ "mm": "မဂဒ",
205
+ "code": 12,
206
+ "fullEn": "MaGaDa",
207
+ "fullMm": "မင်္ဂလာဒုံ"
208
+ },
209
+ {
210
+ "en": "UKAMA",
211
+ "mm": "ဥကမ",
212
+ "code": 12,
213
+ "fullEn": "OuKaMa",
214
+ "fullMm": "မြောက်ဥက္ကလာပ"
215
+ },
216
+ {
217
+ "en": "PABHATA",
218
+ "mm": "ပဘတ",
219
+ "code": 12,
220
+ "fullEn": "PaBaTa",
221
+ "fullMm": "ပန်းဘဲတန်း"
222
+ },
223
+ {
224
+ "en": "PAZATA",
225
+ "mm": "ပဇတ",
226
+ "code": 12,
227
+ "fullEn": "PaZaDa",
228
+ "fullMm": "ပုဇွန်တောင်"
229
+ },
230
+ {
231
+ "en": "CAKHANA",
232
+ "mm": "စခန",
233
+ "code": 12,
234
+ "fullEn": "SaKhaNa",
235
+ "fullMm": "စမ်းချောင်း"
236
+ },
237
+ {
238
+ "en": "CHAKAKHA",
239
+ "mm": "ဆကခ",
240
+ "code": 12,
241
+ "fullEn": "SaKakha",
242
+ "fullMm": "ဆိပ်ကြီးခနောင်တို"
243
+ },
244
+ {
245
+ "en": "CHAKANA",
246
+ "mm": "ဆကန",
247
+ "code": 12,
248
+ "fullEn": "SaKaNa",
249
+ "fullMm": "ဆိပ်ကမ်း"
250
+ },
251
+ {
252
+ "en": "RAPAKA",
253
+ "mm": "ရပက",
254
+ "code": 12,
255
+ "fullEn": "YaPaKa",
256
+ "fullMm": "ရွှေပေါက်ကံ"
257
+ },
258
+ {
259
+ "en": "RAPASA",
260
+ "mm": "ရပသ",
261
+ "code": 12,
262
+ "fullEn": "YaPaTha",
263
+ "fullMm": "ရွှေပြည်သာ"
264
+ },
265
+ {
266
+ "en": "UKATA",
267
+ "mm": "ဥကတ",
268
+ "code": 12,
269
+ "fullEn": "OuKaTa",
270
+ "fullMm": "တောင်ဥက္ကလာပ"
271
+ },
272
+ {
273
+ "en": "TAKANA",
274
+ "mm": "တကန",
275
+ "code": 12,
276
+ "fullEn": "TaKaNa",
277
+ "fullMm": "တိုက်ကြီး"
278
+ },
279
+ {
280
+ "en": "TAMANA",
281
+ "mm": "တမန",
282
+ "code": 12,
283
+ "fullEn": "TaMaNa",
284
+ "fullMm": "တာမွေ"
285
+ },
286
+ {
287
+ "en": "SAKATA",
288
+ "mm": "သကတ",
289
+ "code": 12,
290
+ "fullEn": "ThaKaTa",
291
+ "fullMm": "သာကေတ"
292
+ },
293
+ {
294
+ "en": "SALANA",
295
+ "mm": "သလန",
296
+ "code": 12,
297
+ "fullEn": "ThaLaNa",
298
+ "fullMm": "သန်လျင်"
299
+ },
300
+ {
301
+ "en": "SAGHAKA",
302
+ "mm": "သဃက",
303
+ "code": 12,
304
+ "fullEn": "ThaGaKa",
305
+ "fullMm": "သင်္ဃန်းကျွန်း"
306
+ },
307
+ {
308
+ "en": "SAKHANA",
309
+ "mm": "သခန",
310
+ "code": 12,
311
+ "fullEn": "ThaKhaNa",
312
+ "fullMm": "သုံးခွ"
313
+ },
314
+ {
315
+ "en": "TATANA",
316
+ "mm": "တတန",
317
+ "code": 12,
318
+ "fullEn": "TaTaNa",
319
+ "fullMm": "တွံတေး"
320
+ },
321
+ {
322
+ "en": "RAKANA",
323
+ "mm": "ရကန",
324
+ "code": 12,
325
+ "fullEn": "YaKaNa",
326
+ "fullMm": "ရန်ကင်း"
327
+ },
328
+ {
329
+ "en": "TATHTA",
330
+ "mm": "တတထ",
331
+ "code": 12,
332
+ "fullEn": "TaTaHta",
333
+ "fullMm": "တံတား"
334
+ }
335
+ ]
336
+ }
package/dist/index.d.ts CHANGED
@@ -1,15 +1,14 @@
1
- /**
2
- * မြန်မာ NRC နံပါတ် မှန်/မမှန် စစ်ဆေးပေးသော Function
3
- * ဥပမာ - "12/ဥကမ(နိုင်)123456" သို့မဟုတ် "12/Oukama(N)123456"
4
- */
5
- export declare function validateNRC(nrcString: string): boolean;
6
- /**
7
- * NRC နံပါတ်ကို အပိုင်းလိုက် ခွဲထုတ်လိုပါက အသုံးပြုနိုင်သော Helper Function
8
- */
9
- export declare function parseNRC(nrcString: string): {
10
- stateCode: string | undefined;
11
- township: string | undefined;
12
- type: string | undefined;
13
- number: string | undefined;
14
- } | null;
1
+ export declare const STATE_REGIONS: Record<string, {
2
+ en: string;
3
+ mm: string;
4
+ }>;
5
+ export declare const CITIZENSHIP_TYPES: Record<string, {
6
+ en: string;
7
+ mm: string;
8
+ }>;
9
+ export { validateNRC, isValidTownship } from "./utils/validator.js";
10
+ export { parseNRC } from "./utils/parser.js";
11
+ export type { ParsedNRC } from "./utils/parser.js";
12
+ export { composeNRC } from "./utils/composer.js";
13
+ export type { ComposeOptions, CitizenType } from "./utils/composer.js";
15
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CActD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM;;;;;SAczC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,EAAiB,MAAM,CAC/C,MAAM,EACN;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAC3B,CAAC;AACF,eAAO,MAAM,iBAAiB,EAAkC,MAAM,CACpE,MAAM,EACN;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAC3B,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,32 +1,8 @@
1
- /**
2
- * မြန်မာ NRC နံပါတ် မှန်/မမှန် စစ်ဆေးပေးသော Function
3
- * ဥပမာ - "12/ဥကမ(နိုင်)123456" သို့မဟုတ် "12/Oukama(N)123456"
4
- */
5
- export function validateNRC(nrcString) {
6
- if (!nrcString || typeof nrcString !== "string") {
7
- return false;
8
- }
9
- // Space များကို ဖယ်ရှားခြင်း
10
- const cleaned = nrcString.trim();
11
- // မြန်မာ NRC Regex Pattern (State/Region + Township + (N/Naing/နိုင်) + 6 digits)
12
- // ဥပမာ - ၁၂/ဥကမ(နိုင်)၁၂၃၄၅၆ သို့မဟုတ် 12/Oukama(N)123456
13
- const nrcPattern = /^[0-9]{1,2}\/[А-Яa-z\u1000-\u109F]+(\(N\)|\(Naing\)|\(နိုင်\)|\(NAING\))[0-9]{6}$/i;
14
- return nrcPattern.test(cleaned);
15
- }
16
- /**
17
- * NRC နံပါတ်ကို အပိုင်းလိုက် ခွဲထုတ်လိုပါက အသုံးပြုနိုင်သော Helper Function
18
- */
19
- export function parseNRC(nrcString) {
20
- if (!validateNRC(nrcString)) {
21
- return null;
22
- }
23
- const cleaned = nrcString.trim();
24
- const parts = cleaned.split(/\/|\(|\)/);
25
- return {
26
- stateCode: parts[0],
27
- township: parts[1],
28
- type: parts[2],
29
- number: parts[3],
30
- };
31
- }
1
+ import statesData from "./data/states.json" with { type: "json" };
2
+ import citizenTypesData from "./data/citizen-types.json" with { type: "json" };
3
+ export const STATE_REGIONS = statesData;
4
+ export const CITIZENSHIP_TYPES = citizenTypesData;
5
+ export { validateNRC, isValidTownship } from "./utils/validator.js";
6
+ export { parseNRC } from "./utils/parser.js";
7
+ export { composeNRC } from "./utils/composer.js";
32
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6BAA6B;IAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAEjC,kFAAkF;IAClF,0DAA0D;IAC1D,MAAM,UAAU,GACd,oFAAoF,CAAC;IAEvF,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,SAAiB;IACxC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAExC,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QACnB,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAClB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;KACjB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAClE,OAAO,gBAAgB,MAAM,2BAA2B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAE/E,MAAM,CAAC,MAAM,aAAa,GAAG,UAG5B,CAAC;AACF,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAGhC,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type CitizenType = "N" | "P" | "A" | "T" | "နိုင်" | "ပြု" | "ဧည့်" | "ယာယီ";
2
+ export interface ComposeOptions {
3
+ stateCode: string | number;
4
+ township: string;
5
+ type: CitizenType;
6
+ number: string | number;
7
+ }
8
+ export declare function composeNRC(options: ComposeOptions): string | null;
9
+ //# sourceMappingURL=composer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../src/utils/composer.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GACnB,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,OAAO,GACP,KAAK,GACL,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CA2CjE"}
@@ -0,0 +1,39 @@
1
+ import { isValidTownship } from "./validator.js";
2
+ export function composeNRC(options) {
3
+ if (!options)
4
+ return null;
5
+ const { stateCode, township, type, number } = options;
6
+ if (stateCode === undefined || !township || !type || number === undefined) {
7
+ return null;
8
+ }
9
+ const stateStr = String(stateCode).trim();
10
+ const townshipStr = String(township).trim().toUpperCase();
11
+ const typeStr = String(type).trim();
12
+ const numStr = String(number).trim();
13
+ const stateNum = parseInt(stateStr, 10);
14
+ if (isNaN(stateNum) || stateNum < 1 || stateNum > 14) {
15
+ return null;
16
+ }
17
+ if (!isValidTownship(stateStr, townshipStr)) {
18
+ return null;
19
+ }
20
+ const validTypes = [
21
+ "N",
22
+ "P",
23
+ "A",
24
+ "T",
25
+ "နိုင်",
26
+ "ပြု",
27
+ "ဧည့်",
28
+ "ယာယီ",
29
+ ];
30
+ if (!validTypes.includes(typeStr)) {
31
+ return null;
32
+ }
33
+ const cleanNumber = numStr.replace(/[^0-9]/g, "");
34
+ if (cleanNumber.length !== 6) {
35
+ return null;
36
+ }
37
+ return `${stateNum}/${townshipStr}(${typeStr})${cleanNumber}`;
38
+ }
39
+ //# sourceMappingURL=composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.js","sourceRoot":"","sources":["../../src/utils/composer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAmBjD,MAAM,UAAU,UAAU,CAAC,OAAuB;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEtD,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAErC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAkB;QAChC,GAAG;QACH,GAAG;QACH,GAAG;QACH,GAAG;QACH,OAAO;QACP,KAAK;QACL,MAAM;QACN,MAAM;KACP,CAAC;IACF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAsB,CAAC,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAClD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAG,QAAQ,IAAI,WAAW,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;AAChE,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface ParsedNRC {
2
+ stateCode: string;
3
+ stateNameEn: string;
4
+ stateNameMm: string;
5
+ township: string;
6
+ type: string;
7
+ number: string;
8
+ raw: string;
9
+ }
10
+ export declare function parseNRC(nrcString: string): ParsedNRC | null;
11
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/utils/parser.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAuC5D"}
@@ -0,0 +1,35 @@
1
+ import statesData from "../data/states.json" with { type: "json" };
2
+ import { validateNRC, isValidTownship, normalizeDigits } from "./validator.js";
3
+ const STATE_REGIONS = statesData;
4
+ export function parseNRC(nrcString) {
5
+ if (!nrcString || typeof nrcString !== "string") {
6
+ return null;
7
+ }
8
+ const normalized = normalizeDigits(nrcString.trim());
9
+ if (!validateNRC(normalized)) {
10
+ return null;
11
+ }
12
+ const regex = /^([1-9]|1[0-4])\/([A-Za-z\u1000-\u109F]+)\(([^)]+)\)([0-9]{6})$/;
13
+ const match = normalized.match(regex);
14
+ if (!match || !match[1] || !match[2] || !match[3] || !match[4]) {
15
+ return null;
16
+ }
17
+ const stateCode = match[1];
18
+ const township = match[2].toUpperCase();
19
+ const type = match[3];
20
+ const number = match[4];
21
+ if (!isValidTownship(stateCode, township)) {
22
+ return null;
23
+ }
24
+ const stateInfo = STATE_REGIONS[stateCode] || { en: "", mm: "" };
25
+ return {
26
+ stateCode,
27
+ stateNameEn: stateInfo.en,
28
+ stateNameMm: stateInfo.mm,
29
+ township,
30
+ type,
31
+ number,
32
+ raw: nrcString.trim(),
33
+ };
34
+ }
35
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/utils/parser.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,qBAAqB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE/E,MAAM,aAAa,GAAG,UAAwD,CAAC;AAY/E,MAAM,UAAU,QAAQ,CAAC,SAAiB;IACxC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAErD,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GACT,iEAAiE,CAAC;IACpE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEtC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAW,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAEjE,OAAO;QACL,SAAS;QACT,WAAW,EAAE,SAAS,CAAC,EAAE;QACzB,WAAW,EAAE,SAAS,CAAC,EAAE;QACzB,QAAQ;QACR,IAAI;QACJ,MAAM;QACN,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function normalizeDigits(input: string): string;
2
+ export declare function validateNRC(nrcString: string): boolean;
3
+ export declare function isValidTownship(stateCode: string, townshipCode: string): boolean;
4
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAgCA,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAerD;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAStD;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAeT"}
@@ -0,0 +1,67 @@
1
+ import kachinData from "../data/townships/kachin.json" with { type: "json" };
2
+ import kayahData from "../data/townships/kayah.json" with { type: "json" };
3
+ import kayinData from "../data/townships/kayin.json" with { type: "json" };
4
+ import chinData from "../data/townships/chin.json" with { type: "json" };
5
+ import sagaingData from "../data/townships/sagaing.json" with { type: "json" };
6
+ import tanintharyiData from "../data/townships/tanintharyi.json" with { type: "json" };
7
+ import bagoData from "../data/townships/bago.json" with { type: "json" };
8
+ import magwayData from "../data/townships/magway.json" with { type: "json" };
9
+ import mandalayData from "../data/townships/mandalay.json" with { type: "json" };
10
+ import monData from "../data/townships/mon.json" with { type: "json" };
11
+ import rakhineData from "../data/townships/rakhine.json" with { type: "json" };
12
+ import yangonData from "../data/townships/yangon.json" with { type: "json" };
13
+ import shanData from "../data/townships/shan.json" with { type: "json" };
14
+ import ayeyarwadyData from "../data/townships/ayeyarwady.json" with { type: "json" };
15
+ const TOWNSHIP_FILES = {
16
+ "1": kachinData,
17
+ "2": kayahData,
18
+ "3": kayinData,
19
+ "4": chinData,
20
+ "5": sagaingData,
21
+ "6": tanintharyiData,
22
+ "7": bagoData,
23
+ "8": magwayData,
24
+ "9": mandalayData,
25
+ "10": monData,
26
+ "11": rakhineData,
27
+ "12": yangonData,
28
+ "13": shanData,
29
+ "14": ayeyarwadyData,
30
+ };
31
+ export function normalizeDigits(input) {
32
+ if (!input)
33
+ return "";
34
+ const mmDigits = {
35
+ "၀": "0",
36
+ "၁": "1",
37
+ "၂": "2",
38
+ "၃": "3",
39
+ "၄": "4",
40
+ "၅": "5",
41
+ "၆": "6",
42
+ "၇": "7",
43
+ "၈": "8",
44
+ "၉": "9",
45
+ };
46
+ return input.replace(/[၀-၉]/g, (digit) => mmDigits[digit] || digit);
47
+ }
48
+ export function validateNRC(nrcString) {
49
+ if (!nrcString || typeof nrcString !== "string")
50
+ return false;
51
+ const cleaned = normalizeDigits(nrcString.trim());
52
+ const nrcPattern = /^([1-9]|1[0-4])\/([A-Za-z\u1000-\u109F]+)\((N|P|A|T|နိုင်|ပြု|ဧည့်|ယာယီ)\)([0-9]{6})$/i;
53
+ return nrcPattern.test(cleaned);
54
+ }
55
+ export function isValidTownship(stateCode, townshipCode) {
56
+ if (!stateCode || !townshipCode)
57
+ return false;
58
+ const stateFile = TOWNSHIP_FILES[stateCode];
59
+ if (!stateFile || !stateFile.townships)
60
+ return false;
61
+ const query = townshipCode.toUpperCase();
62
+ return stateFile.townships.some((t) => t.en.toUpperCase() === query ||
63
+ t.mm === townshipCode ||
64
+ t.fullEn.toUpperCase() === query ||
65
+ t.fullMm === townshipCode);
66
+ }
67
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myanmar-nrc-validator",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "A simple npm package to validate Myanmar NRC numbers",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",