@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/cu/ni.ts CHANGED
@@ -15,16 +15,17 @@
15
15
  * @see https://www.ecured.cu/Carnet_de_Identidad
16
16
  */
17
17
 
18
- import { clean } from "#util/clean";
19
- import { isValidDate } from "#util/date";
20
- import { err } from "#util/result";
21
-
22
18
  import type {
23
19
  ParsedPersonId,
24
20
  ValidateResult,
25
- Validator,
21
+ CountryValidator,
26
22
  } from "../types";
27
23
 
24
+ import { clean } from "#util/clean";
25
+ import { isValidDate } from "#util/date";
26
+ import { randomDigits, randomInt } from "#util/generate";
27
+ import { err } from "#util/result";
28
+
28
29
  const compact = (value: string): string =>
29
30
  clean(value, " -").trim();
30
31
 
@@ -58,6 +59,8 @@ const validate = (value: string): ValidateResult => {
58
59
  const yy = Number(v.slice(0, 2));
59
60
  const mm = Number(v.slice(2, 4));
60
61
  const dd = Number(v.slice(4, 6));
62
+ // SAFETY: regex check above guarantees v.length === 11.
63
+ // eslint-disable-next-line no-non-null-assertion
61
64
  const year = centuryOffset(v[6]!) + yy;
62
65
 
63
66
  if (!isValidDate(year, mm, dd)) {
@@ -84,6 +87,8 @@ const parse = (value: string): ParsedPersonId | null => {
84
87
  const yy = Number(v.slice(0, 2));
85
88
  const mm = Number(v.slice(2, 4));
86
89
  const dd = Number(v.slice(4, 6));
90
+ // SAFETY: regex check above guarantees v.length === 11.
91
+ // eslint-disable-next-line no-non-null-assertion
87
92
  const year = centuryOffset(v[6]!) + yy;
88
93
 
89
94
  const genderDigit = Number(v[9]);
@@ -96,12 +101,25 @@ const parse = (value: string): ParsedPersonId | null => {
96
101
  };
97
102
  };
98
103
 
104
+ /** Generate a random valid Cuban NI. */
105
+ const generate = (): string => {
106
+ const year = randomInt(1950, 2024);
107
+ const month = String(randomInt(1, 12)).padStart(2, "0");
108
+ const day = String(randomInt(1, 28)).padStart(2, "0");
109
+ const yy = String(year % 100).padStart(2, "0");
110
+ const century =
111
+ year >= 2000
112
+ ? String(randomInt(6, 8))
113
+ : String(randomInt(0, 5));
114
+ return `${yy}${month}${day}${century}${randomDigits(4)}`;
115
+ };
116
+
99
117
  /**
100
118
  * Cuban identity card number (NI).
101
119
  *
102
120
  * Examples sourced from python-stdnum test suite.
103
121
  */
104
- const ni: Validator = {
122
+ const ni: CountryValidator<"CU", ParsedPersonId> = {
105
123
  name: "Cuban Identity Card Number",
106
124
  localName: "Número de Identidad",
107
125
  abbreviation: "NI",
@@ -111,15 +129,18 @@ const ni: Validator = {
111
129
  "carnet de identidad",
112
130
  ] as const,
113
131
  candidatePattern: "\\d{11}",
132
+ scope: "country",
114
133
  country: "CU",
115
134
  entityType: "person",
116
135
  lengths: [11] as const,
117
136
  examples: ["91021027775", "72062506561"] as const,
118
137
  compact,
119
138
  format,
139
+ parse,
120
140
  validate,
141
+ generate,
121
142
  sourceUrl: "https://www.ecured.cu/Carnet_de_Identidad",
122
143
  };
123
144
 
124
145
  export default ni;
125
- export { compact, format, parse, validate };
146
+ export { compact, format, generate, parse, validate };
package/src/cy/vat.ts CHANGED
@@ -7,13 +7,16 @@
7
7
  * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/cyprus-tin.pdf
8
8
  */
9
9
 
10
+ import type {
11
+ ValidateResult,
12
+ CountryValidator,
13
+ } from "../types";
14
+
10
15
  import { clean } from "#util/clean";
11
16
  import { randomDigits } from "#util/generate";
12
17
  import { err } from "#util/result";
13
18
  import { isdigits } from "#util/strings";
14
19
 
15
- import type { ValidateResult, Validator } from "../types";
16
-
17
20
  const ODD_MAP: Record<number, number> = {
18
21
  0: 1,
19
22
  1: 0,
@@ -110,12 +113,13 @@ const generate = (): string => {
110
113
  };
111
114
 
112
115
  /** Cypriot VAT Number. */
113
- const vat: Validator = {
116
+ const vat: CountryValidator<"CY"> = {
114
117
  name: "Cypriot VAT Number",
115
118
  localName: "Αριθμός Εγγραφής Φ.Π.Α.",
116
119
  abbreviation: "ΦΠΑ",
117
120
  aliases: ["ΦΠΑ", "VAT CY"] as const,
118
121
  candidatePattern: "CY\\d{8}[A-Z]",
122
+ scope: "country",
119
123
  country: "CY",
120
124
  entityType: "company",
121
125
  sourceUrl: "https://www.mof.gov.cy/",
package/src/cz/dic.ts CHANGED
@@ -11,15 +11,18 @@
11
11
  * @see https://adisspr.mfcr.cz/dpr/DphReg
12
12
  */
13
13
 
14
+ import type {
15
+ ValidateResult,
16
+ CountryValidator,
17
+ } from "../types";
18
+ import { validate as validateRc } from "./rc";
19
+
14
20
  import { weightedSum } from "#checksums/weighted-sum";
15
21
  import { clean } from "#util/clean";
16
22
  import { randomDigits, randomInt } from "#util/generate";
17
23
  import { err } from "#util/result";
18
24
  import { isdigits } from "#util/strings";
19
25
 
20
- import type { ValidateResult, Validator } from "../types";
21
- import { validate as validateRc } from "./rc";
22
-
23
26
  const ICO_WEIGHTS = [8, 7, 6, 5, 4, 3, 2] as const;
24
27
 
25
28
  const compact = (value: string): string => {
@@ -115,15 +118,17 @@ const generate = (): string => {
115
118
  };
116
119
 
117
120
  /** Czech VAT Number. */
118
- const dic: Validator = {
121
+ const dic: CountryValidator<"CZ"> = {
119
122
  name: "Czech VAT Number",
120
123
  localName: "Daňové identifikační číslo",
121
124
  abbreviation: "DIČ",
122
125
  aliases: ["DIČ", "daňové identifikační číslo"] as const,
123
126
  candidatePattern: "CZ\\d{8,10}",
127
+ scope: "country",
124
128
  country: "CZ",
125
129
  entityType: "any",
126
130
  sourceUrl: "https://adisspr.mfcr.cz/dpr/DphReg",
131
+ lengths: [8, 9, 10] as const,
127
132
  examples: ["25123891", "7103192745"] as const,
128
133
  compact,
129
134
  format,
package/src/cz/ico.ts CHANGED
@@ -8,14 +8,17 @@
8
8
  * @see https://www.czso.cz/
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 = [8, 7, 6, 5, 4, 3, 2] as const;
20
23
 
21
24
  const compact = (value: string): string =>
@@ -59,12 +62,13 @@ const generate = (): string => {
59
62
  };
60
63
 
61
64
  /** Czech Company Identification Number. */
62
- const ico: Validator = {
65
+ const ico: CountryValidator<"CZ"> = {
63
66
  name: "Czech Company ID",
64
67
  localName: "Identifikační číslo osoby",
65
68
  abbreviation: "IČO",
66
69
  aliases: ["IČO", "IČ", "identifikační číslo"] as const,
67
70
  candidatePattern: "\\d{8}",
71
+ scope: "country",
68
72
  country: "CZ",
69
73
  entityType: "company",
70
74
  description:
package/src/cz/rc.ts CHANGED
@@ -6,29 +6,57 @@
6
6
  * and gender. 10-digit numbers (post-1954) must
7
7
  * be divisible by 11.
8
8
  *
9
- * Women have 50 added to the month. Since 2004,
10
- * an extra +20 offset is used when the serial
11
- * range is exhausted.
9
+ * Women have 50 added to the month. For modern
10
+ * 10-digit numbers, an additional +20 offset may
11
+ * be used when the daily serial range is exhausted
12
+ * (+70 for women).
13
+ *
14
+ * Canonical source:
15
+ * - Czech Ministry of the Interior guidance on rodne
16
+ * cislo, with the modern overflow-month rules
17
+ *
18
+ * We use this to keep the 9-digit historical form
19
+ * valid while rejecting modern +20/+70 month offsets
20
+ * on 9-digit numbers. Those overflow offsets are a
21
+ * modern rule for 10-digit values.
12
22
  *
13
23
  * @see https://www.mvcr.cz/mvcren/docDetail.aspx?docid=21975362&doctype=ART
14
24
  * @see Law 133/2000 Sb.
15
25
  */
16
26
 
27
+ import type {
28
+ ParsedPersonId,
29
+ ValidateResult,
30
+ CountryValidator,
31
+ } from "../types";
32
+
17
33
  import { clean } from "#util/clean";
18
34
  import { isValidDate } from "#util/date";
19
35
  import { randomInt } from "#util/generate";
20
36
  import { err } from "#util/result";
21
37
  import { isdigits } from "#util/strings";
22
38
 
23
- import type {
24
- ParsedPersonId,
25
- ValidateResult,
26
- Validator,
27
- } from "../types";
28
-
29
39
  const compact = (value: string): string =>
30
40
  clean(value, " /");
31
41
 
42
+ const decodeMonth = (
43
+ rawMonth: number,
44
+ year: number,
45
+ length: number,
46
+ ): number | null => {
47
+ const candidates =
48
+ length === 10 && year >= 2004
49
+ ? [0, 50, 20, 70]
50
+ : [0, 50];
51
+ for (const offset of candidates) {
52
+ const month = rawMonth - offset;
53
+ if (month >= 1 && month <= 12) {
54
+ return month;
55
+ }
56
+ }
57
+ return null;
58
+ };
59
+
32
60
  const validate = (value: string): ValidateResult => {
33
61
  const v = compact(value);
34
62
  if (v.length !== 9 && v.length !== 10) {
@@ -48,22 +76,6 @@ const validate = (value: string): ValidateResult => {
48
76
  const mm = Number(v.slice(2, 4));
49
77
  const dd = Number(v.slice(4, 6));
50
78
 
51
- // Strip gender (+50) and overflow (+20) offsets
52
- const month = (mm % 50) % 20 || mm % 50;
53
- if (month < 1 || month > 12) {
54
- return err(
55
- "INVALID_COMPONENT",
56
- "Birth number contains an invalid month",
57
- );
58
- }
59
-
60
- if (dd < 1 || dd > 31) {
61
- return err(
62
- "INVALID_COMPONENT",
63
- "Birth number contains an invalid day",
64
- );
65
- }
66
-
67
79
  // Resolve full year
68
80
  let year = yy + 1900;
69
81
  if (v.length === 9) {
@@ -80,6 +92,21 @@ const validate = (value: string): ValidateResult => {
80
92
  if (year < 1954) year += 100;
81
93
  }
82
94
 
95
+ const month = decodeMonth(mm, year, v.length);
96
+ if (month === null) {
97
+ return err(
98
+ "INVALID_COMPONENT",
99
+ "Birth number contains an invalid month",
100
+ );
101
+ }
102
+
103
+ if (dd < 1 || dd > 31) {
104
+ return err(
105
+ "INVALID_COMPONENT",
106
+ "Birth number contains an invalid day",
107
+ );
108
+ }
109
+
83
110
  // Validate the actual date
84
111
  if (!isValidDate(year, month, dd)) {
85
112
  return err(
@@ -122,13 +149,16 @@ const parse = (value: string): ParsedPersonId | null => {
122
149
  const mm = Number(v.slice(2, 4));
123
150
  const dd = Number(v.slice(4, 6));
124
151
 
125
- const gender = mm > 50 ? "female" : "male";
126
- const month = (mm % 50) % 20 || mm % 50;
127
-
152
+ const gender = mm >= 50 ? "female" : "male";
128
153
  let year = yy + 1900;
129
154
  if (v.length === 10 && year < 1954) year += 100;
130
155
  if (v.length === 9 && year >= 1980) year -= 100;
131
156
 
157
+ const month = decodeMonth(mm, year, v.length);
158
+ if (month === null) {
159
+ return null;
160
+ }
161
+
132
162
  return {
133
163
  birthDate: new Date(year, month - 1, dd),
134
164
  gender,
@@ -166,12 +196,13 @@ const generate = (): string => {
166
196
  };
167
197
 
168
198
  /** Czech/Slovak Birth Number. */
169
- const rc: Validator = {
199
+ const rc: CountryValidator<"CZ", ParsedPersonId> = {
170
200
  name: "Czech Birth Number",
171
201
  localName: "Rodné číslo",
172
202
  abbreviation: "RČ",
173
203
  aliases: ["rodné číslo", "RČ", "birth number"] as const,
174
204
  candidatePattern: "\\d{6}/\\d{3,4}",
205
+ scope: "country",
175
206
  country: "CZ",
176
207
  entityType: "person",
177
208
  description:
@@ -182,6 +213,7 @@ const rc: Validator = {
182
213
  examples: ["7103192745"] as const,
183
214
  compact,
184
215
  format,
216
+ parse,
185
217
  validate,
186
218
  generate,
187
219
  };
@@ -1,7 +1,14 @@
1
+ const GENERATE_TYPES = [
2
+ "HRA",
3
+ "HRB",
4
+ "GNR",
5
+ "PR",
6
+ "VR",
7
+ ] as const;
8
+
1
9
  /** Generate a random valid Handelsregisternummer. */
2
10
  const generate = (): string => {
3
- const types = ["HRA", "HRB", "GNR", "PR", "VR"];
4
- const type = types[randomInt(0, types.length - 1)]!;
11
+ const type = randomPick(GENERATE_TYPES);
5
12
  const number = randomDigits(5);
6
13
  return `${type} ${number}`;
7
14
  };
@@ -24,12 +31,15 @@ const generate = (): string => {
24
31
  * @see https://de.wikipedia.org/wiki/Handelsregister_(Deutschland)
25
32
  */
26
33
 
34
+ import type {
35
+ ValidateResult,
36
+ CountryValidator,
37
+ } from "../types";
38
+
27
39
  import { clean } from "#util/clean";
28
- import { randomDigits, randomInt } from "#util/generate";
40
+ import { randomDigits, randomPick } from "#util/generate";
29
41
  import { err } from "#util/result";
30
42
 
31
- import type { ValidateResult, Validator } from "../types";
32
-
33
43
  const REGISTER_TYPES = new Set([
34
44
  "HRA",
35
45
  "HRB",
@@ -62,7 +72,11 @@ const validate = (value: string): ValidateResult => {
62
72
  );
63
73
  }
64
74
 
75
+ // SAFETY: both capture groups are required, so a
76
+ // successful match always populates [1] and [2].
77
+ // eslint-disable-next-line no-non-null-assertion
65
78
  const type = match[1]!;
79
+ // eslint-disable-next-line no-non-null-assertion
66
80
  const number = match[2]!;
67
81
 
68
82
  if (!REGISTER_TYPES.has(type)) {
@@ -81,7 +95,7 @@ const validate = (value: string): ValidateResult => {
81
95
  const format = (value: string): string => compact(value);
82
96
 
83
97
  /** German Company Register Number. */
84
- const handelsreg: Validator = {
98
+ const handelsreg: CountryValidator<"DE"> = {
85
99
  name: "German Company Register Number",
86
100
  localName: "Handelsregisternummer",
87
101
  abbreviation: "HReg",
@@ -92,6 +106,7 @@ const handelsreg: Validator = {
92
106
  "HRA",
93
107
  ] as const,
94
108
  candidatePattern: "(?:HRA|HRB|GnR|PR|VR)\\s*\\d{1,7}",
109
+ scope: "country",
95
110
  country: "DE",
96
111
  entityType: "company",
97
112
  sourceUrl:
package/src/de/idnr.ts CHANGED
@@ -10,6 +10,11 @@
10
10
  * @see https://www.bzst.de/DE/Privatpersonen/SteuerlicheIdentifikationsnummer/steuerlicheidentifikationsnummer_node.html
11
11
  */
12
12
 
13
+ import type {
14
+ ValidateResult,
15
+ CountryValidator,
16
+ } from "../types";
17
+
13
18
  import {
14
19
  mod1110validate,
15
20
  mod1110checkDigit,
@@ -19,8 +24,6 @@ import { randomInt } from "#util/generate";
19
24
  import { err } from "#util/result";
20
25
  import { isdigits } from "#util/strings";
21
26
 
22
- import type { ValidateResult, Validator } from "../types";
23
-
24
27
  const compact = (value: string): string =>
25
28
  clean(value, " -/");
26
29
 
@@ -103,6 +106,9 @@ const generate = (): string => {
103
106
  while (pool.length < 10) pool.push(randomInt(0, 9));
104
107
  for (let i = pool.length - 1; i > 0; i--) {
105
108
  const j = randomInt(0, i);
109
+ // SAFETY: i and j are valid indices of `pool`
110
+ // (i > 0, j ∈ [0, i]).
111
+ // eslint-disable-next-line no-non-null-assertion
106
112
  [pool[i], pool[j]] = [pool[j]!, pool[i]!];
107
113
  }
108
114
  if (pool[0] === 0) continue;
@@ -115,7 +121,7 @@ const generate = (): string => {
115
121
  };
116
122
 
117
123
  /** German Personal Tax ID. */
118
- const idnr: Validator = {
124
+ const idnr: CountryValidator<"DE"> = {
119
125
  name: "German Tax ID",
120
126
  localName: "Steuerliche Identifikationsnummer",
121
127
  abbreviation: "IdNr",
@@ -125,6 +131,7 @@ const idnr: Validator = {
125
131
  "Steuer-ID",
126
132
  ] as const,
127
133
  candidatePattern: "\\d{2}\\s?\\d{3}\\s?\\d{3}\\s?\\d{3}",
134
+ scope: "country",
128
135
  country: "DE",
129
136
  entityType: "person",
130
137
  sourceUrl:
package/src/de/stnr.ts CHANGED
@@ -26,13 +26,16 @@ const generate = (): string => {
26
26
  * @see https://de.wikipedia.org/wiki/Steuernummer
27
27
  */
28
28
 
29
+ import type {
30
+ ValidateResult,
31
+ CountryValidator,
32
+ } from "../types";
33
+
29
34
  import { clean } from "#util/clean";
30
35
  import { randomDigits } from "#util/generate";
31
36
  import { err } from "#util/result";
32
37
  import { isdigits } from "#util/strings";
33
38
 
34
- import type { ValidateResult, Validator } from "../types";
35
-
36
39
  /**
37
40
  * Format patterns per federal state.
38
41
  * [0] = regional format, [1] = unified (federal) format.
@@ -166,9 +169,13 @@ const format = (value: string): string => {
166
169
  // category: literal digits, F, B, U, P
167
170
  const segments: string[] = [];
168
171
  let segStart = 0;
172
+ // SAFETY: fmt is a non-empty literal from COMPILED.
173
+ // eslint-disable-next-line no-non-null-assertion
169
174
  let prevCat = charCat(fmt[0]!);
170
175
 
171
176
  for (let i = 1; i < fmt.length; i++) {
177
+ // SAFETY: i < fmt.length.
178
+ // eslint-disable-next-line no-non-null-assertion
172
179
  const cat = charCat(fmt[i]!);
173
180
  if (cat !== prevCat) {
174
181
  segments.push(v.slice(segStart, i));
@@ -190,12 +197,13 @@ const charCat = (ch: string): string => {
190
197
  };
191
198
 
192
199
  /** German Tax Number (Steuernummer). */
193
- const stnr: Validator = {
200
+ const stnr: CountryValidator<"DE"> = {
194
201
  name: "German Tax Number",
195
202
  localName: "Steuernummer",
196
203
  abbreviation: "StNr",
197
204
  aliases: ["Steuernummer", "St.Nr."] as const,
198
205
  candidatePattern: "\\d{2,4}/\\d{3,4}/\\d{4,5}",
206
+ scope: "country",
199
207
  country: "DE",
200
208
  entityType: "any",
201
209
  description:
package/src/de/svnr.ts CHANGED
@@ -9,6 +9,11 @@
9
9
  * @see https://de.wikipedia.org/wiki/Sozialversicherungsnummer
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 {
14
19
  isValidDate,
@@ -17,8 +22,6 @@ import {
17
22
  import { randomInt } from "#util/generate";
18
23
  import { err } from "#util/result";
19
24
 
20
- import type { ValidateResult, Validator } from "../types";
21
-
22
25
  const letterValue = (ch: string): number => {
23
26
  const code = ch.charCodeAt(0);
24
27
  if (code >= 65 && code <= 90) return code - 64;
@@ -39,6 +42,8 @@ const computeCheck = (v: string): number => {
39
42
  digits.push(Number(v[i]));
40
43
  }
41
44
 
45
+ // SAFETY: caller guarantees v.length === 12.
46
+ // eslint-disable-next-line no-non-null-assertion
42
47
  const lv = letterValue(v[8]!);
43
48
  digits.push(Math.floor(lv / 10));
44
49
  digits.push(lv % 10);
@@ -47,8 +52,11 @@ const computeCheck = (v: string): number => {
47
52
  digits.push(Number(v[10]));
48
53
 
49
54
  let sum = 0;
50
- for (let i = 0; i < 12; i++) {
51
- const product = digits[i]! * WEIGHTS[i]!;
55
+ for (const [i, weight] of WEIGHTS.entries()) {
56
+ // SAFETY: WEIGHTS.length === 12 and we just pushed
57
+ // 12 entries onto `digits`.
58
+ // eslint-disable-next-line no-non-null-assertion
59
+ const product = digits[i]! * weight;
52
60
  if (product >= 10) {
53
61
  sum += Math.floor(product / 10) + (product % 10);
54
62
  } else {
@@ -132,7 +140,7 @@ const generate = (): string => {
132
140
  };
133
141
 
134
142
  /** German Social Insurance Number. */
135
- const svnr: Validator = {
143
+ const svnr: CountryValidator<"DE"> = {
136
144
  name: "German Social Insurance Number",
137
145
  localName: "Sozialversicherungsnummer",
138
146
  abbreviation: "SVNR",
@@ -142,6 +150,7 @@ const svnr: Validator = {
142
150
  "Versicherungsnummer",
143
151
  ] as const,
144
152
  candidatePattern: "\\d{2}\\s?\\d{6}\\s?[A-Z]\\s?\\d{3}",
153
+ scope: "country",
145
154
  country: "DE",
146
155
  entityType: "person",
147
156
  description:
package/src/de/vat.ts CHANGED
@@ -9,6 +9,11 @@
9
9
  * @see https://www.bzst.de/SharedDocs/Downloads/DE/Merkblaetter/ust_idnr_aufbau.pdf
10
10
  */
11
11
 
12
+ import type {
13
+ ValidateResult,
14
+ CountryValidator,
15
+ } from "../types";
16
+
12
17
  import {
13
18
  mod1110checkDigit,
14
19
  mod1110validate,
@@ -18,8 +23,6 @@ import { randomDigits, randomInt } 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
  const v = clean(value, " -/");
25
28
  if (v.startsWith("DE") || v.startsWith("de")) {
@@ -70,7 +73,7 @@ const generate = (): string => {
70
73
  };
71
74
 
72
75
  /** German VAT Identification Number. */
73
- const vat: Validator = {
76
+ const vat: CountryValidator<"DE"> = {
74
77
  name: "German VAT Number",
75
78
  localName: "Umsatzsteuer-Identifikationsnummer",
76
79
  abbreviation: "USt-IdNr.",
@@ -80,6 +83,7 @@ const vat: Validator = {
80
83
  "VAT DE",
81
84
  ] as const,
82
85
  candidatePattern: "DE\\d{9}",
86
+ scope: "country",
83
87
  country: "DE",
84
88
  entityType: "company",
85
89
  description:
package/src/dk/cpr.ts CHANGED
@@ -8,17 +8,18 @@
8
8
  * @see https://cpr.dk/
9
9
  */
10
10
 
11
- import { clean } from "#util/clean";
12
- import { isValidDate } from "#util/date";
13
- import { err } from "#util/result";
14
- import { isdigits } from "#util/strings";
15
-
16
11
  import type {
17
12
  ParsedPersonId,
18
13
  ValidateResult,
19
- Validator,
14
+ CountryValidator,
20
15
  } from "../types";
21
16
 
17
+ import { clean } from "#util/clean";
18
+ import { isValidDate } from "#util/date";
19
+ import { randomDigits, randomInt } from "#util/generate";
20
+ import { err } from "#util/result";
21
+ import { isdigits } from "#util/strings";
22
+
22
23
  const compact = (value: string): string =>
23
24
  clean(value, " -");
24
25
 
@@ -102,21 +103,35 @@ const parse = (value: string): ParsedPersonId | null => {
102
103
  };
103
104
  };
104
105
 
106
+ /** Generate a random valid Danish CPR. */
107
+ const generate = (): string => {
108
+ const year = randomInt(1900, 2024);
109
+ const month = String(randomInt(1, 12)).padStart(2, "0");
110
+ const day = String(randomInt(1, 28)).padStart(2, "0");
111
+ const yy = String(year % 100).padStart(2, "0");
112
+ const serialPrefix = String(randomInt(0, 3));
113
+ return `${day}${month}${yy}${serialPrefix}${randomDigits(3)}`;
114
+ };
115
+
105
116
  /** Danish Personal Identification Number. */
106
- const cpr: Validator = {
117
+ const cpr: CountryValidator<"DK", ParsedPersonId> = {
107
118
  name: "Danish Personal ID",
108
119
  localName: "Det Centrale Personregister",
109
120
  abbreviation: "CPR",
110
121
  aliases: ["CPR-nummer", "personnummer", "CPR"] as const,
111
122
  candidatePattern: "\\d{6}-?\\d{4}",
123
+ scope: "country",
112
124
  country: "DK",
113
125
  entityType: "person",
114
126
  sourceUrl: "https://cpr.dk/",
127
+ lengths: [10] as const,
115
128
  examples: ["2110625629"] as const,
116
129
  compact,
117
130
  format,
131
+ parse,
118
132
  validate,
133
+ generate,
119
134
  };
120
135
 
121
136
  export default cpr;
122
- export { compact, format, parse, validate };
137
+ export { compact, format, generate, parse, validate };