@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/dist/hu/vat.js CHANGED
@@ -1,18 +1,9 @@
1
+ import { weightedSum } from "../_checksums/weighted-sum.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits } from "../_util/generate.js";
3
4
  import { err } from "../_util/result.js";
4
5
  import { isdigits } from "../_util/strings.js";
5
- import { weightedSum } from "../_checksums/weighted-sum.js";
6
6
  //#region src/hu/vat.ts
7
- /**
8
- * ANUM (Hungarian VAT number).
9
- *
10
- * 8 digits. Weights [9,7,3,1,9,7,3,1],
11
- * sum % 10 === 0.
12
- *
13
- * @see https://www.vatify.eu/hungary-vat-number.html
14
- * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/hungary-tin.pdf
15
- */
16
7
  const WEIGHTS = [
17
8
  9,
18
9
  7,
@@ -53,9 +44,11 @@ const vat = {
53
44
  abbreviation: "ANUM",
54
45
  aliases: ["adószám", "adóazonosító jel"],
55
46
  candidatePattern: "\\d{8}-\\d-\\d{2}",
47
+ scope: "country",
56
48
  country: "HU",
57
49
  entityType: "company",
58
50
  sourceUrl: "https://nav.gov.hu/",
51
+ lengths: [8],
59
52
  examples: ["12892312"],
60
53
  compact,
61
54
  format,
@@ -1 +1 @@
1
- {"version":3,"file":"vat.js","names":[],"sources":["../../src/hu/vat.ts"],"sourcesContent":["/**\n * ANUM (Hungarian VAT number).\n *\n * 8 digits. Weights [9,7,3,1,9,7,3,1],\n * sum % 10 === 0.\n *\n * @see https://www.vatify.eu/hungary-vat-number.html\n * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/hungary-tin.pdf\n */\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst WEIGHTS = [9, 7, 3, 1, 9, 7, 3, 1];\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"HU\") || v.startsWith(\"hu\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"Hungarian VAT number must be 8 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Hungarian VAT number must contain only digits\",\n );\n }\n const sum = weightedSum(v, WEIGHTS, 10);\n if (sum !== 0) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Hungarian VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `HU${compact(value)}`;\n\n/** Generate a random valid Hungarian VAT number. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(8);\n if (validate(c).valid) return c;\n }\n};\n\n/** Hungarian VAT Number. */\nconst vat: Validator = {\n name: \"Hungarian VAT Number\",\n localName: \"Adószám\",\n abbreviation: \"ANUM\",\n aliases: [\"adószám\", \"adóazonosító jel\"] as const,\n candidatePattern: \"\\\\d{8}-\\\\d-\\\\d{2}\",\n country: \"HU\",\n entityType: \"company\",\n sourceUrl: \"https://nav.gov.hu/\",\n examples: [\"12892312\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAExC,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,OAAO;AAC5B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,KAAI,EAAE,MAAM,EAAE;AAEhB,QAAO;;AAGT,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,wCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,gDACD;AAGH,KADY,YAAY,GAAG,SAAS,GAAG,KAC3B,EACV,QAAO,IACL,oBACA,4CACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UACd,KAAK,QAAQ,MAAM;;AAGrB,MAAM,iBAAyB;AAC7B,UAAS;EACP,MAAM,IAAI,aAAa,EAAE;AACzB,MAAI,SAAS,EAAE,CAAC,MAAO,QAAO;;;;AAKlC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,WAAW,mBAAmB;CACxC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"vat.js","names":[],"sources":["../../src/hu/vat.ts"],"sourcesContent":["/**\n * ANUM (Hungarian VAT number).\n *\n * 8 digits. Weights [9,7,3,1,9,7,3,1],\n * sum % 10 === 0.\n *\n * @see https://www.vatify.eu/hungary-vat-number.html\n * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/hungary-tin.pdf\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [9, 7, 3, 1, 9, 7, 3, 1];\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"HU\") || v.startsWith(\"hu\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"Hungarian VAT number must be 8 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Hungarian VAT number must contain only digits\",\n );\n }\n const sum = weightedSum(v, WEIGHTS, 10);\n if (sum !== 0) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Hungarian VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `HU${compact(value)}`;\n\n/** Generate a random valid Hungarian VAT number. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(8);\n if (validate(c).valid) return c;\n }\n};\n\n/** Hungarian VAT Number. */\nconst vat: CountryValidator<\"HU\"> = {\n name: \"Hungarian VAT Number\",\n localName: \"Adószám\",\n abbreviation: \"ANUM\",\n aliases: [\"adószám\", \"adóazonosító jel\"] as const,\n candidatePattern: \"\\\\d{8}-\\\\d-\\\\d{2}\",\n scope: \"country\",\n country: \"HU\",\n entityType: \"company\",\n sourceUrl: \"https://nav.gov.hu/\",\n lengths: [8] as const,\n examples: [\"12892312\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAqBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAEvC,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,MAAM;CAC3B,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO;AACT;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,uCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,+CACF;CAGF,IADY,YAAY,GAAG,SAAS,EAC9B,MAAM,GACV,OAAO,IACL,oBACA,2CACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UACd,KAAK,QAAQ,KAAK;;AAGpB,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,IAAI,aAAa,CAAC;EACxB,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO;CAChC;AACF;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,WAAW,kBAAkB;CACvC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,SAAS,CAAC,CAAC;CACX,UAAU,CAAC,UAAU;CACrB;CACA;CACA;CACA;AACF"}
package/dist/iban.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { ValidateResult, Validator } from "./types.js";
1
+ import { GlobalValidator, ValidateResult } from "./types.js";
2
2
 
3
3
  //#region src/iban.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;
@@ -10,7 +9,7 @@ declare const format: (value: string) => string;
10
9
  */
11
10
  declare const generate: () => string;
12
11
  /** International Bank Account Number. */
13
- declare const iban: Validator;
12
+ declare const iban: GlobalValidator;
14
13
  //#endregion
15
14
  export { compact, iban as default, format, generate, validate };
16
15
  //# sourceMappingURL=iban.d.ts.map
package/dist/iban.js CHANGED
@@ -1,17 +1,10 @@
1
+ import { mod97 } from "./_checksums/mod97.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
5
  import { charValue, isalnum } from "./_util/strings.js";
5
- import { mod97 } from "./_checksums/mod97.js";
6
6
  //#region src/iban.ts
7
7
  /**
8
- * IBAN (International Bank Account Number).
9
- *
10
- * ISO 13616. Format: 2-letter country code +
11
- * 2 check digits + up to 30 alphanumeric BBAN
12
- * characters. Validated using ISO 7064 Mod 97-10.
13
- */
14
- /**
15
8
  * BBAN format regex by country code.
16
9
  * Sourced from SWIFT IBAN Registry.
17
10
  */
@@ -262,6 +255,7 @@ const generate = () => {
262
255
  };
263
256
  /** International Bank Account Number. */
264
257
  const iban = {
258
+ scope: "global",
265
259
  name: "IBAN",
266
260
  localName: "IBAN",
267
261
  abbreviation: "IBAN",
package/dist/iban.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"iban.js","names":[],"sources":["../src/iban.ts"],"sourcesContent":["/**\n * IBAN (International Bank Account Number).\n *\n * ISO 13616. Format: 2-letter country code +\n * 2 check digits + up to 30 alphanumeric BBAN\n * characters. Validated using ISO 7064 Mod 97-10.\n */\n\nimport { mod97 } from \"#checksums/mod97\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { charValue, isalnum } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"./types\";\n\n/**\n * BBAN format regex by country code.\n * Sourced from SWIFT IBAN Registry.\n */\nconst BBAN_FORMAT: Record<string, RegExp> = {\n AD: /^\\d{8}[A-Z0-9]{12}$/,\n AE: /^\\d{19}$/,\n AL: /^\\d{8}[A-Z0-9]{16}$/,\n AT: /^\\d{16}$/,\n AZ: /^[A-Z]{4}[A-Z0-9]{20}$/,\n BA: /^\\d{16}$/,\n BE: /^\\d{12}$/,\n BG: /^[A-Z]{4}\\d{6}[A-Z0-9]{8}$/,\n BH: /^[A-Z]{4}[A-Z0-9]{14}$/,\n BR: /^\\d{23}[A-Z]{1}[A-Z0-9]{1}$/,\n BY: /^[A-Z0-9]{4}\\d{20}$/,\n CH: /^\\d{17}$/,\n CR: /^0\\d{17}$/,\n CY: /^\\d{8}[A-Z0-9]{16}$/,\n CZ: /^\\d{20}$/,\n DE: /^\\d{18}$/,\n DK: /^\\d{14}$/,\n DO: /^[A-Z0-9]{4}\\d{20}$/,\n EE: /^\\d{16}$/,\n EG: /^\\d{25}$/,\n ES: /^\\d{20}$/,\n FI: /^\\d{14}$/,\n FO: /^\\d{14}$/,\n FR: /^\\d{10}[A-Z0-9]{11}\\d{2}$/,\n GB: /^[A-Z]{4}\\d{14}$/,\n GE: /^[A-Z]{2}\\d{16}$/,\n GI: /^[A-Z]{4}[A-Z0-9]{15}$/,\n GL: /^\\d{14}$/,\n GR: /^\\d{7}[A-Z0-9]{16}$/,\n GT: /^[A-Z0-9]{24}$/,\n HR: /^\\d{17}$/,\n HU: /^\\d{24}$/,\n IE: /^[A-Z]{4}\\d{14}$/,\n IL: /^\\d{19}$/,\n IQ: /^[A-Z]{4}\\d{15}$/,\n IS: /^\\d{22}$/,\n IT: /^[A-Z]\\d{10}[A-Z0-9]{12}$/,\n JO: /^[A-Z]{4}\\d{22}$/,\n KW: /^[A-Z]{4}[A-Z0-9]{22}$/,\n KZ: /^\\d{16}$/,\n LB: /^\\d{4}[A-Z0-9]{20}$/,\n LC: /^[A-Z]{4}[A-Z0-9]{24}$/,\n LI: /^\\d{17}$/,\n LT: /^\\d{16}$/,\n LU: /^\\d{16}$/,\n LV: /^[A-Z]{4}[A-Z0-9]{13}$/,\n MC: /^\\d{10}[A-Z0-9]{11}\\d{2}$/,\n MD: /^[A-Z0-9]{20}$/,\n ME: /^\\d{18}$/,\n MK: /^\\d{3}[A-Z0-9]{10}\\d{2}$/,\n MR: /^\\d{23}$/,\n MT: /^[A-Z]{4}\\d{5}[A-Z0-9]{18}$/,\n MU: /^[A-Z]{4}\\d{19}[A-Z]{3}$/,\n NI: /^[A-Z]{4}\\d{24}$/,\n NL: /^[A-Z]{4}\\d{10}$/,\n NO: /^\\d{11}$/,\n PK: /^[A-Z]{4}[A-Z0-9]{16}$/,\n PL: /^\\d{24}$/,\n PS: /^[A-Z]{4}[A-Z0-9]{21}$/,\n PT: /^\\d{21}$/,\n QA: /^[A-Z]{4}[A-Z0-9]{21}$/,\n RO: /^[A-Z]{4}[A-Z0-9]{16}$/,\n RS: /^\\d{18}$/,\n SA: /^\\d{20}$/,\n SC: /^[A-Z]{4}\\d{20}[A-Z]{3}$/,\n SD: /^\\d{14}$/,\n SE: /^\\d{20}$/,\n SI: /^\\d{15}$/,\n SK: /^\\d{20}$/,\n SM: /^[A-Z]\\d{10}[A-Z0-9]{12}$/,\n ST: /^\\d{21}$/,\n SV: /^[A-Z]{4}\\d{20}$/,\n TL: /^\\d{19}$/,\n TN: /^\\d{20}$/,\n TR: /^\\d{6}[A-Z0-9]{16}$/,\n UA: /^\\d{6}[A-Z0-9]{19}$/,\n VA: /^\\d{18}$/,\n VG: /^[A-Z]{4}\\d{16}$/,\n XK: /^\\d{16}$/,\n};\n\n/** IBAN total length by country code. */\nconst LENGTHS: Record<string, number> = {\n AD: 24,\n AE: 23,\n AL: 28,\n AT: 20,\n AZ: 28,\n BA: 20,\n BE: 16,\n BG: 22,\n BH: 22,\n BI: 27,\n BR: 29,\n BY: 28,\n CH: 21,\n CR: 22,\n CY: 28,\n CZ: 24,\n DE: 22,\n DJ: 27,\n DK: 18,\n DO: 28,\n EE: 20,\n EG: 29,\n ES: 24,\n FI: 18,\n FO: 18,\n FR: 27,\n GB: 22,\n GE: 22,\n GI: 23,\n GL: 18,\n GR: 27,\n GT: 28,\n HR: 21,\n HU: 28,\n IE: 22,\n IL: 23,\n IQ: 23,\n IS: 26,\n IT: 27,\n JO: 30,\n KW: 30,\n KZ: 20,\n LB: 28,\n LC: 32,\n LI: 21,\n LT: 20,\n LU: 20,\n LV: 21,\n LY: 25,\n MC: 27,\n MD: 24,\n ME: 22,\n MK: 19,\n MN: 20,\n MR: 27,\n MT: 31,\n MU: 30,\n NI: 28,\n NL: 18,\n NO: 15,\n PK: 24,\n PL: 28,\n PS: 29,\n PT: 25,\n QA: 29,\n RO: 24,\n RS: 22,\n RU: 33,\n SA: 24,\n SC: 31,\n SD: 18,\n SE: 24,\n SI: 19,\n SK: 24,\n SM: 27,\n SN: 28,\n SO: 23,\n ST: 25,\n SV: 28,\n TL: 23,\n TN: 24,\n TR: 26,\n UA: 29,\n VA: 22,\n VG: 24,\n XK: 20,\n};\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\n/**\n * Convert letters to numbers (A=10, ..., Z=35)\n * and rearrange for mod-97 check.\n */\nconst toNumeric = (iban: string): string => {\n const rearranged = iban.slice(4) + iban.slice(0, 4);\n let result = \"\";\n for (let i = 0; i < rearranged.length; i++) {\n const ch = rearranged[i];\n if (ch !== undefined) {\n result += String(charValue(ch));\n }\n }\n return result;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length < 5) {\n return err(\"INVALID_LENGTH\", \"IBAN is too short\");\n }\n if (!isalnum(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"IBAN must contain only letters and digits\",\n );\n }\n const cc = v.slice(0, 2);\n if (!/^[A-Z]{2}$/.test(cc)) {\n return err(\n \"INVALID_COMPONENT\",\n \"IBAN must start with a 2-letter country code\",\n );\n }\n const expectedLen = LENGTHS[cc];\n if (\n expectedLen !== undefined &&\n v.length !== expectedLen\n ) {\n return err(\n \"INVALID_LENGTH\",\n `IBAN for ${cc} must be ${String(expectedLen)} characters`,\n );\n }\n // Validate BBAN format (country-specific)\n const bban = v.slice(4);\n const bbanRegex = BBAN_FORMAT[cc];\n if (bbanRegex !== undefined && !bbanRegex.test(bban)) {\n return err(\n \"INVALID_FORMAT\",\n `IBAN BBAN format is invalid for ${cc}`,\n );\n }\n const numeric = toNumeric(v);\n if (mod97(numeric) !== 1) {\n return err(\n \"INVALID_CHECKSUM\",\n \"IBAN check digits are incorrect\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const groups: string[] = [];\n for (let i = 0; i < v.length; i += 4) {\n groups.push(v.slice(i, i + 4));\n }\n return groups.join(\" \");\n};\n\n/**\n * Countries supported by generate(). All have\n * all-digit BBANs for simplicity.\n */\nconst GENERATE_COUNTRIES = [\"CZ\", \"DE\", \"SK\"] as const;\n\ntype GenerateCountry = (typeof GENERATE_COUNTRIES)[number];\n\n/** BBAN lengths for generate()-supported countries. */\nconst BBAN_LENGTHS: Record<GenerateCountry, number> = {\n CZ: 20,\n DE: 18,\n SK: 20,\n};\n\n/**\n * Compute IBAN check digits for a country code\n * and BBAN. Returns a 2-character string.\n */\nconst computeCheckDigits = (\n cc: string,\n bban: string,\n): string => {\n const placeholder = `${bban}${cc}00`;\n let numeric = \"\";\n for (let i = 0; i < placeholder.length; i++) {\n const ch = placeholder[i];\n if (ch !== undefined) {\n numeric += String(charValue(ch));\n }\n }\n const remainder = mod97(numeric);\n const check = 98 - remainder;\n return String(check).padStart(2, \"0\");\n};\n\n/**\n * Generate a random valid IBAN for CZ, DE, or SK.\n */\nconst generate = (): string => {\n const idx = randomInt(0, GENERATE_COUNTRIES.length - 1);\n const cc = GENERATE_COUNTRIES[idx] as GenerateCountry;\n const bbanLen = BBAN_LENGTHS[cc];\n const bban = randomDigits(bbanLen);\n const checkDigits = computeCheckDigits(cc, bban);\n return `${cc}${checkDigits}${bban}`;\n};\n\n/** International Bank Account Number. */\nconst iban: Validator = {\n name: \"IBAN\",\n localName: \"IBAN\",\n abbreviation: \"IBAN\",\n aliases: [\"IBAN\"] as const,\n candidatePattern:\n \"[A-Z]{2}\\\\d{2}[\\\\s]?[A-Z0-9]{4}[\\\\s]?(?:[A-Z0-9]{4}[\\\\s]?){2,7}[A-Z0-9]{1,4}\",\n entityType: \"any\",\n description:\n \"International bank account number per ISO 13616\",\n sourceUrl:\n \"https://www.swift.com/standards/data-standards/iban-international-bank-account-number\",\n examples: [\n \"GB29NWBK60161331926819\",\n \"DE89370400440532013000\",\n ] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default iban;\nexport { compact, format, generate, validate };\n"],"mappings":"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"}
1
+ {"version":3,"file":"iban.js","names":[],"sources":["../src/iban.ts"],"sourcesContent":["/**\n * IBAN (International Bank Account Number).\n *\n * ISO 13616. Format: 2-letter country code +\n * 2 check digits + up to 30 alphanumeric BBAN\n * characters. Validated using ISO 7064 Mod 97-10.\n */\n\nimport type {\n ValidateResult,\n GlobalValidator,\n} from \"./types\";\n\nimport { mod97 } from \"#checksums/mod97\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { charValue, isalnum } from \"#util/strings\";\n\n/**\n * BBAN format regex by country code.\n * Sourced from SWIFT IBAN Registry.\n */\nconst BBAN_FORMAT: Record<string, RegExp> = {\n AD: /^\\d{8}[A-Z0-9]{12}$/,\n AE: /^\\d{19}$/,\n AL: /^\\d{8}[A-Z0-9]{16}$/,\n AT: /^\\d{16}$/,\n AZ: /^[A-Z]{4}[A-Z0-9]{20}$/,\n BA: /^\\d{16}$/,\n BE: /^\\d{12}$/,\n BG: /^[A-Z]{4}\\d{6}[A-Z0-9]{8}$/,\n BH: /^[A-Z]{4}[A-Z0-9]{14}$/,\n BR: /^\\d{23}[A-Z]{1}[A-Z0-9]{1}$/,\n BY: /^[A-Z0-9]{4}\\d{20}$/,\n CH: /^\\d{17}$/,\n CR: /^0\\d{17}$/,\n CY: /^\\d{8}[A-Z0-9]{16}$/,\n CZ: /^\\d{20}$/,\n DE: /^\\d{18}$/,\n DK: /^\\d{14}$/,\n DO: /^[A-Z0-9]{4}\\d{20}$/,\n EE: /^\\d{16}$/,\n EG: /^\\d{25}$/,\n ES: /^\\d{20}$/,\n FI: /^\\d{14}$/,\n FO: /^\\d{14}$/,\n FR: /^\\d{10}[A-Z0-9]{11}\\d{2}$/,\n GB: /^[A-Z]{4}\\d{14}$/,\n GE: /^[A-Z]{2}\\d{16}$/,\n GI: /^[A-Z]{4}[A-Z0-9]{15}$/,\n GL: /^\\d{14}$/,\n GR: /^\\d{7}[A-Z0-9]{16}$/,\n GT: /^[A-Z0-9]{24}$/,\n HR: /^\\d{17}$/,\n HU: /^\\d{24}$/,\n IE: /^[A-Z]{4}\\d{14}$/,\n IL: /^\\d{19}$/,\n IQ: /^[A-Z]{4}\\d{15}$/,\n IS: /^\\d{22}$/,\n IT: /^[A-Z]\\d{10}[A-Z0-9]{12}$/,\n JO: /^[A-Z]{4}\\d{22}$/,\n KW: /^[A-Z]{4}[A-Z0-9]{22}$/,\n KZ: /^\\d{16}$/,\n LB: /^\\d{4}[A-Z0-9]{20}$/,\n LC: /^[A-Z]{4}[A-Z0-9]{24}$/,\n LI: /^\\d{17}$/,\n LT: /^\\d{16}$/,\n LU: /^\\d{16}$/,\n LV: /^[A-Z]{4}[A-Z0-9]{13}$/,\n MC: /^\\d{10}[A-Z0-9]{11}\\d{2}$/,\n MD: /^[A-Z0-9]{20}$/,\n ME: /^\\d{18}$/,\n MK: /^\\d{3}[A-Z0-9]{10}\\d{2}$/,\n MR: /^\\d{23}$/,\n MT: /^[A-Z]{4}\\d{5}[A-Z0-9]{18}$/,\n MU: /^[A-Z]{4}\\d{19}[A-Z]{3}$/,\n NI: /^[A-Z]{4}\\d{24}$/,\n NL: /^[A-Z]{4}\\d{10}$/,\n NO: /^\\d{11}$/,\n PK: /^[A-Z]{4}[A-Z0-9]{16}$/,\n PL: /^\\d{24}$/,\n PS: /^[A-Z]{4}[A-Z0-9]{21}$/,\n PT: /^\\d{21}$/,\n QA: /^[A-Z]{4}[A-Z0-9]{21}$/,\n RO: /^[A-Z]{4}[A-Z0-9]{16}$/,\n RS: /^\\d{18}$/,\n SA: /^\\d{20}$/,\n SC: /^[A-Z]{4}\\d{20}[A-Z]{3}$/,\n SD: /^\\d{14}$/,\n SE: /^\\d{20}$/,\n SI: /^\\d{15}$/,\n SK: /^\\d{20}$/,\n SM: /^[A-Z]\\d{10}[A-Z0-9]{12}$/,\n ST: /^\\d{21}$/,\n SV: /^[A-Z]{4}\\d{20}$/,\n TL: /^\\d{19}$/,\n TN: /^\\d{20}$/,\n TR: /^\\d{6}[A-Z0-9]{16}$/,\n UA: /^\\d{6}[A-Z0-9]{19}$/,\n VA: /^\\d{18}$/,\n VG: /^[A-Z]{4}\\d{16}$/,\n XK: /^\\d{16}$/,\n};\n\n/** IBAN total length by country code. */\nconst LENGTHS: Record<string, number> = {\n AD: 24,\n AE: 23,\n AL: 28,\n AT: 20,\n AZ: 28,\n BA: 20,\n BE: 16,\n BG: 22,\n BH: 22,\n BI: 27,\n BR: 29,\n BY: 28,\n CH: 21,\n CR: 22,\n CY: 28,\n CZ: 24,\n DE: 22,\n DJ: 27,\n DK: 18,\n DO: 28,\n EE: 20,\n EG: 29,\n ES: 24,\n FI: 18,\n FO: 18,\n FR: 27,\n GB: 22,\n GE: 22,\n GI: 23,\n GL: 18,\n GR: 27,\n GT: 28,\n HR: 21,\n HU: 28,\n IE: 22,\n IL: 23,\n IQ: 23,\n IS: 26,\n IT: 27,\n JO: 30,\n KW: 30,\n KZ: 20,\n LB: 28,\n LC: 32,\n LI: 21,\n LT: 20,\n LU: 20,\n LV: 21,\n LY: 25,\n MC: 27,\n MD: 24,\n ME: 22,\n MK: 19,\n MN: 20,\n MR: 27,\n MT: 31,\n MU: 30,\n NI: 28,\n NL: 18,\n NO: 15,\n PK: 24,\n PL: 28,\n PS: 29,\n PT: 25,\n QA: 29,\n RO: 24,\n RS: 22,\n RU: 33,\n SA: 24,\n SC: 31,\n SD: 18,\n SE: 24,\n SI: 19,\n SK: 24,\n SM: 27,\n SN: 28,\n SO: 23,\n ST: 25,\n SV: 28,\n TL: 23,\n TN: 24,\n TR: 26,\n UA: 29,\n VA: 22,\n VG: 24,\n XK: 20,\n};\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\n/**\n * Convert letters to numbers (A=10, ..., Z=35)\n * and rearrange for mod-97 check.\n */\nconst toNumeric = (iban: string): string => {\n const rearranged = iban.slice(4) + iban.slice(0, 4);\n let result = \"\";\n for (let i = 0; i < rearranged.length; i++) {\n const ch = rearranged[i];\n if (ch !== undefined) {\n result += String(charValue(ch));\n }\n }\n return result;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length < 5) {\n return err(\"INVALID_LENGTH\", \"IBAN is too short\");\n }\n if (!isalnum(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"IBAN must contain only letters and digits\",\n );\n }\n const cc = v.slice(0, 2);\n if (!/^[A-Z]{2}$/.test(cc)) {\n return err(\n \"INVALID_COMPONENT\",\n \"IBAN must start with a 2-letter country code\",\n );\n }\n const expectedLen = LENGTHS[cc];\n if (\n expectedLen !== undefined &&\n v.length !== expectedLen\n ) {\n return err(\n \"INVALID_LENGTH\",\n `IBAN for ${cc} must be ${String(expectedLen)} characters`,\n );\n }\n // Validate BBAN format (country-specific)\n const bban = v.slice(4);\n const bbanRegex = BBAN_FORMAT[cc];\n if (bbanRegex !== undefined && !bbanRegex.test(bban)) {\n return err(\n \"INVALID_FORMAT\",\n `IBAN BBAN format is invalid for ${cc}`,\n );\n }\n const numeric = toNumeric(v);\n if (mod97(numeric) !== 1) {\n return err(\n \"INVALID_CHECKSUM\",\n \"IBAN check digits are incorrect\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const groups: string[] = [];\n for (let i = 0; i < v.length; i += 4) {\n groups.push(v.slice(i, i + 4));\n }\n return groups.join(\" \");\n};\n\n/**\n * Countries supported by generate(). All have\n * all-digit BBANs for simplicity.\n */\nconst GENERATE_COUNTRIES = [\"CZ\", \"DE\", \"SK\"] as const;\n\ntype GenerateCountry = (typeof GENERATE_COUNTRIES)[number];\n\n/** BBAN lengths for generate()-supported countries. */\nconst BBAN_LENGTHS: Record<GenerateCountry, number> = {\n CZ: 20,\n DE: 18,\n SK: 20,\n};\n\n/**\n * Compute IBAN check digits for a country code\n * and BBAN. Returns a 2-character string.\n */\nconst computeCheckDigits = (\n cc: string,\n bban: string,\n): string => {\n const placeholder = `${bban}${cc}00`;\n let numeric = \"\";\n for (let i = 0; i < placeholder.length; i++) {\n const ch = placeholder[i];\n if (ch !== undefined) {\n numeric += String(charValue(ch));\n }\n }\n const remainder = mod97(numeric);\n const check = 98 - remainder;\n return String(check).padStart(2, \"0\");\n};\n\n/**\n * Generate a random valid IBAN for CZ, DE, or SK.\n */\nconst generate = (): string => {\n const idx = randomInt(0, GENERATE_COUNTRIES.length - 1);\n const cc = GENERATE_COUNTRIES[idx] as GenerateCountry;\n const bbanLen = BBAN_LENGTHS[cc];\n const bban = randomDigits(bbanLen);\n const checkDigits = computeCheckDigits(cc, bban);\n return `${cc}${checkDigits}${bban}`;\n};\n\n/** International Bank Account Number. */\nconst iban: GlobalValidator = {\n scope: \"global\",\n name: \"IBAN\",\n localName: \"IBAN\",\n abbreviation: \"IBAN\",\n aliases: [\"IBAN\"] as const,\n candidatePattern:\n \"[A-Z]{2}\\\\d{2}[\\\\s]?[A-Z0-9]{4}[\\\\s]?(?:[A-Z0-9]{4}[\\\\s]?){2,7}[A-Z0-9]{1,4}\",\n entityType: \"any\",\n description:\n \"International bank account number per ISO 13616\",\n sourceUrl:\n \"https://www.swift.com/standards/data-standards/iban-international-bank-account-number\",\n examples: [\n \"GB29NWBK60161331926819\",\n \"DE89370400440532013000\",\n ] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default iban;\nexport { compact, format, generate, validate };\n"],"mappings":"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"}
package/dist/id/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import npwp from "./npwp.js";
3
2
 
4
3
  //#region src/id/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { npwp };
6
+ }
6
7
  //#endregion
7
8
  export { mod_d_exports, npwp };
8
9
  //# sourceMappingURL=mod.d.ts.map
package/dist/id/npwp.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/id/npwp.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;
8
7
  /** Generate a random valid 15-digit NPWP. */
9
8
  declare const generate: () => string;
10
9
  /** Indonesian Taxpayer Identification Number. */
11
- declare const npwp: Validator;
10
+ declare const npwp: CountryValidator<"ID">;
12
11
  //#endregion
13
12
  export { compact, npwp as default, format, generate, validate };
14
13
  //# sourceMappingURL=npwp.d.ts.map
package/dist/id/npwp.js CHANGED
@@ -1,21 +1,10 @@
1
+ import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
1
2
  import { clean } from "../_util/clean.js";
3
+ import { isValidDate } from "../_util/date.js";
2
4
  import { randomDigits } from "../_util/generate.js";
3
5
  import { err } from "../_util/result.js";
4
- import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
5
6
  import { isdigits } from "../_util/strings.js";
6
- import { isValidDate } from "../_util/date.js";
7
7
  //#region src/id/npwp.ts
8
- /**
9
- * NPWP (Nomor Pokok Wajib Pajak, Indonesian tax ID).
10
- *
11
- * 15 or 16 digits. The 15-digit (legacy) format has a
12
- * Luhn check on the first 9 digits. The 16-digit format
13
- * is either a NIK (starts with non-zero) validated as a
14
- * province-code and birth-date checks, or the legacy
15
- * format prefixed with 0 (Luhn on first 10 digits).
16
- *
17
- * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Indonesia-TIN.pdf
18
- */
19
8
  const compact = (value) => clean(value, " .-");
20
9
  /**
21
10
  * Valid 2-digit province codes for NIK, sourced from
@@ -116,6 +105,7 @@ const npwp = {
116
105
  abbreviation: "NPWP",
117
106
  aliases: ["NPWP", "Nomor Pokok Wajib Pajak"],
118
107
  candidatePattern: "\\d{2}\\.?\\d{3}\\.?\\d{3}\\.?\\d-?\\d{3}\\.?\\d{3}",
108
+ scope: "country",
119
109
  country: "ID",
120
110
  entityType: "any",
121
111
  lengths: [15, 16],
@@ -1 +1 @@
1
- {"version":3,"file":"npwp.js","names":[],"sources":["../../src/id/npwp.ts"],"sourcesContent":["/**\n * NPWP (Nomor Pokok Wajib Pajak, Indonesian tax ID).\n *\n * 15 or 16 digits. The 15-digit (legacy) format has a\n * Luhn check on the first 9 digits. The 16-digit format\n * is either a NIK (starts with non-zero) validated as a\n * province-code and birth-date checks, or the legacy\n * format prefixed with 0 (Luhn on first 10 digits).\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Indonesia-TIN.pdf\n */\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomDigits } 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\n/**\n * Valid 2-digit province codes for NIK, sourced from\n * python-stdnum's id/loc numdb.\n */\nconst NIK_PROVINCES = new Set([\n \"11\",\n \"12\",\n \"13\",\n \"14\",\n \"15\",\n \"16\",\n \"17\",\n \"18\",\n \"19\",\n \"21\",\n \"31\",\n \"32\",\n \"33\",\n \"34\",\n \"35\",\n \"36\",\n \"51\",\n \"52\",\n \"53\",\n \"61\",\n \"62\",\n \"63\",\n \"64\",\n \"71\",\n \"72\",\n \"73\",\n \"74\",\n \"75\",\n \"76\",\n \"81\",\n \"82\",\n \"91\",\n \"94\",\n]);\n\n/**\n * Validate a 16-digit NIK (Nomor Induk Kependudukan).\n * Format: PPRRSSDDMMYYXXXX where PP = province,\n * RRSS = regency/city + sub-district,\n * DDMMYY = birth date (DD+40 for females),\n * XXXX = serial.\n */\nconst validateNik = (v: string): ValidateResult => {\n // Province code check\n if (!NIK_PROVINCES.has(v.slice(0, 2))) {\n return err(\n \"INVALID_COMPONENT\",\n \"NIK province code is invalid\",\n );\n }\n let day = Number(v.slice(6, 8));\n const month = Number(v.slice(8, 10));\n const year = Number(v.slice(10, 12));\n // Females have 40 added to the day\n if (day > 40) day -= 40;\n // Validate the date (century is ambiguous in NIK)\n if (\n !isValidDate(1900 + year, month, day) &&\n !isValidDate(2000 + year, month, day)\n ) {\n return err(\n \"INVALID_COMPONENT\",\n \"NIK contains an invalid date\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"NPWP must contain only digits\",\n );\n }\n if (v.length === 15) {\n // Legacy 15-digit format: Luhn on first 9 digits\n if (!luhnValidate(v.slice(0, 9))) {\n return err(\n \"INVALID_CHECKSUM\",\n \"NPWP Luhn check on first 9 digits failed\",\n );\n }\n return { valid: true, compact: v };\n }\n if (v.length === 16) {\n if (v[0] !== \"0\") {\n // NIK format\n return validateNik(v);\n }\n // 0-prefixed legacy: Luhn on first 10 digits\n if (!luhnValidate(v.slice(0, 10))) {\n return err(\n \"INVALID_CHECKSUM\",\n \"NPWP Luhn check on first 10 digits failed\",\n );\n }\n return { valid: true, compact: v };\n }\n return err(\n \"INVALID_LENGTH\",\n \"NPWP must be 15 or 16 digits\",\n );\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 16) {\n // NIK or 0-prefixed legacy: no standard mask\n return v;\n }\n return (\n `${v.slice(0, 2)}.${v.slice(2, 5)}.` +\n `${v.slice(5, 8)}.${v.slice(8, 9)}` +\n `-${v.slice(9, 12)}.${v.slice(12)}`\n );\n};\n\n/** Generate a random valid 15-digit NPWP. */\nconst generate = (): string => {\n for (;;) {\n const p = randomDigits(8);\n const cs = luhnChecksum(p + \"0\");\n const c = p + String((10 - cs) % 10) + randomDigits(6);\n if (validate(c).valid) return c;\n }\n};\n\n/** Indonesian Taxpayer Identification Number. */\nconst npwp: Validator = {\n name: \"Indonesian Taxpayer Identification Number\",\n localName: \"Nomor Pokok Wajib Pajak\",\n abbreviation: \"NPWP\",\n aliases: [\"NPWP\", \"Nomor Pokok Wajib Pajak\"] as const,\n candidatePattern:\n \"\\\\d{2}\\\\.?\\\\d{3}\\\\.?\\\\d{3}\\\\.?\\\\d-?\\\\d{3}\\\\.?\\\\d{3}\",\n country: \"ID\",\n entityType: \"any\",\n lengths: [15, 16],\n examples: [\"013000666091000\", \"016090524017000\"],\n description:\n \"15 or 16-digit tax identification number issued by \" +\n \"the Directorate General of Taxes\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/\" +\n \"Tax_identification_number#Indonesia\",\n compact,\n format,\n validate,\n generate,\n};\n\nexport default npwp;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAwBA,MAAM,WAAW,UACf,MAAM,OAAO,MAAM;;;;;AAMrB,MAAM,gBAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;;;AASF,MAAM,eAAe,MAA8B;AAEjD,KAAI,CAAC,cAAc,IAAI,EAAE,MAAM,GAAG,EAAE,CAAC,CACnC,QAAO,IACL,qBACA,+BACD;CAEH,IAAI,MAAM,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAC/B,MAAM,QAAQ,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;CACpC,MAAM,OAAO,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;AAEpC,KAAI,MAAM,GAAI,QAAO;AAErB,KACE,CAAC,YAAY,OAAO,MAAM,OAAO,IAAI,IACrC,CAAC,YAAY,MAAO,MAAM,OAAO,IAAI,CAErC,QAAO,IACL,qBACA,+BACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,gCACD;AAEH,KAAI,EAAE,WAAW,IAAI;AAEnB,MAAI,CAAC,aAAa,EAAE,MAAM,GAAG,EAAE,CAAC,CAC9B,QAAO,IACL,oBACA,2CACD;AAEH,SAAO;GAAE,OAAO;GAAM,SAAS;GAAG;;AAEpC,KAAI,EAAE,WAAW,IAAI;AACnB,MAAI,EAAE,OAAO,IAEX,QAAO,YAAY,EAAE;AAGvB,MAAI,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG,CAAC,CAC/B,QAAO,IACL,oBACA,4CACD;AAEH,SAAO;GAAE,OAAO;GAAM,SAAS;GAAG;;AAEpC,QAAO,IACL,kBACA,+BACD;;AAGH,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GAEf,QAAO;AAET,QACE,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAC/B,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAA,GAC7B,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG;;;AAKrC,MAAM,iBAAyB;AAC7B,UAAS;EACP,MAAM,IAAI,aAAa,EAAE;EACzB,MAAM,KAAK,aAAa,IAAI,IAAI;EAChC,MAAM,IAAI,IAAI,QAAQ,KAAK,MAAM,GAAG,GAAG,aAAa,EAAE;AACtD,MAAI,SAAS,EAAE,CAAC,MAAO,QAAO;;;;AAKlC,MAAM,OAAkB;CACtB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,QAAQ,0BAA0B;CAC5C,kBACE;CACF,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,IAAI,GAAG;CACjB,UAAU,CAAC,mBAAmB,kBAAkB;CAChD,aACE;CAEF,WACE;CAEF;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"npwp.js","names":[],"sources":["../../src/id/npwp.ts"],"sourcesContent":["/**\n * NPWP (Nomor Pokok Wajib Pajak, Indonesian tax ID).\n *\n * 15 or 16 digits. The 15-digit (legacy) format has a\n * Luhn check on the first 9 digits. The 16-digit format\n * is either a NIK (starts with non-zero) validated as a\n * province-code and birth-date checks, or the legacy\n * format prefixed with 0 (Luhn on first 10 digits).\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Indonesia-TIN.pdf\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" .-\");\n\n/**\n * Valid 2-digit province codes for NIK, sourced from\n * python-stdnum's id/loc numdb.\n */\nconst NIK_PROVINCES = new Set([\n \"11\",\n \"12\",\n \"13\",\n \"14\",\n \"15\",\n \"16\",\n \"17\",\n \"18\",\n \"19\",\n \"21\",\n \"31\",\n \"32\",\n \"33\",\n \"34\",\n \"35\",\n \"36\",\n \"51\",\n \"52\",\n \"53\",\n \"61\",\n \"62\",\n \"63\",\n \"64\",\n \"71\",\n \"72\",\n \"73\",\n \"74\",\n \"75\",\n \"76\",\n \"81\",\n \"82\",\n \"91\",\n \"94\",\n]);\n\n/**\n * Validate a 16-digit NIK (Nomor Induk Kependudukan).\n * Format: PPRRSSDDMMYYXXXX where PP = province,\n * RRSS = regency/city + sub-district,\n * DDMMYY = birth date (DD+40 for females),\n * XXXX = serial.\n */\nconst validateNik = (v: string): ValidateResult => {\n // Province code check\n if (!NIK_PROVINCES.has(v.slice(0, 2))) {\n return err(\n \"INVALID_COMPONENT\",\n \"NIK province code is invalid\",\n );\n }\n let day = Number(v.slice(6, 8));\n const month = Number(v.slice(8, 10));\n const year = Number(v.slice(10, 12));\n // Females have 40 added to the day\n if (day > 40) day -= 40;\n // Validate the date (century is ambiguous in NIK)\n if (\n !isValidDate(1900 + year, month, day) &&\n !isValidDate(2000 + year, month, day)\n ) {\n return err(\n \"INVALID_COMPONENT\",\n \"NIK contains an invalid date\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"NPWP must contain only digits\",\n );\n }\n if (v.length === 15) {\n // Legacy 15-digit format: Luhn on first 9 digits\n if (!luhnValidate(v.slice(0, 9))) {\n return err(\n \"INVALID_CHECKSUM\",\n \"NPWP Luhn check on first 9 digits failed\",\n );\n }\n return { valid: true, compact: v };\n }\n if (v.length === 16) {\n if (v[0] !== \"0\") {\n // NIK format\n return validateNik(v);\n }\n // 0-prefixed legacy: Luhn on first 10 digits\n if (!luhnValidate(v.slice(0, 10))) {\n return err(\n \"INVALID_CHECKSUM\",\n \"NPWP Luhn check on first 10 digits failed\",\n );\n }\n return { valid: true, compact: v };\n }\n return err(\n \"INVALID_LENGTH\",\n \"NPWP must be 15 or 16 digits\",\n );\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 16) {\n // NIK or 0-prefixed legacy: no standard mask\n return v;\n }\n return (\n `${v.slice(0, 2)}.${v.slice(2, 5)}.` +\n `${v.slice(5, 8)}.${v.slice(8, 9)}` +\n `-${v.slice(9, 12)}.${v.slice(12)}`\n );\n};\n\n/** Generate a random valid 15-digit NPWP. */\nconst generate = (): string => {\n for (;;) {\n const p = randomDigits(8);\n const cs = luhnChecksum(p + \"0\");\n const c = p + String((10 - cs) % 10) + randomDigits(6);\n if (validate(c).valid) return c;\n }\n};\n\n/** Indonesian Taxpayer Identification Number. */\nconst npwp: CountryValidator<\"ID\"> = {\n name: \"Indonesian Taxpayer Identification Number\",\n localName: \"Nomor Pokok Wajib Pajak\",\n abbreviation: \"NPWP\",\n aliases: [\"NPWP\", \"Nomor Pokok Wajib Pajak\"] as const,\n candidatePattern:\n \"\\\\d{2}\\\\.?\\\\d{3}\\\\.?\\\\d{3}\\\\.?\\\\d-?\\\\d{3}\\\\.?\\\\d{3}\",\n scope: \"country\",\n country: \"ID\",\n entityType: \"any\",\n lengths: [15, 16],\n examples: [\"013000666091000\", \"016090524017000\"],\n description:\n \"15 or 16-digit tax identification number issued by \" +\n \"the Directorate General of Taxes\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/\" +\n \"Tax_identification_number#Indonesia\",\n compact,\n format,\n validate,\n generate,\n};\n\nexport default npwp;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;AA2BA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;;;;;AAMpB,MAAM,gBAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;;;AASD,MAAM,eAAe,MAA8B;CAEjD,IAAI,CAAC,cAAc,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,GAClC,OAAO,IACL,qBACA,8BACF;CAEF,IAAI,MAAM,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAC9B,MAAM,QAAQ,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CACnC,MAAM,OAAO,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;CAEnC,IAAI,MAAM,IAAI,OAAO;CAErB,IACE,CAAC,YAAY,OAAO,MAAM,OAAO,GAAG,KACpC,CAAC,YAAY,MAAO,MAAM,OAAO,GAAG,GAEpC,OAAO,IACL,qBACA,8BACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,+BACF;CAEF,IAAI,EAAE,WAAW,IAAI;EAEnB,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,CAAC,CAAC,GAC7B,OAAO,IACL,oBACA,0CACF;EAEF,OAAO;GAAE,OAAO;GAAM,SAAS;EAAE;CACnC;CACA,IAAI,EAAE,WAAW,IAAI;EACnB,IAAI,EAAE,OAAO,KAEX,OAAO,YAAY,CAAC;EAGtB,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,EAAE,CAAC,GAC9B,OAAO,IACL,oBACA,2CACF;EAEF,OAAO;GAAE,OAAO;GAAM,SAAS;EAAE;CACnC;CACA,OAAO,IACL,kBACA,8BACF;AACF;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IAEf,OAAO;CAET,OACE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAC/B,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAA,GAC5B,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;AAEpC;;AAGA,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,IAAI,aAAa,CAAC;EACxB,MAAM,KAAK,aAAa,IAAI,GAAG;EAC/B,MAAM,IAAI,IAAI,QAAQ,KAAK,MAAM,EAAE,IAAI,aAAa,CAAC;EACrD,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO;CAChC;AACF;;AAGA,MAAM,OAA+B;CACnC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,QAAQ,yBAAyB;CAC3C,kBACE;CACF,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,IAAI,EAAE;CAChB,UAAU,CAAC,mBAAmB,iBAAiB;CAC/C,aACE;CAEF,WACE;CAEF;CACA;CACA;CACA;AACF"}
package/dist/ie/mod.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import pps from "./pps.js";
3
2
  import vat from "./vat.js";
4
3
 
5
4
  //#region src/ie/mod.d.ts
6
-
5
+ declare namespace mod_d_exports {
6
+ export { pps, vat };
7
+ }
7
8
  //#endregion
8
9
  export { mod_d_exports, pps, vat };
9
10
  //# sourceMappingURL=mod.d.ts.map
package/dist/ie/pps.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ie/pps.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;
8
7
  /** Generate a random valid Irish PPS number. */
9
8
  declare const generate: () => string;
10
9
  /** Irish Personal Public Service Number. */
11
- declare const pps: Validator;
10
+ declare const pps: CountryValidator<"IE">;
12
11
  //#endregion
13
12
  export { compact, pps as default, format, generate, validate };
14
13
  //# sourceMappingURL=pps.d.ts.map
package/dist/ie/pps.js CHANGED
@@ -3,16 +3,6 @@ import { randomDigits } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/ie/pps.ts
6
- /**
7
- * PPS (Personal Public Service Number).
8
- *
9
- * Irish personal identification number. 7 digits
10
- * followed by a check letter and an optional second
11
- * letter (new format). Uses a weighted sum with
12
- * alphabet "WABCDEFGHIJKLMNOPQRSTUV".
13
- *
14
- * @see https://www.gov.ie/en/service/12e6de-get-a-personal-public-service-pps-number/
15
- */
16
6
  const ALPHABET = "WABCDEFGHIJKLMNOPQRSTUV";
17
7
  const compact = (value) => clean(value, " -").toUpperCase();
18
8
  const validate = (value) => {
@@ -54,6 +44,7 @@ const pps = {
54
44
  "RSI number"
55
45
  ],
56
46
  candidatePattern: "\\d{7}[A-Z]{1,2}",
47
+ scope: "country",
57
48
  country: "IE",
58
49
  entityType: "person",
59
50
  sourceUrl: "https://www.gov.ie/en/service/12e6de-get-a-personal-public-service-pps-number/",
@@ -1 +1 @@
1
- {"version":3,"file":"pps.js","names":[],"sources":["../../src/ie/pps.ts"],"sourcesContent":["/**\n * PPS (Personal Public Service Number).\n *\n * Irish personal identification number. 7 digits\n * followed by a check letter and an optional second\n * letter (new format). Uses a weighted sum with\n * alphabet \"WABCDEFGHIJKLMNOPQRSTUV\".\n *\n * @see https://www.gov.ie/en/service/12e6de-get-a-personal-public-service-pps-number/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst ALPHABET = \"WABCDEFGHIJKLMNOPQRSTUV\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length < 8 || v.length > 9) {\n return err(\n \"INVALID_LENGTH\",\n \"PPS must be 8 or 9 characters\",\n );\n }\n\n const digits = v.slice(0, 7);\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"PPS must start with 7 digits\",\n );\n }\n\n const checkLetter = v[7];\n const secondLetter = v.length >= 9 ? v[8] : undefined;\n\n // Compute weighted sum: weights 8..2 for digits\n let sum = 0;\n for (let i = 0; i < 7; i++) {\n sum += Number(digits[i]) * (8 - i);\n }\n\n // New format: add 9 * index of 2nd letter\n if (secondLetter !== undefined && secondLetter !== \"W\") {\n const idx = ALPHABET.indexOf(secondLetter);\n if (idx === -1) {\n return err(\n \"INVALID_FORMAT\",\n \"PPS second letter is invalid\",\n );\n }\n sum += 9 * idx;\n }\n\n const remainder = sum % 23;\n const expected = ALPHABET[remainder];\n if (checkLetter !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"PPS check letter does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Irish PPS number. */\nconst generate = (): string => {\n for (;;) {\n for (let c = 65; c <= 90; c++) {\n const cand = randomDigits(7) + String.fromCharCode(c);\n if (validate(cand).valid) return compact(cand);\n }\n }\n};\n\n/** Irish Personal Public Service Number. */\nconst pps: Validator = {\n name: \"Irish Personal ID\",\n localName: \"Personal Public Service Number\",\n abbreviation: \"PPS\",\n aliases: [\"PPS number\", \"PPSN\", \"RSI number\"] as const,\n candidatePattern: \"\\\\d{7}[A-Z]{1,2}\",\n country: \"IE\",\n entityType: \"person\",\n sourceUrl:\n \"https://www.gov.ie/en/service/12e6de-get-a-personal-public-service-pps-number/\",\n examples: [\"6433435F\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default pps;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,WAAW;AAEjB,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,CAAC,aAAa;AAElC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,SAAS,KAAK,EAAE,SAAS,EAC7B,QAAO,IACL,kBACA,gCACD;CAGH,MAAM,SAAS,EAAE,MAAM,GAAG,EAAE;AAC5B,KAAI,CAAC,SAAS,OAAO,CACnB,QAAO,IACL,kBACA,+BACD;CAGH,MAAM,cAAc,EAAE;CACtB,MAAM,eAAe,EAAE,UAAU,IAAI,EAAE,KAAK,KAAA;CAG5C,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,QAAO,OAAO,OAAO,GAAG,IAAI,IAAI;AAIlC,KAAI,iBAAiB,KAAA,KAAa,iBAAiB,KAAK;EACtD,MAAM,MAAM,SAAS,QAAQ,aAAa;AAC1C,MAAI,QAAQ,GACV,QAAO,IACL,kBACA,+BACD;AAEH,SAAO,IAAI;;AAKb,KAAI,gBADa,SADC,MAAM,IAGtB,QAAO,IACL,oBACA,kCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,MAAM,iBAAyB;AAC7B,SACE,MAAK,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK;EAC7B,MAAM,OAAO,aAAa,EAAE,GAAG,OAAO,aAAa,EAAE;AACrD,MAAI,SAAS,KAAK,CAAC,MAAO,QAAO,QAAQ,KAAK;;;;AAMpD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAc;EAAQ;EAAa;CAC7C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"pps.js","names":[],"sources":["../../src/ie/pps.ts"],"sourcesContent":["/**\n * PPS (Personal Public Service Number).\n *\n * Irish personal identification number. 7 digits\n * followed by a check letter and an optional second\n * letter (new format). Uses a weighted sum with\n * alphabet \"WABCDEFGHIJKLMNOPQRSTUV\".\n *\n * @see https://www.gov.ie/en/service/12e6de-get-a-personal-public-service-pps-number/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst ALPHABET = \"WABCDEFGHIJKLMNOPQRSTUV\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length < 8 || v.length > 9) {\n return err(\n \"INVALID_LENGTH\",\n \"PPS must be 8 or 9 characters\",\n );\n }\n\n const digits = v.slice(0, 7);\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"PPS must start with 7 digits\",\n );\n }\n\n const checkLetter = v[7];\n const secondLetter = v.length >= 9 ? v[8] : undefined;\n\n // Compute weighted sum: weights 8..2 for digits\n let sum = 0;\n for (let i = 0; i < 7; i++) {\n sum += Number(digits[i]) * (8 - i);\n }\n\n // New format: add 9 * index of 2nd letter\n if (secondLetter !== undefined && secondLetter !== \"W\") {\n const idx = ALPHABET.indexOf(secondLetter);\n if (idx === -1) {\n return err(\n \"INVALID_FORMAT\",\n \"PPS second letter is invalid\",\n );\n }\n sum += 9 * idx;\n }\n\n const remainder = sum % 23;\n const expected = ALPHABET[remainder];\n if (checkLetter !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"PPS check letter does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Irish PPS number. */\nconst generate = (): string => {\n for (;;) {\n for (let c = 65; c <= 90; c++) {\n const cand = randomDigits(7) + String.fromCharCode(c);\n if (validate(cand).valid) return compact(cand);\n }\n }\n};\n\n/** Irish Personal Public Service Number. */\nconst pps: CountryValidator<\"IE\"> = {\n name: \"Irish Personal ID\",\n localName: \"Personal Public Service Number\",\n abbreviation: \"PPS\",\n aliases: [\"PPS number\", \"PPSN\", \"RSI number\"] as const,\n candidatePattern: \"\\\\d{7}[A-Z]{1,2}\",\n scope: \"country\",\n country: \"IE\",\n entityType: \"person\",\n sourceUrl:\n \"https://www.gov.ie/en/service/12e6de-get-a-personal-public-service-pps-number/\",\n examples: [\"6433435F\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default pps;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAqBA,MAAM,WAAW;AAEjB,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,EAAE,YAAY;AAEjC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,SAAS,KAAK,EAAE,SAAS,GAC7B,OAAO,IACL,kBACA,+BACF;CAGF,MAAM,SAAS,EAAE,MAAM,GAAG,CAAC;CAC3B,IAAI,CAAC,SAAS,MAAM,GAClB,OAAO,IACL,kBACA,8BACF;CAGF,MAAM,cAAc,EAAE;CACtB,MAAM,eAAe,EAAE,UAAU,IAAI,EAAE,KAAK,KAAA;CAG5C,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,OAAO,OAAO,OAAO,EAAE,KAAK,IAAI;CAIlC,IAAI,iBAAiB,KAAA,KAAa,iBAAiB,KAAK;EACtD,MAAM,MAAM,SAAS,QAAQ,YAAY;EACzC,IAAI,QAAQ,IACV,OAAO,IACL,kBACA,8BACF;EAEF,OAAO,IAAI;CACb;CAIA,IAAI,gBADa,SADC,MAAM,KAGtB,OAAO,IACL,oBACA,iCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,iBAAyB;CAC7B,SACE,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK;EAC7B,MAAM,OAAO,aAAa,CAAC,IAAI,OAAO,aAAa,CAAC;EACpD,IAAI,SAAS,IAAI,EAAE,OAAO,OAAO,QAAQ,IAAI;CAC/C;AAEJ;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAc;EAAQ;CAAY;CAC5C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,UAAU;CACrB;CACA;CACA;CACA;AACF"}
package/dist/ie/vat.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ie/vat.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;
8
7
  /** Generate a random valid Irish VAT number. */
9
8
  declare const generate: () => string;
10
9
  /** Irish VAT Number. */
11
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"IE">;
12
11
  //#endregion
13
12
  export { compact, vat as default, format, generate, validate };
14
13
  //# sourceMappingURL=vat.d.ts.map
package/dist/ie/vat.js CHANGED
@@ -3,15 +3,6 @@ import { randomDigits } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/ie/vat.ts
6
- /**
7
- * VAT (Irish VAT number).
8
- *
9
- * 8-9 characters, complex format with old and new
10
- * styles.
11
- *
12
- * @see https://www.vatify.eu/ireland-vat-number.html
13
- * @see https://www.revenue.ie/
14
- */
15
6
  const ALPHABET = "WABCDEFGHIJKLMNOPQRSTUV";
16
7
  const compact = (value) => {
17
8
  let v = clean(value, " -/.");
@@ -68,6 +59,7 @@ const vat = {
68
59
  abbreviation: "VAT",
69
60
  aliases: ["VAT number IE"],
70
61
  candidatePattern: "IE\\d[A-Z+*]\\d{5}[A-Z]",
62
+ scope: "country",
71
63
  country: "IE",
72
64
  entityType: "any",
73
65
  sourceUrl: "https://www.revenue.ie/",
@@ -1 +1 @@
1
- {"version":3,"file":"vat.js","names":[],"sources":["../../src/ie/vat.ts"],"sourcesContent":["/**\n * VAT (Irish VAT number).\n *\n * 8-9 characters, complex format with old and new\n * styles.\n *\n * @see https://www.vatify.eu/ireland-vat-number.html\n * @see https://www.revenue.ie/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst ALPHABET = \"WABCDEFGHIJKLMNOPQRSTUV\";\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"IE\") || v.startsWith(\"ie\")) {\n v = v.slice(2);\n }\n return v.toUpperCase();\n};\n\nconst checkNew = (v: string): boolean => {\n // New format: 7 digits + check letter + optional\n // trailing letter (W or A-Z)\n const trailing = v.length === 9 ? v.charAt(8) : \"W\";\n let sum = 0;\n for (let i = 0; i < 7; i++) {\n sum += (8 - i) * Number(v.charAt(i));\n }\n sum += 9 * ALPHABET.indexOf(trailing);\n const expected = ALPHABET.charAt(sum % 23);\n return v.charAt(7) === expected;\n};\n\nconst checkOld = (v: string): boolean => {\n // Old format: digit + letter + 5 digits +\n // check letter (8 chars total).\n // Rearrange to 7-digit new-style layout:\n // 0 + d[2..6] + d[0]\n const rearranged = `0${v.slice(2, 7)}${v.charAt(0)}`;\n let sum = 0;\n for (let i = 0; i < 7; i++) {\n sum += (8 - i) * Number(rearranged.charAt(i));\n }\n const expected = ALPHABET.charAt(sum % 23);\n return v.charAt(7) === expected;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 8 && v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Irish VAT number must be 8 or 9 characters\",\n );\n }\n\n // New format: 7 digits + letter [+ letter]\n if (\n isdigits(v.slice(0, 7)) &&\n /^[A-Z]$/.test(v.charAt(7))\n ) {\n if (v.length === 9 && !/^[A-Z+*]$/.test(v.charAt(8))) {\n return err(\n \"INVALID_FORMAT\",\n \"Irish VAT trailing character must be a letter\",\n );\n }\n if (!checkNew(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Irish VAT number check letter mismatch\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // Old format: digit + letter + 5 digits + letter\n if (\n v.length === 8 &&\n /^\\d$/.test(v.charAt(0)) &&\n /^[A-Z+*]$/.test(v.charAt(1)) &&\n isdigits(v.slice(2, 7)) &&\n /^[A-Z]$/.test(v.charAt(7))\n ) {\n if (!checkOld(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Irish VAT number check letter mismatch\",\n );\n }\n return { valid: true, compact: v };\n }\n\n return err(\n \"INVALID_FORMAT\",\n \"Irish VAT number has invalid format\",\n );\n};\n\nconst format = (value: string): string =>\n `IE${compact(value)}`;\n\n/** Generate a random valid Irish VAT number. */\nconst generate = (): string => {\n for (;;) {\n for (let c = 65; c <= 90; c++) {\n const cand = randomDigits(7) + String.fromCharCode(c);\n if (validate(cand).valid) return compact(cand);\n }\n }\n};\n\n/** Irish VAT Number. */\nconst vat: Validator = {\n name: \"Irish VAT Number\",\n localName: \"Value Added Tax Number\",\n abbreviation: \"VAT\",\n aliases: [\"VAT number IE\"] as const,\n candidatePattern: \"IE\\\\d[A-Z+*]\\\\d{5}[A-Z]\",\n country: \"IE\",\n entityType: \"any\",\n sourceUrl: \"https://www.revenue.ie/\",\n examples: [\"6433435F\", \"8D79739I\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,WAAW;AAEjB,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,OAAO;AAC5B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,KAAI,EAAE,MAAM,EAAE;AAEhB,QAAO,EAAE,aAAa;;AAGxB,MAAM,YAAY,MAAuB;CAGvC,MAAM,WAAW,EAAE,WAAW,IAAI,EAAE,OAAO,EAAE,GAAG;CAChD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,SAAQ,IAAI,KAAK,OAAO,EAAE,OAAO,EAAE,CAAC;AAEtC,QAAO,IAAI,SAAS,QAAQ,SAAS;CACrC,MAAM,WAAW,SAAS,OAAO,MAAM,GAAG;AAC1C,QAAO,EAAE,OAAO,EAAE,KAAK;;AAGzB,MAAM,YAAY,MAAuB;CAKvC,MAAM,aAAa,IAAI,EAAE,MAAM,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE;CAClD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,SAAQ,IAAI,KAAK,OAAO,WAAW,OAAO,EAAE,CAAC;CAE/C,MAAM,WAAW,SAAS,OAAO,MAAM,GAAG;AAC1C,QAAO,EAAE,OAAO,EAAE,KAAK;;AAGzB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EACjC,QAAO,IACL,kBACA,6CACD;AAIH,KACE,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,IACvB,UAAU,KAAK,EAAE,OAAO,EAAE,CAAC,EAC3B;AACA,MAAI,EAAE,WAAW,KAAK,CAAC,YAAY,KAAK,EAAE,OAAO,EAAE,CAAC,CAClD,QAAO,IACL,kBACA,gDACD;AAEH,MAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,oBACA,yCACD;AAEH,SAAO;GAAE,OAAO;GAAM,SAAS;GAAG;;AAIpC,KACE,EAAE,WAAW,KACb,OAAO,KAAK,EAAE,OAAO,EAAE,CAAC,IACxB,YAAY,KAAK,EAAE,OAAO,EAAE,CAAC,IAC7B,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,IACvB,UAAU,KAAK,EAAE,OAAO,EAAE,CAAC,EAC3B;AACA,MAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,oBACA,yCACD;AAEH,SAAO;GAAE,OAAO;GAAM,SAAS;GAAG;;AAGpC,QAAO,IACL,kBACA,sCACD;;AAGH,MAAM,UAAU,UACd,KAAK,QAAQ,MAAM;;AAGrB,MAAM,iBAAyB;AAC7B,SACE,MAAK,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK;EAC7B,MAAM,OAAO,aAAa,EAAE,GAAG,OAAO,aAAa,EAAE;AACrD,MAAI,SAAS,KAAK,CAAC,MAAO,QAAO,QAAQ,KAAK;;;;AAMpD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,gBAAgB;CAC1B,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,YAAY,WAAW;CAClC;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"vat.js","names":[],"sources":["../../src/ie/vat.ts"],"sourcesContent":["/**\n * VAT (Irish VAT number).\n *\n * 8-9 characters, complex format with old and new\n * styles.\n *\n * @see https://www.vatify.eu/ireland-vat-number.html\n * @see https://www.revenue.ie/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst ALPHABET = \"WABCDEFGHIJKLMNOPQRSTUV\";\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"IE\") || v.startsWith(\"ie\")) {\n v = v.slice(2);\n }\n return v.toUpperCase();\n};\n\nconst checkNew = (v: string): boolean => {\n // New format: 7 digits + check letter + optional\n // trailing letter (W or A-Z)\n const trailing = v.length === 9 ? v.charAt(8) : \"W\";\n let sum = 0;\n for (let i = 0; i < 7; i++) {\n sum += (8 - i) * Number(v.charAt(i));\n }\n sum += 9 * ALPHABET.indexOf(trailing);\n const expected = ALPHABET.charAt(sum % 23);\n return v.charAt(7) === expected;\n};\n\nconst checkOld = (v: string): boolean => {\n // Old format: digit + letter + 5 digits +\n // check letter (8 chars total).\n // Rearrange to 7-digit new-style layout:\n // 0 + d[2..6] + d[0]\n const rearranged = `0${v.slice(2, 7)}${v.charAt(0)}`;\n let sum = 0;\n for (let i = 0; i < 7; i++) {\n sum += (8 - i) * Number(rearranged.charAt(i));\n }\n const expected = ALPHABET.charAt(sum % 23);\n return v.charAt(7) === expected;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 8 && v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Irish VAT number must be 8 or 9 characters\",\n );\n }\n\n // New format: 7 digits + letter [+ letter]\n if (\n isdigits(v.slice(0, 7)) &&\n /^[A-Z]$/.test(v.charAt(7))\n ) {\n if (v.length === 9 && !/^[A-Z+*]$/.test(v.charAt(8))) {\n return err(\n \"INVALID_FORMAT\",\n \"Irish VAT trailing character must be a letter\",\n );\n }\n if (!checkNew(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Irish VAT number check letter mismatch\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // Old format: digit + letter + 5 digits + letter\n if (\n v.length === 8 &&\n /^\\d$/.test(v.charAt(0)) &&\n /^[A-Z+*]$/.test(v.charAt(1)) &&\n isdigits(v.slice(2, 7)) &&\n /^[A-Z]$/.test(v.charAt(7))\n ) {\n if (!checkOld(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Irish VAT number check letter mismatch\",\n );\n }\n return { valid: true, compact: v };\n }\n\n return err(\n \"INVALID_FORMAT\",\n \"Irish VAT number has invalid format\",\n );\n};\n\nconst format = (value: string): string =>\n `IE${compact(value)}`;\n\n/** Generate a random valid Irish VAT number. */\nconst generate = (): string => {\n for (;;) {\n for (let c = 65; c <= 90; c++) {\n const cand = randomDigits(7) + String.fromCharCode(c);\n if (validate(cand).valid) return compact(cand);\n }\n }\n};\n\n/** Irish VAT Number. */\nconst vat: CountryValidator<\"IE\"> = {\n name: \"Irish VAT Number\",\n localName: \"Value Added Tax Number\",\n abbreviation: \"VAT\",\n aliases: [\"VAT number IE\"] as const,\n candidatePattern: \"IE\\\\d[A-Z+*]\\\\d{5}[A-Z]\",\n scope: \"country\",\n country: \"IE\",\n entityType: \"any\",\n sourceUrl: \"https://www.revenue.ie/\",\n examples: [\"6433435F\", \"8D79739I\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAoBA,MAAM,WAAW;AAEjB,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,MAAM;CAC3B,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO,EAAE,YAAY;AACvB;AAEA,MAAM,YAAY,MAAuB;CAGvC,MAAM,WAAW,EAAE,WAAW,IAAI,EAAE,OAAO,CAAC,IAAI;CAChD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,QAAQ,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC,CAAC;CAErC,OAAO,IAAI,SAAS,QAAQ,QAAQ;CACpC,MAAM,WAAW,SAAS,OAAO,MAAM,EAAE;CACzC,OAAO,EAAE,OAAO,CAAC,MAAM;AACzB;AAEA,MAAM,YAAY,MAAuB;CAKvC,MAAM,aAAa,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;CACjD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,QAAQ,IAAI,KAAK,OAAO,WAAW,OAAO,CAAC,CAAC;CAE9C,MAAM,WAAW,SAAS,OAAO,MAAM,EAAE;CACzC,OAAO,EAAE,OAAO,CAAC,MAAM;AACzB;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,OAAO,IACL,kBACA,4CACF;CAIF,IACE,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,KACtB,UAAU,KAAK,EAAE,OAAO,CAAC,CAAC,GAC1B;EACA,IAAI,EAAE,WAAW,KAAK,CAAC,YAAY,KAAK,EAAE,OAAO,CAAC,CAAC,GACjD,OAAO,IACL,kBACA,+CACF;EAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,oBACA,wCACF;EAEF,OAAO;GAAE,OAAO;GAAM,SAAS;EAAE;CACnC;CAGA,IACE,EAAE,WAAW,KACb,OAAO,KAAK,EAAE,OAAO,CAAC,CAAC,KACvB,YAAY,KAAK,EAAE,OAAO,CAAC,CAAC,KAC5B,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,KACtB,UAAU,KAAK,EAAE,OAAO,CAAC,CAAC,GAC1B;EACA,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,oBACA,wCACF;EAEF,OAAO;GAAE,OAAO;GAAM,SAAS;EAAE;CACnC;CAEA,OAAO,IACL,kBACA,qCACF;AACF;AAEA,MAAM,UAAU,UACd,KAAK,QAAQ,KAAK;;AAGpB,MAAM,iBAAyB;CAC7B,SACE,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK;EAC7B,MAAM,OAAO,aAAa,CAAC,IAAI,OAAO,aAAa,CAAC;EACpD,IAAI,SAAS,IAAI,EAAE,OAAO,OAAO,QAAQ,IAAI;CAC/C;AAEJ;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,eAAe;CACzB,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,YAAY,UAAU;CACjC;CACA;CACA;CACA;AACF"}
package/dist/il/idnr.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/il/idnr.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;
8
7
  /** Generate a random valid Israeli ID number. */
9
8
  declare const generate: () => string;
10
9
  /** Israeli Identity Number (Mispar Zehut). */
11
- declare const idnr: Validator;
10
+ declare const idnr: CountryValidator<"IL">;
12
11
  //#endregion
13
12
  export { compact, idnr as default, format, generate, validate };
14
13
  //# sourceMappingURL=idnr.d.ts.map
package/dist/il/idnr.js CHANGED
@@ -1,17 +1,9 @@
1
+ import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits } 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/il/idnr.ts
7
- /**
8
- * Identity Number (Mispar Zehut, מספר זהות).
9
- *
10
- * Israeli personal identity number. 9 digits
11
- * (zero-padded) with a Luhn checksum.
12
- *
13
- * @see https://en.wikipedia.org/wiki/Israeli_identity_card
14
- */
15
7
  const compact = (value) => clean(value, " -").padStart(9, "0");
16
8
  const validate = (value) => {
17
9
  const v = compact(value);
@@ -44,6 +36,7 @@ const idnr = {
44
36
  "ID number"
45
37
  ],
46
38
  candidatePattern: "\\d{9}",
39
+ scope: "country",
47
40
  country: "IL",
48
41
  entityType: "person",
49
42
  compact,
@@ -1 +1 @@
1
- {"version":3,"file":"idnr.js","names":[],"sources":["../../src/il/idnr.ts"],"sourcesContent":["/**\n * Identity Number (Mispar Zehut, מספר זהות).\n *\n * Israeli personal identity number. 9 digits\n * (zero-padded) with a Luhn checksum.\n *\n * @see https://en.wikipedia.org/wiki/Israeli_identity_card\n */\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } 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, \" -\").padStart(9, \"0\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length > 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Israeli ID must be at most 9 digits\",\n );\n }\n if (!isdigits(v) || Number(v) === 0) {\n return err(\n \"INVALID_FORMAT\",\n \"Israeli ID must contain only digits\" +\n \" and not be zero\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Israeli ID Luhn check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, -1)}-${v.slice(-1)}`;\n};\n\n/** Generate a random valid Israeli ID number. */\nconst generate = (): string => {\n const payload = randomDigits(8);\n const cs = luhnChecksum(payload + \"0\");\n return payload + String((10 - cs) % 10);\n};\n\n/** Israeli Identity Number (Mispar Zehut). */\nconst idnr: Validator = {\n name: \"Israeli Identity Number\",\n localName: \"מספר זהות\",\n abbreviation: \"ת.ז.\",\n aliases: [\n \"תעודת זהות\",\n \"Teudat Zehut\",\n \"ID number\",\n ] as const,\n candidatePattern: \"\\\\d{9}\",\n country: \"IL\",\n entityType: \"person\",\n compact,\n format,\n validate,\n description:\n \"Israeli personal identification number\" +\n \" (Mispar Zehut)\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/Israeli_identity_card\",\n lengths: [9] as const,\n examples: [\"039337423\", \"000000018\"] as const,\n generate,\n};\n\nexport default idnr;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;AAoBA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,CAAC,SAAS,GAAG,IAAI;AAErC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,SAAS,EACb,QAAO,IACL,kBACA,sCACD;AAEH,KAAI,CAAC,SAAS,EAAE,IAAI,OAAO,EAAE,KAAK,EAChC,QAAO,IACL,kBACA,sDAED;AAEH,KAAI,CAAC,aAAa,EAAE,CAClB,QAAO,IACL,oBACA,uCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG;;;AAIzC,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,EAAE;CAC/B,MAAM,KAAK,aAAa,UAAU,IAAI;AACtC,QAAO,UAAU,QAAQ,KAAK,MAAM,GAAG;;;AAIzC,MAAM,OAAkB;CACtB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,aACE;CAEF,WACE;CACF,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,aAAa,YAAY;CACpC;CACD"}
1
+ {"version":3,"file":"idnr.js","names":[],"sources":["../../src/il/idnr.ts"],"sourcesContent":["/**\n * Identity Number (Mispar Zehut, מספר זהות).\n *\n * Israeli personal identity number. 9 digits\n * (zero-padded) with a Luhn checksum.\n *\n * @see https://en.wikipedia.org/wiki/Israeli_identity_card\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\").padStart(9, \"0\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length > 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Israeli ID must be at most 9 digits\",\n );\n }\n if (!isdigits(v) || Number(v) === 0) {\n return err(\n \"INVALID_FORMAT\",\n \"Israeli ID must contain only digits\" +\n \" and not be zero\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Israeli ID Luhn check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, -1)}-${v.slice(-1)}`;\n};\n\n/** Generate a random valid Israeli ID number. */\nconst generate = (): string => {\n const payload = randomDigits(8);\n const cs = luhnChecksum(payload + \"0\");\n return payload + String((10 - cs) % 10);\n};\n\n/** Israeli Identity Number (Mispar Zehut). */\nconst idnr: CountryValidator<\"IL\"> = {\n name: \"Israeli Identity Number\",\n localName: \"מספר זהות\",\n abbreviation: \"ת.ז.\",\n aliases: [\n \"תעודת זהות\",\n \"Teudat Zehut\",\n \"ID number\",\n ] as const,\n candidatePattern: \"\\\\d{9}\",\n scope: \"country\",\n country: \"IL\",\n entityType: \"person\",\n compact,\n format,\n validate,\n description:\n \"Israeli personal identification number\" +\n \" (Mispar Zehut)\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/Israeli_identity_card\",\n lengths: [9] as const,\n examples: [\"039337423\", \"000000018\"] as const,\n generate,\n};\n\nexport default idnr;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAuBA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG;AAEpC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,SAAS,GACb,OAAO,IACL,kBACA,qCACF;CAEF,IAAI,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,MAAM,GAChC,OAAO,IACL,kBACA,qDAEF;CAEF,IAAI,CAAC,aAAa,CAAC,GACjB,OAAO,IACL,oBACA,sCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;AACxC;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,CAAC;CAC9B,MAAM,KAAK,aAAa,UAAU,GAAG;CACrC,OAAO,UAAU,QAAQ,KAAK,MAAM,EAAE;AACxC;;AAGA,MAAM,OAA+B;CACnC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,aACE;CAEF,WACE;CACF,SAAS,CAAC,CAAC;CACX,UAAU,CAAC,aAAa,WAAW;CACnC;AACF"}
package/dist/il/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import idnr from "./idnr.js";
3
2
 
4
3
  //#region src/il/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { idnr };
6
+ }
6
7
  //#endregion
7
8
  export { idnr, mod_d_exports };
8
9
  //# sourceMappingURL=mod.d.ts.map
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/in/aadhaar.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;
8
7
  /** Generate a random valid Aadhaar number. */
9
8
  declare const generate: () => string;
10
9
  /** Indian Unique Identity Number. */
11
- declare const aadhaar: Validator;
10
+ declare const aadhaar: CountryValidator<"IN">;
12
11
  //#endregion
13
12
  export { compact, aadhaar as default, format, generate, validate };
14
13
  //# sourceMappingURL=aadhaar.d.ts.map
@@ -1,20 +1,9 @@
1
+ import { verhoeffCheckDigit, verhoeffValidate } from "../_checksums/verhoeff.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
5
  import { isdigits } from "../_util/strings.js";
5
- import { verhoeffCheckDigit, verhoeffValidate } from "../_checksums/verhoeff.js";
6
6
  //#region src/in/aadhaar.ts
7
- /**
8
- * Aadhaar (Indian unique identity number).
9
- *
10
- * 12 digits with Verhoeff checksum (last digit).
11
- * Cannot start with 0 or 1.
12
- * Issued by the Unique Identification Authority
13
- * of India (UIDAI).
14
- *
15
- * @see https://en.wikipedia.org/wiki/Aadhaar
16
- * @see https://uidai.gov.in/
17
- */
18
7
  const compact = (value) => clean(value, " -");
19
8
  const validate = (value) => {
20
9
  const v = compact(value);
@@ -44,6 +33,7 @@ const aadhaar = {
44
33
  abbreviation: "Aadhaar",
45
34
  aliases: ["Aadhaar", "आधार"],
46
35
  candidatePattern: "\\d{4}\\s?\\d{4}\\s?\\d{4}",
36
+ scope: "country",
47
37
  country: "IN",
48
38
  entityType: "person",
49
39
  lengths: [12],
@@ -1 +1 @@
1
- {"version":3,"file":"aadhaar.js","names":[],"sources":["../../src/in/aadhaar.ts"],"sourcesContent":["/**\n * Aadhaar (Indian unique identity number).\n *\n * 12 digits with Verhoeff checksum (last digit).\n * Cannot start with 0 or 1.\n * Issued by the Unique Identification Authority\n * of India (UIDAI).\n *\n * @see https://en.wikipedia.org/wiki/Aadhaar\n * @see https://uidai.gov.in/\n */\n\nimport {\n verhoeffValidate,\n verhoeffCheckDigit,\n} from \"#checksums/verhoeff\";\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 !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"Aadhaar must be 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Aadhaar must contain only digits\",\n );\n }\n if (v[0] === \"0\" || v[0] === \"1\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Aadhaar cannot start with 0 or 1\",\n );\n }\n // Aadhaar cannot be a palindrome\n if (v === v.split(\"\").reverse().join(\"\")) {\n return err(\n \"INVALID_FORMAT\",\n \"Aadhaar cannot be a palindrome\",\n );\n }\n if (!verhoeffValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Aadhaar check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 4)} ${v.slice(4, 8)} ${v.slice(8)}`;\n};\n\n/** Generate a random valid Aadhaar number. */\nconst generate = (): string => {\n const first = String(randomInt(2, 9));\n const payload = first + randomDigits(10);\n return payload + String(verhoeffCheckDigit(payload));\n};\n\n/** Indian Unique Identity Number. */\nconst aadhaar: Validator = {\n name: \"Indian Unique Identity Number\",\n localName: \"Aadhaar\",\n abbreviation: \"Aadhaar\",\n aliases: [\"Aadhaar\", \"आधार\"] as const,\n candidatePattern: \"\\\\d{4}\\\\s?\\\\d{4}\\\\s?\\\\d{4}\",\n country: \"IN\",\n entityType: \"person\",\n lengths: [12],\n examples: [\"234123412346\", \"295274982189\"],\n description:\n \"12-digit unique identity number issued by UIDAI\",\n sourceUrl: \"https://uidai.gov.in/\",\n compact,\n format,\n validate,\n generate,\n};\n\nexport default aadhaar;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;AAuBA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,4BACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,mCACD;AAEH,KAAI,EAAE,OAAO,OAAO,EAAE,OAAO,IAC3B,QAAO,IACL,qBACA,mCACD;AAGH,KAAI,MAAM,EAAE,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CACtC,QAAO,IACL,kBACA,iCACD;AAEH,KAAI,CAAC,iBAAiB,EAAE,CACtB,QAAO,IACL,oBACA,+BACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;;;AAIxD,MAAM,iBAAyB;CAE7B,MAAM,UADQ,OAAO,UAAU,GAAG,EAAE,CAAC,GACb,aAAa,GAAG;AACxC,QAAO,UAAU,OAAO,mBAAmB,QAAQ,CAAC;;;AAItD,MAAM,UAAqB;CACzB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,WAAW,OAAO;CAC5B,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,gBAAgB,eAAe;CAC1C,aACE;CACF,WAAW;CACX;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"aadhaar.js","names":[],"sources":["../../src/in/aadhaar.ts"],"sourcesContent":["/**\n * Aadhaar (Indian unique identity number).\n *\n * 12 digits with Verhoeff checksum (last digit).\n * Cannot start with 0 or 1.\n * Issued by the Unique Identification Authority\n * of India (UIDAI).\n *\n * @see https://en.wikipedia.org/wiki/Aadhaar\n * @see https://uidai.gov.in/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n verhoeffValidate,\n verhoeffCheckDigit,\n} from \"#checksums/verhoeff\";\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 !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"Aadhaar must be 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Aadhaar must contain only digits\",\n );\n }\n if (v[0] === \"0\" || v[0] === \"1\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Aadhaar cannot start with 0 or 1\",\n );\n }\n // Aadhaar cannot be a palindrome\n if (v === v.split(\"\").reverse().join(\"\")) {\n return err(\n \"INVALID_FORMAT\",\n \"Aadhaar cannot be a palindrome\",\n );\n }\n if (!verhoeffValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Aadhaar check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 4)} ${v.slice(4, 8)} ${v.slice(8)}`;\n};\n\n/** Generate a random valid Aadhaar number. */\nconst generate = (): string => {\n const first = String(randomInt(2, 9));\n const payload = first + randomDigits(10);\n return payload + String(verhoeffCheckDigit(payload));\n};\n\n/** Indian Unique Identity Number. */\nconst aadhaar: CountryValidator<\"IN\"> = {\n name: \"Indian Unique Identity Number\",\n localName: \"Aadhaar\",\n abbreviation: \"Aadhaar\",\n aliases: [\"Aadhaar\", \"आधार\"] as const,\n candidatePattern: \"\\\\d{4}\\\\s?\\\\d{4}\\\\s?\\\\d{4}\",\n scope: \"country\",\n country: \"IN\",\n entityType: \"person\",\n lengths: [12],\n examples: [\"234123412346\", \"295274982189\"],\n description:\n \"12-digit unique identity number issued by UIDAI\",\n sourceUrl: \"https://uidai.gov.in/\",\n compact,\n format,\n validate,\n generate,\n};\n\nexport default aadhaar;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AA0BA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,2BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,kCACF;CAEF,IAAI,EAAE,OAAO,OAAO,EAAE,OAAO,KAC3B,OAAO,IACL,qBACA,kCACF;CAGF,IAAI,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GACrC,OAAO,IACL,kBACA,gCACF;CAEF,IAAI,CAAC,iBAAiB,CAAC,GACrB,OAAO,IACL,oBACA,8BACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;AACvD;;AAGA,MAAM,iBAAyB;CAE7B,MAAM,UADQ,OAAO,UAAU,GAAG,CAAC,CACf,IAAI,aAAa,EAAE;CACvC,OAAO,UAAU,OAAO,mBAAmB,OAAO,CAAC;AACrD;;AAGA,MAAM,UAAkC;CACtC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,WAAW,MAAM;CAC3B,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,gBAAgB,cAAc;CACzC,aACE;CACF,WAAW;CACX;CACA;CACA;CACA;AACF"}
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/in/gstin.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;
8
7
  /** Generate a random valid GSTIN. */
9
8
  declare const generate: () => string;
10
9
  /** Indian Goods and Services Tax ID. */
11
- declare const gstin: Validator;
10
+ declare const gstin: CountryValidator<"IN">;
12
11
  //#endregion
13
12
  export { compact, gstin as default, format, generate, validate };
14
13
  //# sourceMappingURL=gstin.d.ts.map