@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/by/unp.ts CHANGED
@@ -11,13 +11,16 @@
11
11
  * @see https://www.nalog.gov.by/
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, randomInt } 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
  /** Cyrillic to Latin mapping for the letter positions. */
22
25
  const CYRILLIC_TO_LATIN: Record<string, string> = {
23
26
  А: "A",
@@ -44,7 +47,8 @@ const compact = (value: string): string => {
44
47
  } else if (v.startsWith("UNP")) {
45
48
  v = v.slice(3);
46
49
  }
47
- return [...v]
50
+ return v
51
+ .split("")
48
52
  .map((ch) => CYRILLIC_TO_LATIN[ch] ?? ch)
49
53
  .join("");
50
54
  };
@@ -52,16 +56,19 @@ const compact = (value: string): string => {
52
56
  const calcCheckDigit = (number: string): number | null => {
53
57
  let work = number;
54
58
  if (!isdigits(number)) {
55
- const idx = ALPHA_SET.indexOf(number[1]!);
59
+ const second = number[1];
60
+ if (second === undefined) return null;
61
+ const idx = ALPHA_SET.indexOf(second);
56
62
  if (idx === -1) return null;
57
63
  work = number[0] + String(idx) + number.slice(2);
58
64
  }
59
65
  let sum = 0;
60
- for (let i = 0; i < 8; i++) {
61
- const ch = work[i]!;
66
+ for (const [i, weight] of WEIGHTS.entries()) {
67
+ const ch = work[i];
68
+ if (ch === undefined) return null;
62
69
  const val = ALPHABET.indexOf(ch);
63
70
  if (val === -1) return null;
64
- sum += (WEIGHTS[i] ?? 0) * val;
71
+ sum += weight * val;
65
72
  }
66
73
  const remainder = sum % 11;
67
74
  if (remainder > 9) return null;
@@ -85,7 +92,7 @@ const validate = (value: string): ValidateResult => {
85
92
  const first2 = v.slice(0, 2);
86
93
  if (
87
94
  !isdigits(first2) &&
88
- ![...first2].every((ch) => ALPHA_SET.includes(ch))
95
+ !first2.split("").every((ch) => ALPHA_SET.includes(ch))
89
96
  ) {
90
97
  return err(
91
98
  "INVALID_FORMAT",
@@ -93,6 +100,8 @@ const validate = (value: string): ValidateResult => {
93
100
  " digits or letters from ABCEHKMOPT",
94
101
  );
95
102
  }
103
+ // SAFETY: v.length === 9 guarantees v[0] exists.
104
+ // eslint-disable-next-line no-non-null-assertion
96
105
  if (!VALID_FIRST.includes(v[0]!)) {
97
106
  return err(
98
107
  "INVALID_COMPONENT",
@@ -133,12 +142,13 @@ const generate = (): string => {
133
142
  };
134
143
 
135
144
  /** Belarus UNP (Учётный номер плательщика). */
136
- const unp: Validator = {
145
+ const unp: CountryValidator<"BY"> = {
137
146
  name: "Belarus Tax Number",
138
147
  localName: "Учётный номер плательщика",
139
148
  abbreviation: "УНП",
140
149
  aliases: ["УНП", "UNP"] as const,
141
150
  candidatePattern: "\\d{9}",
151
+ scope: "country",
142
152
  country: "BY",
143
153
  entityType: "any",
144
154
  sourceUrl: "https://www.nalog.gov.by/",
package/src/bz/tin.ts CHANGED
@@ -25,11 +25,15 @@
25
25
  * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Belize-TIN.pdf
26
26
  */
27
27
 
28
+ import type {
29
+ ValidateResult,
30
+ CountryValidator,
31
+ } from "../types";
32
+
28
33
  import { clean } from "#util/clean";
34
+ import { randomDigits, randomInt } from "#util/generate";
29
35
  import { err } from "#util/result";
30
36
 
31
- import type { ValidateResult, Validator } from "../types";
32
-
33
37
  /** Valid 2-digit suffix codes. */
34
38
  const SUFFIX_CODES = ["10", "13", "66"] as const;
35
39
 
@@ -79,17 +83,27 @@ const format = (value: string): string => {
79
83
  return `${v.slice(0, 6)}-${v.slice(6)}`;
80
84
  };
81
85
 
86
+ /** Generate a random valid Belize TIN. */
87
+ const generate = (): string => {
88
+ const base = randomDigits(6);
89
+ const suffixes = ["", ...SUFFIX_CODES] as const;
90
+ const suffix =
91
+ suffixes[randomInt(0, suffixes.length - 1)] ?? "";
92
+ return `${base}${suffix}`;
93
+ };
94
+
82
95
  /**
83
96
  * Belize Tax Identification Number.
84
97
  *
85
98
  * Examples derived from stdnum-js test suite.
86
99
  */
87
- const tin: Validator = {
100
+ const tin: CountryValidator<"BZ"> = {
88
101
  name: "Belize Tax Identification Number",
89
102
  localName: "Tax Identification Number",
90
103
  abbreviation: "TIN",
91
104
  aliases: ["TIN"] as const,
92
105
  candidatePattern: "\\d{6}",
106
+ scope: "country",
93
107
  country: "BZ",
94
108
  entityType: "any",
95
109
  lengths: [6, 8] as const,
@@ -97,6 +111,7 @@ const tin: Validator = {
97
111
  compact,
98
112
  format,
99
113
  validate,
114
+ generate,
100
115
  description:
101
116
  "Belize tax number issued by the Belize Tax Service Department",
102
117
  sourceUrl:
@@ -104,4 +119,4 @@ const tin: Validator = {
104
119
  };
105
120
 
106
121
  export default tin;
107
- export { compact, format, validate };
122
+ export { compact, format, generate, validate };
package/src/ca/bn.ts CHANGED
@@ -8,6 +8,11 @@
8
8
  * @see https://www.canada.ca/en/services/taxes/business-number.html
9
9
  */
10
10
 
11
+ import type {
12
+ ValidateResult,
13
+ CountryValidator,
14
+ } from "../types";
15
+
11
16
  import {
12
17
  luhnValidate,
13
18
  luhnChecksum,
@@ -17,8 +22,6 @@ import { randomDigits } from "#util/generate";
17
22
  import { err } from "#util/result";
18
23
  import { isdigits } from "#util/strings";
19
24
 
20
- import type { ValidateResult, Validator } from "../types";
21
-
22
25
  const VALID_PROGRAMS = new Set(["RC", "RM", "RP", "RT"]);
23
26
 
24
27
  const compact = (value: string): string =>
@@ -82,7 +85,7 @@ const generate = (): string => {
82
85
  };
83
86
 
84
87
  /** Canadian Business Number. */
85
- const bn: Validator = {
88
+ const bn: CountryValidator<"CA"> = {
86
89
  name: "Business Number",
87
90
  localName: "Business Number",
88
91
  abbreviation: "BN",
@@ -92,6 +95,7 @@ const bn: Validator = {
92
95
  "numéro d'entreprise",
93
96
  ] as const,
94
97
  candidatePattern: "\\d{9}\\s?[A-Z]{2}\\s?\\d{4}",
98
+ scope: "country",
95
99
  country: "CA",
96
100
  entityType: "company",
97
101
  sourceUrl:
package/src/ca/sin.ts CHANGED
@@ -8,6 +8,11 @@
8
8
  * @see https://en.wikipedia.org/wiki/Social_Insurance_Number
9
9
  */
10
10
 
11
+ import type {
12
+ ValidateResult,
13
+ CountryValidator,
14
+ } from "../types";
15
+
11
16
  import {
12
17
  luhnValidate,
13
18
  luhnChecksum,
@@ -17,8 +22,6 @@ import { randomDigits, randomInt } from "#util/generate";
17
22
  import { err } from "#util/result";
18
23
  import { isdigits } from "#util/strings";
19
24
 
20
- import type { ValidateResult, Validator } from "../types";
21
-
22
25
  const compact = (value: string): string =>
23
26
  clean(value, " -");
24
27
 
@@ -66,7 +69,7 @@ const generate = (): string => {
66
69
  };
67
70
 
68
71
  /** Canadian Social Insurance Number. */
69
- const sin: Validator = {
72
+ const sin: CountryValidator<"CA"> = {
70
73
  name: "Social Insurance Number",
71
74
  localName: "Social Insurance Number",
72
75
  abbreviation: "SIN",
@@ -76,6 +79,7 @@ const sin: Validator = {
76
79
  "NAS",
77
80
  ] as const,
78
81
  candidatePattern: "\\d{3}-?\\d{3}-?\\d{3}",
82
+ scope: "country",
79
83
  country: "CA",
80
84
  entityType: "person",
81
85
  sourceUrl:
package/src/ch/ssn.ts CHANGED
@@ -8,13 +8,16 @@
8
8
  * @see https://www.bsv.admin.ch/
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 compact = (value: string): string =>
19
22
  clean(value, " -.");
20
23
 
@@ -70,7 +73,7 @@ const generate = (): string => {
70
73
  };
71
74
 
72
75
  /** Swiss Social Security Number. */
73
- const ssn: Validator = {
76
+ const ssn: CountryValidator<"CH"> = {
74
77
  name: "Swiss Social Security Number",
75
78
  localName: "AHV-Versichertennummer",
76
79
  abbreviation: "AHV",
@@ -81,6 +84,7 @@ const ssn: Validator = {
81
84
  "AHV",
82
85
  ] as const,
83
86
  candidatePattern: "756\\.?\\d{4}\\.?\\d{4}\\.?\\d{2}",
87
+ scope: "country",
84
88
  country: "CH",
85
89
  entityType: "person",
86
90
  sourceUrl: "https://www.bsv.admin.ch/",
package/src/ch/uid.ts CHANGED
@@ -8,13 +8,16 @@
8
8
  * @see https://www.uid.admin.ch/
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 = [5, 4, 3, 2, 7, 6, 5, 4] as const;
19
22
 
20
23
  const compact = (value: string): string =>
@@ -84,7 +87,7 @@ const generate = (): string => {
84
87
  };
85
88
 
86
89
  /** Swiss Business Identification Number. */
87
- const uid: Validator = {
90
+ const uid: CountryValidator<"CH"> = {
88
91
  name: "Swiss Business ID",
89
92
  localName: "Unternehmens-Identifikationsnummer",
90
93
  abbreviation: "UID",
@@ -94,6 +97,7 @@ const uid: Validator = {
94
97
  "IDE",
95
98
  ] as const,
96
99
  candidatePattern: "CHE-?\\d{3}\\.?\\d{3}\\.?\\d{3}",
100
+ scope: "country",
97
101
  country: "CH",
98
102
  entityType: "company",
99
103
  sourceUrl: "https://www.uid.admin.ch/",
package/src/ch/vat.ts CHANGED
@@ -8,15 +8,18 @@
8
8
  * @see https://www.estv.admin.ch/
9
9
  */
10
10
 
11
- import { clean } from "#util/clean";
12
- import { err } from "#util/result";
13
-
14
- import type { ValidateResult, Validator } from "../types";
11
+ import type {
12
+ ValidateResult,
13
+ CountryValidator,
14
+ } from "../types";
15
15
  import {
16
16
  validate as validateUid,
17
17
  generate as generateUid,
18
18
  } from "./uid";
19
19
 
20
+ import { clean } from "#util/clean";
21
+ import { err } from "#util/result";
22
+
20
23
  const SUFFIXES = ["MWST", "TVA", "IVA", "TPV"] as const;
21
24
 
22
25
  const compact = (value: string): string =>
@@ -64,13 +67,14 @@ const format = (value: string): string => {
64
67
  const generate = (): string => generateUid() + "MWST";
65
68
 
66
69
  /** Swiss VAT Number. */
67
- const vat: Validator = {
70
+ const vat: CountryValidator<"CH"> = {
68
71
  name: "Swiss VAT Number",
69
72
  localName: "Mehrwertsteuernummer",
70
73
  abbreviation: "MWST",
71
74
  aliases: ["MWST", "TVA", "IVA"] as const,
72
75
  candidatePattern:
73
76
  "CHE-?\\d{3}\\.?\\d{3}\\.?\\d{3}\\s?(?:MWST|TVA|IVA)",
77
+ scope: "country",
74
78
  country: "CH",
75
79
  entityType: "company",
76
80
  sourceUrl: "https://www.estv.admin.ch/",
package/src/cl/rut.ts CHANGED
@@ -13,12 +13,15 @@
13
13
  * @see https://en.wikipedia.org/wiki/Rol_%C3%9Anico_Tributario
14
14
  */
15
15
 
16
+ import type {
17
+ ValidateResult,
18
+ CountryValidator,
19
+ } from "../types";
20
+
16
21
  import { clean } from "#util/clean";
17
22
  import { randomDigits } from "#util/generate";
18
23
  import { err } from "#util/result";
19
24
 
20
- import type { ValidateResult, Validator } from "../types";
21
-
22
25
  const RUT_RE = /^\d{7,8}[\dK]$/;
23
26
 
24
27
  const compact = (value: string): string => {
@@ -35,10 +38,12 @@ const compact = (value: string): string => {
35
38
  * 11 -> "0", 10 -> "K", else the digit as string.
36
39
  */
37
40
  const calcCheckDigit = (body: string): string => {
38
- const weights = [2, 3, 4, 5, 6, 7];
41
+ const weights = [2, 3, 4, 5, 6, 7] as const;
39
42
  let sum = 0;
40
43
  for (let i = body.length - 1, w = 0; i >= 0; i--, w++) {
41
- sum += Number(body[i]) * weights[w % 6]!;
44
+ // SAFETY: w % weights.length is a valid index.
45
+ // eslint-disable-next-line no-non-null-assertion
46
+ sum += Number(body[i]) * weights[w % weights.length]!;
42
47
  }
43
48
  const remainder = 11 - (sum % 11);
44
49
  if (remainder === 11) return "0";
@@ -97,12 +102,13 @@ const generate = (): string => {
97
102
  * Examples sourced from python-stdnum test suite
98
103
  * (cl.rut module).
99
104
  */
100
- const rut: Validator = {
105
+ const rut: CountryValidator<"CL"> = {
101
106
  name: "Chilean Tax ID",
102
107
  localName: "Rol Único Tributario",
103
108
  abbreviation: "RUT",
104
109
  aliases: ["RUT", "Rol Único Tributario"] as const,
105
110
  candidatePattern: "\\d{1,2}\\.?\\d{3}\\.?\\d{3}-?[\\dkK]",
111
+ scope: "country",
106
112
  country: "CL",
107
113
  entityType: "any",
108
114
  compact,
package/src/cn/ric.ts CHANGED
@@ -11,6 +11,12 @@
11
11
  * @see https://en.wikipedia.org/wiki/Resident_Identity_Card
12
12
  */
13
13
 
14
+ import type {
15
+ ParsedPersonId,
16
+ ValidateResult,
17
+ CountryValidator,
18
+ } from "../types";
19
+
14
20
  import {
15
21
  mod112checkChar,
16
22
  mod112validate,
@@ -21,12 +27,6 @@ import { randomInt } from "#util/generate";
21
27
  import { err } from "#util/result";
22
28
  import { isdigits } from "#util/strings";
23
29
 
24
- import type {
25
- ParsedPersonId,
26
- ValidateResult,
27
- Validator,
28
- } from "../types";
29
-
30
30
  const compact = (value: string): string =>
31
31
  clean(value, " -").toUpperCase();
32
32
 
@@ -67,6 +67,8 @@ const validate = (value: string): ValidateResult => {
67
67
  "RIC must contain only digits (plus check char)",
68
68
  );
69
69
  }
70
+ // SAFETY: 18-character branch guarantees v[17] exists.
71
+ // eslint-disable-next-line no-non-null-assertion
70
72
  const lastChar = v[17]!;
71
73
  if (!isdigits(lastChar) && lastChar !== "X") {
72
74
  return err(
@@ -153,12 +155,13 @@ const generate = (): string => {
153
155
  };
154
156
 
155
157
  /** Chinese Resident Identity Card number. */
156
- const ric: Validator = {
158
+ const ric: CountryValidator<"CN", ParsedPersonId> = {
157
159
  name: "Chinese Resident Identity Card",
158
160
  localName: "居民身份证号码",
159
161
  abbreviation: "RIC",
160
162
  aliases: ["身份证", "居民身份证号码", "RIC"] as const,
161
163
  candidatePattern: "\\d{17}[\\dX]",
164
+ scope: "country",
162
165
  country: "CN",
163
166
  entityType: "person",
164
167
  description:
@@ -172,6 +175,7 @@ const ric: Validator = {
172
175
  ] as const,
173
176
  compact,
174
177
  format,
178
+ parse,
175
179
  validate,
176
180
  generate,
177
181
  };
package/src/cn/uscc.ts CHANGED
@@ -9,13 +9,20 @@
9
9
  * @see https://zh.wikipedia.org/wiki/统一社会信用代码
10
10
  */
11
11
 
12
+ import type {
13
+ ValidateResult,
14
+ CountryValidator,
15
+ } from "../types";
16
+
12
17
  import { clean } from "#util/clean";
13
- import { randomDigits, randomInt } from "#util/generate";
18
+ import {
19
+ randomChar,
20
+ randomDigits,
21
+ randomInt,
22
+ } from "#util/generate";
14
23
  import { err } from "#util/result";
15
24
  import { isdigits } from "#util/strings";
16
25
 
17
- import type { ValidateResult, Validator } from "../types";
18
-
19
26
  const ALPHABET = "0123456789ABCDEFGHJKLMNPQRTUWXY";
20
27
 
21
28
  const WEIGHTS = [
@@ -28,10 +35,14 @@ const compact = (value: string): string =>
28
35
 
29
36
  const calcCheckChar = (value: string): string => {
30
37
  let total = 0;
31
- for (let i = 0; i < 17; i++) {
32
- const idx = ALPHABET.indexOf(value[i]!);
33
- total += idx * WEIGHTS[i]!;
38
+ for (const [i, weight] of WEIGHTS.entries()) {
39
+ const ch = value[i];
40
+ if (ch === undefined) continue;
41
+ total += ALPHABET.indexOf(ch) * weight;
34
42
  }
43
+ // SAFETY: (31 - total % 31) % 31 is in 0..30 and
44
+ // ALPHABET has 31 characters.
45
+ // eslint-disable-next-line no-non-null-assertion
35
46
  return ALPHABET[(31 - (total % 31)) % 31]!;
36
47
  };
37
48
 
@@ -45,8 +56,8 @@ const validate = (value: string): ValidateResult => {
45
56
  );
46
57
  }
47
58
 
48
- for (let i = 0; i < 18; i++) {
49
- if (!ALPHABET.includes(v[i]!)) {
59
+ for (const ch of v) {
60
+ if (!ALPHABET.includes(ch)) {
50
61
  return err(
51
62
  "INVALID_FORMAT",
52
63
  "USCC contains invalid character",
@@ -75,24 +86,29 @@ const format = (value: string): string => compact(value);
75
86
 
76
87
  /** Generate a random valid USCC. */
77
88
  const generate = (): string => {
89
+ // SAFETY: indices 1..9 are within ALPHABET (31 chars).
90
+ // eslint-disable-next-line no-non-null-assertion
78
91
  const reg = ALPHABET[randomInt(1, 9)]!;
92
+ // eslint-disable-next-line no-non-null-assertion
79
93
  const etype = ALPHABET[randomInt(1, 9)]!;
80
94
  const region = randomDigits(6);
81
95
  let org = "";
82
- for (let i = 0; i < 9; i++)
83
- org += ALPHABET[randomInt(0, ALPHABET.length - 1)]!;
96
+ for (let i = 0; i < 9; i++) {
97
+ org += randomChar(ALPHABET);
98
+ }
84
99
  const payload = reg + etype + region + org;
85
100
  return payload + calcCheckChar(payload);
86
101
  };
87
102
 
88
103
  /** Chinese Unified Social Credit Code. */
89
- const uscc: Validator = {
104
+ const uscc: CountryValidator<"CN"> = {
90
105
  name: "Unified Social Credit Code",
91
106
  localName: "统一社会信用代码",
92
107
  abbreviation: "USCC",
93
108
  aliases: ["统一社会信用代码", "USCC"] as const,
94
109
  candidatePattern:
95
110
  "[0-9A-HJ-NP-RTUW-Y]{2}\\d{6}[0-9A-HJ-NP-RTUW-Y]{10}",
111
+ scope: "country",
96
112
  country: "CN",
97
113
  entityType: "company",
98
114
  description:
package/src/co/nit.ts CHANGED
@@ -10,13 +10,16 @@
10
10
  * @see https://es.wikipedia.org/wiki/Número_de_identificación_tributaria
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
  const WEIGHTS = [
21
24
  3, 7, 13, 17, 19, 23, 29, 37, 41, 43, 47, 53, 59, 67, 71,
22
25
  ] as const;
@@ -30,9 +33,13 @@ const compact = (value: string): string =>
30
33
  const calcCheckDigit = (body: string): number => {
31
34
  let sum = 0;
32
35
  const len = body.length;
33
- for (let i = 0; i < len; i++) {
34
- sum += Number(body[len - 1 - i]) * WEIGHTS[i]!;
36
+ for (const [i, weight] of WEIGHTS.entries()) {
37
+ if (i >= len) break;
38
+ sum += Number(body[len - 1 - i]) * weight;
35
39
  }
40
+ // SAFETY: sum % 11 is in 0..10 and CHECK_DIGITS has
41
+ // 11 entries.
42
+ // eslint-disable-next-line no-non-null-assertion
36
43
  return CHECK_DIGITS[sum % 11]!;
37
44
  };
38
45
 
@@ -53,7 +60,7 @@ const validate = (value: string): ValidateResult => {
53
60
 
54
61
  const body = v.slice(0, -1);
55
62
  const check = calcCheckDigit(body);
56
- if (check !== Number(v[v.length - 1])) {
63
+ if (check !== Number(v.at(-1))) {
57
64
  return err(
58
65
  "INVALID_CHECKSUM",
59
66
  "NIT check digit does not match",
@@ -82,7 +89,7 @@ const generate = (): string => {
82
89
  };
83
90
 
84
91
  /** Colombian tax identification number. */
85
- const nit: Validator = {
92
+ const nit: CountryValidator<"CO"> = {
86
93
  name: "Número de Identificación Tributaria",
87
94
  localName: "Número de Identificación Tributaria",
88
95
  abbreviation: "NIT",
@@ -91,6 +98,7 @@ const nit: Validator = {
91
98
  "Número de Identificación Tributaria",
92
99
  ] as const,
93
100
  candidatePattern: "\\d{9,10}-?\\d",
101
+ scope: "country",
94
102
  country: "CO",
95
103
  entityType: "any",
96
104
  description: "Tax identifier issued by the DIAN",
package/src/cr/cpf.ts CHANGED
@@ -23,12 +23,15 @@ const generate = (): string => {
23
23
  * @see https://www.tse.go.cr/
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, randomInt } from "#util/generate";
28
33
  import { err } from "#util/result";
29
34
 
30
- import type { ValidateResult, Validator } from "../types";
31
-
32
35
  /**
33
36
  * Compact: strip spaces, pad hyphen-separated parts
34
37
  * (2-4-4), join, and prepend '0' if 9 digits.
@@ -38,9 +41,10 @@ const compact = (value: string): string => {
38
41
 
39
42
  const parts = number.split("-");
40
43
  if (parts.length === 3) {
41
- const p0 = parts[0]!.padStart(2, "0");
42
- const p1 = parts[1]!.padStart(4, "0");
43
- const p2 = parts[2]!.padStart(4, "0");
44
+ const [raw0, raw1, raw2] = parts;
45
+ const p0 = (raw0 ?? "").padStart(2, "0");
46
+ const p1 = (raw1 ?? "").padStart(4, "0");
47
+ const p2 = (raw2 ?? "").padStart(4, "0");
44
48
  number = p0 + p1 + p2;
45
49
  } else {
46
50
  number = number.replaceAll("-", "");
@@ -90,12 +94,13 @@ const format = (value: string): string => {
90
94
  *
91
95
  * Examples sourced from python-stdnum test suite.
92
96
  */
93
- const cpf: Validator = {
97
+ const cpf: CountryValidator<"CR"> = {
94
98
  name: "Costa Rican Physical Person ID",
95
99
  localName: "Cédula de Persona Física",
96
100
  abbreviation: "CPF",
97
101
  aliases: ["CPF", "cédula de persona física"] as const,
98
102
  candidatePattern: "\\d{9,12}",
103
+ scope: "country",
99
104
  country: "CR",
100
105
  entityType: "person",
101
106
  lengths: [10] as const,
package/src/creditcard.ts CHANGED
@@ -9,6 +9,11 @@
9
9
  * @see https://www.iso.org/standard/70484.html
10
10
  */
11
11
 
12
+ import type {
13
+ ValidateResult,
14
+ GlobalValidator,
15
+ } from "./types";
16
+
12
17
  import {
13
18
  luhnChecksum,
14
19
  luhnValidate,
@@ -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
  /**
24
27
  * Card network identifiers returned by
25
28
  * {@link detectNetwork}.
@@ -74,9 +77,9 @@ const format = (value: string): string => {
74
77
  return groups.join(" ");
75
78
  };
76
79
 
77
- const MAESTRO_PREFIXES: readonly number[] = [
80
+ const MAESTRO_PREFIXES = new Set([
78
81
  5018, 5020, 5038, 5893, 6304, 6759, 6761, 6762, 6763,
79
- ];
82
+ ]);
80
83
 
81
84
  /**
82
85
  * Detect the card network from the BIN/IIN prefix.
@@ -112,7 +115,7 @@ const detectNetwork = (
112
115
 
113
116
  // Maestro (check before Mastercard; some share
114
117
  // the 50xx prefix space)
115
- if (MAESTRO_PREFIXES.includes(d4)) return "maestro";
118
+ if (MAESTRO_PREFIXES.has(d4)) return "maestro";
116
119
 
117
120
  // Mastercard: 51-55 or 2221-2720
118
121
  if (d2 >= 51 && d2 <= 55) return "mastercard";
@@ -162,7 +165,8 @@ const generate = (): string => {
162
165
  };
163
166
 
164
167
  /** Credit Card Number (Luhn). */
165
- const creditCard: Validator = {
168
+ const creditCard: GlobalValidator = {
169
+ scope: "global",
166
170
  name: "Credit Card Number",
167
171
  localName: "Credit Card Number",
168
172
  abbreviation: "CC",