@stll/stdnum 0.0.1 → 2.0.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.
Files changed (808) hide show
  1. package/LICENSE +1 -5
  2. package/README.md +28 -4
  3. package/dist/_checksums/luhn.js.map +1 -1
  4. package/dist/_checksums/mod1110.js +1 -1
  5. package/dist/_checksums/mod1110.js.map +1 -1
  6. package/dist/_checksums/mod112.js +5 -5
  7. package/dist/_checksums/mod112.js.map +1 -1
  8. package/dist/_checksums/mod97.js.map +1 -1
  9. package/dist/_checksums/verhoeff.js.map +1 -1
  10. package/dist/_checksums/weighted-sum.js.map +1 -1
  11. package/dist/_util/arabic.js.map +1 -1
  12. package/dist/_util/clean.js.map +1 -1
  13. package/dist/_util/date.js.map +1 -1
  14. package/dist/_util/generate.d.ts +13 -1
  15. package/dist/_util/generate.js +23 -1
  16. package/dist/_util/generate.js.map +1 -1
  17. package/dist/_util/result.js.map +1 -1
  18. package/dist/_util/strings.js.map +1 -1
  19. package/dist/ad/mod.d.ts +3 -2
  20. package/dist/ad/nrt.d.ts +16 -2
  21. package/dist/ad/nrt.js +4 -16
  22. package/dist/ad/nrt.js.map +1 -1
  23. package/dist/ae/eid.d.ts +2 -3
  24. package/dist/ae/eid.js +2 -12
  25. package/dist/ae/eid.js.map +1 -1
  26. package/dist/ae/mod.d.ts +3 -2
  27. package/dist/ai/mod.d.ts +3 -2
  28. package/dist/ai/tin.d.ts +20 -2
  29. package/dist/ai/tin.js +1 -18
  30. package/dist/ai/tin.js.map +1 -1
  31. package/dist/al/mod.d.ts +3 -2
  32. package/dist/al/nipt.d.ts +13 -2
  33. package/dist/al/nipt.js +1 -11
  34. package/dist/al/nipt.js.map +1 -1
  35. package/dist/am/mod.d.ts +3 -2
  36. package/dist/am/tin.d.ts +16 -2
  37. package/dist/am/tin.js +1 -14
  38. package/dist/am/tin.js.map +1 -1
  39. package/dist/ar/cbu.d.ts +2 -3
  40. package/dist/ar/cbu.js +2 -10
  41. package/dist/ar/cbu.js.map +1 -1
  42. package/dist/ar/cuit.d.ts +2 -3
  43. package/dist/ar/cuit.js +13 -29
  44. package/dist/ar/cuit.js.map +1 -1
  45. package/dist/ar/dni.d.ts +11 -2
  46. package/dist/ar/dni.js +1 -9
  47. package/dist/ar/dni.js.map +1 -1
  48. package/dist/ar/mod.d.ts +3 -2
  49. package/dist/at/businessid.d.ts +10 -2
  50. package/dist/at/businessid.js +1 -8
  51. package/dist/at/businessid.js.map +1 -1
  52. package/dist/at/mod.d.ts +3 -2
  53. package/dist/at/tin.d.ts +2 -3
  54. package/dist/at/tin.js +1 -11
  55. package/dist/at/tin.js.map +1 -1
  56. package/dist/at/uid.d.ts +2 -3
  57. package/dist/at/uid.js +2 -10
  58. package/dist/at/uid.js.map +1 -1
  59. package/dist/at/vnr.d.ts +5 -4
  60. package/dist/at/vnr.js +23 -16
  61. package/dist/at/vnr.js.map +1 -1
  62. package/dist/au/abn.d.ts +2 -3
  63. package/dist/au/abn.js +1 -10
  64. package/dist/au/abn.js.map +1 -1
  65. package/dist/au/acn.d.ts +2 -3
  66. package/dist/au/acn.js +1 -10
  67. package/dist/au/acn.js.map +1 -1
  68. package/dist/au/mod.d.ts +3 -2
  69. package/dist/au/tfn.d.ts +2 -3
  70. package/dist/au/tfn.js +1 -10
  71. package/dist/au/tfn.js.map +1 -1
  72. package/dist/az/mod.d.ts +3 -2
  73. package/dist/az/voen.d.ts +2 -3
  74. package/dist/az/voen.js +1 -14
  75. package/dist/az/voen.js.map +1 -1
  76. package/dist/ba/jmbg.d.ts +2 -3
  77. package/dist/ba/jmbg.js +4 -11
  78. package/dist/ba/jmbg.js.map +1 -1
  79. package/dist/ba/mod.d.ts +3 -2
  80. package/dist/bd/mod.d.ts +3 -2
  81. package/dist/bd/nid.d.ts +23 -2
  82. package/dist/bd/nid.js +11 -32
  83. package/dist/bd/nid.js.map +1 -1
  84. package/dist/be/bis.d.ts +2 -3
  85. package/dist/be/bis.js +1 -11
  86. package/dist/be/bis.js.map +1 -1
  87. package/dist/be/mod.d.ts +3 -2
  88. package/dist/be/nn.d.ts +2 -3
  89. package/dist/be/nn.js +1 -11
  90. package/dist/be/nn.js.map +1 -1
  91. package/dist/be/vat.d.ts +2 -3
  92. package/dist/be/vat.js +1 -9
  93. package/dist/be/vat.js.map +1 -1
  94. package/dist/bg/egn.d.ts +2 -3
  95. package/dist/bg/egn.js +5 -13
  96. package/dist/bg/egn.js.map +1 -1
  97. package/dist/bg/mod.d.ts +3 -2
  98. package/dist/bg/pnf.d.ts +2 -3
  99. package/dist/bg/pnf.js +1 -8
  100. package/dist/bg/pnf.js.map +1 -1
  101. package/dist/bg/vat.d.ts +2 -3
  102. package/dist/bg/vat.js +3 -9
  103. package/dist/bg/vat.js.map +1 -1
  104. package/dist/bh/cpr.d.ts +5 -4
  105. package/dist/bh/cpr.js +9 -19
  106. package/dist/bh/cpr.js.map +1 -1
  107. package/dist/bh/mod.d.ts +3 -2
  108. package/dist/bic.d.ts +13 -2
  109. package/dist/bic.js +14 -26
  110. package/dist/bic.js.map +1 -1
  111. package/dist/br/cnpj.d.ts +2 -3
  112. package/dist/br/cnpj.js +1 -20
  113. package/dist/br/cnpj.js.map +1 -1
  114. package/dist/br/cpf.d.ts +2 -3
  115. package/dist/br/cpf.js +1 -14
  116. package/dist/br/cpf.js.map +1 -1
  117. package/dist/br/mod.d.ts +3 -2
  118. package/dist/by/mod.d.ts +3 -2
  119. package/dist/by/unp.d.ts +2 -3
  120. package/dist/by/unp.js +9 -17
  121. package/dist/by/unp.js.map +1 -1
  122. package/dist/bz/mod.d.ts +3 -2
  123. package/dist/bz/tin.d.ts +5 -4
  124. package/dist/bz/tin.js +10 -27
  125. package/dist/bz/tin.js.map +1 -1
  126. package/dist/ca/bn.d.ts +2 -3
  127. package/dist/ca/bn.js +2 -10
  128. package/dist/ca/bn.js.map +1 -1
  129. package/dist/ca/mod.d.ts +3 -2
  130. package/dist/ca/sin.d.ts +2 -3
  131. package/dist/ca/sin.js +2 -10
  132. package/dist/ca/sin.js.map +1 -1
  133. package/dist/ch/mod.d.ts +3 -2
  134. package/dist/ch/ssn.d.ts +2 -3
  135. package/dist/ch/ssn.js +1 -9
  136. package/dist/ch/ssn.js.map +1 -1
  137. package/dist/ch/uid.d.ts +2 -3
  138. package/dist/ch/uid.js +1 -9
  139. package/dist/ch/uid.js.map +1 -1
  140. package/dist/ch/vat.d.ts +2 -3
  141. package/dist/ch/vat.js +1 -9
  142. package/dist/ch/vat.js.map +1 -1
  143. package/dist/cl/mod.d.ts +3 -2
  144. package/dist/cl/rut.d.ts +2 -3
  145. package/dist/cl/rut.js +2 -15
  146. package/dist/cl/rut.js.map +1 -1
  147. package/dist/cn/mod.d.ts +3 -2
  148. package/dist/cn/ric.d.ts +2 -3
  149. package/dist/cn/ric.js +4 -14
  150. package/dist/cn/ric.js.map +1 -1
  151. package/dist/cn/uscc.d.ts +2 -3
  152. package/dist/cn/uscc.js +8 -16
  153. package/dist/cn/uscc.js.map +1 -1
  154. package/dist/co/mod.d.ts +3 -2
  155. package/dist/co/nit.d.ts +2 -3
  156. package/dist/co/nit.js +6 -13
  157. package/dist/co/nit.js.map +1 -1
  158. package/dist/cr/cpf.d.ts +18 -2
  159. package/dist/cr/cpf.js +5 -19
  160. package/dist/cr/cpf.js.map +1 -1
  161. package/dist/cr/mod.d.ts +3 -2
  162. package/dist/creditcard.d.ts +2 -3
  163. package/dist/creditcard.js +5 -14
  164. package/dist/creditcard.js.map +1 -1
  165. package/dist/cu/mod.d.ts +3 -2
  166. package/dist/cu/ni.d.ts +5 -4
  167. package/dist/cu/ni.js +13 -18
  168. package/dist/cu/ni.js.map +1 -1
  169. package/dist/cy/mod.d.ts +3 -2
  170. package/dist/cy/vat.d.ts +2 -3
  171. package/dist/cy/vat.js +1 -8
  172. package/dist/cy/vat.js.map +1 -1
  173. package/dist/cz/dic.d.ts +2 -3
  174. package/dist/cz/dic.js +7 -13
  175. package/dist/cz/dic.js.map +1 -1
  176. package/dist/cz/ico.d.ts +2 -3
  177. package/dist/cz/ico.js +2 -10
  178. package/dist/cz/ico.js.map +1 -1
  179. package/dist/cz/mod.d.ts +3 -2
  180. package/dist/cz/rc.d.ts +2 -3
  181. package/dist/cz/rc.js +22 -21
  182. package/dist/cz/rc.js.map +1 -1
  183. package/dist/de/handelsreg.d.ts +19 -2
  184. package/dist/de/handelsreg.js +10 -26
  185. package/dist/de/handelsreg.js.map +1 -1
  186. package/dist/de/idnr.d.ts +2 -3
  187. package/dist/de/idnr.js +2 -12
  188. package/dist/de/idnr.js.map +1 -1
  189. package/dist/de/mod.d.ts +3 -2
  190. package/dist/de/stnr.d.ts +17 -3
  191. package/dist/de/stnr.js +1 -15
  192. package/dist/de/stnr.js.map +1 -1
  193. package/dist/de/svnr.d.ts +2 -3
  194. package/dist/de/svnr.js +4 -13
  195. package/dist/de/svnr.js.map +1 -1
  196. package/dist/de/vat.d.ts +2 -3
  197. package/dist/de/vat.js +2 -11
  198. package/dist/de/vat.js.map +1 -1
  199. package/dist/dk/cpr.d.ts +5 -4
  200. package/dist/dk/cpr.js +14 -12
  201. package/dist/dk/cpr.js.map +1 -1
  202. package/dist/dk/cvr.d.ts +2 -3
  203. package/dist/dk/cvr.js +2 -15
  204. package/dist/dk/cvr.js.map +1 -1
  205. package/dist/dk/mod.d.ts +3 -2
  206. package/dist/dk/vat.d.ts +2 -3
  207. package/dist/dk/vat.js +3 -13
  208. package/dist/dk/vat.js.map +1 -1
  209. package/dist/do/mod.d.ts +3 -2
  210. package/dist/do/rnc.d.ts +2 -3
  211. package/dist/do/rnc.js +3 -17
  212. package/dist/do/rnc.js.map +1 -1
  213. package/dist/ec/mod.d.ts +3 -2
  214. package/dist/ec/ruc.d.ts +2 -3
  215. package/dist/ec/ruc.js +2 -19
  216. package/dist/ec/ruc.js.map +1 -1
  217. package/dist/ee/ik.d.ts +2 -3
  218. package/dist/ee/ik.js +6 -15
  219. package/dist/ee/ik.js.map +1 -1
  220. package/dist/ee/mod.d.ts +3 -2
  221. package/dist/ee/registrikood.d.ts +2 -3
  222. package/dist/ee/registrikood.js +9 -15
  223. package/dist/ee/registrikood.js.map +1 -1
  224. package/dist/ee/vat.d.ts +2 -3
  225. package/dist/ee/vat.js +2 -10
  226. package/dist/ee/vat.js.map +1 -1
  227. package/dist/eg/mod.d.ts +3 -2
  228. package/dist/eg/tn.d.ts +11 -2
  229. package/dist/eg/tn.js +1 -9
  230. package/dist/eg/tn.js.map +1 -1
  231. package/dist/es/cif.d.ts +2 -3
  232. package/dist/es/cif.js +3 -12
  233. package/dist/es/cif.js.map +1 -1
  234. package/dist/es/dni.d.ts +2 -3
  235. package/dist/es/dni.js +1 -9
  236. package/dist/es/dni.js.map +1 -1
  237. package/dist/es/mod.d.ts +3 -2
  238. package/dist/es/nie.d.ts +2 -3
  239. package/dist/es/nie.js +14 -22
  240. package/dist/es/nie.js.map +1 -1
  241. package/dist/es/nss.d.ts +2 -3
  242. package/dist/es/nss.js +1 -16
  243. package/dist/es/nss.js.map +1 -1
  244. package/dist/es/vat.d.ts +2 -3
  245. package/dist/es/vat.js +5 -10
  246. package/dist/es/vat.js.map +1 -1
  247. package/dist/eu/mod.d.ts +3 -2
  248. package/dist/eu/vat.d.ts +5 -4
  249. package/dist/eu/vat.js +44 -2
  250. package/dist/eu/vat.js.map +1 -1
  251. package/dist/fi/hetu.d.ts +5 -4
  252. package/dist/fi/hetu.js +19 -12
  253. package/dist/fi/hetu.js.map +1 -1
  254. package/dist/fi/mod.d.ts +3 -2
  255. package/dist/fi/vat.d.ts +2 -3
  256. package/dist/fi/vat.js +3 -10
  257. package/dist/fi/vat.js.map +1 -1
  258. package/dist/fi/ytunnus.d.ts +2 -3
  259. package/dist/fi/ytunnus.js +2 -10
  260. package/dist/fi/ytunnus.js.map +1 -1
  261. package/dist/fr/mod.d.ts +3 -2
  262. package/dist/fr/nif.d.ts +2 -3
  263. package/dist/fr/nif.js +1 -9
  264. package/dist/fr/nif.js.map +1 -1
  265. package/dist/fr/nir.d.ts +2 -3
  266. package/dist/fr/nir.js +3 -14
  267. package/dist/fr/nir.js.map +1 -1
  268. package/dist/fr/siren.d.ts +2 -3
  269. package/dist/fr/siren.js +2 -10
  270. package/dist/fr/siren.js.map +1 -1
  271. package/dist/fr/siret.d.ts +2 -3
  272. package/dist/fr/siret.js +2 -11
  273. package/dist/fr/siret.js.map +1 -1
  274. package/dist/fr/tva.d.ts +2 -3
  275. package/dist/fr/tva.js +2 -12
  276. package/dist/fr/tva.js.map +1 -1
  277. package/dist/gb/mod.d.ts +3 -2
  278. package/dist/gb/nino.d.ts +12 -2
  279. package/dist/gb/nino.js +8 -17
  280. package/dist/gb/nino.js.map +1 -1
  281. package/dist/gb/sedol.d.ts +2 -3
  282. package/dist/gb/sedol.js +9 -18
  283. package/dist/gb/sedol.js.map +1 -1
  284. package/dist/gb/utr.d.ts +2 -3
  285. package/dist/gb/utr.js +2 -10
  286. package/dist/gb/utr.js.map +1 -1
  287. package/dist/gb/vat.d.ts +2 -3
  288. package/dist/gb/vat.js +2 -11
  289. package/dist/gb/vat.js.map +1 -1
  290. package/dist/ge/mod.d.ts +3 -2
  291. package/dist/ge/pin.d.ts +14 -2
  292. package/dist/ge/pin.js +1 -12
  293. package/dist/ge/pin.js.map +1 -1
  294. package/dist/gh/mod.d.ts +3 -2
  295. package/dist/gh/tin.d.ts +2 -3
  296. package/dist/gh/tin.js +10 -24
  297. package/dist/gh/tin.js.map +1 -1
  298. package/dist/gr/amka.d.ts +2 -3
  299. package/dist/gr/amka.js +3 -11
  300. package/dist/gr/amka.js.map +1 -1
  301. package/dist/gr/mod.d.ts +3 -2
  302. package/dist/gr/vat.d.ts +2 -3
  303. package/dist/gr/vat.js +1 -10
  304. package/dist/gr/vat.js.map +1 -1
  305. package/dist/gt/mod.d.ts +3 -2
  306. package/dist/gt/nit.d.ts +2 -3
  307. package/dist/gt/nit.js +6 -14
  308. package/dist/gt/nit.js.map +1 -1
  309. package/dist/hk/hkid.d.ts +2 -3
  310. package/dist/hk/hkid.js +2 -10
  311. package/dist/hk/hkid.js.map +1 -1
  312. package/dist/hk/mod.d.ts +3 -2
  313. package/dist/hr/mod.d.ts +3 -2
  314. package/dist/hr/vat.d.ts +2 -3
  315. package/dist/hr/vat.js +2 -9
  316. package/dist/hr/vat.js.map +1 -1
  317. package/dist/hu/mod.d.ts +3 -2
  318. package/dist/hu/vat.d.ts +2 -3
  319. package/dist/hu/vat.js +3 -10
  320. package/dist/hu/vat.js.map +1 -1
  321. package/dist/iban.d.ts +2 -3
  322. package/dist/iban.js +2 -8
  323. package/dist/iban.js.map +1 -1
  324. package/dist/id/mod.d.ts +3 -2
  325. package/dist/id/npwp.d.ts +2 -3
  326. package/dist/id/npwp.js +3 -13
  327. package/dist/id/npwp.js.map +1 -1
  328. package/dist/ie/mod.d.ts +3 -2
  329. package/dist/ie/pps.d.ts +2 -3
  330. package/dist/ie/pps.js +1 -10
  331. package/dist/ie/pps.js.map +1 -1
  332. package/dist/ie/vat.d.ts +2 -3
  333. package/dist/ie/vat.js +1 -9
  334. package/dist/ie/vat.js.map +1 -1
  335. package/dist/il/idnr.d.ts +2 -3
  336. package/dist/il/idnr.js +2 -9
  337. package/dist/il/idnr.js.map +1 -1
  338. package/dist/il/mod.d.ts +3 -2
  339. package/dist/in/aadhaar.d.ts +2 -3
  340. package/dist/in/aadhaar.js +2 -12
  341. package/dist/in/aadhaar.js.map +1 -1
  342. package/dist/in/gstin.d.ts +2 -3
  343. package/dist/in/gstin.js +4 -11
  344. package/dist/in/gstin.js.map +1 -1
  345. package/dist/in/mod.d.ts +3 -2
  346. package/dist/in/pan.d.ts +15 -2
  347. package/dist/in/pan.js +3 -15
  348. package/dist/in/pan.js.map +1 -1
  349. package/dist/index.d.ts +2 -2
  350. package/dist/index.js +6 -6
  351. package/dist/iq/mod.d.ts +3 -2
  352. package/dist/iq/nid.d.ts +16 -2
  353. package/dist/iq/nid.js +2 -15
  354. package/dist/iq/nid.js.map +1 -1
  355. package/dist/ir/mod.d.ts +3 -2
  356. package/dist/ir/nid.d.ts +2 -3
  357. package/dist/ir/nid.js +2 -24
  358. package/dist/ir/nid.js.map +1 -1
  359. package/dist/is/kennitala.d.ts +2 -3
  360. package/dist/is/kennitala.js +2 -13
  361. package/dist/is/kennitala.js.map +1 -1
  362. package/dist/is/mod.d.ts +3 -2
  363. package/dist/is/vsk.d.ts +9 -2
  364. package/dist/is/vsk.js +1 -7
  365. package/dist/is/vsk.js.map +1 -1
  366. package/dist/isin.d.ts +2 -3
  367. package/dist/isin.js +11 -21
  368. package/dist/isin.js.map +1 -1
  369. package/dist/it/codicefiscale.d.ts +5 -4
  370. package/dist/it/codicefiscale.js +27 -23
  371. package/dist/it/codicefiscale.js.map +1 -1
  372. package/dist/it/iva.d.ts +2 -3
  373. package/dist/it/iva.js +2 -9
  374. package/dist/it/iva.js.map +1 -1
  375. package/dist/it/mod.d.ts +3 -2
  376. package/dist/jp/cn.d.ts +2 -3
  377. package/dist/jp/cn.js +1 -9
  378. package/dist/jp/cn.js.map +1 -1
  379. package/dist/jp/mod.d.ts +3 -2
  380. package/dist/jp/mynumber.d.ts +2 -3
  381. package/dist/jp/mynumber.js +1 -10
  382. package/dist/jp/mynumber.js.map +1 -1
  383. package/dist/kr/brn.d.ts +11 -2
  384. package/dist/kr/brn.js +1 -9
  385. package/dist/kr/brn.js.map +1 -1
  386. package/dist/kr/mod.d.ts +3 -2
  387. package/dist/kr/rrn.d.ts +5 -4
  388. package/dist/kr/rrn.js +15 -13
  389. package/dist/kr/rrn.js.map +1 -1
  390. package/dist/kw/civil.d.ts +6 -5
  391. package/dist/kw/civil.js +20 -17
  392. package/dist/kw/civil.js.map +1 -1
  393. package/dist/kw/mod.d.ts +3 -2
  394. package/dist/kz/iin.d.ts +2 -3
  395. package/dist/kz/iin.js +4 -18
  396. package/dist/kz/iin.js.map +1 -1
  397. package/dist/kz/mod.d.ts +3 -2
  398. package/dist/lei.d.ts +2 -3
  399. package/dist/lei.js +2 -11
  400. package/dist/lei.js.map +1 -1
  401. package/dist/li/mod.d.ts +3 -2
  402. package/dist/li/peid.d.ts +11 -2
  403. package/dist/li/peid.js +1 -9
  404. package/dist/li/peid.js.map +1 -1
  405. package/dist/lk/mod.d.ts +3 -2
  406. package/dist/lk/nic.d.ts +5 -4
  407. package/dist/lk/nic.js +16 -16
  408. package/dist/lk/nic.js.map +1 -1
  409. package/dist/lt/asmens.d.ts +2 -3
  410. package/dist/lt/asmens.js +2 -1
  411. package/dist/lt/asmens.js.map +1 -1
  412. package/dist/lt/mod.d.ts +3 -2
  413. package/dist/lt/vat.d.ts +2 -3
  414. package/dist/lt/vat.js +2 -10
  415. package/dist/lt/vat.js.map +1 -1
  416. package/dist/lu/mod.d.ts +3 -2
  417. package/dist/lu/vat.d.ts +2 -3
  418. package/dist/lu/vat.js +2 -8
  419. package/dist/lu/vat.js.map +1 -1
  420. package/dist/luhn.d.ts +2 -3
  421. package/dist/luhn.js +9 -9
  422. package/dist/luhn.js.map +1 -1
  423. package/dist/lv/mod.d.ts +3 -2
  424. package/dist/lv/vat.d.ts +2 -3
  425. package/dist/lv/vat.js +19 -18
  426. package/dist/lv/vat.js.map +1 -1
  427. package/dist/ma/ice.d.ts +2 -3
  428. package/dist/ma/ice.js +2 -11
  429. package/dist/ma/ice.js.map +1 -1
  430. package/dist/ma/mod.d.ts +3 -2
  431. package/dist/mc/mod.d.ts +3 -2
  432. package/dist/mc/tva.d.ts +2 -3
  433. package/dist/mc/tva.js +1 -0
  434. package/dist/mc/tva.js.map +1 -1
  435. package/dist/md/idno.d.ts +2 -3
  436. package/dist/md/idno.js +1 -10
  437. package/dist/md/idno.js.map +1 -1
  438. package/dist/md/mod.d.ts +3 -2
  439. package/dist/me/mod.d.ts +3 -2
  440. package/dist/me/pib.d.ts +2 -3
  441. package/dist/me/pib.js +2 -10
  442. package/dist/me/pib.js.map +1 -1
  443. package/dist/mk/edb.d.ts +2 -3
  444. package/dist/mk/edb.js +2 -11
  445. package/dist/mk/edb.js.map +1 -1
  446. package/dist/mk/mod.d.ts +3 -2
  447. package/dist/mt/mod.d.ts +3 -2
  448. package/dist/mt/vat.d.ts +2 -3
  449. package/dist/mt/vat.js +3 -10
  450. package/dist/mt/vat.js.map +1 -1
  451. package/dist/mu/brn.d.ts +23 -2
  452. package/dist/mu/brn.js +1 -21
  453. package/dist/mu/brn.js.map +1 -1
  454. package/dist/mu/mod.d.ts +3 -2
  455. package/dist/mx/clabe.d.ts +2 -3
  456. package/dist/mx/clabe.js +1 -14
  457. package/dist/mx/clabe.js.map +1 -1
  458. package/dist/mx/curp.d.ts +5 -4
  459. package/dist/mx/curp.js +27 -19
  460. package/dist/mx/curp.js.map +1 -1
  461. package/dist/mx/mod.d.ts +3 -2
  462. package/dist/mx/rfc.d.ts +5 -4
  463. package/dist/mx/rfc.js +23 -20
  464. package/dist/mx/rfc.js.map +1 -1
  465. package/dist/my/mod.d.ts +3 -2
  466. package/dist/my/nric.d.ts +5 -4
  467. package/dist/my/nric.js +18 -16
  468. package/dist/my/nric.js.map +1 -1
  469. package/dist/ng/mod.d.ts +3 -2
  470. package/dist/ng/nin.d.ts +13 -2
  471. package/dist/ng/nin.js +1 -11
  472. package/dist/ng/nin.js.map +1 -1
  473. package/dist/ni/mod.d.ts +3 -2
  474. package/dist/ni/ruc.d.ts +2 -3
  475. package/dist/ni/ruc.js +1 -23
  476. package/dist/ni/ruc.js.map +1 -1
  477. package/dist/nl/bsn.d.ts +2 -3
  478. package/dist/nl/bsn.js +2 -10
  479. package/dist/nl/bsn.js.map +1 -1
  480. package/dist/nl/kvk.d.ts +9 -2
  481. package/dist/nl/kvk.js +1 -7
  482. package/dist/nl/kvk.js.map +1 -1
  483. package/dist/nl/mod.d.ts +3 -2
  484. package/dist/nl/vat.d.ts +2 -3
  485. package/dist/nl/vat.js +4 -50
  486. package/dist/nl/vat.js.map +1 -1
  487. package/dist/no/fodselsnummer.d.ts +2 -3
  488. package/dist/no/fodselsnummer.js +3 -10
  489. package/dist/no/fodselsnummer.js.map +1 -1
  490. package/dist/no/mod.d.ts +3 -2
  491. package/dist/no/mva.d.ts +2 -3
  492. package/dist/no/mva.js +1 -8
  493. package/dist/no/mva.js.map +1 -1
  494. package/dist/no/orgnr.d.ts +2 -3
  495. package/dist/no/orgnr.js +2 -8
  496. package/dist/no/orgnr.js.map +1 -1
  497. package/dist/nz/ird.d.ts +2 -3
  498. package/dist/nz/ird.js +4 -13
  499. package/dist/nz/ird.js.map +1 -1
  500. package/dist/nz/mod.d.ts +3 -2
  501. package/dist/pa/mod.d.ts +3 -2
  502. package/dist/pa/ruc.d.ts +2 -3
  503. package/dist/pa/ruc.js +4 -19
  504. package/dist/pa/ruc.js.map +1 -1
  505. package/dist/patterns.d.ts +8 -10
  506. package/dist/patterns.js +83 -28
  507. package/dist/patterns.js.map +1 -1
  508. package/dist/pe/mod.d.ts +3 -2
  509. package/dist/pe/ruc.d.ts +2 -3
  510. package/dist/pe/ruc.js +10 -24
  511. package/dist/pe/ruc.js.map +1 -1
  512. package/dist/ph/mod.d.ts +3 -2
  513. package/dist/ph/philid.d.ts +14 -2
  514. package/dist/ph/philid.js +1 -12
  515. package/dist/ph/philid.js.map +1 -1
  516. package/dist/pk/cnic.d.ts +14 -2
  517. package/dist/pk/cnic.js +1 -12
  518. package/dist/pk/cnic.js.map +1 -1
  519. package/dist/pk/mod.d.ts +3 -2
  520. package/dist/pl/mod.d.ts +3 -2
  521. package/dist/pl/nip.d.ts +2 -3
  522. package/dist/pl/nip.js +2 -10
  523. package/dist/pl/nip.js.map +1 -1
  524. package/dist/pl/pesel.d.ts +2 -3
  525. package/dist/pl/pesel.js +4 -13
  526. package/dist/pl/pesel.js.map +1 -1
  527. package/dist/pl/regon.d.ts +2 -3
  528. package/dist/pl/regon.js +2 -11
  529. package/dist/pl/regon.js.map +1 -1
  530. package/dist/pt/cc.d.ts +2 -3
  531. package/dist/pt/cc.js +7 -13
  532. package/dist/pt/cc.js.map +1 -1
  533. package/dist/pt/mod.d.ts +3 -2
  534. package/dist/pt/vat.d.ts +2 -3
  535. package/dist/pt/vat.js +3 -11
  536. package/dist/pt/vat.js.map +1 -1
  537. package/dist/ro/cnp.d.ts +2 -3
  538. package/dist/ro/cnp.js +5 -14
  539. package/dist/ro/cnp.js.map +1 -1
  540. package/dist/ro/mod.d.ts +3 -2
  541. package/dist/ro/vat.d.ts +2 -3
  542. package/dist/ro/vat.js +13 -11
  543. package/dist/ro/vat.js.map +1 -1
  544. package/dist/rs/mod.d.ts +3 -2
  545. package/dist/rs/pib.d.ts +2 -3
  546. package/dist/rs/pib.js +1 -9
  547. package/dist/rs/pib.js.map +1 -1
  548. package/dist/ru/inn.d.ts +2 -3
  549. package/dist/ru/inn.js +2 -12
  550. package/dist/ru/inn.js.map +1 -1
  551. package/dist/ru/mod.d.ts +3 -2
  552. package/dist/se/mod.d.ts +3 -2
  553. package/dist/se/orgnr.d.ts +2 -3
  554. package/dist/se/orgnr.js +2 -9
  555. package/dist/se/orgnr.js.map +1 -1
  556. package/dist/se/personnummer.d.ts +2 -3
  557. package/dist/se/personnummer.js +8 -15
  558. package/dist/se/personnummer.js.map +1 -1
  559. package/dist/se/vat.d.ts +2 -3
  560. package/dist/se/vat.js +3 -10
  561. package/dist/se/vat.js.map +1 -1
  562. package/dist/sg/mod.d.ts +3 -2
  563. package/dist/sg/uen.d.ts +2 -3
  564. package/dist/sg/uen.js +47 -70
  565. package/dist/sg/uen.js.map +1 -1
  566. package/dist/si/emso.d.ts +2 -3
  567. package/dist/si/emso.js +12 -14
  568. package/dist/si/emso.js.map +1 -1
  569. package/dist/si/mod.d.ts +3 -2
  570. package/dist/si/vat.d.ts +2 -3
  571. package/dist/si/vat.js +3 -12
  572. package/dist/si/vat.js.map +1 -1
  573. package/dist/sk/dic.d.ts +2 -3
  574. package/dist/sk/dic.js +1 -0
  575. package/dist/sk/dic.js.map +1 -1
  576. package/dist/sk/ico.d.ts +2 -3
  577. package/dist/sk/ico.js +1 -0
  578. package/dist/sk/ico.js.map +1 -1
  579. package/dist/sk/mod.d.ts +3 -2
  580. package/dist/sk/rc.d.ts +4 -5
  581. package/dist/sk/rc.js +6 -2
  582. package/dist/sk/rc.js.map +1 -1
  583. package/dist/th/mod.d.ts +3 -2
  584. package/dist/th/tin.d.ts +2 -3
  585. package/dist/th/tin.js +1 -11
  586. package/dist/th/tin.js.map +1 -1
  587. package/dist/tr/mod.d.ts +3 -2
  588. package/dist/tr/tckimlik.d.ts +2 -3
  589. package/dist/tr/tckimlik.js +1 -20
  590. package/dist/tr/tckimlik.js.map +1 -1
  591. package/dist/tr/vkn.d.ts +2 -3
  592. package/dist/tr/vkn.js +1 -20
  593. package/dist/tr/vkn.js.map +1 -1
  594. package/dist/tw/mod.d.ts +3 -2
  595. package/dist/tw/ubn.d.ts +2 -3
  596. package/dist/tw/ubn.js +2 -12
  597. package/dist/tw/ubn.js.map +1 -1
  598. package/dist/types.d.ts +56 -21
  599. package/dist/ua/edrpou.d.ts +2 -3
  600. package/dist/ua/edrpou.js +5 -12
  601. package/dist/ua/edrpou.js.map +1 -1
  602. package/dist/ua/mod.d.ts +3 -2
  603. package/dist/us/ein.d.ts +12 -2
  604. package/dist/us/ein.js +88 -97
  605. package/dist/us/ein.js.map +1 -1
  606. package/dist/us/itin.d.ts +13 -2
  607. package/dist/us/itin.js +4 -15
  608. package/dist/us/itin.js.map +1 -1
  609. package/dist/us/mod.d.ts +3 -2
  610. package/dist/us/rtn.d.ts +2 -3
  611. package/dist/us/rtn.js +11 -23
  612. package/dist/us/rtn.js.map +1 -1
  613. package/dist/us/ssn.d.ts +13 -2
  614. package/dist/us/ssn.js +1 -11
  615. package/dist/us/ssn.js.map +1 -1
  616. package/dist/uy/mod.d.ts +3 -2
  617. package/dist/uy/rut.d.ts +2 -3
  618. package/dist/uy/rut.js +2 -15
  619. package/dist/uy/rut.js.map +1 -1
  620. package/dist/ve/mod.d.ts +3 -2
  621. package/dist/ve/rif.d.ts +2 -3
  622. package/dist/ve/rif.js +13 -26
  623. package/dist/ve/rif.js.map +1 -1
  624. package/dist/vn/mod.d.ts +3 -2
  625. package/dist/vn/mst.d.ts +2 -3
  626. package/dist/vn/mst.js +1 -12
  627. package/dist/vn/mst.js.map +1 -1
  628. package/dist/za/idnr.d.ts +2 -3
  629. package/dist/za/idnr.js +4 -16
  630. package/dist/za/idnr.js.map +1 -1
  631. package/dist/za/mod.d.ts +3 -2
  632. package/package.json +34 -21
  633. package/src/_checksums/mod1110.ts +1 -1
  634. package/src/_checksums/mod112.ts +7 -6
  635. package/src/_util/generate.ts +38 -0
  636. package/src/ad/nrt.ts +19 -7
  637. package/src/ae/eid.ts +7 -3
  638. package/src/ai/tin.ts +7 -3
  639. package/src/al/nipt.ts +7 -3
  640. package/src/am/tin.ts +7 -3
  641. package/src/ar/cbu.ts +9 -5
  642. package/src/ar/cuit.ts +22 -10
  643. package/src/ar/dni.ts +7 -3
  644. package/src/at/businessid.ts +7 -3
  645. package/src/at/tin.ts +7 -3
  646. package/src/at/uid.ts +7 -3
  647. package/src/at/vnr.ts +62 -12
  648. package/src/au/abn.ts +7 -3
  649. package/src/au/acn.ts +7 -3
  650. package/src/au/tfn.ts +7 -3
  651. package/src/az/voen.ts +9 -3
  652. package/src/ba/jmbg.ts +9 -7
  653. package/src/bd/nid.ts +11 -7
  654. package/src/be/bis.ts +8 -4
  655. package/src/be/nn.ts +7 -3
  656. package/src/be/vat.ts +7 -3
  657. package/src/bg/egn.ts +19 -10
  658. package/src/bg/pnf.ts +7 -3
  659. package/src/bg/vat.ts +8 -3
  660. package/src/bh/cpr.ts +17 -4
  661. package/src/bic.ts +26 -20
  662. package/src/br/cnpj.ts +7 -3
  663. package/src/br/cpf.ts +7 -3
  664. package/src/by/unp.ts +19 -9
  665. package/src/bz/tin.ts +19 -4
  666. package/src/ca/bn.ts +7 -3
  667. package/src/ca/sin.ts +7 -3
  668. package/src/ch/ssn.ts +7 -3
  669. package/src/ch/uid.ts +7 -3
  670. package/src/ch/vat.ts +9 -5
  671. package/src/cl/rut.ts +11 -5
  672. package/src/cn/ric.ts +11 -7
  673. package/src/cn/uscc.ts +27 -11
  674. package/src/co/nit.ts +14 -6
  675. package/src/cr/cpf.ts +11 -6
  676. package/src/creditcard.ts +10 -6
  677. package/src/cu/ni.ts +28 -7
  678. package/src/cy/vat.ts +7 -3
  679. package/src/cz/dic.ts +9 -4
  680. package/src/cz/ico.ts +7 -3
  681. package/src/cz/rc.ts +61 -29
  682. package/src/de/handelsreg.ts +21 -6
  683. package/src/de/idnr.ts +10 -3
  684. package/src/de/stnr.ts +11 -3
  685. package/src/de/svnr.ts +14 -5
  686. package/src/de/vat.ts +7 -3
  687. package/src/dk/cpr.ts +23 -8
  688. package/src/dk/cvr.ts +7 -3
  689. package/src/dk/vat.ts +8 -3
  690. package/src/do/rnc.ts +9 -5
  691. package/src/ec/ruc.ts +9 -5
  692. package/src/ee/ik.ts +21 -10
  693. package/src/ee/registrikood.ts +12 -7
  694. package/src/ee/vat.ts +7 -3
  695. package/src/eg/tn.ts +7 -3
  696. package/src/es/cif.ts +10 -7
  697. package/src/es/dni.ts +7 -3
  698. package/src/es/nie.ts +18 -9
  699. package/src/es/nss.ts +7 -3
  700. package/src/es/vat.ts +13 -5
  701. package/src/eu/vat.ts +55 -6
  702. package/src/fi/hetu.ts +26 -8
  703. package/src/fi/vat.ts +8 -3
  704. package/src/fi/ytunnus.ts +7 -3
  705. package/src/fr/nif.ts +7 -3
  706. package/src/fr/nir.ts +9 -7
  707. package/src/fr/siren.ts +7 -3
  708. package/src/fr/siret.ts +7 -3
  709. package/src/fr/tva.ts +7 -3
  710. package/src/gb/nino.ts +18 -13
  711. package/src/gb/sedol.ts +21 -15
  712. package/src/gb/utr.ts +7 -3
  713. package/src/gb/vat.ts +7 -3
  714. package/src/ge/pin.ts +7 -3
  715. package/src/gh/tin.ts +11 -6
  716. package/src/gr/amka.ts +7 -3
  717. package/src/gr/vat.ts +7 -3
  718. package/src/gt/nit.ts +13 -6
  719. package/src/hk/hkid.ts +9 -4
  720. package/src/hr/vat.ts +7 -3
  721. package/src/hu/vat.ts +8 -3
  722. package/src/iban.ts +7 -3
  723. package/src/id/npwp.ts +7 -3
  724. package/src/ie/pps.ts +7 -3
  725. package/src/ie/vat.ts +7 -3
  726. package/src/il/idnr.ts +7 -3
  727. package/src/in/aadhaar.ts +7 -3
  728. package/src/in/gstin.ts +10 -4
  729. package/src/in/pan.ts +15 -6
  730. package/src/index.ts +6 -0
  731. package/src/iq/nid.ts +7 -3
  732. package/src/ir/nid.ts +7 -3
  733. package/src/is/kennitala.ts +7 -3
  734. package/src/is/vsk.ts +7 -3
  735. package/src/isin.ts +17 -7
  736. package/src/it/codicefiscale.ts +49 -7
  737. package/src/it/iva.ts +7 -3
  738. package/src/jp/cn.ts +7 -3
  739. package/src/jp/mynumber.ts +7 -3
  740. package/src/kr/brn.ts +7 -3
  741. package/src/kr/rrn.ts +27 -8
  742. package/src/kw/civil.ts +31 -14
  743. package/src/kz/iin.ts +9 -8
  744. package/src/lei.ts +7 -3
  745. package/src/li/peid.ts +7 -3
  746. package/src/lk/nic.ts +31 -8
  747. package/src/lt/asmens.ts +8 -4
  748. package/src/lt/vat.ts +8 -3
  749. package/src/lu/vat.ts +8 -3
  750. package/src/luhn.ts +10 -3
  751. package/src/lv/vat.ts +53 -23
  752. package/src/ma/ice.ts +7 -3
  753. package/src/mc/tva.ts +9 -5
  754. package/src/md/idno.ts +7 -3
  755. package/src/me/pib.ts +7 -3
  756. package/src/mk/edb.ts +7 -3
  757. package/src/mt/vat.ts +8 -3
  758. package/src/mu/brn.ts +7 -3
  759. package/src/mx/clabe.ts +7 -3
  760. package/src/mx/curp.ts +47 -10
  761. package/src/mx/rfc.ts +42 -7
  762. package/src/my/nric.ts +33 -8
  763. package/src/ng/nin.ts +7 -3
  764. package/src/ni/ruc.ts +7 -3
  765. package/src/nl/bsn.ts +7 -3
  766. package/src/nl/kvk.ts +7 -3
  767. package/src/nl/vat.ts +18 -69
  768. package/src/no/fodselsnummer.ts +12 -7
  769. package/src/no/mva.ts +9 -5
  770. package/src/no/orgnr.ts +7 -3
  771. package/src/nz/ird.ts +12 -8
  772. package/src/pa/ruc.ts +39 -11
  773. package/src/patterns.ts +184 -46
  774. package/src/pe/ruc.ts +13 -10
  775. package/src/ph/philid.ts +7 -3
  776. package/src/pk/cnic.ts +9 -3
  777. package/src/pl/nip.ts +7 -3
  778. package/src/pl/pesel.ts +9 -7
  779. package/src/pl/regon.ts +7 -3
  780. package/src/pt/cc.ts +13 -7
  781. package/src/pt/vat.ts +8 -3
  782. package/src/ro/cnp.ts +16 -8
  783. package/src/ro/vat.ts +8 -3
  784. package/src/rs/pib.ts +7 -3
  785. package/src/ru/inn.ts +9 -5
  786. package/src/se/orgnr.ts +7 -3
  787. package/src/se/personnummer.ts +35 -32
  788. package/src/se/vat.ts +8 -3
  789. package/src/sg/uen.ts +44 -23
  790. package/src/si/emso.ts +37 -11
  791. package/src/si/vat.ts +8 -3
  792. package/src/sk/dic.ts +8 -4
  793. package/src/sk/ico.ts +3 -2
  794. package/src/sk/rc.ts +17 -4
  795. package/src/th/tin.ts +7 -3
  796. package/src/tr/tckimlik.ts +7 -3
  797. package/src/tr/vkn.ts +7 -3
  798. package/src/tw/ubn.ts +9 -5
  799. package/src/types.ts +69 -7
  800. package/src/ua/edrpou.ts +10 -5
  801. package/src/us/ein.ts +95 -91
  802. package/src/us/itin.ts +14 -11
  803. package/src/us/rtn.ts +32 -19
  804. package/src/us/ssn.ts +7 -3
  805. package/src/uy/rut.ts +9 -5
  806. package/src/ve/rif.ts +19 -12
  807. package/src/vn/mst.ts +7 -3
  808. package/src/za/idnr.ts +9 -7
package/src/mx/curp.ts CHANGED
@@ -14,16 +14,17 @@
14
14
  * @see https://en.wikipedia.org/wiki/CURP
15
15
  */
16
16
 
17
- import { clean } from "#util/clean";
18
- import { isValidDate } from "#util/date";
19
- import { err } from "#util/result";
20
-
21
17
  import type {
22
18
  ParsedPersonId,
23
19
  ValidateResult,
24
- Validator,
20
+ CountryValidator,
25
21
  } from "../types";
26
22
 
23
+ import { clean } from "#util/clean";
24
+ import { isValidDate } from "#util/date";
25
+ import { randomInt } from "#util/generate";
26
+ import { err } from "#util/result";
27
+
27
28
  /** Valid Mexican state codes (2-letter). */
28
29
  const STATE_CODES = new Set([
29
30
  "AS",
@@ -60,6 +61,8 @@ const STATE_CODES = new Set([
60
61
  "ZS",
61
62
  "NE", // Born abroad
62
63
  ]);
64
+ const STATE_CODE_LIST = [...STATE_CODES];
65
+ const LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
63
66
 
64
67
  /**
65
68
  * Alphabet for CURP check digit computation.
@@ -69,8 +72,8 @@ const STATE_CODES = new Set([
69
72
  const ALPHABET = "0123456789ABCDEFGHIJKLMN&OPQRSTUVWXYZ";
70
73
 
71
74
  const CHAR_MAP = new Map<string, number>();
72
- for (let i = 0; i < ALPHABET.length; i++) {
73
- CHAR_MAP.set(ALPHABET[i]!, i);
75
+ for (const [i, ch] of ALPHABET.split("").entries()) {
76
+ CHAR_MAP.set(ch, i);
74
77
  }
75
78
 
76
79
  const compact = (value: string): string =>
@@ -84,7 +87,9 @@ const compact = (value: string): string =>
84
87
  const calcCheckDigit = (value: string): string => {
85
88
  let sum = 0;
86
89
  for (let i = 0; i < 17; i++) {
87
- sum += (CHAR_MAP.get(value[i]!) ?? 0) * (18 - i);
90
+ const ch = value[i];
91
+ if (ch === undefined) continue;
92
+ sum += (CHAR_MAP.get(ch) ?? 0) * (18 - i);
88
93
  }
89
94
  return String((10 - (sum % 10)) % 10);
90
95
  };
@@ -126,6 +131,8 @@ const validate = (value: string): ValidateResult => {
126
131
  const mm = Number(v.slice(6, 8));
127
132
  const dd = Number(v.slice(8, 10));
128
133
 
134
+ // SAFETY: regex validation ensures v.length === 18.
135
+ // eslint-disable-next-line no-non-null-assertion
129
136
  const year = resolveCurpYear(yy, v[16]!);
130
137
  if (!isValidDate(year, mm, dd)) {
131
138
  return err(
@@ -170,6 +177,8 @@ const parse = (value: string): ParsedPersonId | null => {
170
177
  const mm = Number(v.slice(6, 8));
171
178
  const dd = Number(v.slice(8, 10));
172
179
 
180
+ // SAFETY: regex validation ensures v.length === 18.
181
+ // eslint-disable-next-line no-non-null-assertion
173
182
  const year = resolveCurpYear(yy, v[16]!);
174
183
 
175
184
  const genderChar = v[10];
@@ -182,12 +191,37 @@ const parse = (value: string): ParsedPersonId | null => {
182
191
  };
183
192
  };
184
193
 
194
+ const randomLetter = (): string =>
195
+ LETTERS.charAt(randomInt(0, LETTERS.length - 1));
196
+
197
+ /** Generate a random valid CURP. */
198
+ const generate = (): string => {
199
+ const year = randomInt(1980, 2024);
200
+ const month = String(randomInt(1, 12)).padStart(2, "0");
201
+ const day = String(randomInt(1, 28)).padStart(2, "0");
202
+ const yy = String(year % 100).padStart(2, "0");
203
+ const gender = Math.random() < 0.5 ? "H" : "M";
204
+ const state =
205
+ STATE_CODE_LIST[
206
+ randomInt(0, STATE_CODE_LIST.length - 1)
207
+ ] ?? "NE";
208
+ const centuryChar =
209
+ year >= 2000 ? randomLetter() : String(randomInt(0, 9));
210
+ const body =
211
+ `${randomLetter()}${randomLetter()}` +
212
+ `${randomLetter()}${randomLetter()}` +
213
+ `${yy}${month}${day}${gender}${state}` +
214
+ `${randomLetter()}${randomLetter()}${randomLetter()}` +
215
+ `${centuryChar}`;
216
+ return `${body}${calcCheckDigit(body)}`;
217
+ };
218
+
185
219
  /**
186
220
  * Mexican CURP (personal identification number).
187
221
  *
188
222
  * Example sourced from python-stdnum test suite.
189
223
  */
190
- const curp: Validator = {
224
+ const curp: CountryValidator<"MX", ParsedPersonId> = {
191
225
  name: "Mexican Personal ID",
192
226
  localName: "Clave Única de Registro de Población",
193
227
  abbreviation: "CURP",
@@ -196,15 +230,18 @@ const curp: Validator = {
196
230
  "Clave Única de Registro de Población",
197
231
  ] as const,
198
232
  candidatePattern: "[A-Z]{4}\\d{6}[HM][A-Z]{5}[A-Z\\d]\\d",
233
+ scope: "country",
199
234
  country: "MX",
200
235
  entityType: "person",
201
236
  lengths: [18] as const,
202
237
  examples: ["BOXW310820HNERXN09"] as const,
203
238
  compact,
204
239
  format,
240
+ parse,
205
241
  validate,
242
+ generate,
206
243
  sourceUrl: "https://en.wikipedia.org/wiki/CURP",
207
244
  };
208
245
 
209
246
  export default curp;
210
- export { compact, format, parse, validate };
247
+ export { compact, format, generate, parse, validate };
package/src/mx/rfc.ts CHANGED
@@ -16,18 +16,22 @@
16
16
  * @see https://en.wikipedia.org/wiki/Tax_Identification_Number_(Mexico)
17
17
  */
18
18
 
19
+ import type {
20
+ ValidateResult,
21
+ CountryValidator,
22
+ } from "../types";
23
+
19
24
  import { clean } from "#util/clean";
20
25
  import { isValidDate } from "#util/date";
26
+ import { randomInt } from "#util/generate";
21
27
  import { err } from "#util/result";
22
28
 
23
- import type { ValidateResult, Validator } from "../types";
24
-
25
29
  /** Alphabet for RFC check digit computation. */
26
30
  const ALPHABET = "0123456789ABCDEFGHIJKLMN&OPQRSTUVWXYZ Ñ";
27
31
 
28
32
  const CHAR_MAP = new Map<string, number>();
29
- for (let i = 0; i < ALPHABET.length; i++) {
30
- CHAR_MAP.set(ALPHABET[i]!, i);
33
+ for (const [i, ch] of ALPHABET.split("").entries()) {
34
+ CHAR_MAP.set(ch, i);
31
35
  }
32
36
 
33
37
  const compact = (value: string): string =>
@@ -48,7 +52,8 @@ const calcCheckDigit = (value: string): string => {
48
52
  const padded = value.length === 11 ? ` ${value}` : value;
49
53
  let sum = 0;
50
54
  for (let i = 0; i < 12; i++) {
51
- const ch = padded[i]!;
55
+ const ch = padded[i];
56
+ if (ch === undefined) continue;
52
57
  const v = CHAR_MAP.get(ch) ?? 0;
53
58
  sum += v * (13 - i);
54
59
  }
@@ -60,6 +65,8 @@ const calcCheckDigit = (value: string): string => {
60
65
 
61
66
  const PERSON_RE = /^[A-ZÑ&]{4}\d{6}[A-Z\d]{3}$/;
62
67
  const COMPANY_RE = /^[A-ZÑ&]{3}\d{6}[A-Z\d]{3}$/;
68
+ const PREFIX_ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZÑ&";
69
+ const RFC_ALNUM = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
63
70
 
64
71
  const validate = (value: string): ValidateResult => {
65
72
  const v = compact(value);
@@ -115,12 +122,38 @@ const validate = (value: string): ValidateResult => {
115
122
 
116
123
  const format = (value: string): string => compact(value);
117
124
 
125
+ const randomCharFrom = (chars: string): string =>
126
+ chars.charAt(randomInt(0, chars.length - 1));
127
+
128
+ /** Generate a random valid RFC. */
129
+ const generate = (): string => {
130
+ const isPerson = Math.random() < 0.5;
131
+ const prefixLength = isPerson ? 4 : 3;
132
+ let prefix = "";
133
+ for (let i = 0; i < prefixLength; i++) {
134
+ prefix += randomCharFrom(PREFIX_ALPHA);
135
+ }
136
+
137
+ const year = randomInt(2000, 2099);
138
+ const month = String(randomInt(1, 12)).padStart(2, "0");
139
+ const day = String(randomInt(1, 28)).padStart(2, "0");
140
+ let homoclave = "";
141
+ for (let i = 0; i < 2; i++) {
142
+ homoclave += randomCharFrom(RFC_ALNUM);
143
+ }
144
+
145
+ const body =
146
+ `${prefix}${String(year % 100).padStart(2, "0")}` +
147
+ `${month}${day}${homoclave}`;
148
+ return `${body}${calcCheckDigit(body)}`;
149
+ };
150
+
118
151
  /**
119
152
  * Mexican RFC (tax identification number).
120
153
  *
121
154
  * Examples sourced from python-stdnum test suite.
122
155
  */
123
- const rfc: Validator = {
156
+ const rfc: CountryValidator<"MX"> = {
124
157
  name: "Mexican Tax ID",
125
158
  localName: "Registro Federal de Contribuyentes",
126
159
  abbreviation: "RFC",
@@ -129,6 +162,7 @@ const rfc: Validator = {
129
162
  "Registro Federal de Contribuyentes",
130
163
  ] as const,
131
164
  candidatePattern: "[A-ZÑ&]{3,4}\\d{6}[A-Z\\d]{3}",
165
+ scope: "country",
132
166
  country: "MX",
133
167
  entityType: "any",
134
168
  lengths: [12, 13] as const,
@@ -136,9 +170,10 @@ const rfc: Validator = {
136
170
  compact,
137
171
  format,
138
172
  validate,
173
+ generate,
139
174
  sourceUrl:
140
175
  "https://en.wikipedia.org/wiki/Tax_Identification_Number_(Mexico)",
141
176
  };
142
177
 
143
178
  export default rfc;
144
- export { compact, format, validate };
179
+ export { compact, format, generate, validate };
package/src/my/nric.ts CHANGED
@@ -12,17 +12,18 @@
12
12
  * @see https://en.wikipedia.org/wiki/Malaysian_identity_card
13
13
  */
14
14
 
15
- import { clean } from "#util/clean";
16
- import { isValidDate } from "#util/date";
17
- import { err } from "#util/result";
18
- import { isdigits } from "#util/strings";
19
-
20
15
  import type {
21
16
  ParsedPersonId,
22
17
  ValidateResult,
23
- Validator,
18
+ CountryValidator,
24
19
  } from "../types";
25
20
 
21
+ import { clean } from "#util/clean";
22
+ import { isValidDate } from "#util/date";
23
+ import { randomInt } from "#util/generate";
24
+ import { err } from "#util/result";
25
+ import { isdigits } from "#util/strings";
26
+
26
27
  /**
27
28
  * Valid place-of-birth codes (2-digit).
28
29
  * Codes 01-16 are states, 21-59 are pre-2000
@@ -211,13 +212,35 @@ const parse = (value: string): ParsedPersonId | null => {
211
212
  };
212
213
  };
213
214
 
215
+ const PB_CODES = [...VALID_PB_CODES];
216
+
217
+ /** Generate a random valid Malaysian NRIC. */
218
+ const generate = (): string => {
219
+ const year = randomInt(1950, 2024);
220
+ const month = String(randomInt(1, 12)).padStart(2, "0");
221
+ const day = String(randomInt(1, 28)).padStart(2, "0");
222
+ const pb =
223
+ PB_CODES[randomInt(0, PB_CODES.length - 1)] ?? "01";
224
+ const serial = String(randomInt(0, 999)).padStart(3, "0");
225
+ const isMale = Math.random() < 0.5;
226
+ const lastDigit = isMale
227
+ ? String(randomInt(0, 4) * 2 + 1)
228
+ : String(randomInt(0, 4) * 2);
229
+
230
+ return (
231
+ `${String(year % 100).padStart(2, "0")}` +
232
+ `${month}${day}${pb}${serial}${lastDigit}`
233
+ );
234
+ };
235
+
214
236
  /** Malaysian National Registration Identity Card. */
215
- const nric: Validator = {
237
+ const nric: CountryValidator<"MY", ParsedPersonId> = {
216
238
  name: "Malaysian National Registration Identity Card Number",
217
239
  localName: "Nombor Kad Pengenalan",
218
240
  abbreviation: "NRIC",
219
241
  aliases: ["NRIC", "MyKad", "kad pengenalan"] as const,
220
242
  candidatePattern: "\\d{6}-?\\d{2}-?\\d{4}",
243
+ scope: "country",
221
244
  country: "MY",
222
245
  entityType: "person",
223
246
  description:
@@ -228,8 +251,10 @@ const nric: Validator = {
228
251
  examples: ["770305021234", "880715141234"] as const,
229
252
  compact,
230
253
  format,
254
+ parse,
231
255
  validate,
256
+ generate,
232
257
  };
233
258
 
234
259
  export default nric;
235
- export { compact, format, parse, validate };
260
+ export { compact, format, generate, parse, validate };
package/src/ng/nin.ts CHANGED
@@ -13,13 +13,16 @@ const generate = (): string => randomDigits(11);
13
13
  * @see https://nimc.gov.ng/about-nin/
14
14
  */
15
15
 
16
+ import type {
17
+ ValidateResult,
18
+ CountryValidator,
19
+ } from "../types";
20
+
16
21
  import { clean } from "#util/clean";
17
22
  import { randomDigits } from "#util/generate";
18
23
  import { err } from "#util/result";
19
24
  import { isdigits } from "#util/strings";
20
25
 
21
- import type { ValidateResult, Validator } from "../types";
22
-
23
26
  const compact = (value: string): string =>
24
27
  clean(value, " -");
25
28
 
@@ -46,7 +49,7 @@ const format = (value: string): string => {
46
49
  };
47
50
 
48
51
  /** Nigerian National Identification Number. */
49
- const nin: Validator = {
52
+ const nin: CountryValidator<"NG"> = {
50
53
  name: "National Identification Number",
51
54
  localName: "National Identification Number",
52
55
  abbreviation: "NIN",
@@ -55,6 +58,7 @@ const nin: Validator = {
55
58
  "National Identification Number",
56
59
  ] as const,
57
60
  candidatePattern: "\\d{11}",
61
+ scope: "country",
58
62
  country: "NG",
59
63
  entityType: "person",
60
64
  lengths: [11] as const,
package/src/ni/ruc.ts CHANGED
@@ -22,13 +22,16 @@
22
22
  * @see https://www.dgi.gob.ni/
23
23
  */
24
24
 
25
+ import type {
26
+ ValidateResult,
27
+ CountryValidator,
28
+ } from "../types";
29
+
25
30
  import { clean } from "#util/clean";
26
31
  import { randomDigits } from "#util/generate";
27
32
  import { err } from "#util/result";
28
33
  import { isdigits } from "#util/strings";
29
34
 
30
- import type { ValidateResult, Validator } from "../types";
31
-
32
35
  /**
33
36
  * Check letter alphabet (mod 23). Excludes I, O, Z
34
37
  * to prevent transcription errors.
@@ -154,12 +157,13 @@ const format = (value: string): string => {
154
157
  const generate = (): string => "J" + randomDigits(13);
155
158
 
156
159
  /** Nicaragua tax identification number. */
157
- const ruc: Validator = {
160
+ const ruc: CountryValidator<"NI"> = {
158
161
  name: "Tax Identification Number",
159
162
  localName: "Registro Único de Contribuyente",
160
163
  abbreviation: "RUC",
161
164
  aliases: ["RUC"] as const,
162
165
  candidatePattern: "[JKME]\\d{13}",
166
+ scope: "country",
163
167
  country: "NI",
164
168
  entityType: "any",
165
169
  description: "Tax identifier issued by Nicaragua's DGI",
package/src/nl/bsn.ts CHANGED
@@ -8,14 +8,17 @@
8
8
  * @see https://www.government.nl/topics/personal-data/citizen-service-number-bsn
9
9
  */
10
10
 
11
+ import type {
12
+ ValidateResult,
13
+ CountryValidator,
14
+ } from "../types";
15
+
11
16
  import { weightedSum } from "#checksums/weighted-sum";
12
17
  import { clean } from "#util/clean";
13
18
  import { randomDigits } from "#util/generate";
14
19
  import { err } from "#util/result";
15
20
  import { isdigits } from "#util/strings";
16
21
 
17
- import type { ValidateResult, Validator } from "../types";
18
-
19
22
  const WEIGHTS = [9, 8, 7, 6, 5, 4, 3, 2, -1] as const;
20
23
 
21
24
  const compact = (value: string): string =>
@@ -62,7 +65,7 @@ const generate = (): string => {
62
65
  };
63
66
 
64
67
  /** Dutch Citizen Service Number. */
65
- const bsn: Validator = {
68
+ const bsn: CountryValidator<"NL"> = {
66
69
  name: "Dutch Citizen Service Number",
67
70
  localName: "Burgerservicenummer",
68
71
  abbreviation: "BSN",
@@ -72,6 +75,7 @@ const bsn: Validator = {
72
75
  "sofinummer",
73
76
  ] as const,
74
77
  candidatePattern: "\\d{9}",
78
+ scope: "country",
75
79
  country: "NL",
76
80
  entityType: "person",
77
81
  sourceUrl:
package/src/nl/kvk.ts CHANGED
@@ -9,13 +9,16 @@ const generate = (): string => randomDigits(8);
9
9
  * @see https://www.kvk.nl/
10
10
  */
11
11
 
12
+ import type {
13
+ ValidateResult,
14
+ CountryValidator,
15
+ } from "../types";
16
+
12
17
  import { clean } from "#util/clean";
13
18
  import { randomDigits } from "#util/generate";
14
19
  import { err } from "#util/result";
15
20
  import { isdigits } from "#util/strings";
16
21
 
17
- import type { ValidateResult, Validator } from "../types";
18
-
19
22
  const compact = (value: string): string =>
20
23
  clean(value, " -/.");
21
24
 
@@ -39,12 +42,13 @@ const validate = (value: string): ValidateResult => {
39
42
  const format = (value: string): string => compact(value);
40
43
 
41
44
  /** Dutch Chamber of Commerce Number. */
42
- const kvk: Validator = {
45
+ const kvk: CountryValidator<"NL"> = {
43
46
  name: "Dutch Chamber of Commerce Number",
44
47
  localName: "KvK-nummer",
45
48
  abbreviation: "KvK",
46
49
  aliases: ["KVK-nummer", "Kamer van Koophandel"] as const,
47
50
  candidatePattern: "\\d{8}",
51
+ scope: "country",
48
52
  country: "NL",
49
53
  entityType: "company",
50
54
  sourceUrl: "https://www.kvk.nl/",
package/src/nl/vat.ts CHANGED
@@ -2,20 +2,26 @@
2
2
  * BTW (Dutch VAT number).
3
3
  *
4
4
  * 12 characters: 9 digits + "B" + 2 digits.
5
- * Mod 97 check: convert "NL" + number to numeric
6
- * (N=23, L=21, B=11), mod 97 === 1.
7
5
  *
8
- * @see https://www.vatify.eu/netherlands-vat-number.html
6
+ * The current Dutch VAT identification number
7
+ * (btw-id) format is structural: `NL` + 9 digits
8
+ * + `B` + 2 digits. The official guidance explicitly
9
+ * states that the 9 digits are not derived from BSN
10
+ * and the final 2 digits are random.
11
+ *
9
12
  * @see https://business.gov.nl/regulations/using-checking-vat-numbers/
10
13
  */
11
14
 
15
+ import type {
16
+ ValidateResult,
17
+ CountryValidator,
18
+ } from "../types";
19
+
12
20
  import { clean } from "#util/clean";
13
21
  import { randomDigits } from "#util/generate";
14
22
  import { err } from "#util/result";
15
23
  import { isdigits } from "#util/strings";
16
24
 
17
- import type { ValidateResult, Validator } from "../types";
18
-
19
25
  const compact = (value: string): string => {
20
26
  let v = clean(value, " -/.");
21
27
  if (v.startsWith("NL") || v.startsWith("nl")) {
@@ -30,42 +36,6 @@ const compact = (value: string): string => {
30
36
  return v;
31
37
  };
32
38
 
33
- /**
34
- * Compute mod 97 of a string containing digits and
35
- * uppercase letters (A=10, B=11, ..., Z=35).
36
- */
37
- const mod97 = (value: string): number => {
38
- let remainder = 0;
39
- for (const ch of value) {
40
- const code = ch.charCodeAt(0);
41
- if (code >= 48 && code <= 57) {
42
- // Digit
43
- remainder = (remainder * 10 + (code - 48)) % 97;
44
- } else if (code >= 65 && code <= 90) {
45
- // Letter: two decimal digits (A=10, ..., Z=35)
46
- const num = code - 55;
47
- remainder = (remainder * 100 + num) % 97;
48
- }
49
- }
50
- return remainder;
51
- };
52
-
53
- /**
54
- * Check if a 9-digit string is a valid BSN (Dutch citizen
55
- * identification number). Weights [9,8,7,6,5,4,3,2,-1],
56
- * sum % 11 === 0.
57
- */
58
- const bsnValid = (num: string): boolean => {
59
- if (!isdigits(num) || num.length !== 9) return false;
60
- if (Number.parseInt(num, 10) <= 0) return false;
61
- let sum = 0;
62
- for (let i = 0; i < 8; i++) {
63
- sum += (9 - i) * Number(num[i]);
64
- }
65
- sum -= Number(num[8]);
66
- return sum % 11 === 0;
67
- };
68
-
69
39
  const validate = (value: string): ValidateResult => {
70
40
  const v = compact(value);
71
41
  if (v.length !== 12) {
@@ -92,25 +62,6 @@ const validate = (value: string): ValidateResult => {
92
62
  "Dutch VAT number must end with 2 digits",
93
63
  );
94
64
  }
95
- if (Number.parseInt(v.slice(0, 9), 10) <= 0) {
96
- return err(
97
- "INVALID_FORMAT",
98
- "Dutch VAT number first 9 digits must be > 0",
99
- );
100
- }
101
- if (Number.parseInt(v.slice(10, 12), 10) <= 0) {
102
- return err(
103
- "INVALID_FORMAT",
104
- "Dutch VAT number last 2 digits must be > 0",
105
- );
106
- }
107
- // Valid if BSN check passes OR mod 97 check passes
108
- if (!bsnValid(v.slice(0, 9)) && mod97(`NL${v}`) !== 1) {
109
- return err(
110
- "INVALID_CHECKSUM",
111
- "Dutch VAT number checksum failed",
112
- );
113
- }
114
65
  return { valid: true, compact: v };
115
66
  };
116
67
 
@@ -118,24 +69,22 @@ const format = (value: string): string =>
118
69
  `NL${compact(value)}`;
119
70
 
120
71
  /** Generate a random valid Dutch VAT number. */
121
- const generate = (): string => {
122
- for (;;) {
123
- const c = randomDigits(9) + "B" + randomDigits(2);
124
- if (validate(c).valid) return c;
125
- }
126
- };
72
+ const generate = (): string =>
73
+ `${randomDigits(9)}B${randomDigits(2)}`;
127
74
 
128
75
  /** Dutch VAT Number. */
129
- const vat: Validator = {
76
+ const vat: CountryValidator<"NL"> = {
130
77
  name: "Dutch VAT Number",
131
78
  localName: "BTW-identificatienummer",
132
79
  abbreviation: "BTW",
133
80
  aliases: ["BTW-nummer", "BTW-id"] as const,
134
81
  candidatePattern: "NL\\d{9}B\\d{2}",
82
+ scope: "country",
135
83
  country: "NL",
136
84
  entityType: "company",
137
- sourceUrl: "https://www.belastingdienst.nl/",
138
- examples: ["123456789B13"] as const,
85
+ sourceUrl:
86
+ "https://business.gov.nl/regulations/using-checking-vat-numbers/",
87
+ examples: ["000099998B57"] as const,
139
88
  compact,
140
89
  format,
141
90
  validate,
@@ -8,18 +8,18 @@
8
8
  * @see https://www.skatteetaten.no/
9
9
  */
10
10
 
11
+ import type {
12
+ ParsedPersonId,
13
+ ValidateResult,
14
+ CountryValidator,
15
+ } from "../types";
16
+
11
17
  import { clean } from "#util/clean";
12
18
  import { isValidDate } from "#util/date";
13
19
  import { randomDigits, randomInt } from "#util/generate";
14
20
  import { err } from "#util/result";
15
21
  import { isdigits } from "#util/strings";
16
22
 
17
- import type {
18
- ParsedPersonId,
19
- ValidateResult,
20
- Validator,
21
- } from "../types";
22
-
23
23
  const WEIGHTS_D1 = [3, 7, 6, 1, 8, 9, 4, 5, 2] as const;
24
24
  const WEIGHTS_D2 = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2] as const;
25
25
 
@@ -172,18 +172,23 @@ const generate = (): string => {
172
172
  };
173
173
 
174
174
  /** Norwegian Birth Number. */
175
- const fodselsnummer: Validator = {
175
+ const fodselsnummer: CountryValidator<
176
+ "NO",
177
+ ParsedPersonId
178
+ > = {
176
179
  name: "Norwegian Birth Number",
177
180
  localName: "Fødselsnummer",
178
181
  abbreviation: "Fødselsnr",
179
182
  aliases: ["fødselsnummer", "personnummer"] as const,
180
183
  candidatePattern: "\\d{11}",
184
+ scope: "country",
181
185
  country: "NO",
182
186
  entityType: "person",
183
187
  sourceUrl: "https://www.skatteetaten.no/",
184
188
  examples: ["15108695088"] as const,
185
189
  compact,
186
190
  format,
191
+ parse,
187
192
  validate,
188
193
  generate,
189
194
  };
package/src/no/mva.ts CHANGED
@@ -7,15 +7,18 @@
7
7
  * @see https://www.skatteetaten.no/
8
8
  */
9
9
 
10
- import { clean } from "#util/clean";
11
- import { err } from "#util/result";
12
-
13
- import type { ValidateResult, Validator } from "../types";
10
+ import type {
11
+ ValidateResult,
12
+ CountryValidator,
13
+ } from "../types";
14
14
  import {
15
15
  validate as validateOrgnr,
16
16
  generate as generateOrgnr,
17
17
  } from "./orgnr";
18
18
 
19
+ import { clean } from "#util/clean";
20
+ import { err } from "#util/result";
21
+
19
22
  const compact = (value: string): string => {
20
23
  let v = clean(value, " -").toUpperCase();
21
24
  if (v.startsWith("NO")) {
@@ -53,12 +56,13 @@ const format = (value: string): string => {
53
56
  const generate = (): string => generateOrgnr() + "MVA";
54
57
 
55
58
  /** Norwegian VAT Number. */
56
- const mva: Validator = {
59
+ const mva: CountryValidator<"NO"> = {
57
60
  name: "Norwegian VAT Number",
58
61
  localName: "Merverdiavgift",
59
62
  abbreviation: "MVA",
60
63
  aliases: ["MVA-nummer", "organisasjonsnummer"] as const,
61
64
  candidatePattern: "NO\\d{9}MVA",
65
+ scope: "country",
62
66
  country: "NO",
63
67
  entityType: "company",
64
68
  sourceUrl: "https://www.skatteetaten.no/",