@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/sg/uen.ts CHANGED
@@ -14,13 +14,16 @@
14
14
  * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Singapore-TIN.pdf
15
15
  */
16
16
 
17
+ import type {
18
+ ValidateResult,
19
+ CountryValidator,
20
+ } from "../types";
21
+
17
22
  import { clean } from "#util/clean";
18
23
  import { randomDigits } 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
  /** Check letter alphabet for "Other" format. */
25
28
  const OTHER_ALPHA = "ABCDEFGHJKLMNPQRSTUVWX0123456789";
26
29
 
@@ -72,6 +75,9 @@ const compact = (value: string): string =>
72
75
  * Validate Business (ROB) UEN (9 chars):
73
76
  * 8 digits + 1 check letter.
74
77
  */
78
+ const BUSINESS_WEIGHTS = [10, 4, 9, 3, 8, 2, 7, 1] as const;
79
+ const BUSINESS_CHECK_ALPHA = "XMKECAWLJDB";
80
+
75
81
  const validateBusiness = (v: string): ValidateResult => {
76
82
  if (!isdigits(v.slice(0, 8))) {
77
83
  return err(
@@ -79,6 +85,9 @@ const validateBusiness = (v: string): ValidateResult => {
79
85
  "Business UEN must start with 8 digits",
80
86
  );
81
87
  }
88
+ // SAFETY: caller routes to this only when
89
+ // v.length === 9.
90
+ // eslint-disable-next-line no-non-null-assertion
82
91
  if (!/^[A-Z]$/.test(v[8]!)) {
83
92
  return err(
84
93
  "INVALID_FORMAT",
@@ -86,13 +95,11 @@ const validateBusiness = (v: string): ValidateResult => {
86
95
  );
87
96
  }
88
97
 
89
- const weights = [10, 4, 9, 3, 8, 2, 7, 1];
90
- const checkAlpha = "XMKECAWLJDB";
91
98
  let sum = 0;
92
- for (let i = 0; i < 8; i++) {
93
- sum += Number(v[i]) * weights[i]!;
99
+ for (const [i, weight] of BUSINESS_WEIGHTS.entries()) {
100
+ sum += Number(v[i]) * weight;
94
101
  }
95
- const expected = checkAlpha[sum % 11];
102
+ const expected = BUSINESS_CHECK_ALPHA[sum % 11];
96
103
  if (v[8] !== expected) {
97
104
  return err(
98
105
  "INVALID_CHECKSUM",
@@ -106,6 +113,9 @@ const validateBusiness = (v: string): ValidateResult => {
106
113
  * Validate Local Company (ROC) UEN (10 chars):
107
114
  * 9 digits (year prefix) + 1 check letter.
108
115
  */
116
+ const LOCAL_WEIGHTS = [10, 8, 6, 4, 9, 7, 5, 3, 1] as const;
117
+ const LOCAL_CHECK_ALPHA = "ZKCMDNERGWH";
118
+
109
119
  const validateLocalCompany = (
110
120
  v: string,
111
121
  ): ValidateResult => {
@@ -115,6 +125,9 @@ const validateLocalCompany = (
115
125
  "Company UEN must have 9 digits",
116
126
  );
117
127
  }
128
+ // SAFETY: caller routes to this only when
129
+ // v.length === 10.
130
+ // eslint-disable-next-line no-non-null-assertion
118
131
  if (!/^[A-Z]$/.test(v[9]!)) {
119
132
  return err(
120
133
  "INVALID_FORMAT",
@@ -122,13 +135,11 @@ const validateLocalCompany = (
122
135
  );
123
136
  }
124
137
 
125
- const weights = [10, 8, 6, 4, 9, 7, 5, 3, 1];
126
- const checkAlpha = "ZKCMDNERGWH";
127
138
  let sum = 0;
128
- for (let i = 0; i < 9; i++) {
129
- sum += Number(v[i]) * weights[i]!;
139
+ for (const [i, weight] of LOCAL_WEIGHTS.entries()) {
140
+ sum += Number(v[i]) * weight;
130
141
  }
131
- const expected = checkAlpha[sum % 11];
142
+ const expected = LOCAL_CHECK_ALPHA[sum % 11];
132
143
  if (v[9] !== expected) {
133
144
  return err(
134
145
  "INVALID_CHECKSUM",
@@ -143,7 +154,12 @@ const validateLocalCompany = (
143
154
  * R/S/T + 2 digits + 2-letter type + 4 digits
144
155
  * + 1 check letter.
145
156
  */
157
+ const OTHER_WEIGHTS = [4, 3, 5, 3, 10, 2, 2, 5, 7] as const;
158
+
146
159
  const validateOther = (v: string): ValidateResult => {
160
+ // SAFETY: caller routes to this only when
161
+ // v.length === 10.
162
+ // eslint-disable-next-line no-non-null-assertion
147
163
  const prefix = v[0]!;
148
164
  if (prefix !== "R" && prefix !== "S" && prefix !== "T") {
149
165
  return err(
@@ -171,17 +187,18 @@ const validateOther = (v: string): ValidateResult => {
171
187
  );
172
188
  }
173
189
 
174
- const weights = [4, 3, 5, 3, 10, 2, 2, 5, 7];
175
190
  let sum = 0;
176
- for (let i = 0; i < 9; i++) {
177
- const idx = OTHER_ALPHA.indexOf(v[i]!);
191
+ for (const [i, weight] of OTHER_WEIGHTS.entries()) {
192
+ const ch = v[i];
193
+ if (ch === undefined) continue;
194
+ const idx = OTHER_ALPHA.indexOf(ch);
178
195
  if (idx === -1) {
179
196
  return err(
180
197
  "INVALID_FORMAT",
181
- `Unexpected character at position ${i + 1}: ${v[i]}`,
198
+ `Unexpected character at position ${i + 1}: ${ch}`,
182
199
  );
183
200
  }
184
- sum += idx * weights[i]!;
201
+ sum += idx * weight;
185
202
  }
186
203
  const expected =
187
204
  OTHER_ALPHA[(((sum - 5) % 11) + 11) % 11];
@@ -218,6 +235,8 @@ const validate = (value: string): ValidateResult => {
218
235
 
219
236
  // 10 chars: first char digit => local company,
220
237
  // otherwise "other" entity
238
+ // SAFETY: v.length === 10 here.
239
+ // eslint-disable-next-line no-non-null-assertion
221
240
  if (isdigits(v[0]!)) {
222
241
  return validateLocalCompany(v);
223
242
  }
@@ -228,24 +247,26 @@ const format = (value: string): string => compact(value);
228
247
 
229
248
  /** Generate a random valid Singapore UEN (business format). */
230
249
  const generate = (): string => {
231
- const weights = [10, 4, 9, 3, 8, 2, 7, 1];
232
- const checkAlpha = "XMKECAWLJDB";
233
250
  const body = randomDigits(8);
234
251
  let sum = 0;
235
- for (let i = 0; i < 8; i++) {
236
- sum += Number(body[i]) * weights[i]!;
252
+ for (const [i, weight] of BUSINESS_WEIGHTS.entries()) {
253
+ sum += Number(body[i]) * weight;
237
254
  }
238
- const check = checkAlpha[sum % 11]!;
255
+ // SAFETY: sum % 11 is in 0..10 and BUSINESS_CHECK_ALPHA
256
+ // has 11 characters.
257
+ // eslint-disable-next-line no-non-null-assertion
258
+ const check = BUSINESS_CHECK_ALPHA[sum % 11]!;
239
259
  return body + check;
240
260
  };
241
261
 
242
262
  /** Singapore Unique Entity Number. */
243
- const uen: Validator = {
263
+ const uen: CountryValidator<"SG"> = {
244
264
  name: "Singapore Unique Entity Number",
245
265
  localName: "Unique Entity Number",
246
266
  abbreviation: "UEN",
247
267
  aliases: ["UEN", "Unique Entity Number"] as const,
248
268
  candidatePattern: "[\\dSTR]\\d{7}[A-Z]",
269
+ scope: "country",
249
270
  country: "SG",
250
271
  entityType: "company",
251
272
  description:
package/src/si/emso.ts CHANGED
@@ -5,10 +5,22 @@
5
5
  * encoding DDMMYYY (7-digit birth year), region code,
6
6
  * serial number, and a check digit.
7
7
  *
8
- * @see https://en.wikipedia.org/wiki/Unique_Master_Citizen_Number
9
- * @see https://www.gov.si/
8
+ * Canonical source:
9
+ * - Slovenia government registry overview
10
+ *
11
+ * This is the source behind the stricter register
12
+ * code check (50-59) and the decision to reject
13
+ * future birth dates in the embedded date field.
14
+ *
15
+ * @see https://www.gov.si/teme/registri-in-evidence-prebivalstva/
10
16
  */
11
17
 
18
+ import type {
19
+ ParsedPersonId,
20
+ ValidateResult,
21
+ CountryValidator,
22
+ } from "../types";
23
+
12
24
  import { weightedSum } from "#checksums/weighted-sum";
13
25
  import { clean } from "#util/clean";
14
26
  import { isValidDate } from "#util/date";
@@ -16,12 +28,6 @@ import { randomInt } from "#util/generate";
16
28
  import { err } from "#util/result";
17
29
  import { isdigits } from "#util/strings";
18
30
 
19
- import type {
20
- ParsedPersonId,
21
- ValidateResult,
22
- Validator,
23
- } from "../types";
24
-
25
31
  const WEIGHTS = [
26
32
  7, 6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2,
27
33
  ] as const;
@@ -75,6 +81,23 @@ const validate = (value: string): ValidateResult => {
75
81
  "EMŠO contains an invalid date",
76
82
  );
77
83
  }
84
+ const birthDate = new Date(yyyy, mm - 1, dd);
85
+ const today = new Date();
86
+ today.setHours(0, 0, 0, 0);
87
+ if (birthDate > today) {
88
+ return err(
89
+ "INVALID_COMPONENT",
90
+ "EMŠO cannot contain a future birth date",
91
+ );
92
+ }
93
+
94
+ const register = Number(v.slice(7, 9));
95
+ if (register < 50 || register > 59) {
96
+ return err(
97
+ "INVALID_COMPONENT",
98
+ "EMSO register code must be between 50 and 59",
99
+ );
100
+ }
78
101
 
79
102
  if (calcCheckDigit(v) !== Number(v[12])) {
80
103
  return err(
@@ -120,7 +143,7 @@ const generate = (): string => {
120
143
  const dd = String(randomInt(1, 28)).padStart(2, "0");
121
144
  const mm = String(randomInt(1, 12)).padStart(2, "0");
122
145
  const yyy = String(randomInt(900, 999));
123
- const rr = String(randomInt(50, 99));
146
+ const rr = String(randomInt(50, 59));
124
147
  const sss = String(randomInt(0, 999)).padStart(3, "0");
125
148
  const partial = dd + mm + yyy + rr + sss;
126
149
  const c = partial + String(calcCheckDigit(partial));
@@ -129,7 +152,7 @@ const generate = (): string => {
129
152
  };
130
153
 
131
154
  /** Slovenian Unique Master Citizen Number. */
132
- const emso: Validator = {
155
+ const emso: CountryValidator<"SI", ParsedPersonId> = {
133
156
  name: "Slovenian Personal ID",
134
157
  localName: "Enotna matična številka občana",
135
158
  abbreviation: "EMŠO",
@@ -138,12 +161,15 @@ const emso: Validator = {
138
161
  "enotna matična številka občana",
139
162
  ] as const,
140
163
  candidatePattern: "\\d{13}",
164
+ scope: "country",
141
165
  country: "SI",
142
166
  entityType: "person",
143
- sourceUrl: "https://www.gov.si/",
167
+ sourceUrl:
168
+ "https://www.gov.si/teme/registri-in-evidence-prebivalstva/",
144
169
  examples: ["0101006500006"] as const,
145
170
  compact,
146
171
  format,
172
+ parse,
147
173
  validate,
148
174
  generate,
149
175
  };
package/src/si/vat.ts CHANGED
@@ -10,14 +10,17 @@
10
10
  * @see https://spot.gov.si/en/info/taxes/value-added-tax-vat
11
11
  */
12
12
 
13
+ import type {
14
+ ValidateResult,
15
+ CountryValidator,
16
+ } from "../types";
17
+
13
18
  import { weightedSum } from "#checksums/weighted-sum";
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
  const WEIGHTS = [8, 7, 6, 5, 4, 3, 2];
22
25
 
23
26
  const compact = (value: string): string => {
@@ -85,7 +88,7 @@ const generate = (): string => {
85
88
  };
86
89
 
87
90
  /** Slovenian VAT Number. */
88
- const vat: Validator = {
91
+ const vat: CountryValidator<"SI"> = {
89
92
  name: "Slovenian VAT Number",
90
93
  localName: "Davčna številka",
91
94
  abbreviation: "DDV",
@@ -94,9 +97,11 @@ const vat: Validator = {
94
97
  "identifikacijska številka za DDV",
95
98
  ] as const,
96
99
  candidatePattern: "SI\\d{8}",
100
+ scope: "country",
97
101
  country: "SI",
98
102
  entityType: "company",
99
103
  sourceUrl: "https://www.fu.gov.si/",
104
+ lengths: [8] as const,
100
105
  examples: ["15012557"] as const,
101
106
  compact,
102
107
  format,
package/src/sk/dic.ts CHANGED
@@ -9,14 +9,17 @@
9
9
  * @see https://www.financnasprava.sk/
10
10
  */
11
11
 
12
+ import { validate as validateRc } from "../cz/rc";
13
+ import type {
14
+ ValidateResult,
15
+ CountryValidator,
16
+ } from "../types";
17
+
12
18
  import { clean } from "#util/clean";
13
19
  import { randomDigits } from "#util/generate";
14
20
  import { err } from "#util/result";
15
21
  import { isdigits } from "#util/strings";
16
22
 
17
- import { validate as validateRc } from "../cz/rc";
18
- import type { ValidateResult, Validator } from "../types";
19
-
20
23
  const compact = (value: string): string => {
21
24
  const v = clean(value, " -");
22
25
  if (v.startsWith("SK") || v.startsWith("sk")) {
@@ -85,13 +88,14 @@ const generate = (): string => {
85
88
  };
86
89
 
87
90
  /** Slovak VAT Number. */
88
- const dic: Validator = {
91
+ const dic: CountryValidator<"SK"> = {
89
92
  name: "Slovak VAT Number",
90
93
  localName:
91
94
  "Identifikačné číslo pre daň z pridanej hodnoty",
92
95
  abbreviation: "IČ DPH",
93
96
  aliases: ["DIČ", "daňové identifikačné číslo"] as const,
94
97
  candidatePattern: "SK\\d{10}",
98
+ scope: "country",
95
99
  country: "SK",
96
100
  entityType: "company",
97
101
  sourceUrl: "https://www.financnasprava.sk/",
package/src/sk/ico.ts CHANGED
@@ -13,10 +13,10 @@ import {
13
13
  generate,
14
14
  validate,
15
15
  } from "../cz/ico";
16
- import type { Validator } from "../types";
16
+ import type { CountryValidator } from "../types";
17
17
 
18
18
  /** Slovak Company Identification Number. */
19
- const ico: Validator = {
19
+ const ico: CountryValidator<"SK"> = {
20
20
  name: "Slovak Company ID",
21
21
  localName: "Identifikačné číslo organizácie",
22
22
  abbreviation: "IČO",
@@ -25,6 +25,7 @@ const ico: Validator = {
25
25
  "identifikačné číslo organizácie",
26
26
  ] as const,
27
27
  candidatePattern: "\\d{8}",
28
+ scope: "country",
28
29
  country: "SK",
29
30
  entityType: "company",
30
31
  sourceUrl: "https://www.statistics.sk/",
package/src/sk/rc.ts CHANGED
@@ -8,24 +8,37 @@
8
8
  * @see https://www.minv.sk/
9
9
  */
10
10
 
11
- import { compact, format, parse, validate } from "../cz/rc";
12
- import type { Validator } from "../types";
11
+ import {
12
+ compact,
13
+ format,
14
+ generate,
15
+ parse,
16
+ validate,
17
+ } from "../cz/rc";
18
+ import type {
19
+ ParsedPersonId,
20
+ CountryValidator,
21
+ } from "../types";
13
22
 
14
23
  /** Slovak Birth Number. */
15
- const rc: Validator = {
24
+ const rc: CountryValidator<"SK", ParsedPersonId> = {
16
25
  name: "Slovak Birth Number",
17
26
  localName: "Rodné číslo",
18
27
  abbreviation: "RČ",
19
28
  aliases: ["rodné číslo", "RČ"] as const,
20
29
  candidatePattern: "\\d{6}/\\d{3,4}",
30
+ scope: "country",
21
31
  country: "SK",
22
32
  entityType: "person",
23
33
  sourceUrl: "https://www.minv.sk/",
34
+ lengths: [9, 10] as const,
24
35
  examples: ["7103192745"] as const,
25
36
  compact,
26
37
  format,
38
+ generate,
39
+ parse,
27
40
  validate,
28
41
  };
29
42
 
30
43
  export default rc;
31
- export { compact, format, parse, validate };
44
+ export { compact, format, generate, parse, validate };
package/src/th/tin.ts CHANGED
@@ -10,13 +10,16 @@
10
10
  * @see https://en.wikipedia.org/wiki/Thai_identity_card
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, randomInt } 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 compact = (value: string): string =>
21
24
  clean(value, " -");
22
25
 
@@ -79,12 +82,13 @@ const generate = (): string => {
79
82
  };
80
83
 
81
84
  /** Thai Tax Identification Number. */
82
- const tin: Validator = {
85
+ const tin: CountryValidator<"TH"> = {
83
86
  name: "Thai Tax Identification Number",
84
87
  localName: "เลขประจำตัวผู้เสียภาษี",
85
88
  abbreviation: "TIN",
86
89
  aliases: ["เลขประจำตัวผู้เสียภาษี", "TIN"] as const,
87
90
  candidatePattern: "\\d{13}",
91
+ scope: "country",
88
92
  country: "TH",
89
93
  entityType: "any",
90
94
  description:
@@ -19,13 +19,16 @@
19
19
  * @see https://www.turkiye.gov.tr/nvi-tckn-dogrulama
20
20
  */
21
21
 
22
+ import type {
23
+ ValidateResult,
24
+ CountryValidator,
25
+ } from "../types";
26
+
22
27
  import { clean } from "#util/clean";
23
28
  import { randomDigits, randomInt } from "#util/generate";
24
29
  import { err } from "#util/result";
25
30
  import { isdigits } from "#util/strings";
26
31
 
27
- import type { ValidateResult, Validator } from "../types";
28
-
29
32
  const compact = (value: string): string =>
30
33
  clean(value, " -./");
31
34
 
@@ -88,7 +91,7 @@ const generate = (): string => {
88
91
  };
89
92
 
90
93
  /** Turkish Personal Identification Number. */
91
- const tckimlik: Validator = {
94
+ const tckimlik: CountryValidator<"TR"> = {
92
95
  name: "Turkish Personal ID",
93
96
  localName: "T.C. Kimlik Numarası",
94
97
  abbreviation: "T.C. Kimlik",
@@ -97,6 +100,7 @@ const tckimlik: Validator = {
97
100
  "T.C. Kimlik Numarası",
98
101
  ] as const,
99
102
  candidatePattern: "[1-9]\\d{10}",
103
+ scope: "country",
100
104
  country: "TR",
101
105
  entityType: "person",
102
106
  sourceUrl: "https://www.nvi.gov.tr/",
package/src/tr/vkn.ts CHANGED
@@ -19,13 +19,16 @@
19
19
  * @see https://www.gib.gov.tr/
20
20
  */
21
21
 
22
+ import type {
23
+ ValidateResult,
24
+ CountryValidator,
25
+ } from "../types";
26
+
22
27
  import { clean } from "#util/clean";
23
28
  import { randomDigits } from "#util/generate";
24
29
  import { err } from "#util/result";
25
30
  import { isdigits } from "#util/strings";
26
31
 
27
- import type { ValidateResult, Validator } from "../types";
28
-
29
32
  const compact = (value: string): string =>
30
33
  clean(value, " -./");
31
34
 
@@ -77,12 +80,13 @@ const generate = (): string => {
77
80
  };
78
81
 
79
82
  /** Turkish Tax Identification Number. */
80
- const vkn: Validator = {
83
+ const vkn: CountryValidator<"TR"> = {
81
84
  name: "Turkish Tax ID",
82
85
  localName: "Vergi Kimlik Numarası",
83
86
  abbreviation: "VKN",
84
87
  aliases: ["VKN", "Vergi Kimlik Numarası"] as const,
85
88
  candidatePattern: "\\d{10}",
89
+ scope: "country",
86
90
  country: "TR",
87
91
  entityType: "company",
88
92
  sourceUrl: "https://www.gib.gov.tr/",
package/src/tw/ubn.ts CHANGED
@@ -10,13 +10,16 @@
10
10
  * @see https://zh.wikipedia.org/wiki/統一編號
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 = [1, 2, 1, 2, 1, 2, 4, 1] as const;
21
24
 
22
25
  /** Sum the individual digits of a number. */
@@ -48,8 +51,8 @@ const validate = (value: string): ValidateResult => {
48
51
  }
49
52
 
50
53
  let sum = 0;
51
- for (let i = 0; i < 8; i++) {
52
- sum += digitSum(Number(v[i]) * WEIGHTS[i]!);
54
+ for (const [i, weight] of WEIGHTS.entries()) {
55
+ sum += digitSum(Number(v[i]) * weight);
53
56
  }
54
57
 
55
58
  const checksum = sum % 10;
@@ -84,12 +87,13 @@ const generate = (): string => {
84
87
  };
85
88
 
86
89
  /** Taiwanese Unified Business Number. */
87
- const ubn: Validator = {
90
+ const ubn: CountryValidator<"TW"> = {
88
91
  name: "Unified Business Number",
89
92
  localName: "統一編號",
90
93
  abbreviation: "UBN",
91
94
  aliases: ["統一編號", "UBN"] as const,
92
95
  candidatePattern: "\\d{8}",
96
+ scope: "country",
93
97
  country: "TW",
94
98
  entityType: "company",
95
99
  description:
package/src/types.ts CHANGED
@@ -116,24 +116,47 @@ export type ValidateResult =
116
116
  | { valid: false; error: StdnumError };
117
117
 
118
118
  /**
119
- * Structured data extracted from a personal ID number.
120
- * Returned by `parse()` on validators that encode
121
- * birth date and gender.
119
+ * Structured data extracted from an identifier that
120
+ * encodes a birth date.
122
121
  */
123
- export type ParsedPersonId = {
122
+ export type ParsedBirthDate = {
124
123
  birthDate: Date;
124
+ };
125
+
126
+ /**
127
+ * Structured data extracted from a personal ID number
128
+ * that also encodes gender.
129
+ */
130
+ export type ParsedPersonId = ParsedBirthDate & {
125
131
  gender: "male" | "female";
126
132
  };
127
133
 
128
- export type Validator = {
134
+ export type ParsedIdentifier =
135
+ | ParsedBirthDate
136
+ | ParsedPersonId;
137
+
138
+ /**
139
+ * Whether an identifier is scoped to a single
140
+ * country (e.g. Czech IČO) or is cross-border by
141
+ * design (e.g. IBAN, ISIN, BIC, LEI, EU VAT).
142
+ *
143
+ * Modeled as a discriminated union so consumers
144
+ * can group, filter, and exhaustively switch
145
+ * without null-checking `country`.
146
+ */
147
+ export type ValidatorScope =
148
+ | { scope: "country"; country: CountryCode }
149
+ | { scope: "global" };
150
+
151
+ type ValidatorBase<
152
+ TParsed extends ParsedIdentifier | undefined = undefined,
153
+ > = {
129
154
  /** English name. */
130
155
  name: string;
131
156
  /** Name in the local language. */
132
157
  localName: string;
133
158
  /** Common abbreviation (e.g. "IČO"). */
134
159
  abbreviation: string;
135
- /** Country this identifier belongs to. */
136
- country?: CountryCode;
137
160
  /** What kind of entity this identifies. */
138
161
  entityType: "person" | "company" | "any";
139
162
 
@@ -197,4 +220,43 @@ export type Validator = {
197
220
  * passed to validate() for confirmation.
198
221
  */
199
222
  candidatePattern?: string;
223
+
224
+ /**
225
+ * Extract structured data (e.g. birth date,
226
+ * gender) from a known-valid identifier.
227
+ * Available on personal IDs that encode such
228
+ * data. Returns null if the input cannot be
229
+ * parsed.
230
+ *
231
+ * On the base `Validator` type this is optional
232
+ * with a widened return; narrow it by typing the
233
+ * validator as `Validator<ParsedPersonId>` etc.
234
+ */
235
+ parse?: (value: string) => ParsedIdentifier | null;
236
+ } & ([TParsed] extends [undefined]
237
+ ? unknown
238
+ : { parse: (value: string) => TParsed | null });
239
+
240
+ export type CountryValidator<
241
+ TCountry extends CountryCode = CountryCode,
242
+ TParsed extends ParsedIdentifier | undefined = undefined,
243
+ > = ValidatorBase<TParsed> & {
244
+ scope: "country";
245
+ country: TCountry;
200
246
  };
247
+
248
+ export type GlobalValidator<
249
+ TParsed extends ParsedIdentifier | undefined = undefined,
250
+ > = ValidatorBase<TParsed> & {
251
+ scope: "global";
252
+ };
253
+
254
+ export type Validator<
255
+ TParsed extends ParsedIdentifier | undefined = undefined,
256
+ > =
257
+ | CountryValidator<CountryCode, TParsed>
258
+ | GlobalValidator<TParsed>;
259
+
260
+ export type ParsableValidator<
261
+ TParsed extends ParsedIdentifier = ParsedIdentifier,
262
+ > = Validator<TParsed>;