@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
@@ -22,3 +22,41 @@ export const randomInt = (
22
22
  max: number,
23
23
  ): number =>
24
24
  min + Math.floor(Math.random() * (max - min + 1));
25
+
26
+ /**
27
+ * Pick a random element from a non-empty array.
28
+ * Throws if the array is empty so generators that
29
+ * declare a fixed pool fail loudly instead of
30
+ * returning `undefined`.
31
+ */
32
+ export const randomPick = <T>(values: readonly T[]): T => {
33
+ if (values.length === 0) {
34
+ throw new Error("randomPick called with empty array");
35
+ }
36
+ const idx = randomInt(0, values.length - 1);
37
+ // SAFETY: idx is bounded by values.length and the
38
+ // array is non-empty (checked above).
39
+ const value = values[idx];
40
+ if (value === undefined) {
41
+ throw new Error("randomPick produced undefined");
42
+ }
43
+ return value;
44
+ };
45
+
46
+ /**
47
+ * Pick a random character from a non-empty string.
48
+ * Same contract as `randomPick` for arrays.
49
+ */
50
+ export const randomChar = (chars: string): string => {
51
+ if (chars.length === 0) {
52
+ throw new Error("randomChar called with empty string");
53
+ }
54
+ const idx = randomInt(0, chars.length - 1);
55
+ // SAFETY: idx is bounded by chars.length and the
56
+ // string is non-empty (checked above).
57
+ const ch = chars[idx];
58
+ if (ch === undefined) {
59
+ throw new Error("randomChar produced undefined");
60
+ }
61
+ return ch;
62
+ };
package/src/ad/nrt.ts CHANGED
@@ -1,8 +1,8 @@
1
+ const NRT_PREFIXES = "CDEGOPU";
2
+
1
3
  /** Generate a random valid Andorra NRT. */
2
4
  const generate = (): string => {
3
- const prefixes = "CDEGOPU";
4
- const prefix =
5
- prefixes[randomInt(0, prefixes.length - 1)]!;
5
+ const prefix = randomChar(NRT_PREFIXES);
6
6
  const digits = randomDigits(6);
7
7
  const suffix = String.fromCodePoint(
8
8
  65 + randomInt(0, 25),
@@ -25,13 +25,20 @@ const generate = (): string => {
25
25
  * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Andorra-TIN.pdf
26
26
  */
27
27
 
28
+ import type {
29
+ ValidateResult,
30
+ CountryValidator,
31
+ } from "../types";
32
+
28
33
  import { clean } from "#util/clean";
29
- import { randomDigits, randomInt } from "#util/generate";
34
+ import {
35
+ randomChar,
36
+ randomDigits,
37
+ randomInt,
38
+ } from "#util/generate";
30
39
  import { err } from "#util/result";
31
40
  import { isdigits } from "#util/strings";
32
41
 
33
- import type { ValidateResult, Validator } from "../types";
34
-
35
42
  const VALID_PREFIXES = "ACDEFGLOPU";
36
43
 
37
44
  const compact = (value: string): string =>
@@ -45,7 +52,11 @@ const validate = (value: string): ValidateResult => {
45
52
  "Andorra NRT must be 8 characters",
46
53
  );
47
54
  }
55
+ // SAFETY: v.length === 8 guarantees both positions
56
+ // exist; oxlint cannot see the length guard.
57
+ // eslint-disable-next-line no-non-null-assertion
48
58
  const prefix = v[0]!;
59
+ // eslint-disable-next-line no-non-null-assertion
49
60
  const tail = v[7]!;
50
61
  const digits = v.slice(1, 7);
51
62
  if (!/^[A-Z]$/.test(prefix) || !/^[A-Z]$/.test(tail)) {
@@ -90,12 +101,13 @@ const format = (value: string): string => {
90
101
  };
91
102
 
92
103
  /** Andorra NRT (Número de Registre Tributari). */
93
- const nrt: Validator = {
104
+ const nrt: CountryValidator<"AD"> = {
94
105
  name: "Andorra Tax Number",
95
106
  localName: "Número de Registre Tributari",
96
107
  abbreviation: "NRT",
97
108
  aliases: ["NRT", "Número de Registre Tributari"] as const,
98
109
  candidatePattern: "[A-Z]-?\\d{6}-?[A-Z]",
110
+ scope: "country",
99
111
  country: "AD",
100
112
  entityType: "any",
101
113
  sourceUrl:
package/src/ae/eid.ts CHANGED
@@ -10,6 +10,11 @@
10
10
  * @see https://u.ae/en/information-and-services/visa-and-emirates-id/emirates-id
11
11
  */
12
12
 
13
+ import type {
14
+ ValidateResult,
15
+ CountryValidator,
16
+ } from "../types";
17
+
13
18
  import {
14
19
  luhnChecksum,
15
20
  luhnValidate,
@@ -19,8 +24,6 @@ import { randomDigits, 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
 
@@ -77,12 +80,13 @@ const generate = (): string => {
77
80
  };
78
81
 
79
82
  /** UAE Emirates ID. */
80
- const eid: Validator = {
83
+ const eid: CountryValidator<"AE"> = {
81
84
  name: "Emirates ID",
82
85
  localName: "رقم الهوية",
83
86
  abbreviation: "EID",
84
87
  aliases: ["EID", "Emirates ID", "رقم الهوية"] as const,
85
88
  candidatePattern: "784-\\d{4}-\\d{7}-\\d",
89
+ scope: "country",
86
90
  country: "AE",
87
91
  entityType: "person",
88
92
  lengths: [15],
package/src/ai/tin.ts CHANGED
@@ -23,12 +23,15 @@ const generate = (): string => {
23
23
  * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Anguilla-TIN.pdf
24
24
  */
25
25
 
26
+ import type {
27
+ ValidateResult,
28
+ CountryValidator,
29
+ } from "../types";
30
+
26
31
  import { clean } from "#util/clean";
27
32
  import { randomDigits } from "#util/generate";
28
33
  import { err } from "#util/result";
29
34
 
30
- import type { ValidateResult, Validator } from "../types";
31
-
32
35
  const compact = (value: string): string => {
33
36
  return clean(value, " -").trim();
34
37
  };
@@ -74,12 +77,13 @@ const format = (value: string): string => {
74
77
  * (format-only validation, no published check
75
78
  * digit algorithm).
76
79
  */
77
- const tin: Validator = {
80
+ const tin: CountryValidator<"AI"> = {
78
81
  name: "Anguilla Tax Identification Number",
79
82
  localName: "Tax Identification Number",
80
83
  abbreviation: "TIN",
81
84
  aliases: ["TIN"] as const,
82
85
  candidatePattern: "\\d{11}",
86
+ scope: "country",
83
87
  country: "AI",
84
88
  entityType: "any",
85
89
  lengths: [10] as const,
package/src/al/nipt.ts CHANGED
@@ -18,12 +18,15 @@ const generate = (): string => {
18
18
  * @see https://www.tatime.gov.al/eng/c/4/103/business-lifecycle
19
19
  */
20
20
 
21
+ import type {
22
+ ValidateResult,
23
+ CountryValidator,
24
+ } from "../types";
25
+
21
26
  import { clean } from "#util/clean";
22
27
  import { randomDigits, randomInt } from "#util/generate";
23
28
  import { err } from "#util/result";
24
29
 
25
- import type { ValidateResult, Validator } from "../types";
26
-
27
30
  const NIPT_RE = /^[A-M]\d{8}[A-Z]$/;
28
31
 
29
32
  const compact = (value: string): string => {
@@ -57,13 +60,14 @@ const validate = (value: string): ValidateResult => {
57
60
  const format = (value: string): string => compact(value);
58
61
 
59
62
  /** Albanian NIPT (tax identification number). */
60
- const nipt: Validator = {
63
+ const nipt: CountryValidator<"AL"> = {
61
64
  name: "Albanian Tax Number",
62
65
  localName:
63
66
  "Numri i Identifikimit për Personin e Tatueshëm",
64
67
  abbreviation: "NIPT",
65
68
  aliases: ["NIPT", "NUIS"] as const,
66
69
  candidatePattern: "[A-Z]\\d{8}[A-Z]",
70
+ scope: "country",
67
71
  country: "AL",
68
72
  entityType: "any",
69
73
  sourceUrl: "https://www.tatime.gov.al/",
package/src/am/tin.ts CHANGED
@@ -16,13 +16,16 @@ const generate = (): string => randomDigits(8);
16
16
  * @see https://www.src.am/en/taxpayerSearchSystemPage/112
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 { randomDigits } from "#util/generate";
21
26
  import { err } from "#util/result";
22
27
  import { isdigits } from "#util/strings";
23
28
 
24
- import type { ValidateResult, Validator } from "../types";
25
-
26
29
  const compact = (value: string): string =>
27
30
  clean(value, " -").trim();
28
31
 
@@ -49,12 +52,13 @@ const validate = (value: string): ValidateResult => {
49
52
  const format = (value: string): string => compact(value);
50
53
 
51
54
  /** Armenian Tax Identification Number. */
52
- const tin: Validator = {
55
+ const tin: CountryValidator<"AM"> = {
53
56
  name: "Armenian Tax ID",
54
57
  localName: "Հարկ վճարողի հաշվառման համար",
55
58
  abbreviation: "TIN",
56
59
  aliases: ["ՀՎՀՀ", "TIN"] as const,
57
60
  candidatePattern: "\\d{8}",
61
+ scope: "country",
58
62
  country: "AM",
59
63
  entityType: "any",
60
64
  lengths: [8] as const,
package/src/ar/cbu.ts CHANGED
@@ -8,13 +8,16 @@
8
8
  * @see https://es.wikipedia.org/wiki/Clave_bancaria_uniforme
9
9
  */
10
10
 
11
+ import type {
12
+ ValidateResult,
13
+ CountryValidator,
14
+ } from "../types";
15
+
11
16
  import { clean } from "#util/clean";
12
17
  import { randomDigits } from "#util/generate";
13
18
  import { err } from "#util/result";
14
19
  import { isdigits } from "#util/strings";
15
20
 
16
- import type { ValidateResult, Validator } from "../types";
17
-
18
21
  const WEIGHTS_BLOCK1 = [7, 1, 3, 9, 7, 1, 3];
19
22
  const WEIGHTS_BLOCK2 = [
20
23
  3, 9, 7, 1, 3, 9, 7, 1, 3, 9, 7, 1, 3,
@@ -28,8 +31,8 @@ const calcCheck = (
28
31
  weights: readonly number[],
29
32
  ): number => {
30
33
  let sum = 0;
31
- for (let i = 0; i < digits.length; i++) {
32
- sum += Number(digits[i]) * weights[i]!;
34
+ for (const [i, weight] of weights.entries()) {
35
+ sum += Number(digits[i]) * weight;
33
36
  }
34
37
  return (10 - (sum % 10)) % 10;
35
38
  };
@@ -84,12 +87,13 @@ const generate = (): string => {
84
87
  };
85
88
 
86
89
  /** Argentine Uniform Bank Key. */
87
- const cbu: Validator = {
90
+ const cbu: CountryValidator<"AR"> = {
88
91
  name: "Argentine Bank Account Number",
89
92
  localName: "Clave Bancaria Uniforme",
90
93
  abbreviation: "CBU",
91
94
  aliases: ["CBU", "Clave Bancaria Uniforme"] as const,
92
95
  candidatePattern: "\\d{22}",
96
+ scope: "country",
93
97
  country: "AR",
94
98
  entityType: "any",
95
99
  sourceUrl:
package/src/ar/cuit.ts CHANGED
@@ -16,13 +16,16 @@
16
16
  * @see https://en.wikipedia.org/wiki/CUIT_(Argentina)
17
17
  */
18
18
 
19
+ import type {
20
+ ValidateResult,
21
+ CountryValidator,
22
+ } from "../types";
23
+
19
24
  import { clean } from "#util/clean";
20
- import { randomDigits } from "#util/generate";
25
+ import { randomDigits, randomPick } from "#util/generate";
21
26
  import { err } from "#util/result";
22
27
  import { isdigits } from "#util/strings";
23
28
 
24
- import type { ValidateResult, Validator } from "../types";
25
-
26
29
  const VALID_TYPES = new Set([
27
30
  "20",
28
31
  "23",
@@ -36,7 +39,17 @@ const VALID_TYPES = new Set([
36
39
  "55",
37
40
  ]);
38
41
 
39
- const WEIGHTS = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
42
+ const WEIGHTS = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2] as const;
43
+
44
+ const GENERATE_TYPES = [
45
+ "20",
46
+ "23",
47
+ "24",
48
+ "27",
49
+ "30",
50
+ "33",
51
+ "34",
52
+ ] as const;
40
53
 
41
54
  const compact = (value: string): string =>
42
55
  clean(value, " -.").trim();
@@ -49,8 +62,8 @@ const compact = (value: string): string =>
49
62
  */
50
63
  const calcCheckDigit = (body: string): number => {
51
64
  let sum = 0;
52
- for (let i = 0; i < 10; i++) {
53
- sum += Number(body[i]) * WEIGHTS[i]!;
65
+ for (const [i, weight] of WEIGHTS.entries()) {
66
+ sum += Number(body[i]) * weight;
54
67
  }
55
68
  const remainder = 11 - (sum % 11);
56
69
  if (remainder === 11) return 0;
@@ -98,9 +111,7 @@ const format = (value: string): string => {
98
111
 
99
112
  /** Generate a random valid CUIT. */
100
113
  const generate = (): string => {
101
- const types = ["20", "23", "24", "27", "30", "33", "34"];
102
- const type =
103
- types[Math.floor(Math.random() * types.length)]!;
114
+ const type = randomPick(GENERATE_TYPES);
104
115
  const body = type + randomDigits(8);
105
116
  const check = calcCheckDigit(body);
106
117
  return body + String(check);
@@ -112,7 +123,7 @@ const generate = (): string => {
112
123
  * Examples sourced from python-stdnum test suite
113
124
  * (ar.cuit module).
114
125
  */
115
- const cuit: Validator = {
126
+ const cuit: CountryValidator<"AR"> = {
116
127
  name: "Argentine Tax ID",
117
128
  localName: "Clave Única de Identificación Tributaria",
118
129
  abbreviation: "CUIT",
@@ -122,6 +133,7 @@ const cuit: Validator = {
122
133
  "Clave Única de Identificación Tributaria",
123
134
  ] as const,
124
135
  candidatePattern: "\\d{2}-?\\d{8}-?\\d",
136
+ scope: "country",
125
137
  country: "AR",
126
138
  entityType: "any",
127
139
  compact,
package/src/ar/dni.ts CHANGED
@@ -11,13 +11,16 @@ const generate = (): string => randomDigits(8);
11
11
  * @see https://en.wikipedia.org/wiki/Documento_Nacional_de_Identidad_(Argentina)
12
12
  */
13
13
 
14
+ import type {
15
+ ValidateResult,
16
+ CountryValidator,
17
+ } from "../types";
18
+
14
19
  import { clean } from "#util/clean";
15
20
  import { randomDigits } from "#util/generate";
16
21
  import { err } from "#util/result";
17
22
  import { isdigits } from "#util/strings";
18
23
 
19
- import type { ValidateResult, Validator } from "../types";
20
-
21
24
  const compact = (value: string): string =>
22
25
  clean(value, " -.").trim();
23
26
 
@@ -53,7 +56,7 @@ const format = (value: string): string => {
53
56
  };
54
57
 
55
58
  /** Argentine National Identity Document. */
56
- const dni: Validator = {
59
+ const dni: CountryValidator<"AR"> = {
57
60
  name: "Argentine Identity Card",
58
61
  localName: "Documento Nacional de Identidad",
59
62
  abbreviation: "DNI",
@@ -63,6 +66,7 @@ const dni: Validator = {
63
66
  "Documento de Identidad",
64
67
  ] as const,
65
68
  candidatePattern: "\\d{1,2}\\.?\\d{3}\\.?\\d{3}",
69
+ scope: "country",
66
70
  country: "AR",
67
71
  entityType: "person",
68
72
  sourceUrl:
@@ -16,12 +16,15 @@ const generate = (): string => {
16
16
  * @see https://www.justiz.gv.at/
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 { randomDigits, randomInt } from "#util/generate";
21
26
  import { err } from "#util/result";
22
27
 
23
- import type { ValidateResult, Validator } from "../types";
24
-
25
28
  const FN_RE = /^\d+[a-z]$/i;
26
29
 
27
30
  const compact = (value: string): string => {
@@ -54,12 +57,13 @@ const format = (value: string): string =>
54
57
  `FN ${compact(value)}`;
55
58
 
56
59
  /** Austrian Company Register Number. */
57
- const businessid: Validator = {
60
+ const businessid: CountryValidator<"AT"> = {
58
61
  name: "Austrian Company Register Number",
59
62
  localName: "Firmenbuchnummer",
60
63
  abbreviation: "FN",
61
64
  aliases: ["Firmenbuchnummer", "FN", "FBN"] as const,
62
65
  candidatePattern: "FN\\s?\\d{5,6}[a-z]?",
66
+ scope: "country",
63
67
  country: "AT",
64
68
  entityType: "company",
65
69
  sourceUrl: "https://www.justiz.gv.at/",
package/src/at/tin.ts CHANGED
@@ -10,13 +10,16 @@
10
10
  * @see https://service.bmf.gv.at/Service/Anwend/Behoerden/show_mast.asp
11
11
  */
12
12
 
13
+ import type {
14
+ ValidateResult,
15
+ CountryValidator,
16
+ } from "../types";
17
+
13
18
  import { clean } from "#util/clean";
14
19
  import { randomDigits } from "#util/generate";
15
20
  import { err } from "#util/result";
16
21
  import { isdigits } from "#util/strings";
17
22
 
18
- import type { ValidateResult, Validator } from "../types";
19
-
20
23
  /** Luhn-variant doubling table: position-dependent. */
21
24
  const DOUBLE = "0246813579";
22
25
 
@@ -69,12 +72,13 @@ const generate = (): string => {
69
72
  };
70
73
 
71
74
  /** Austrian Tax Identification Number. */
72
- const tin: Validator = {
75
+ const tin: CountryValidator<"AT"> = {
73
76
  name: "Austrian Tax Identification Number",
74
77
  localName: "Abgabenkontonummer",
75
78
  abbreviation: "TIN",
76
79
  aliases: ["Steuernummer", "St.Nr.", "TIN"] as const,
77
80
  candidatePattern: "\\d{2}-?\\d{3}/\\d{4}",
81
+ scope: "country",
78
82
  country: "AT",
79
83
  entityType: "any",
80
84
  sourceUrl:
package/src/at/uid.ts CHANGED
@@ -8,14 +8,17 @@
8
8
  * @see https://www.bmf.gv.at/
9
9
  */
10
10
 
11
+ import type {
12
+ ValidateResult,
13
+ CountryValidator,
14
+ } from "../types";
15
+
11
16
  import { luhnChecksum } from "#checksums/luhn";
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
  let v = clean(value, " -/");
21
24
  if (v.startsWith("AT") || v.startsWith("at")) {
@@ -68,7 +71,7 @@ const generate = (): string => {
68
71
  };
69
72
 
70
73
  /** Austrian VAT Identification Number. */
71
- const uid: Validator = {
74
+ const uid: CountryValidator<"AT"> = {
72
75
  name: "Austrian VAT Number",
73
76
  localName: "Umsatzsteuer-Identifikationsnummer",
74
77
  abbreviation: "UID",
@@ -78,6 +81,7 @@ const uid: Validator = {
78
81
  "ATU",
79
82
  ] as const,
80
83
  candidatePattern: "ATU\\d{8}",
84
+ scope: "country",
81
85
  country: "AT",
82
86
  entityType: "company",
83
87
  sourceUrl: "https://www.bmf.gv.at/",
package/src/at/vnr.ts CHANGED
@@ -6,22 +6,37 @@
6
6
  * The check digit is computed using a weighted sum
7
7
  * mod 11 over the 9 non-check digits.
8
8
  *
9
+ * The 6-digit "birth date" field is not always a real
10
+ * calendar date. Sozialversicherung.at documents that
11
+ * persons with unknown date of birth are issued
12
+ * substitute values (01.01. or 01.07.), and that
13
+ * months 13, 14, etc. are issued when the daily serial
14
+ * pool for a given substitute date is exhausted. We
15
+ * therefore do not enforce a calendar-valid month here.
16
+ * The day field, however, is always within 01-31 — even
17
+ * in the documented overflow cases the day stays "01"
18
+ * — so we keep the day-bounds check.
19
+ *
9
20
  * @see https://de.wikipedia.org/wiki/Sozialversicherungsnummer#%C3%96sterreich
10
- * @see https://www.sozialversicherung.at/
21
+ * @see https://www.sozialversicherung.at/cdscontent/?contentid=10007.820902&viewmode=content
11
22
  */
12
23
 
24
+ import type {
25
+ ValidateResult,
26
+ CountryValidator,
27
+ } from "../types";
28
+
13
29
  import { clean } from "#util/clean";
30
+ import { randomDigits, randomInt } from "#util/generate";
14
31
  import { err } from "#util/result";
15
32
  import { isdigits } from "#util/strings";
16
33
 
17
- import type { ValidateResult, Validator } from "../types";
18
-
19
34
  /**
20
35
  * Weights for the 9 non-check digits (positions
21
36
  * 0,1,2, then 4,5,6,7,8,9). Check digit is at
22
37
  * position 3 and equals the weighted sum mod 11.
23
38
  */
24
- const WEIGHTS = [3, 7, 9, 5, 8, 4, 2, 1, 6];
39
+ const WEIGHTS = [3, 7, 9, 5, 8, 4, 2, 1, 6] as const;
25
40
 
26
41
  const compact = (value: string): string =>
27
42
  clean(value, " -/").trim();
@@ -43,13 +58,24 @@ const validate = (value: string): ValidateResult => {
43
58
  );
44
59
  }
45
60
 
46
- // Validate birth date (DDMMYY in positions 4-9)
61
+ // Per sozialversicherung.at, the 3-digit serial
62
+ // (positions 0-2) never starts with zero.
63
+ if (v[0] === "0") {
64
+ return err(
65
+ "INVALID_COMPONENT",
66
+ "Austrian VNR serial must not start with zero",
67
+ );
68
+ }
69
+
70
+ // Day (positions 4-5) is always within 01-31, even
71
+ // in the documented substitute and overflow cases
72
+ // where the month is shifted. The month is left
73
+ // unchecked per the source.
47
74
  const day = Number(v.slice(4, 6));
48
- const month = Number(v.slice(6, 8));
49
- if (day < 1 || day > 31 || month < 1 || month > 12) {
75
+ if (day < 1 || day > 31) {
50
76
  return err(
51
77
  "INVALID_COMPONENT",
52
- "Austrian VNR contains an invalid birth date",
78
+ "Austrian VNR day field must be within 01-31",
53
79
  );
54
80
  }
55
81
 
@@ -58,8 +84,8 @@ const validate = (value: string): ValidateResult => {
58
84
  // number is invalid.
59
85
  const digits = v.slice(0, 3) + v.slice(4);
60
86
  let sum = 0;
61
- for (let i = 0; i < 9; i++) {
62
- sum += Number(digits[i]) * WEIGHTS[i]!;
87
+ for (const [i, weight] of WEIGHTS.entries()) {
88
+ sum += Number(digits[i]) * weight;
63
89
  }
64
90
  const check = sum % 11;
65
91
  if (check === 10) {
@@ -84,8 +110,30 @@ const format = (value: string): string => {
84
110
  return `${v.slice(0, 4)} ${v.slice(4, 6)}${v.slice(6, 8)}${v.slice(8)}`;
85
111
  };
86
112
 
113
+ /** Generate a random valid Austrian VNR. */
114
+ const generate = (): string => {
115
+ for (;;) {
116
+ // Serial must not start with zero (see validate).
117
+ const serial =
118
+ String(randomInt(1, 9)) + randomDigits(2);
119
+ const day = String(randomInt(1, 28)).padStart(2, "0");
120
+ const month = String(randomInt(1, 12)).padStart(2, "0");
121
+ const year = String(randomInt(0, 99)).padStart(2, "0");
122
+ const digits = `${serial}${day}${month}${year}`;
123
+
124
+ let sum = 0;
125
+ for (const [i, weight] of WEIGHTS.entries()) {
126
+ sum += Number(digits[i]) * weight;
127
+ }
128
+
129
+ const check = sum % 11;
130
+ if (check === 10) continue;
131
+ return `${serial}${String(check)}${day}${month}${year}`;
132
+ }
133
+ };
134
+
87
135
  /** Austrian Social Insurance Number. */
88
- const vnr: Validator = {
136
+ const vnr: CountryValidator<"AT"> = {
89
137
  name: "Austrian Social Insurance Number",
90
138
  localName: "Versicherungsnummer",
91
139
  abbreviation: "VNR",
@@ -96,6 +144,7 @@ const vnr: Validator = {
96
144
  "Sozialversicherungsnummer",
97
145
  ] as const,
98
146
  candidatePattern: "\\d{4}\\s?\\d{6}",
147
+ scope: "country",
99
148
  country: "AT",
100
149
  entityType: "person",
101
150
  sourceUrl:
@@ -105,7 +154,8 @@ const vnr: Validator = {
105
154
  compact,
106
155
  format,
107
156
  validate,
157
+ generate,
108
158
  };
109
159
 
110
160
  export default vnr;
111
- export { compact, format, validate };
161
+ export { compact, format, generate, validate };
package/src/au/abn.ts CHANGED
@@ -9,13 +9,16 @@
9
9
  * @see https://abr.business.gov.au/
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 WEIGHTS = [
20
23
  10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19,
21
24
  ] as const;
@@ -65,12 +68,13 @@ const generate = (): string => {
65
68
  };
66
69
 
67
70
  /** Australian Business Number. */
68
- const abn: Validator = {
71
+ const abn: CountryValidator<"AU"> = {
69
72
  name: "Australian Business Number",
70
73
  localName: "Australian Business Number",
71
74
  abbreviation: "ABN",
72
75
  aliases: ["ABN", "Australian Business Number"] as const,
73
76
  candidatePattern: "\\d{2}\\s?\\d{3}\\s?\\d{3}\\s?\\d{3}",
77
+ scope: "country",
74
78
  country: "AU",
75
79
  entityType: "company",
76
80
  sourceUrl: "https://abr.business.gov.au/",