@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/LICENSE CHANGED
@@ -1,10 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 stella labs, s.r.o., a limited liability company
4
- established under the laws of the Czech Republic, with its registered
5
- office at Nad Porubkou 2355, Poruba, 708 00 Ostrava, Czech Republic,
6
- Company ID (IČO): 24632872, registered in the Commercial Register
7
- maintained by the Regional Court in Ostrava, Section C, File No. 103233.
3
+ Copyright (c) 2026 stella labs, s.r.o.
8
4
 
9
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
10
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -4,9 +4,12 @@
4
4
 
5
5
  # @stll/stdnum
6
6
 
7
- Validate, compact, and format standard
8
- identifiers. Pure TypeScript, zero dependencies,
9
- tree-shakeable.
7
+ Validate, compact, and format standard identifiers
8
+ for Node.js and Bun. Pure TypeScript, zero
9
+ dependencies, tree-shakeable per identifier.
10
+
11
+ This package covers 7 international identifiers and
12
+ 96 countries through per-module entry points.
10
13
 
11
14
  ## Install
12
15
 
@@ -16,6 +19,9 @@ npm install @stll/stdnum
16
19
  bun add @stll/stdnum
17
20
  ```
18
21
 
22
+ Tagged releases are published from GitHub Actions
23
+ with npm provenance enabled.
24
+
19
25
  ## Usage
20
26
 
21
27
  ```typescript
@@ -43,6 +49,23 @@ ico.validate("25596641");
43
49
  iban.validate("CZ65 0800 0000 1920 0014 5399");
44
50
  ```
45
51
 
52
+ ## Oracle Validation
53
+
54
+ The repo ships two oracle modes:
55
+
56
+ - `bun run oracle`
57
+ Runs the strict gate. It keeps only
58
+ high-confidence cross-checks that are stable enough
59
+ for CI.
60
+ - `bun run oracle:survey`
61
+ Runs the broader ecosystem survey. It includes
62
+ noisier third-party validators and mutation probes to
63
+ surface drift without treating every disagreement as a
64
+ release blocker.
65
+
66
+ Both commands accept `ORACLE_SAMPLES=<n>` to trade off
67
+ runtime against coverage.
68
+
46
69
  ## Supported Identifiers
47
70
 
48
71
  ### International
@@ -313,7 +336,8 @@ handled automatically.
313
336
 
314
337
  ```bash
315
338
  bun install
316
- bun test # 4,185 tests
339
+ bun run typecheck
340
+ bun test
317
341
  bun run lint # oxlint
318
342
  bun run format # oxfmt
319
343
  ```
@@ -1 +1 @@
1
- {"version":3,"file":"luhn.js","names":[],"sources":["../../src/_checksums/luhn.ts"],"sourcesContent":["/**\n * Luhn checksum algorithm (ISO/IEC 7812-1).\n * Used by credit cards, IMEI, Canadian SIN, etc.\n */\n\n/** Compute the Luhn checksum of a digit string. */\nexport const luhnChecksum = (value: string): number => {\n let sum = 0;\n let double = false;\n for (let i = value.length - 1; i >= 0; i--) {\n let d = Number(value[i]);\n if (double) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n sum += d;\n double = !double;\n }\n return sum % 10;\n};\n\n/** Validate a digit string using Luhn. */\nexport const luhnValidate = (value: string): boolean =>\n luhnChecksum(value) === 0;\n"],"mappings":";;;;;;AAMA,MAAa,gBAAgB,UAA0B;CACrD,IAAI,MAAM;CACV,IAAI,SAAS;AACb,MAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,IAAI,IAAI,OAAO,MAAM,GAAG;AACxB,MAAI,QAAQ;AACV,QAAK;AACL,OAAI,IAAI,EAAG,MAAK;;AAElB,SAAO;AACP,WAAS,CAAC;;AAEZ,QAAO,MAAM;;;AAIf,MAAa,gBAAgB,UAC3B,aAAa,MAAM,KAAK"}
1
+ {"version":3,"file":"luhn.js","names":[],"sources":["../../src/_checksums/luhn.ts"],"sourcesContent":["/**\n * Luhn checksum algorithm (ISO/IEC 7812-1).\n * Used by credit cards, IMEI, Canadian SIN, etc.\n */\n\n/** Compute the Luhn checksum of a digit string. */\nexport const luhnChecksum = (value: string): number => {\n let sum = 0;\n let double = false;\n for (let i = value.length - 1; i >= 0; i--) {\n let d = Number(value[i]);\n if (double) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n sum += d;\n double = !double;\n }\n return sum % 10;\n};\n\n/** Validate a digit string using Luhn. */\nexport const luhnValidate = (value: string): boolean =>\n luhnChecksum(value) === 0;\n"],"mappings":";;;;;;AAMA,MAAa,gBAAgB,UAA0B;CACrD,IAAI,MAAM;CACV,IAAI,SAAS;CACb,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,IAAI,IAAI,OAAO,MAAM,EAAE;EACvB,IAAI,QAAQ;GACV,KAAK;GACL,IAAI,IAAI,GAAG,KAAK;EAClB;EACA,OAAO;EACP,SAAS,CAAC;CACZ;CACA,OAAO,MAAM;AACf;;AAGA,MAAa,gBAAgB,UAC3B,aAAa,KAAK,MAAM"}
@@ -16,7 +16,7 @@ const mod1110checkDigit = (payload) => {
16
16
  /** Validate a string with a Mod 11,10 check digit. */
17
17
  const mod1110validate = (value) => {
18
18
  const payload = value.slice(0, -1);
19
- const check = Number(value[value.length - 1]);
19
+ const check = Number(value.at(-1));
20
20
  return mod1110checkDigit(payload) === check;
21
21
  };
22
22
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"mod1110.js","names":[],"sources":["../../src/_checksums/mod1110.ts"],"sourcesContent":["/**\n * ISO 7064 Mod 11,10 check digit algorithm.\n * Used by DE VAT, DE IdNr, HR OIB.\n */\n\n/** Compute the Mod 11,10 check digit for a payload. */\nexport const mod1110checkDigit = (\n payload: string,\n): number => {\n let product = 10;\n for (let i = 0; i < payload.length; i++) {\n let sum = (Number(payload[i]) + product) % 10;\n if (sum === 0) sum = 10;\n product = (sum * 2) % 11;\n }\n return (11 - product) % 10;\n};\n\n/** Validate a string with a Mod 11,10 check digit. */\nexport const mod1110validate = (value: string): boolean => {\n const payload = value.slice(0, -1);\n const check = Number(value[value.length - 1]);\n return mod1110checkDigit(payload) === check;\n};\n"],"mappings":";;;;;;AAMA,MAAa,qBACX,YACW;CACX,IAAI,UAAU;AACd,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,IAAI,OAAO,OAAO,QAAQ,GAAG,GAAG,WAAW;AAC3C,MAAI,QAAQ,EAAG,OAAM;AACrB,YAAW,MAAM,IAAK;;AAExB,SAAQ,KAAK,WAAW;;;AAI1B,MAAa,mBAAmB,UAA2B;CACzD,MAAM,UAAU,MAAM,MAAM,GAAG,GAAG;CAClC,MAAM,QAAQ,OAAO,MAAM,MAAM,SAAS,GAAG;AAC7C,QAAO,kBAAkB,QAAQ,KAAK"}
1
+ {"version":3,"file":"mod1110.js","names":[],"sources":["../../src/_checksums/mod1110.ts"],"sourcesContent":["/**\n * ISO 7064 Mod 11,10 check digit algorithm.\n * Used by DE VAT, DE IdNr, HR OIB.\n */\n\n/** Compute the Mod 11,10 check digit for a payload. */\nexport const mod1110checkDigit = (\n payload: string,\n): number => {\n let product = 10;\n for (let i = 0; i < payload.length; i++) {\n let sum = (Number(payload[i]) + product) % 10;\n if (sum === 0) sum = 10;\n product = (sum * 2) % 11;\n }\n return (11 - product) % 10;\n};\n\n/** Validate a string with a Mod 11,10 check digit. */\nexport const mod1110validate = (value: string): boolean => {\n const payload = value.slice(0, -1);\n const check = Number(value.at(-1));\n return mod1110checkDigit(payload) === check;\n};\n"],"mappings":";;;;;;AAMA,MAAa,qBACX,YACW;CACX,IAAI,UAAU;CACd,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,IAAI,OAAO,OAAO,QAAQ,EAAE,IAAI,WAAW;EAC3C,IAAI,QAAQ,GAAG,MAAM;EACrB,UAAW,MAAM,IAAK;CACxB;CACA,QAAQ,KAAK,WAAW;AAC1B;;AAGA,MAAa,mBAAmB,UAA2B;CACzD,MAAM,UAAU,MAAM,MAAM,GAAG,EAAE;CACjC,MAAM,QAAQ,OAAO,MAAM,GAAG,EAAE,CAAC;CACjC,OAAO,kBAAkB,OAAO,MAAM;AACxC"}
@@ -35,17 +35,17 @@ const CHECK_CHARS = "10X98765432";
35
35
  */
36
36
  const mod112checkChar = (payload) => {
37
37
  let sum = 0;
38
- for (let i = 0; i < 17; i++) sum += Number(payload[i]) * WEIGHTS[i];
39
- return CHECK_CHARS[sum % 11];
38
+ for (const [i, weight] of WEIGHTS.entries()) sum += Number(payload[i]) * weight;
39
+ return CHECK_CHARS[sum % 11] ?? "";
40
40
  };
41
41
  /**
42
42
  * Validate an 18-character string with a Mod 11,2
43
43
  * check character (last char is 0-9 or X).
44
44
  */
45
45
  const mod112validate = (value) => {
46
- const payload = value.slice(0, 17);
47
- const check = value[17].toUpperCase();
48
- return mod112checkChar(payload) === check;
46
+ const check = value[17]?.toUpperCase();
47
+ if (check === void 0) return false;
48
+ return mod112checkChar(value.slice(0, 17)) === check;
49
49
  };
50
50
  //#endregion
51
51
  export { mod112checkChar, mod112validate };
@@ -1 +1 @@
1
- {"version":3,"file":"mod112.js","names":[],"sources":["../../src/_checksums/mod112.ts"],"sourcesContent":["/**\n * ISO 7064 Mod 11,2 check character algorithm.\n * Used by CN RIC (Resident Identity Card).\n *\n * Weights are powers of 2 modulo 11\n * (2^17 mod 11 ... 2^1 mod 11), applied\n * left-to-right across the 17-character payload.\n * The check character is looked up from\n * \"10X98765432\".\n */\n\nconst WEIGHTS = [\n 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,\n] as const;\n\nconst CHECK_CHARS = \"10X98765432\";\n\n/**\n * Compute the ISO 7064 Mod 11,2 check character\n * for a 17-character payload.\n */\nexport const mod112checkChar = (\n payload: string,\n): string => {\n let sum = 0;\n for (let i = 0; i < 17; i++) {\n sum += Number(payload[i]) * WEIGHTS[i]!;\n }\n return CHECK_CHARS[sum % 11]!;\n};\n\n/**\n * Validate an 18-character string with a Mod 11,2\n * check character (last char is 0-9 or X).\n */\nexport const mod112validate = (value: string): boolean => {\n const payload = value.slice(0, 17);\n const check = value[17]!.toUpperCase();\n return mod112checkChar(payload) === check;\n};\n"],"mappings":";;;;;;;;;;;AAWA,MAAM,UAAU;CACd;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CACnD;AAED,MAAM,cAAc;;;;;AAMpB,MAAa,mBACX,YACW;CACX,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IACtB,QAAO,OAAO,QAAQ,GAAG,GAAG,QAAQ;AAEtC,QAAO,YAAY,MAAM;;;;;;AAO3B,MAAa,kBAAkB,UAA2B;CACxD,MAAM,UAAU,MAAM,MAAM,GAAG,GAAG;CAClC,MAAM,QAAQ,MAAM,IAAK,aAAa;AACtC,QAAO,gBAAgB,QAAQ,KAAK"}
1
+ {"version":3,"file":"mod112.js","names":[],"sources":["../../src/_checksums/mod112.ts"],"sourcesContent":["/**\n * ISO 7064 Mod 11,2 check character algorithm.\n * Used by CN RIC (Resident Identity Card).\n *\n * Weights are powers of 2 modulo 11\n * (2^17 mod 11 ... 2^1 mod 11), applied\n * left-to-right across the 17-character payload.\n * The check character is looked up from\n * \"10X98765432\".\n */\n\nconst WEIGHTS = [\n 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,\n] as const;\n\nconst CHECK_CHARS = \"10X98765432\";\n\n/**\n * Compute the ISO 7064 Mod 11,2 check character\n * for a 17-character payload.\n */\nexport const mod112checkChar = (\n payload: string,\n): string => {\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n sum += Number(payload[i]) * weight;\n }\n // SAFETY: sum % 11 is in 0..10 and CHECK_CHARS has 11 chars.\n return CHECK_CHARS[sum % 11] ?? \"\";\n};\n\n/**\n * Validate an 18-character string with a Mod 11,2\n * check character (last char is 0-9 or X).\n */\nexport const mod112validate = (value: string): boolean => {\n const check = value[17]?.toUpperCase();\n if (check === undefined) return false;\n return mod112checkChar(value.slice(0, 17)) === check;\n};\n"],"mappings":";;;;;;;;;;;AAWA,MAAM,UAAU;CACd;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;AACpD;AAEA,MAAM,cAAc;;;;;AAMpB,MAAa,mBACX,YACW;CACX,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GACxC,OAAO,OAAO,QAAQ,EAAE,IAAI;CAG9B,OAAO,YAAY,MAAM,OAAO;AAClC;;;;;AAMA,MAAa,kBAAkB,UAA2B;CACxD,MAAM,QAAQ,MAAM,KAAK,YAAY;CACrC,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,OAAO,gBAAgB,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM;AACjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"mod97.js","names":[],"sources":["../../src/_checksums/mod97.ts"],"sourcesContent":["/**\n * ISO 7064 Mod 97-10 checksum.\n * Used by IBAN and LEI.\n *\n * Processes one digit at a time to avoid BigInt.\n */\n\n/**\n * Compute mod 97 of a numeric string.\n * Letters must already be converted to digits.\n */\nexport const mod97 = (value: string): number => {\n let remainder = 0;\n for (let i = 0; i < value.length; i++) {\n remainder = (remainder * 10 + Number(value[i])) % 97;\n }\n return remainder;\n};\n\n/**\n * Validate a string using ISO 7064 Mod 97-10.\n * The remainder must equal 1.\n *\n * @param value - Numeric string (letters already\n * converted via charValue)\n */\nexport const mod97validate = (value: string): boolean =>\n mod97(value) === 1;\n"],"mappings":";;;;;;;;;;;AAWA,MAAa,SAAS,UAA0B;CAC9C,IAAI,YAAY;AAChB,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,IAChC,cAAa,YAAY,KAAK,OAAO,MAAM,GAAG,IAAI;AAEpD,QAAO;;;;;;;;;AAUT,MAAa,iBAAiB,UAC5B,MAAM,MAAM,KAAK"}
1
+ {"version":3,"file":"mod97.js","names":[],"sources":["../../src/_checksums/mod97.ts"],"sourcesContent":["/**\n * ISO 7064 Mod 97-10 checksum.\n * Used by IBAN and LEI.\n *\n * Processes one digit at a time to avoid BigInt.\n */\n\n/**\n * Compute mod 97 of a numeric string.\n * Letters must already be converted to digits.\n */\nexport const mod97 = (value: string): number => {\n let remainder = 0;\n for (let i = 0; i < value.length; i++) {\n remainder = (remainder * 10 + Number(value[i])) % 97;\n }\n return remainder;\n};\n\n/**\n * Validate a string using ISO 7064 Mod 97-10.\n * The remainder must equal 1.\n *\n * @param value - Numeric string (letters already\n * converted via charValue)\n */\nexport const mod97validate = (value: string): boolean =>\n mod97(value) === 1;\n"],"mappings":";;;;;;;;;;;AAWA,MAAa,SAAS,UAA0B;CAC9C,IAAI,YAAY;CAChB,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAChC,aAAa,YAAY,KAAK,OAAO,MAAM,EAAE,KAAK;CAEpD,OAAO;AACT;;;;;;;;AASA,MAAa,iBAAiB,UAC5B,MAAM,KAAK,MAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"verhoeff.js","names":[],"sources":["../../src/_checksums/verhoeff.ts"],"sourcesContent":["/**\n * Verhoeff checksum algorithm.\n *\n * Uses three tables (d, p, inv) to detect all\n * single-digit and adjacent-transposition errors.\n * Used by Indian Aadhaar numbers.\n *\n * @see https://en.wikipedia.org/wiki/Verhoeff_algorithm\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\n// Dihedral group D5 multiplication table\nconst D: readonly (readonly number[])[] = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],\n [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],\n [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],\n [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],\n [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],\n [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],\n [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],\n [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],\n [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],\n];\n\n// Permutation table\nconst P: readonly (readonly number[])[] = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],\n [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],\n [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],\n [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],\n [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],\n [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],\n [7, 0, 4, 6, 9, 1, 3, 2, 5, 8],\n];\n\n// Inverse table\nconst INV = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9] as const;\n\n/** Compute the Verhoeff checksum of a digit string. */\nexport const verhoeffChecksum = (value: string): number => {\n let c = 0;\n for (let i = value.length - 1; i >= 0; i--) {\n const pos = (value.length - 1 - i) % 8;\n const digit = Number(value[i]);\n c = D[c]![P[pos]![digit]!]!;\n }\n return c;\n};\n\n/** Validate a digit string using Verhoeff. */\nexport const verhoeffValidate = (value: string): boolean =>\n verhoeffChecksum(value) === 0;\n\n/**\n * Calculate the Verhoeff check digit for a\n * digit string (without the check digit).\n */\nexport const verhoeffCheckDigit = (\n value: string,\n): number => {\n let c = 0;\n for (let i = value.length - 1; i >= 0; i--) {\n const pos = (value.length - i) % 8;\n const digit = Number(value[i]);\n c = D[c]![P[pos]![digit]!]!;\n }\n return INV[c]!;\n};\n"],"mappings":";;;;;;;;;;AAaA,MAAM,IAAoC;CACxC;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC/B;AAGD,MAAM,IAAoC;CACxC;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC9B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAC/B;AAGD,MAAM,MAAM;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;;AAG1C,MAAa,oBAAoB,UAA0B;CACzD,IAAI,IAAI;AACR,MAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,MAAM,OAAO,MAAM,SAAS,IAAI,KAAK;EACrC,MAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,MAAI,EAAE,GAAI,EAAE,KAAM;;AAEpB,QAAO;;;AAIT,MAAa,oBAAoB,UAC/B,iBAAiB,MAAM,KAAK;;;;;AAM9B,MAAa,sBACX,UACW;CACX,IAAI,IAAI;AACR,MAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,MAAM,OAAO,MAAM,SAAS,KAAK;EACjC,MAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,MAAI,EAAE,GAAI,EAAE,KAAM;;AAEpB,QAAO,IAAI"}
1
+ {"version":3,"file":"verhoeff.js","names":[],"sources":["../../src/_checksums/verhoeff.ts"],"sourcesContent":["/**\n * Verhoeff checksum algorithm.\n *\n * Uses three tables (d, p, inv) to detect all\n * single-digit and adjacent-transposition errors.\n * Used by Indian Aadhaar numbers.\n *\n * @see https://en.wikipedia.org/wiki/Verhoeff_algorithm\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\n// Dihedral group D5 multiplication table\nconst D: readonly (readonly number[])[] = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],\n [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],\n [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],\n [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],\n [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],\n [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],\n [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],\n [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],\n [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],\n];\n\n// Permutation table\nconst P: readonly (readonly number[])[] = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],\n [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],\n [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],\n [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],\n [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],\n [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],\n [7, 0, 4, 6, 9, 1, 3, 2, 5, 8],\n];\n\n// Inverse table\nconst INV = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9] as const;\n\n/** Compute the Verhoeff checksum of a digit string. */\nexport const verhoeffChecksum = (value: string): number => {\n let c = 0;\n for (let i = value.length - 1; i >= 0; i--) {\n const pos = (value.length - 1 - i) % 8;\n const digit = Number(value[i]);\n c = D[c]![P[pos]![digit]!]!;\n }\n return c;\n};\n\n/** Validate a digit string using Verhoeff. */\nexport const verhoeffValidate = (value: string): boolean =>\n verhoeffChecksum(value) === 0;\n\n/**\n * Calculate the Verhoeff check digit for a\n * digit string (without the check digit).\n */\nexport const verhoeffCheckDigit = (\n value: string,\n): number => {\n let c = 0;\n for (let i = value.length - 1; i >= 0; i--) {\n const pos = (value.length - i) % 8;\n const digit = Number(value[i]);\n c = D[c]![P[pos]![digit]!]!;\n }\n return INV[c]!;\n};\n"],"mappings":";;;;;;;;;;AAaA,MAAM,IAAoC;CACxC;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;AAC/B;AAGA,MAAM,IAAoC;CACxC;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;AAC/B;AAGA,MAAM,MAAM;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;;AAGzC,MAAa,oBAAoB,UAA0B;CACzD,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,MAAM,OAAO,MAAM,SAAS,IAAI,KAAK;EACrC,MAAM,QAAQ,OAAO,MAAM,EAAE;EAC7B,IAAI,EAAE,GAAI,EAAE,KAAM;CACpB;CACA,OAAO;AACT;;AAGA,MAAa,oBAAoB,UAC/B,iBAAiB,KAAK,MAAM;;;;;AAM9B,MAAa,sBACX,UACW;CACX,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,MAAM,OAAO,MAAM,SAAS,KAAK;EACjC,MAAM,QAAQ,OAAO,MAAM,EAAE;EAC7B,IAAI,EAAE,GAAI,EAAE,KAAM;CACpB;CACA,OAAO,IAAI;AACb"}
@@ -1 +1 @@
1
- {"version":3,"file":"weighted-sum.js","names":[],"sources":["../../src/_checksums/weighted-sum.ts"],"sourcesContent":["/**\n * Compute a weighted sum of digits.\n *\n * @param value - String of digits\n * @param weights - Array of weights (cycled if\n * shorter than value)\n * @param modulus - Modulus for the result\n */\nexport const weightedSum = (\n value: string,\n weights: readonly number[],\n modulus: number,\n): number => {\n let sum = 0;\n for (let i = 0; i < value.length; i++) {\n const digit = Number(value[i]);\n // SAFETY: modulo guarantees valid index\n // eslint-disable-next-line no-non-null-assertion\n const weight = weights[i % weights.length]!;\n sum += digit * weight;\n }\n return ((sum % modulus) + modulus) % modulus;\n};\n"],"mappings":";;;;;;;;;AAQA,MAAa,eACX,OACA,SACA,YACW;CACX,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,QAAQ,OAAO,MAAM,GAAG;EAG9B,MAAM,SAAS,QAAQ,IAAI,QAAQ;AACnC,SAAO,QAAQ;;AAEjB,SAAS,MAAM,UAAW,WAAW"}
1
+ {"version":3,"file":"weighted-sum.js","names":[],"sources":["../../src/_checksums/weighted-sum.ts"],"sourcesContent":["/**\n * Compute a weighted sum of digits.\n *\n * @param value - String of digits\n * @param weights - Array of weights (cycled if\n * shorter than value)\n * @param modulus - Modulus for the result\n */\nexport const weightedSum = (\n value: string,\n weights: readonly number[],\n modulus: number,\n): number => {\n let sum = 0;\n for (let i = 0; i < value.length; i++) {\n const digit = Number(value[i]);\n // SAFETY: modulo guarantees valid index\n // eslint-disable-next-line no-non-null-assertion\n const weight = weights[i % weights.length]!;\n sum += digit * weight;\n }\n return ((sum % modulus) + modulus) % modulus;\n};\n"],"mappings":";;;;;;;;;AAQA,MAAa,eACX,OACA,SACA,YACW;CACX,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,QAAQ,OAAO,MAAM,EAAE;EAG7B,MAAM,SAAS,QAAQ,IAAI,QAAQ;EACnC,OAAO,QAAQ;CACjB;CACA,QAAS,MAAM,UAAW,WAAW;AACvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"arabic.js","names":[],"sources":["../../src/_util/arabic.ts"],"sourcesContent":["/**\n * Shared Arabic-Indic and Extended Arabic-Indic digit\n * normalization utilities.\n *\n * Arabic-Indic (U+0660..U+0669) and Extended Arabic-Indic\n * (U+06F0..U+06F9, used for Persian/Dari) digits are\n * mapped to ASCII 0-9.\n */\n\nexport const ARABIC_DIGITS: Record<string, string> = {\n \"\\u0660\": \"0\", // ٠\n \"\\u0661\": \"1\", // ١\n \"\\u0662\": \"2\", // ٢\n \"\\u0663\": \"3\", // ٣\n \"\\u0664\": \"4\", // ٤\n \"\\u0665\": \"5\", // ٥\n \"\\u0666\": \"6\", // ٦\n \"\\u0667\": \"7\", // ٧\n \"\\u0668\": \"8\", // ٨\n \"\\u0669\": \"9\", // ٩\n \"\\u06F0\": \"0\", // ۰\n \"\\u06F1\": \"1\", // ۱\n \"\\u06F2\": \"2\", // ۲\n \"\\u06F3\": \"3\", // ۳\n \"\\u06F4\": \"4\", // ۴\n \"\\u06F5\": \"5\", // ۵\n \"\\u06F6\": \"6\", // ۶\n \"\\u06F7\": \"7\", // ۷\n \"\\u06F8\": \"8\", // ۸\n \"\\u06F9\": \"9\", // ۹\n};\n\nexport const ARABIC_REGEX = new RegExp(\n `[${Object.keys(ARABIC_DIGITS).join(\"\")}]`,\n \"g\",\n);\n\n/**\n * Replace Arabic-Indic and Extended Arabic-Indic digits\n * with their ASCII equivalents.\n */\nexport const normalizeArabicDigits = (\n value: string,\n): string =>\n value.replace(\n ARABIC_REGEX,\n (ch) => ARABIC_DIGITS[ch] ?? ch,\n );\n"],"mappings":";;;;;;;;;AASA,MAAa,gBAAwC;CACnD,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACX;AAED,MAAa,eAAe,IAAI,OAC9B,IAAI,OAAO,KAAK,cAAc,CAAC,KAAK,GAAG,CAAC,IACxC,IACD;;;;;AAMD,MAAa,yBACX,UAEA,MAAM,QACJ,eACC,OAAO,cAAc,OAAO,GAC9B"}
1
+ {"version":3,"file":"arabic.js","names":[],"sources":["../../src/_util/arabic.ts"],"sourcesContent":["/**\n * Shared Arabic-Indic and Extended Arabic-Indic digit\n * normalization utilities.\n *\n * Arabic-Indic (U+0660..U+0669) and Extended Arabic-Indic\n * (U+06F0..U+06F9, used for Persian/Dari) digits are\n * mapped to ASCII 0-9.\n */\n\nexport const ARABIC_DIGITS: Record<string, string> = {\n \"\\u0660\": \"0\", // ٠\n \"\\u0661\": \"1\", // ١\n \"\\u0662\": \"2\", // ٢\n \"\\u0663\": \"3\", // ٣\n \"\\u0664\": \"4\", // ٤\n \"\\u0665\": \"5\", // ٥\n \"\\u0666\": \"6\", // ٦\n \"\\u0667\": \"7\", // ٧\n \"\\u0668\": \"8\", // ٨\n \"\\u0669\": \"9\", // ٩\n \"\\u06F0\": \"0\", // ۰\n \"\\u06F1\": \"1\", // ۱\n \"\\u06F2\": \"2\", // ۲\n \"\\u06F3\": \"3\", // ۳\n \"\\u06F4\": \"4\", // ۴\n \"\\u06F5\": \"5\", // ۵\n \"\\u06F6\": \"6\", // ۶\n \"\\u06F7\": \"7\", // ۷\n \"\\u06F8\": \"8\", // ۸\n \"\\u06F9\": \"9\", // ۹\n};\n\nexport const ARABIC_REGEX = new RegExp(\n `[${Object.keys(ARABIC_DIGITS).join(\"\")}]`,\n \"g\",\n);\n\n/**\n * Replace Arabic-Indic and Extended Arabic-Indic digits\n * with their ASCII equivalents.\n */\nexport const normalizeArabicDigits = (\n value: string,\n): string =>\n value.replace(\n ARABIC_REGEX,\n (ch) => ARABIC_DIGITS[ch] ?? ch,\n );\n"],"mappings":";;;;;;;;;AASA,MAAa,gBAAwC;CACnD,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;AACZ;AAEA,MAAa,eAAe,IAAI,OAC9B,IAAI,OAAO,KAAK,aAAa,EAAE,KAAK,EAAE,EAAE,IACxC,GACF;;;;;AAMA,MAAa,yBACX,UAEA,MAAM,QACJ,eACC,OAAO,cAAc,OAAO,EAC/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"clean.js","names":[],"sources":["../../src/_util/clean.ts"],"sourcesContent":["/**\n * Unicode normalization map for common OCR, PDF\n * extraction, and copy-paste artifacts.\n *\n * Maps fullwidth digits, various dashes, dots,\n * spaces, and quotes to their ASCII equivalents.\n * Ported from python-stdnum's util.py _char_map.\n */\nconst CHAR_MAP: Record<string, string> = {\n // Fullwidth digits\n \"\\uFF10\": \"0\",\n \"\\uFF11\": \"1\",\n \"\\uFF12\": \"2\",\n \"\\uFF13\": \"3\",\n \"\\uFF14\": \"4\",\n \"\\uFF15\": \"5\",\n \"\\uFF16\": \"6\",\n \"\\uFF17\": \"7\",\n \"\\uFF18\": \"8\",\n \"\\uFF19\": \"9\",\n // Dashes and hyphens\n \"\\u2010\": \"-\", // hyphen\n \"\\u2011\": \"-\", // non-breaking hyphen\n \"\\u2012\": \"-\", // figure dash\n \"\\u2013\": \"-\", // en dash\n \"\\u2014\": \"-\", // em dash\n \"\\u2015\": \"-\", // horizontal bar\n \"\\u2212\": \"-\", // minus sign\n \"\\uFE58\": \"-\", // small em dash\n \"\\uFE63\": \"-\", // small hyphen-minus\n \"\\uFF0D\": \"-\", // fullwidth hyphen-minus\n // Dots and periods\n \"\\u2024\": \".\", // one dot leader\n \"\\uFE52\": \".\", // small full stop\n \"\\uFF0E\": \".\", // fullwidth full stop\n // Spaces\n \"\\u00A0\": \" \", // non-breaking space\n \"\\u2000\": \" \", // en quad\n \"\\u2001\": \" \", // em quad\n \"\\u2002\": \" \", // en space\n \"\\u2003\": \" \", // em space\n \"\\u2004\": \" \", // three-per-em space\n \"\\u2005\": \" \", // four-per-em space\n \"\\u2006\": \" \", // six-per-em space\n \"\\u2007\": \" \", // figure space\n \"\\u2008\": \" \", // punctuation space\n \"\\u2009\": \" \", // thin space\n \"\\u200A\": \" \", // hair space\n \"\\u200B\": \"\", // zero-width space (remove)\n \"\\u202F\": \" \", // narrow no-break space\n \"\\u205F\": \" \", // medium mathematical space\n \"\\u3000\": \" \", // ideographic space\n \"\\uFEFF\": \"\", // BOM / zero-width no-break\n // Slashes\n \"\\uFF0F\": \"/\", // fullwidth solidus\n \"\\u2044\": \"/\", // fraction slash\n};\n\nconst CHAR_REGEX = new RegExp(\n `[${Object.keys(CHAR_MAP).join(\"\")}]`,\n \"g\",\n);\n\n/**\n * Normalize Unicode artifacts to ASCII\n * equivalents and strip the given characters.\n *\n * @param value - The input string\n * @param strip - Characters to remove\n * (e.g. \" -/\" to strip spaces, dashes, slashes)\n */\nexport const clean = (\n value: string,\n strip: string = \"\",\n): string => {\n let result = value.replace(\n CHAR_REGEX,\n (ch) => CHAR_MAP[ch] ?? ch,\n );\n if (strip) {\n for (const ch of strip) {\n result = result.replaceAll(ch, \"\");\n }\n }\n return result;\n};\n"],"mappings":";;;;;;;;;AAQA,MAAM,WAAmC;CAEvC,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,QAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,KAAU;CACV,KAAU;CACX;AAED,MAAM,aAAa,IAAI,OACrB,IAAI,OAAO,KAAK,SAAS,CAAC,KAAK,GAAG,CAAC,IACnC,IACD;;;;;;;;;AAUD,MAAa,SACX,OACA,QAAgB,OACL;CACX,IAAI,SAAS,MAAM,QACjB,aACC,OAAO,SAAS,OAAO,GACzB;AACD,KAAI,MACF,MAAK,MAAM,MAAM,MACf,UAAS,OAAO,WAAW,IAAI,GAAG;AAGtC,QAAO"}
1
+ {"version":3,"file":"clean.js","names":[],"sources":["../../src/_util/clean.ts"],"sourcesContent":["/**\n * Unicode normalization map for common OCR, PDF\n * extraction, and copy-paste artifacts.\n *\n * Maps fullwidth digits, various dashes, dots,\n * spaces, and quotes to their ASCII equivalents.\n * Ported from python-stdnum's util.py _char_map.\n */\nconst CHAR_MAP: Record<string, string> = {\n // Fullwidth digits\n \"\\uFF10\": \"0\",\n \"\\uFF11\": \"1\",\n \"\\uFF12\": \"2\",\n \"\\uFF13\": \"3\",\n \"\\uFF14\": \"4\",\n \"\\uFF15\": \"5\",\n \"\\uFF16\": \"6\",\n \"\\uFF17\": \"7\",\n \"\\uFF18\": \"8\",\n \"\\uFF19\": \"9\",\n // Dashes and hyphens\n \"\\u2010\": \"-\", // hyphen\n \"\\u2011\": \"-\", // non-breaking hyphen\n \"\\u2012\": \"-\", // figure dash\n \"\\u2013\": \"-\", // en dash\n \"\\u2014\": \"-\", // em dash\n \"\\u2015\": \"-\", // horizontal bar\n \"\\u2212\": \"-\", // minus sign\n \"\\uFE58\": \"-\", // small em dash\n \"\\uFE63\": \"-\", // small hyphen-minus\n \"\\uFF0D\": \"-\", // fullwidth hyphen-minus\n // Dots and periods\n \"\\u2024\": \".\", // one dot leader\n \"\\uFE52\": \".\", // small full stop\n \"\\uFF0E\": \".\", // fullwidth full stop\n // Spaces\n \"\\u00A0\": \" \", // non-breaking space\n \"\\u2000\": \" \", // en quad\n \"\\u2001\": \" \", // em quad\n \"\\u2002\": \" \", // en space\n \"\\u2003\": \" \", // em space\n \"\\u2004\": \" \", // three-per-em space\n \"\\u2005\": \" \", // four-per-em space\n \"\\u2006\": \" \", // six-per-em space\n \"\\u2007\": \" \", // figure space\n \"\\u2008\": \" \", // punctuation space\n \"\\u2009\": \" \", // thin space\n \"\\u200A\": \" \", // hair space\n \"\\u200B\": \"\", // zero-width space (remove)\n \"\\u202F\": \" \", // narrow no-break space\n \"\\u205F\": \" \", // medium mathematical space\n \"\\u3000\": \" \", // ideographic space\n \"\\uFEFF\": \"\", // BOM / zero-width no-break\n // Slashes\n \"\\uFF0F\": \"/\", // fullwidth solidus\n \"\\u2044\": \"/\", // fraction slash\n};\n\nconst CHAR_REGEX = new RegExp(\n `[${Object.keys(CHAR_MAP).join(\"\")}]`,\n \"g\",\n);\n\n/**\n * Normalize Unicode artifacts to ASCII\n * equivalents and strip the given characters.\n *\n * @param value - The input string\n * @param strip - Characters to remove\n * (e.g. \" -/\" to strip spaces, dashes, slashes)\n */\nexport const clean = (\n value: string,\n strip: string = \"\",\n): string => {\n let result = value.replace(\n CHAR_REGEX,\n (ch) => CHAR_MAP[ch] ?? ch,\n );\n if (strip) {\n for (const ch of strip) {\n result = result.replaceAll(ch, \"\");\n }\n }\n return result;\n};\n"],"mappings":";;;;;;;;;AAQA,MAAM,WAAmC;CAEvC,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,QAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,KAAU;CACV,KAAU;AACZ;AAEA,MAAM,aAAa,IAAI,OACrB,IAAI,OAAO,KAAK,QAAQ,EAAE,KAAK,EAAE,EAAE,IACnC,GACF;;;;;;;;;AAUA,MAAa,SACX,OACA,QAAgB,OACL;CACX,IAAI,SAAS,MAAM,QACjB,aACC,OAAO,SAAS,OAAO,EAC1B;CACA,IAAI,OACF,KAAK,MAAM,MAAM,OACf,SAAS,OAAO,WAAW,IAAI,EAAE;CAGrC,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"date.js","names":[],"sources":["../../src/_util/date.ts"],"sourcesContent":["/** Validate a calendar date via Date round-trip. */\nexport const isValidDate = (\n year: number,\n month: number,\n day: number,\n): boolean => {\n const d = new Date(year, month - 1, day);\n return (\n d.getFullYear() === year &&\n d.getMonth() === month - 1 &&\n d.getDate() === day\n );\n};\n\n/**\n * Resolve a 2-digit year to a 4-digit year using a\n * rolling pivot: years after the current year are\n * assumed to be in the previous century.\n */\nexport const resolveTwoDigitYear = (yy: number): number => {\n const y = 2000 + yy;\n return y > new Date().getFullYear() ? y - 100 : y;\n};\n"],"mappings":";;AACA,MAAa,eACX,MACA,OACA,QACY;CACZ,MAAM,IAAI,IAAI,KAAK,MAAM,QAAQ,GAAG,IAAI;AACxC,QACE,EAAE,aAAa,KAAK,QACpB,EAAE,UAAU,KAAK,QAAQ,KACzB,EAAE,SAAS,KAAK;;;;;;;AASpB,MAAa,uBAAuB,OAAuB;CACzD,MAAM,IAAI,MAAO;AACjB,QAAO,qBAAI,IAAI,MAAM,EAAC,aAAa,GAAG,IAAI,MAAM"}
1
+ {"version":3,"file":"date.js","names":[],"sources":["../../src/_util/date.ts"],"sourcesContent":["/** Validate a calendar date via Date round-trip. */\nexport const isValidDate = (\n year: number,\n month: number,\n day: number,\n): boolean => {\n const d = new Date(year, month - 1, day);\n return (\n d.getFullYear() === year &&\n d.getMonth() === month - 1 &&\n d.getDate() === day\n );\n};\n\n/**\n * Resolve a 2-digit year to a 4-digit year using a\n * rolling pivot: years after the current year are\n * assumed to be in the previous century.\n */\nexport const resolveTwoDigitYear = (yy: number): number => {\n const y = 2000 + yy;\n return y > new Date().getFullYear() ? y - 100 : y;\n};\n"],"mappings":";;AACA,MAAa,eACX,MACA,OACA,QACY;CACZ,MAAM,IAAI,IAAI,KAAK,MAAM,QAAQ,GAAG,GAAG;CACvC,OACE,EAAE,YAAY,MAAM,QACpB,EAAE,SAAS,MAAM,QAAQ,KACzB,EAAE,QAAQ,MAAM;AAEpB;;;;;;AAOA,MAAa,uBAAuB,OAAuB;CACzD,MAAM,IAAI,MAAO;CACjB,OAAO,qBAAI,IAAI,KAAK,GAAE,YAAY,IAAI,IAAI,MAAM;AAClD"}
@@ -11,6 +11,18 @@ declare const randomDigits: (n: number) => string;
11
11
  * (inclusive).
12
12
  */
13
13
  declare const randomInt: (min: number, max: number) => number;
14
+ /**
15
+ * Pick a random element from a non-empty array.
16
+ * Throws if the array is empty so generators that
17
+ * declare a fixed pool fail loudly instead of
18
+ * returning `undefined`.
19
+ */
20
+ declare const randomPick: <T>(values: readonly T[]) => T;
21
+ /**
22
+ * Pick a random character from a non-empty string.
23
+ * Same contract as `randomPick` for arrays.
24
+ */
25
+ declare const randomChar: (chars: string) => string;
14
26
  //#endregion
15
- export { randomDigits, randomInt };
27
+ export { randomChar, randomDigits, randomInt, randomPick };
16
28
  //# sourceMappingURL=generate.d.ts.map
@@ -15,7 +15,29 @@ const randomDigits = (n) => {
15
15
  * (inclusive).
16
16
  */
17
17
  const randomInt = (min, max) => min + Math.floor(Math.random() * (max - min + 1));
18
+ /**
19
+ * Pick a random element from a non-empty array.
20
+ * Throws if the array is empty so generators that
21
+ * declare a fixed pool fail loudly instead of
22
+ * returning `undefined`.
23
+ */
24
+ const randomPick = (values) => {
25
+ if (values.length === 0) throw new Error("randomPick called with empty array");
26
+ const value = values[randomInt(0, values.length - 1)];
27
+ if (value === void 0) throw new Error("randomPick produced undefined");
28
+ return value;
29
+ };
30
+ /**
31
+ * Pick a random character from a non-empty string.
32
+ * Same contract as `randomPick` for arrays.
33
+ */
34
+ const randomChar = (chars) => {
35
+ if (chars.length === 0) throw new Error("randomChar called with empty string");
36
+ const ch = chars[randomInt(0, chars.length - 1)];
37
+ if (ch === void 0) throw new Error("randomChar produced undefined");
38
+ return ch;
39
+ };
18
40
  //#endregion
19
- export { randomDigits, randomInt };
41
+ export { randomChar, randomDigits, randomInt, randomPick };
20
42
 
21
43
  //# sourceMappingURL=generate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","names":[],"sources":["../../src/_util/generate.ts"],"sourcesContent":["/**\n * Helpers for generating random valid identifiers.\n * NOT cryptographically secure; use only for\n * testing, demos, and form placeholders.\n */\n\n/** Generate a string of n random decimal digits. */\nexport const randomDigits = (n: number): string => {\n let result = \"\";\n for (let i = 0; i < n; i++) {\n result += String(Math.floor(Math.random() * 10));\n }\n return result;\n};\n\n/**\n * Generate a random integer in [min, max]\n * (inclusive).\n */\nexport const randomInt = (\n min: number,\n max: number,\n): number =>\n min + Math.floor(Math.random() * (max - min + 1));\n"],"mappings":";;;;;;;AAOA,MAAa,gBAAgB,MAAsB;CACjD,IAAI,SAAS;AACb,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,WAAU,OAAO,KAAK,MAAM,KAAK,QAAQ,GAAG,GAAG,CAAC;AAElD,QAAO;;;;;;AAOT,MAAa,aACX,KACA,QAEA,MAAM,KAAK,MAAM,KAAK,QAAQ,IAAI,MAAM,MAAM,GAAG"}
1
+ {"version":3,"file":"generate.js","names":[],"sources":["../../src/_util/generate.ts"],"sourcesContent":["/**\n * Helpers for generating random valid identifiers.\n * NOT cryptographically secure; use only for\n * testing, demos, and form placeholders.\n */\n\n/** Generate a string of n random decimal digits. */\nexport const randomDigits = (n: number): string => {\n let result = \"\";\n for (let i = 0; i < n; i++) {\n result += String(Math.floor(Math.random() * 10));\n }\n return result;\n};\n\n/**\n * Generate a random integer in [min, max]\n * (inclusive).\n */\nexport const randomInt = (\n min: number,\n max: number,\n): number =>\n min + Math.floor(Math.random() * (max - min + 1));\n\n/**\n * Pick a random element from a non-empty array.\n * Throws if the array is empty so generators that\n * declare a fixed pool fail loudly instead of\n * returning `undefined`.\n */\nexport const randomPick = <T>(values: readonly T[]): T => {\n if (values.length === 0) {\n throw new Error(\"randomPick called with empty array\");\n }\n const idx = randomInt(0, values.length - 1);\n // SAFETY: idx is bounded by values.length and the\n // array is non-empty (checked above).\n const value = values[idx];\n if (value === undefined) {\n throw new Error(\"randomPick produced undefined\");\n }\n return value;\n};\n\n/**\n * Pick a random character from a non-empty string.\n * Same contract as `randomPick` for arrays.\n */\nexport const randomChar = (chars: string): string => {\n if (chars.length === 0) {\n throw new Error(\"randomChar called with empty string\");\n }\n const idx = randomInt(0, chars.length - 1);\n // SAFETY: idx is bounded by chars.length and the\n // string is non-empty (checked above).\n const ch = chars[idx];\n if (ch === undefined) {\n throw new Error(\"randomChar produced undefined\");\n }\n return ch;\n};\n"],"mappings":";;;;;;;AAOA,MAAa,gBAAgB,MAAsB;CACjD,IAAI,SAAS;CACb,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,UAAU,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC;CAEjD,OAAO;AACT;;;;;AAMA,MAAa,aACX,KACA,QAEA,MAAM,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM,MAAM,EAAE;;;;;;;AAQlD,MAAa,cAAiB,WAA4B;CACxD,IAAI,OAAO,WAAW,GACpB,MAAM,IAAI,MAAM,oCAAoC;CAKtD,MAAM,QAAQ,OAHF,UAAU,GAAG,OAAO,SAAS,CAGlB;CACvB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MAAM,+BAA+B;CAEjD,OAAO;AACT;;;;;AAMA,MAAa,cAAc,UAA0B;CACnD,IAAI,MAAM,WAAW,GACnB,MAAM,IAAI,MAAM,qCAAqC;CAKvD,MAAM,KAAK,MAHC,UAAU,GAAG,MAAM,SAAS,CAGrB;CACnB,IAAI,OAAO,KAAA,GACT,MAAM,IAAI,MAAM,+BAA+B;CAEjD,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"result.js","names":[],"sources":["../../src/_util/result.ts"],"sourcesContent":["import type { StdnumError, ValidateResult } from \"../types\";\n\n/** Create an error ValidateResult. */\nexport const err = (\n code: StdnumError[\"code\"],\n message: string,\n): ValidateResult => ({\n valid: false,\n error: { code, message },\n});\n"],"mappings":";;AAGA,MAAa,OACX,MACA,aACoB;CACpB,OAAO;CACP,OAAO;EAAE;EAAM;EAAS;CACzB"}
1
+ {"version":3,"file":"result.js","names":[],"sources":["../../src/_util/result.ts"],"sourcesContent":["import type { StdnumError, ValidateResult } from \"../types\";\n\n/** Create an error ValidateResult. */\nexport const err = (\n code: StdnumError[\"code\"],\n message: string,\n): ValidateResult => ({\n valid: false,\n error: { code, message },\n});\n"],"mappings":";;AAGA,MAAa,OACX,MACA,aACoB;CACpB,OAAO;CACP,OAAO;EAAE;EAAM;CAAQ;AACzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"strings.js","names":[],"sources":["../../src/_util/strings.ts"],"sourcesContent":["/** Check if the string contains only digits. */\nexport const isdigits = (value: string): boolean =>\n value.length > 0 && /^\\d+$/.test(value);\n\n/**\n * Check if the string contains only ASCII\n * letters (a-z, A-Z).\n */\nexport const isalpha = (value: string): boolean =>\n value.length > 0 && /^[a-zA-Z]+$/.test(value);\n\n/**\n * Check if the string contains only ASCII\n * letters and digits.\n */\nexport const isalnum = (value: string): boolean =>\n value.length > 0 && /^[a-zA-Z0-9]+$/.test(value);\n\n/**\n * Convert a single character to its numeric\n * value (0-9 for digits, 10-35 for A-Z).\n */\nexport const charValue = (ch: string): number => {\n const code = ch.charCodeAt(0);\n // 0-9\n if (code >= 48 && code <= 57) return code - 48;\n // A-Z\n if (code >= 65 && code <= 90) return code - 55;\n // a-z\n if (code >= 97 && code <= 122) return code - 87;\n return 0;\n};\n"],"mappings":";;AACA,MAAa,YAAY,UACvB,MAAM,SAAS,KAAK,QAAQ,KAAK,MAAM;;;;;AAMzC,MAAa,WAAW,UACtB,MAAM,SAAS,KAAK,cAAc,KAAK,MAAM;;;;;AAM/C,MAAa,WAAW,UACtB,MAAM,SAAS,KAAK,iBAAiB,KAAK,MAAM;;;;;AAMlD,MAAa,aAAa,OAAuB;CAC/C,MAAM,OAAO,GAAG,WAAW,EAAE;AAE7B,KAAI,QAAQ,MAAM,QAAQ,GAAI,QAAO,OAAO;AAE5C,KAAI,QAAQ,MAAM,QAAQ,GAAI,QAAO,OAAO;AAE5C,KAAI,QAAQ,MAAM,QAAQ,IAAK,QAAO,OAAO;AAC7C,QAAO"}
1
+ {"version":3,"file":"strings.js","names":[],"sources":["../../src/_util/strings.ts"],"sourcesContent":["/** Check if the string contains only digits. */\nexport const isdigits = (value: string): boolean =>\n value.length > 0 && /^\\d+$/.test(value);\n\n/**\n * Check if the string contains only ASCII\n * letters (a-z, A-Z).\n */\nexport const isalpha = (value: string): boolean =>\n value.length > 0 && /^[a-zA-Z]+$/.test(value);\n\n/**\n * Check if the string contains only ASCII\n * letters and digits.\n */\nexport const isalnum = (value: string): boolean =>\n value.length > 0 && /^[a-zA-Z0-9]+$/.test(value);\n\n/**\n * Convert a single character to its numeric\n * value (0-9 for digits, 10-35 for A-Z).\n */\nexport const charValue = (ch: string): number => {\n const code = ch.charCodeAt(0);\n // 0-9\n if (code >= 48 && code <= 57) return code - 48;\n // A-Z\n if (code >= 65 && code <= 90) return code - 55;\n // a-z\n if (code >= 97 && code <= 122) return code - 87;\n return 0;\n};\n"],"mappings":";;AACA,MAAa,YAAY,UACvB,MAAM,SAAS,KAAK,QAAQ,KAAK,KAAK;;;;;AAMxC,MAAa,WAAW,UACtB,MAAM,SAAS,KAAK,cAAc,KAAK,KAAK;;;;;AAM9C,MAAa,WAAW,UACtB,MAAM,SAAS,KAAK,iBAAiB,KAAK,KAAK;;;;;AAMjD,MAAa,aAAa,OAAuB;CAC/C,MAAM,OAAO,GAAG,WAAW,CAAC;CAE5B,IAAI,QAAQ,MAAM,QAAQ,IAAI,OAAO,OAAO;CAE5C,IAAI,QAAQ,MAAM,QAAQ,IAAI,OAAO,OAAO;CAE5C,IAAI,QAAQ,MAAM,QAAQ,KAAK,OAAO,OAAO;CAC7C,OAAO;AACT"}
package/dist/ad/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import nrt from "./nrt.js";
3
2
 
4
3
  //#region src/ad/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { nrt };
6
+ }
6
7
  //#endregion
7
8
  export { mod_d_exports, nrt };
8
9
  //# sourceMappingURL=mod.d.ts.map
package/dist/ad/nrt.d.ts CHANGED
@@ -1,13 +1,27 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ad/nrt.d.ts
4
4
  /** Generate a random valid Andorra NRT. */
5
5
  declare const generate: () => string;
6
+ /**
7
+ * NRT (Número de Registre Tributari, Andorra tax number).
8
+ *
9
+ * The NRT identifies legal and natural entities for tax
10
+ * purposes. It consists of one letter indicating entity
11
+ * type, six digits, and a check letter.
12
+ *
13
+ * Entity type prefixes:
14
+ * F — companies (digits <= 699999)
15
+ * A, L — other entities (digits 700000-799999)
16
+ * C, D, E, G, O, P, U — other types
17
+ *
18
+ * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Andorra-TIN.pdf
19
+ */
6
20
  declare const compact: (value: string) => string;
7
21
  declare const validate: (value: string) => ValidateResult;
8
22
  declare const format: (value: string) => string;
9
23
  /** Andorra NRT (Número de Registre Tributari). */
10
- declare const nrt: Validator;
24
+ declare const nrt: CountryValidator<"AD">;
11
25
  //#endregion
12
26
  export { compact, nrt as default, format, generate, validate };
13
27
  //# sourceMappingURL=nrt.d.ts.map
package/dist/ad/nrt.js CHANGED
@@ -1,25 +1,12 @@
1
1
  import { clean } from "../_util/clean.js";
2
- import { randomDigits, randomInt } from "../_util/generate.js";
2
+ import { randomChar, randomDigits, randomInt } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/ad/nrt.ts
6
- /**
7
- * NRT (Número de Registre Tributari, Andorra tax number).
8
- *
9
- * The NRT identifies legal and natural entities for tax
10
- * purposes. It consists of one letter indicating entity
11
- * type, six digits, and a check letter.
12
- *
13
- * Entity type prefixes:
14
- * F — companies (digits <= 699999)
15
- * A, L — other entities (digits 700000-799999)
16
- * C, D, E, G, O, P, U — other types
17
- *
18
- * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Andorra-TIN.pdf
19
- */
6
+ const NRT_PREFIXES = "CDEGOPU";
20
7
  /** Generate a random valid Andorra NRT. */
21
8
  const generate = () => {
22
- return `${"CDEGOPU"[randomInt(0, 6)]}${randomDigits(6)}${String.fromCodePoint(65 + randomInt(0, 25))}`;
9
+ return `${randomChar(NRT_PREFIXES)}${randomDigits(6)}${String.fromCodePoint(65 + randomInt(0, 25))}`;
23
10
  };
24
11
  const VALID_PREFIXES = "ACDEFGLOPU";
25
12
  const compact = (value) => clean(value, " -.").toUpperCase().trim();
@@ -50,6 +37,7 @@ const nrt = {
50
37
  abbreviation: "NRT",
51
38
  aliases: ["NRT", "Número de Registre Tributari"],
52
39
  candidatePattern: "[A-Z]-?\\d{6}-?[A-Z]",
40
+ scope: "country",
53
41
  country: "AD",
54
42
  entityType: "any",
55
43
  sourceUrl: "https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Andorra-TIN.pdf",
@@ -1 +1 @@
1
- {"version":3,"file":"nrt.js","names":[],"sources":["../../src/ad/nrt.ts"],"sourcesContent":["/** Generate a random valid Andorra NRT. */\nconst generate = (): string => {\n const prefixes = \"CDEGOPU\";\n const prefix =\n prefixes[randomInt(0, prefixes.length - 1)]!;\n const digits = randomDigits(6);\n const suffix = String.fromCodePoint(\n 65 + randomInt(0, 25),\n );\n return `${prefix}${digits}${suffix}`;\n};\n\n/**\n * NRT (Número de Registre Tributari, Andorra tax number).\n *\n * The NRT identifies legal and natural entities for tax\n * purposes. It consists of one letter indicating entity\n * type, six digits, and a check letter.\n *\n * Entity type prefixes:\n * F — companies (digits <= 699999)\n * A, L — other entities (digits 700000-799999)\n * C, D, E, G, O, P, U — other types\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Andorra-TIN.pdf\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst VALID_PREFIXES = \"ACDEFGLOPU\";\n\nconst compact = (value: string): string =>\n clean(value, \" -.\").toUpperCase().trim();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"Andorra NRT must be 8 characters\",\n );\n }\n const prefix = v[0]!;\n const tail = v[7]!;\n const digits = v.slice(1, 7);\n if (!/^[A-Z]$/.test(prefix) || !/^[A-Z]$/.test(tail)) {\n return err(\n \"INVALID_FORMAT\",\n \"Andorra NRT must start and end with a letter\",\n );\n }\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"Andorra NRT must have 6 digits in the middle\",\n );\n }\n if (!VALID_PREFIXES.includes(prefix)) {\n return err(\n \"INVALID_COMPONENT\",\n \"Andorra NRT has an invalid entity type prefix\",\n );\n }\n if (prefix === \"F\" && digits > \"699999\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Andorra NRT F-type digits must be <= 699999\",\n );\n }\n if (\n (prefix === \"A\" || prefix === \"L\") &&\n !(\"699999\" < digits && digits < \"800000\")\n ) {\n return err(\n \"INVALID_COMPONENT\",\n \"Andorra NRT A/L-type digits must be 700000-799999\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v[0]}-${v.slice(1, 7)}-${v[7]}`;\n};\n\n/** Andorra NRT (Número de Registre Tributari). */\nconst nrt: Validator = {\n name: \"Andorra Tax Number\",\n localName: \"Número de Registre Tributari\",\n abbreviation: \"NRT\",\n aliases: [\"NRT\", \"Número de Registre Tributari\"] as const,\n candidatePattern: \"[A-Z]-?\\\\d{6}-?[A-Z]\",\n country: \"AD\",\n entityType: \"any\",\n sourceUrl:\n \"https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Andorra-TIN.pdf\",\n examples: [\"U132950X\", \"D059888N\", \"F123456M\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nrt;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AACA,MAAM,iBAAyB;AAQ7B,QAAO,GAPU,UAEN,UAAU,GAAG,EAAoB,IAC7B,aAAa,EAAE,GACf,OAAO,cACpB,KAAK,UAAU,GAAG,GAAG,CACtB;;AA0BH,MAAM,iBAAiB;AAEvB,MAAM,WAAW,UACf,MAAM,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM;AAE1C,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,mCACD;CAEH,MAAM,SAAS,EAAE;CACjB,MAAM,OAAO,EAAE;CACf,MAAM,SAAS,EAAE,MAAM,GAAG,EAAE;AAC5B,KAAI,CAAC,UAAU,KAAK,OAAO,IAAI,CAAC,UAAU,KAAK,KAAK,CAClD,QAAO,IACL,kBACA,+CACD;AAEH,KAAI,CAAC,SAAS,OAAO,CACnB,QAAO,IACL,kBACA,+CACD;AAEH,KAAI,CAAC,eAAe,SAAS,OAAO,CAClC,QAAO,IACL,qBACA,gDACD;AAEH,KAAI,WAAW,OAAO,SAAS,SAC7B,QAAO,IACL,qBACA,8CACD;AAEH,MACG,WAAW,OAAO,WAAW,QAC9B,EAAE,WAAW,UAAU,SAAS,UAEhC,QAAO,IACL,qBACA,oDACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,GAAG,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;;;AAIvC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,+BAA+B;CAChD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU;EAAC;EAAY;EAAY;EAAW;CAC9C;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"nrt.js","names":[],"sources":["../../src/ad/nrt.ts"],"sourcesContent":["const NRT_PREFIXES = \"CDEGOPU\";\n\n/** Generate a random valid Andorra NRT. */\nconst generate = (): string => {\n const prefix = randomChar(NRT_PREFIXES);\n const digits = randomDigits(6);\n const suffix = String.fromCodePoint(\n 65 + randomInt(0, 25),\n );\n return `${prefix}${digits}${suffix}`;\n};\n\n/**\n * NRT (Número de Registre Tributari, Andorra tax number).\n *\n * The NRT identifies legal and natural entities for tax\n * purposes. It consists of one letter indicating entity\n * type, six digits, and a check letter.\n *\n * Entity type prefixes:\n * F — companies (digits <= 699999)\n * A, L — other entities (digits 700000-799999)\n * C, D, E, G, O, P, U — other types\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Andorra-TIN.pdf\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport {\n randomChar,\n randomDigits,\n randomInt,\n} from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst VALID_PREFIXES = \"ACDEFGLOPU\";\n\nconst compact = (value: string): string =>\n clean(value, \" -.\").toUpperCase().trim();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"Andorra NRT must be 8 characters\",\n );\n }\n // SAFETY: v.length === 8 guarantees both positions\n // exist; oxlint cannot see the length guard.\n // eslint-disable-next-line no-non-null-assertion\n const prefix = v[0]!;\n // eslint-disable-next-line no-non-null-assertion\n const tail = v[7]!;\n const digits = v.slice(1, 7);\n if (!/^[A-Z]$/.test(prefix) || !/^[A-Z]$/.test(tail)) {\n return err(\n \"INVALID_FORMAT\",\n \"Andorra NRT must start and end with a letter\",\n );\n }\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"Andorra NRT must have 6 digits in the middle\",\n );\n }\n if (!VALID_PREFIXES.includes(prefix)) {\n return err(\n \"INVALID_COMPONENT\",\n \"Andorra NRT has an invalid entity type prefix\",\n );\n }\n if (prefix === \"F\" && digits > \"699999\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Andorra NRT F-type digits must be <= 699999\",\n );\n }\n if (\n (prefix === \"A\" || prefix === \"L\") &&\n !(\"699999\" < digits && digits < \"800000\")\n ) {\n return err(\n \"INVALID_COMPONENT\",\n \"Andorra NRT A/L-type digits must be 700000-799999\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v[0]}-${v.slice(1, 7)}-${v[7]}`;\n};\n\n/** Andorra NRT (Número de Registre Tributari). */\nconst nrt: CountryValidator<\"AD\"> = {\n name: \"Andorra Tax Number\",\n localName: \"Número de Registre Tributari\",\n abbreviation: \"NRT\",\n aliases: [\"NRT\", \"Número de Registre Tributari\"] as const,\n candidatePattern: \"[A-Z]-?\\\\d{6}-?[A-Z]\",\n scope: \"country\",\n country: \"AD\",\n entityType: \"any\",\n sourceUrl:\n \"https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Andorra-TIN.pdf\",\n examples: [\"U132950X\", \"D059888N\", \"F123456M\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nrt;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAAA,MAAM,eAAe;;AAGrB,MAAM,iBAAyB;CAM7B,OAAO,GALQ,WAAW,YAKX,IAJA,aAAa,CAIJ,IAHT,OAAO,cACpB,KAAK,UAAU,GAAG,EAAE,CAEW;AACnC;AA+BA,MAAM,iBAAiB;AAEvB,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK;AAEzC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,kCACF;CAKF,MAAM,SAAS,EAAE;CAEjB,MAAM,OAAO,EAAE;CACf,MAAM,SAAS,EAAE,MAAM,GAAG,CAAC;CAC3B,IAAI,CAAC,UAAU,KAAK,MAAM,KAAK,CAAC,UAAU,KAAK,IAAI,GACjD,OAAO,IACL,kBACA,8CACF;CAEF,IAAI,CAAC,SAAS,MAAM,GAClB,OAAO,IACL,kBACA,8CACF;CAEF,IAAI,CAAC,eAAe,SAAS,MAAM,GACjC,OAAO,IACL,qBACA,+CACF;CAEF,IAAI,WAAW,OAAO,SAAS,UAC7B,OAAO,IACL,qBACA,6CACF;CAEF,KACG,WAAW,OAAO,WAAW,QAC9B,EAAE,WAAW,UAAU,SAAS,WAEhC,OAAO,IACL,qBACA,mDACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE;AACvC;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,8BAA8B;CAC/C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU;EAAC;EAAY;EAAY;CAAU;CAC7C;CACA;CACA;CACA;AACF"}
package/dist/ae/eid.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ae/eid.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
@@ -11,7 +10,7 @@ declare const format: (value: string) => string;
11
10
  */
12
11
  declare const generate: () => string;
13
12
  /** UAE Emirates ID. */
14
- declare const eid: Validator;
13
+ declare const eid: CountryValidator<"AE">;
15
14
  //#endregion
16
15
  export { compact, eid as default, format, generate, validate };
17
16
  //# sourceMappingURL=eid.d.ts.map
package/dist/ae/eid.js CHANGED
@@ -1,20 +1,9 @@
1
+ import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits, randomInt } from "../_util/generate.js";
3
4
  import { err } from "../_util/result.js";
4
- import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
5
5
  import { isdigits } from "../_util/strings.js";
6
6
  //#region src/ae/eid.ts
7
- /**
8
- * Emirates ID (رقم الهوية, UAE).
9
- *
10
- * 15 digits: 784-YYYY-NNNNNNN-C where 784 is the
11
- * ISO 3166-1 numeric code for the UAE, YYYY is the
12
- * year of birth, NNNNNNN is a serial number, and C
13
- * is a Luhn check digit.
14
- *
15
- * @see https://en.wikipedia.org/wiki/National_identification_number#United_Arab_Emirates
16
- * @see https://u.ae/en/information-and-services/visa-and-emirates-id/emirates-id
17
- */
18
7
  const compact = (value) => clean(value, " -/");
19
8
  const validate = (value) => {
20
9
  const v = compact(value);
@@ -57,6 +46,7 @@ const eid = {
57
46
  "رقم الهوية"
58
47
  ],
59
48
  candidatePattern: "784-\\d{4}-\\d{7}-\\d",
49
+ scope: "country",
60
50
  country: "AE",
61
51
  entityType: "person",
62
52
  lengths: [15],
@@ -1 +1 @@
1
- {"version":3,"file":"eid.js","names":[],"sources":["../../src/ae/eid.ts"],"sourcesContent":["/**\n * Emirates ID (رقم الهوية, UAE).\n *\n * 15 digits: 784-YYYY-NNNNNNN-C where 784 is the\n * ISO 3166-1 numeric code for the UAE, YYYY is the\n * year of birth, NNNNNNN is a serial number, and C\n * is a Luhn check digit.\n *\n * @see https://en.wikipedia.org/wiki/National_identification_number#United_Arab_Emirates\n * @see https://u.ae/en/information-and-services/visa-and-emirates-id/emirates-id\n */\n\nimport {\n luhnChecksum,\n luhnValidate,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -/\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 15) {\n return err(\n \"INVALID_LENGTH\",\n \"Emirates ID must be 15 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Emirates ID must contain only digits\",\n );\n }\n if (!v.startsWith(\"784\")) {\n return err(\n \"INVALID_COMPONENT\",\n \"Emirates ID must start with 784\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Emirates ID Luhn check digit is invalid\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return [\n v.slice(0, 3),\n v.slice(3, 7),\n v.slice(7, 14),\n v.slice(14),\n ].join(\"-\");\n};\n\n/**\n * Generate a random valid Emirates ID in compact\n * form. NOT cryptographically secure.\n */\nconst generate = (): string => {\n const yyyy = String(randomInt(1950, 2010));\n const serial = randomDigits(7);\n const partial = `784${yyyy}${serial}0`;\n const remainder = luhnChecksum(partial);\n const check = (10 - remainder) % 10;\n return `784${yyyy}${serial}${String(check)}`;\n};\n\n/** UAE Emirates ID. */\nconst eid: Validator = {\n name: \"Emirates ID\",\n localName: \"رقم الهوية\",\n abbreviation: \"EID\",\n aliases: [\"EID\", \"Emirates ID\", \"رقم الهوية\"] as const,\n candidatePattern: \"784-\\\\d{4}-\\\\d{7}-\\\\d\",\n country: \"AE\",\n entityType: \"person\",\n lengths: [15],\n examples: [\n \"784198012345678\",\n \"784197912345671\",\n \"784195204640486\",\n \"784196865703050\",\n ] as const,\n description:\n \"15-digit identity number issued to UAE residents\",\n sourceUrl:\n \"https://u.ae/en/information-and-services/visa-and-emirates-id/emirates-id\",\n compact,\n format,\n validate,\n generate,\n};\n\nexport default eid;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;;;;;;;;;;;;AAuBA,MAAM,WAAW,UACf,MAAM,OAAO,MAAM;AAErB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,gCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,uCACD;AAEH,KAAI,CAAC,EAAE,WAAW,MAAM,CACtB,QAAO,IACL,qBACA,kCACD;AAEH,KAAI,CAAC,aAAa,EAAE,CAClB,QAAO,IACL,oBACA,0CACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO;EACL,EAAE,MAAM,GAAG,EAAE;EACb,EAAE,MAAM,GAAG,EAAE;EACb,EAAE,MAAM,GAAG,GAAG;EACd,EAAE,MAAM,GAAG;EACZ,CAAC,KAAK,IAAI;;;;;;AAOb,MAAM,iBAAyB;CAC7B,MAAM,OAAO,OAAO,UAAU,MAAM,KAAK,CAAC;CAC1C,MAAM,SAAS,aAAa,EAAE;CAG9B,MAAM,SAAS,KADG,aADF,MAAM,OAAO,OAAO,GACG,IACN;AACjC,QAAO,MAAM,OAAO,SAAS,OAAO,MAAM;;;AAI5C,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAO;EAAe;EAAa;CAC7C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,GAAG;CACb,UAAU;EACR;EACA;EACA;EACA;EACD;CACD,aACE;CACF,WACE;CACF;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"eid.js","names":[],"sources":["../../src/ae/eid.ts"],"sourcesContent":["/**\n * Emirates ID (رقم الهوية, UAE).\n *\n * 15 digits: 784-YYYY-NNNNNNN-C where 784 is the\n * ISO 3166-1 numeric code for the UAE, YYYY is the\n * year of birth, NNNNNNN is a serial number, and C\n * is a Luhn check digit.\n *\n * @see https://en.wikipedia.org/wiki/National_identification_number#United_Arab_Emirates\n * @see https://u.ae/en/information-and-services/visa-and-emirates-id/emirates-id\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n luhnChecksum,\n luhnValidate,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -/\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 15) {\n return err(\n \"INVALID_LENGTH\",\n \"Emirates ID must be 15 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Emirates ID must contain only digits\",\n );\n }\n if (!v.startsWith(\"784\")) {\n return err(\n \"INVALID_COMPONENT\",\n \"Emirates ID must start with 784\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Emirates ID Luhn check digit is invalid\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return [\n v.slice(0, 3),\n v.slice(3, 7),\n v.slice(7, 14),\n v.slice(14),\n ].join(\"-\");\n};\n\n/**\n * Generate a random valid Emirates ID in compact\n * form. NOT cryptographically secure.\n */\nconst generate = (): string => {\n const yyyy = String(randomInt(1950, 2010));\n const serial = randomDigits(7);\n const partial = `784${yyyy}${serial}0`;\n const remainder = luhnChecksum(partial);\n const check = (10 - remainder) % 10;\n return `784${yyyy}${serial}${String(check)}`;\n};\n\n/** UAE Emirates ID. */\nconst eid: CountryValidator<\"AE\"> = {\n name: \"Emirates ID\",\n localName: \"رقم الهوية\",\n abbreviation: \"EID\",\n aliases: [\"EID\", \"Emirates ID\", \"رقم الهوية\"] as const,\n candidatePattern: \"784-\\\\d{4}-\\\\d{7}-\\\\d\",\n scope: \"country\",\n country: \"AE\",\n entityType: \"person\",\n lengths: [15],\n examples: [\n \"784198012345678\",\n \"784197912345671\",\n \"784195204640486\",\n \"784196865703050\",\n ] as const,\n description:\n \"15-digit identity number issued to UAE residents\",\n sourceUrl:\n \"https://u.ae/en/information-and-services/visa-and-emirates-id/emirates-id\",\n compact,\n format,\n validate,\n generate,\n};\n\nexport default eid;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;AA0BA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,+BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,sCACF;CAEF,IAAI,CAAC,EAAE,WAAW,KAAK,GACrB,OAAO,IACL,qBACA,iCACF;CAEF,IAAI,CAAC,aAAa,CAAC,GACjB,OAAO,IACL,oBACA,yCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO;EACL,EAAE,MAAM,GAAG,CAAC;EACZ,EAAE,MAAM,GAAG,CAAC;EACZ,EAAE,MAAM,GAAG,EAAE;EACb,EAAE,MAAM,EAAE;CACZ,EAAE,KAAK,GAAG;AACZ;;;;;AAMA,MAAM,iBAAyB;CAC7B,MAAM,OAAO,OAAO,UAAU,MAAM,IAAI,CAAC;CACzC,MAAM,SAAS,aAAa,CAAC;CAG7B,MAAM,SAAS,KADG,aAAa,MADT,OAAO,OAAO,EAER,KAAK;CACjC,OAAO,MAAM,OAAO,SAAS,OAAO,KAAK;AAC3C;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAO;EAAe;CAAY;CAC5C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,UAAU;EACR;EACA;EACA;EACA;CACF;CACA,aACE;CACF,WACE;CACF;CACA;CACA;CACA;AACF"}
package/dist/ae/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import eid from "./eid.js";
3
2
 
4
3
  //#region src/ae/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { eid };
6
+ }
6
7
  //#endregion
7
8
  export { eid, mod_d_exports };
8
9
  //# sourceMappingURL=mod.d.ts.map
package/dist/ai/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import tin from "./tin.js";
3
2
 
4
3
  //#region src/ai/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { tin };
6
+ }
6
7
  //#endregion
7
8
  export { mod_d_exports, tin };
8
9
  //# sourceMappingURL=mod.d.ts.map
package/dist/ai/tin.d.ts CHANGED
@@ -1,8 +1,26 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ai/tin.d.ts
4
4
  /** Generate a random valid Anguilla TIN. */
5
5
  declare const generate: () => string;
6
+ /**
7
+ * TIN (Anguilla Tax Identification Number).
8
+ *
9
+ * Issued by the Inland Revenue Department (IRD) to
10
+ * individuals and entities for tax purposes. The
11
+ * number consists of 10 digits including a prefix
12
+ * digit and check digit:
13
+ * - Prefix 1: individual TIN
14
+ * - Prefix 2: non-individual (business) TIN
15
+ *
16
+ * Formatted as XXXXX-XXXXX.
17
+ *
18
+ * Source: OECD CRS TIN information sheet.
19
+ *
20
+ * PERSON/ENTITY
21
+ *
22
+ * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Anguilla-TIN.pdf
23
+ */
6
24
  declare const compact: (value: string) => string;
7
25
  declare const validate: (value: string) => ValidateResult;
8
26
  declare const format: (value: string) => string;
@@ -13,7 +31,7 @@ declare const format: (value: string) => string;
13
31
  * (format-only validation, no published check
14
32
  * digit algorithm).
15
33
  */
16
- declare const tin: Validator;
34
+ declare const tin: CountryValidator<"AI">;
17
35
  //#endregion
18
36
  export { compact, tin as default, format, generate, validate };
19
37
  //# sourceMappingURL=tin.d.ts.map
package/dist/ai/tin.js CHANGED
@@ -2,24 +2,6 @@ import { clean } from "../_util/clean.js";
2
2
  import { randomDigits } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  //#region src/ai/tin.ts
5
- /**
6
- * TIN (Anguilla Tax Identification Number).
7
- *
8
- * Issued by the Inland Revenue Department (IRD) to
9
- * individuals and entities for tax purposes. The
10
- * number consists of 10 digits including a prefix
11
- * digit and check digit:
12
- * - Prefix 1: individual TIN
13
- * - Prefix 2: non-individual (business) TIN
14
- *
15
- * Formatted as XXXXX-XXXXX.
16
- *
17
- * Source: OECD CRS TIN information sheet.
18
- *
19
- * PERSON/ENTITY
20
- *
21
- * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Anguilla-TIN.pdf
22
- */
23
5
  /** Generate a random valid Anguilla TIN. */
24
6
  const generate = () => {
25
7
  return (Math.random() < .5 ? "1" : "2") + randomDigits(9);
@@ -55,6 +37,7 @@ const tin = {
55
37
  abbreviation: "TIN",
56
38
  aliases: ["TIN"],
57
39
  candidatePattern: "\\d{11}",
40
+ scope: "country",
58
41
  country: "AI",
59
42
  entityType: "any",
60
43
  lengths: [10],