@stll/stdnum 1.0.0 → 2.0.1

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 (705) hide show
  1. package/README.md +1 -4
  2. package/dist/_checksums/luhn.js.map +1 -1
  3. package/dist/_checksums/mod1110.js +1 -1
  4. package/dist/_checksums/mod1110.js.map +1 -1
  5. package/dist/_checksums/mod112.js.map +1 -1
  6. package/dist/_checksums/mod97.js.map +1 -1
  7. package/dist/_checksums/verhoeff.js.map +1 -1
  8. package/dist/_checksums/weighted-sum.js.map +1 -1
  9. package/dist/_util/arabic.js.map +1 -1
  10. package/dist/_util/clean.js.map +1 -1
  11. package/dist/_util/date.js.map +1 -1
  12. package/dist/_util/generate.js.map +1 -1
  13. package/dist/_util/result.js.map +1 -1
  14. package/dist/_util/strings.js.map +1 -1
  15. package/dist/ad/nrt.d.ts +16 -2
  16. package/dist/ad/nrt.js +1 -14
  17. package/dist/ad/nrt.js.map +1 -1
  18. package/dist/ae/eid.d.ts +2 -2
  19. package/dist/ae/eid.js +2 -12
  20. package/dist/ae/eid.js.map +1 -1
  21. package/dist/ai/tin.d.ts +20 -2
  22. package/dist/ai/tin.js +1 -18
  23. package/dist/ai/tin.js.map +1 -1
  24. package/dist/al/nipt.d.ts +13 -2
  25. package/dist/al/nipt.js +1 -11
  26. package/dist/al/nipt.js.map +1 -1
  27. package/dist/am/tin.d.ts +16 -2
  28. package/dist/am/tin.js +1 -14
  29. package/dist/am/tin.js.map +1 -1
  30. package/dist/ar/cbu.d.ts +2 -2
  31. package/dist/ar/cbu.js +1 -9
  32. package/dist/ar/cbu.js.map +1 -1
  33. package/dist/ar/cuit.d.ts +2 -2
  34. package/dist/ar/cuit.js +1 -17
  35. package/dist/ar/cuit.js.map +1 -1
  36. package/dist/ar/dni.d.ts +11 -2
  37. package/dist/ar/dni.js +1 -9
  38. package/dist/ar/dni.js.map +1 -1
  39. package/dist/at/businessid.d.ts +10 -2
  40. package/dist/at/businessid.js +1 -8
  41. package/dist/at/businessid.js.map +1 -1
  42. package/dist/at/tin.d.ts +2 -2
  43. package/dist/at/tin.js +1 -11
  44. package/dist/at/tin.js.map +1 -1
  45. package/dist/at/uid.d.ts +2 -2
  46. package/dist/at/uid.js +2 -10
  47. package/dist/at/uid.js.map +1 -1
  48. package/dist/at/vnr.d.ts +2 -2
  49. package/dist/at/vnr.js +4 -14
  50. package/dist/at/vnr.js.map +1 -1
  51. package/dist/au/abn.d.ts +2 -2
  52. package/dist/au/abn.js +1 -10
  53. package/dist/au/abn.js.map +1 -1
  54. package/dist/au/acn.d.ts +2 -2
  55. package/dist/au/acn.js +1 -10
  56. package/dist/au/acn.js.map +1 -1
  57. package/dist/au/tfn.d.ts +2 -2
  58. package/dist/au/tfn.js +1 -10
  59. package/dist/au/tfn.js.map +1 -1
  60. package/dist/az/voen.d.ts +2 -2
  61. package/dist/az/voen.js +1 -14
  62. package/dist/az/voen.js.map +1 -1
  63. package/dist/ba/jmbg.d.ts +2 -2
  64. package/dist/ba/jmbg.js +3 -11
  65. package/dist/ba/jmbg.js.map +1 -1
  66. package/dist/bd/nid.d.ts +23 -2
  67. package/dist/bd/nid.js +1 -21
  68. package/dist/bd/nid.js.map +1 -1
  69. package/dist/be/bis.d.ts +2 -2
  70. package/dist/be/bis.js +1 -11
  71. package/dist/be/bis.js.map +1 -1
  72. package/dist/be/nn.d.ts +2 -2
  73. package/dist/be/nn.js +1 -11
  74. package/dist/be/nn.js.map +1 -1
  75. package/dist/be/vat.d.ts +2 -2
  76. package/dist/be/vat.js +1 -9
  77. package/dist/be/vat.js.map +1 -1
  78. package/dist/bg/egn.d.ts +2 -2
  79. package/dist/bg/egn.js +3 -18
  80. package/dist/bg/egn.js.map +1 -1
  81. package/dist/bg/pnf.d.ts +2 -2
  82. package/dist/bg/pnf.js +1 -8
  83. package/dist/bg/pnf.js.map +1 -1
  84. package/dist/bg/vat.d.ts +2 -2
  85. package/dist/bg/vat.js +3 -9
  86. package/dist/bg/vat.js.map +1 -1
  87. package/dist/bh/cpr.d.ts +2 -2
  88. package/dist/bh/cpr.js +1 -17
  89. package/dist/bh/cpr.js.map +1 -1
  90. package/dist/bic.d.ts +13 -2
  91. package/dist/bic.js +1 -11
  92. package/dist/bic.js.map +1 -1
  93. package/dist/br/cnpj.d.ts +2 -2
  94. package/dist/br/cnpj.js +1 -20
  95. package/dist/br/cnpj.js.map +1 -1
  96. package/dist/br/cpf.d.ts +2 -2
  97. package/dist/br/cpf.js +1 -14
  98. package/dist/br/cpf.js.map +1 -1
  99. package/dist/by/unp.d.ts +2 -2
  100. package/dist/by/unp.js +3 -14
  101. package/dist/by/unp.js.map +1 -1
  102. package/dist/bz/tin.d.ts +2 -2
  103. package/dist/bz/tin.js +1 -26
  104. package/dist/bz/tin.js.map +1 -1
  105. package/dist/ca/bn.d.ts +2 -2
  106. package/dist/ca/bn.js +2 -10
  107. package/dist/ca/bn.js.map +1 -1
  108. package/dist/ca/sin.d.ts +2 -2
  109. package/dist/ca/sin.js +2 -10
  110. package/dist/ca/sin.js.map +1 -1
  111. package/dist/ch/ssn.d.ts +2 -2
  112. package/dist/ch/ssn.js +1 -9
  113. package/dist/ch/ssn.js.map +1 -1
  114. package/dist/ch/uid.d.ts +2 -2
  115. package/dist/ch/uid.js +1 -9
  116. package/dist/ch/uid.js.map +1 -1
  117. package/dist/ch/vat.d.ts +2 -2
  118. package/dist/ch/vat.js +1 -9
  119. package/dist/ch/vat.js.map +1 -1
  120. package/dist/cl/rut.d.ts +2 -2
  121. package/dist/cl/rut.js +1 -14
  122. package/dist/cl/rut.js.map +1 -1
  123. package/dist/cn/ric.d.ts +2 -2
  124. package/dist/cn/ric.js +3 -14
  125. package/dist/cn/ric.js.map +1 -1
  126. package/dist/cn/uscc.d.ts +2 -2
  127. package/dist/cn/uscc.js +1 -10
  128. package/dist/cn/uscc.js.map +1 -1
  129. package/dist/co/nit.d.ts +2 -2
  130. package/dist/co/nit.js +2 -12
  131. package/dist/co/nit.js.map +1 -1
  132. package/dist/cr/cpf.d.ts +18 -2
  133. package/dist/cr/cpf.js +1 -16
  134. package/dist/cr/cpf.js.map +1 -1
  135. package/dist/creditcard.d.ts +2 -2
  136. package/dist/creditcard.js +5 -14
  137. package/dist/creditcard.js.map +1 -1
  138. package/dist/cu/ni.d.ts +2 -2
  139. package/dist/cu/ni.js +2 -17
  140. package/dist/cu/ni.js.map +1 -1
  141. package/dist/cy/vat.d.ts +2 -2
  142. package/dist/cy/vat.js +1 -8
  143. package/dist/cy/vat.js.map +1 -1
  144. package/dist/cz/dic.d.ts +2 -2
  145. package/dist/cz/dic.js +7 -13
  146. package/dist/cz/dic.js.map +1 -1
  147. package/dist/cz/ico.d.ts +2 -2
  148. package/dist/cz/ico.js +2 -10
  149. package/dist/cz/ico.js.map +1 -1
  150. package/dist/cz/rc.d.ts +2 -2
  151. package/dist/cz/rc.js +2 -26
  152. package/dist/cz/rc.js.map +1 -1
  153. package/dist/de/handelsreg.d.ts +19 -2
  154. package/dist/de/handelsreg.js +1 -17
  155. package/dist/de/handelsreg.js.map +1 -1
  156. package/dist/de/idnr.d.ts +2 -2
  157. package/dist/de/idnr.js +2 -12
  158. package/dist/de/idnr.js.map +1 -1
  159. package/dist/de/stnr.d.ts +17 -2
  160. package/dist/de/stnr.js +1 -15
  161. package/dist/de/stnr.js.map +1 -1
  162. package/dist/de/svnr.d.ts +2 -2
  163. package/dist/de/svnr.js +2 -11
  164. package/dist/de/svnr.js.map +1 -1
  165. package/dist/de/vat.d.ts +2 -2
  166. package/dist/de/vat.js +2 -11
  167. package/dist/de/vat.js.map +1 -1
  168. package/dist/dk/cpr.d.ts +2 -2
  169. package/dist/dk/cpr.js +2 -10
  170. package/dist/dk/cpr.js.map +1 -1
  171. package/dist/dk/cvr.d.ts +2 -2
  172. package/dist/dk/cvr.js +2 -15
  173. package/dist/dk/cvr.js.map +1 -1
  174. package/dist/dk/vat.d.ts +2 -2
  175. package/dist/dk/vat.js +3 -13
  176. package/dist/dk/vat.js.map +1 -1
  177. package/dist/do/rnc.d.ts +2 -2
  178. package/dist/do/rnc.js +2 -16
  179. package/dist/do/rnc.js.map +1 -1
  180. package/dist/ec/ruc.d.ts +2 -2
  181. package/dist/ec/ruc.js +1 -18
  182. package/dist/ec/ruc.js.map +1 -1
  183. package/dist/ee/ik.d.ts +2 -2
  184. package/dist/ee/ik.js +3 -20
  185. package/dist/ee/ik.js.map +1 -1
  186. package/dist/ee/registrikood.d.ts +2 -2
  187. package/dist/ee/registrikood.js +1 -8
  188. package/dist/ee/registrikood.js.map +1 -1
  189. package/dist/ee/vat.d.ts +2 -2
  190. package/dist/ee/vat.js +2 -10
  191. package/dist/ee/vat.js.map +1 -1
  192. package/dist/eg/tn.d.ts +11 -2
  193. package/dist/eg/tn.js +1 -9
  194. package/dist/eg/tn.js.map +1 -1
  195. package/dist/es/cif.d.ts +2 -2
  196. package/dist/es/cif.js +1 -10
  197. package/dist/es/cif.js.map +1 -1
  198. package/dist/es/dni.d.ts +2 -2
  199. package/dist/es/dni.js +1 -9
  200. package/dist/es/dni.js.map +1 -1
  201. package/dist/es/nie.d.ts +2 -2
  202. package/dist/es/nie.js +1 -9
  203. package/dist/es/nie.js.map +1 -1
  204. package/dist/es/nss.d.ts +2 -2
  205. package/dist/es/nss.js +1 -16
  206. package/dist/es/nss.js.map +1 -1
  207. package/dist/es/vat.d.ts +2 -2
  208. package/dist/es/vat.js +5 -10
  209. package/dist/es/vat.js.map +1 -1
  210. package/dist/eu/vat.d.ts +2 -2
  211. package/dist/eu/vat.js +1 -0
  212. package/dist/eu/vat.js.map +1 -1
  213. package/dist/fi/hetu.d.ts +2 -2
  214. package/dist/fi/hetu.js +2 -10
  215. package/dist/fi/hetu.js.map +1 -1
  216. package/dist/fi/vat.d.ts +2 -2
  217. package/dist/fi/vat.js +3 -10
  218. package/dist/fi/vat.js.map +1 -1
  219. package/dist/fi/ytunnus.d.ts +2 -2
  220. package/dist/fi/ytunnus.js +2 -10
  221. package/dist/fi/ytunnus.js.map +1 -1
  222. package/dist/fr/nif.d.ts +2 -2
  223. package/dist/fr/nif.js +1 -9
  224. package/dist/fr/nif.js.map +1 -1
  225. package/dist/fr/nir.d.ts +2 -2
  226. package/dist/fr/nir.js +2 -14
  227. package/dist/fr/nir.js.map +1 -1
  228. package/dist/fr/siren.d.ts +2 -2
  229. package/dist/fr/siren.js +2 -10
  230. package/dist/fr/siren.js.map +1 -1
  231. package/dist/fr/siret.d.ts +2 -2
  232. package/dist/fr/siret.js +2 -11
  233. package/dist/fr/siret.js.map +1 -1
  234. package/dist/fr/tva.d.ts +2 -2
  235. package/dist/fr/tva.js +2 -12
  236. package/dist/fr/tva.js.map +1 -1
  237. package/dist/gb/nino.d.ts +12 -2
  238. package/dist/gb/nino.js +1 -10
  239. package/dist/gb/nino.js.map +1 -1
  240. package/dist/gb/sedol.d.ts +2 -2
  241. package/dist/gb/sedol.js +1 -11
  242. package/dist/gb/sedol.js.map +1 -1
  243. package/dist/gb/utr.d.ts +2 -2
  244. package/dist/gb/utr.js +2 -10
  245. package/dist/gb/utr.js.map +1 -1
  246. package/dist/gb/vat.d.ts +2 -2
  247. package/dist/gb/vat.js +2 -11
  248. package/dist/gb/vat.js.map +1 -1
  249. package/dist/ge/pin.d.ts +14 -2
  250. package/dist/ge/pin.js +1 -12
  251. package/dist/ge/pin.js.map +1 -1
  252. package/dist/gh/tin.d.ts +2 -2
  253. package/dist/gh/tin.js +1 -15
  254. package/dist/gh/tin.js.map +1 -1
  255. package/dist/gr/amka.d.ts +2 -2
  256. package/dist/gr/amka.js +3 -11
  257. package/dist/gr/amka.js.map +1 -1
  258. package/dist/gr/vat.d.ts +2 -2
  259. package/dist/gr/vat.js +1 -10
  260. package/dist/gr/vat.js.map +1 -1
  261. package/dist/gt/nit.d.ts +2 -2
  262. package/dist/gt/nit.js +1 -12
  263. package/dist/gt/nit.js.map +1 -1
  264. package/dist/hk/hkid.d.ts +2 -2
  265. package/dist/hk/hkid.js +1 -10
  266. package/dist/hk/hkid.js.map +1 -1
  267. package/dist/hr/vat.d.ts +2 -2
  268. package/dist/hr/vat.js +2 -9
  269. package/dist/hr/vat.js.map +1 -1
  270. package/dist/hu/vat.d.ts +2 -2
  271. package/dist/hu/vat.js +3 -10
  272. package/dist/hu/vat.js.map +1 -1
  273. package/dist/iban.d.ts +2 -2
  274. package/dist/iban.js +2 -8
  275. package/dist/iban.js.map +1 -1
  276. package/dist/id/npwp.d.ts +2 -2
  277. package/dist/id/npwp.js +3 -13
  278. package/dist/id/npwp.js.map +1 -1
  279. package/dist/ie/pps.d.ts +2 -2
  280. package/dist/ie/pps.js +1 -10
  281. package/dist/ie/pps.js.map +1 -1
  282. package/dist/ie/vat.d.ts +2 -2
  283. package/dist/ie/vat.js +1 -9
  284. package/dist/ie/vat.js.map +1 -1
  285. package/dist/il/idnr.d.ts +2 -2
  286. package/dist/il/idnr.js +2 -9
  287. package/dist/il/idnr.js.map +1 -1
  288. package/dist/in/aadhaar.d.ts +2 -2
  289. package/dist/in/aadhaar.js +2 -12
  290. package/dist/in/aadhaar.js.map +1 -1
  291. package/dist/in/gstin.d.ts +2 -2
  292. package/dist/in/gstin.js +1 -10
  293. package/dist/in/gstin.js.map +1 -1
  294. package/dist/in/pan.d.ts +15 -2
  295. package/dist/in/pan.js +1 -13
  296. package/dist/in/pan.js.map +1 -1
  297. package/dist/index.d.ts +2 -2
  298. package/dist/index.js +6 -6
  299. package/dist/iq/nid.d.ts +16 -2
  300. package/dist/iq/nid.js +2 -15
  301. package/dist/iq/nid.js.map +1 -1
  302. package/dist/ir/nid.d.ts +2 -2
  303. package/dist/ir/nid.js +2 -24
  304. package/dist/ir/nid.js.map +1 -1
  305. package/dist/is/kennitala.d.ts +2 -2
  306. package/dist/is/kennitala.js +2 -13
  307. package/dist/is/kennitala.js.map +1 -1
  308. package/dist/is/vsk.d.ts +9 -2
  309. package/dist/is/vsk.js +1 -7
  310. package/dist/is/vsk.js.map +1 -1
  311. package/dist/isin.d.ts +2 -2
  312. package/dist/isin.js +2 -12
  313. package/dist/isin.js.map +1 -1
  314. package/dist/it/codicefiscale.d.ts +2 -2
  315. package/dist/it/codicefiscale.js +1 -21
  316. package/dist/it/codicefiscale.js.map +1 -1
  317. package/dist/it/iva.d.ts +2 -2
  318. package/dist/it/iva.js +2 -9
  319. package/dist/it/iva.js.map +1 -1
  320. package/dist/jp/cn.d.ts +2 -2
  321. package/dist/jp/cn.js +1 -9
  322. package/dist/jp/cn.js.map +1 -1
  323. package/dist/jp/mynumber.d.ts +2 -2
  324. package/dist/jp/mynumber.js +1 -10
  325. package/dist/jp/mynumber.js.map +1 -1
  326. package/dist/kr/brn.d.ts +11 -2
  327. package/dist/kr/brn.js +1 -9
  328. package/dist/kr/brn.js.map +1 -1
  329. package/dist/kr/rrn.d.ts +2 -2
  330. package/dist/kr/rrn.js +2 -11
  331. package/dist/kr/rrn.js.map +1 -1
  332. package/dist/kw/civil.d.ts +2 -2
  333. package/dist/kw/civil.js +2 -14
  334. package/dist/kw/civil.js.map +1 -1
  335. package/dist/kz/iin.d.ts +2 -2
  336. package/dist/kz/iin.js +3 -18
  337. package/dist/kz/iin.js.map +1 -1
  338. package/dist/lei.d.ts +2 -2
  339. package/dist/lei.js +2 -11
  340. package/dist/lei.js.map +1 -1
  341. package/dist/li/peid.d.ts +11 -2
  342. package/dist/li/peid.js +1 -9
  343. package/dist/li/peid.js.map +1 -1
  344. package/dist/lk/nic.d.ts +2 -2
  345. package/dist/lk/nic.js +2 -14
  346. package/dist/lk/nic.js.map +1 -1
  347. package/dist/lt/asmens.d.ts +2 -2
  348. package/dist/lt/asmens.js +2 -1
  349. package/dist/lt/asmens.js.map +1 -1
  350. package/dist/lt/vat.d.ts +2 -2
  351. package/dist/lt/vat.js +2 -10
  352. package/dist/lt/vat.js.map +1 -1
  353. package/dist/lu/vat.d.ts +2 -2
  354. package/dist/lu/vat.js +2 -8
  355. package/dist/lu/vat.js.map +1 -1
  356. package/dist/luhn.d.ts +2 -2
  357. package/dist/luhn.js +2 -9
  358. package/dist/luhn.js.map +1 -1
  359. package/dist/lv/vat.d.ts +2 -2
  360. package/dist/lv/vat.js +2 -28
  361. package/dist/lv/vat.js.map +1 -1
  362. package/dist/ma/ice.d.ts +2 -2
  363. package/dist/ma/ice.js +2 -11
  364. package/dist/ma/ice.js.map +1 -1
  365. package/dist/mc/tva.d.ts +2 -2
  366. package/dist/mc/tva.js +1 -0
  367. package/dist/mc/tva.js.map +1 -1
  368. package/dist/md/idno.d.ts +2 -2
  369. package/dist/md/idno.js +1 -10
  370. package/dist/md/idno.js.map +1 -1
  371. package/dist/me/pib.d.ts +2 -2
  372. package/dist/me/pib.js +2 -10
  373. package/dist/me/pib.js.map +1 -1
  374. package/dist/mk/edb.d.ts +2 -2
  375. package/dist/mk/edb.js +2 -11
  376. package/dist/mk/edb.js.map +1 -1
  377. package/dist/mt/vat.d.ts +2 -2
  378. package/dist/mt/vat.js +3 -10
  379. package/dist/mt/vat.js.map +1 -1
  380. package/dist/mu/brn.d.ts +23 -2
  381. package/dist/mu/brn.js +1 -21
  382. package/dist/mu/brn.js.map +1 -1
  383. package/dist/mx/clabe.d.ts +2 -2
  384. package/dist/mx/clabe.js +1 -14
  385. package/dist/mx/clabe.js.map +1 -1
  386. package/dist/mx/curp.d.ts +2 -2
  387. package/dist/mx/curp.js +3 -17
  388. package/dist/mx/curp.js.map +1 -1
  389. package/dist/mx/rfc.d.ts +2 -2
  390. package/dist/mx/rfc.js +3 -19
  391. package/dist/mx/rfc.js.map +1 -1
  392. package/dist/my/nric.d.ts +2 -2
  393. package/dist/my/nric.js +2 -14
  394. package/dist/my/nric.js.map +1 -1
  395. package/dist/ng/nin.d.ts +13 -2
  396. package/dist/ng/nin.js +1 -11
  397. package/dist/ng/nin.js.map +1 -1
  398. package/dist/ni/ruc.d.ts +2 -2
  399. package/dist/ni/ruc.js +1 -23
  400. package/dist/ni/ruc.js.map +1 -1
  401. package/dist/nl/bsn.d.ts +2 -2
  402. package/dist/nl/bsn.js +2 -10
  403. package/dist/nl/bsn.js.map +1 -1
  404. package/dist/nl/kvk.d.ts +9 -2
  405. package/dist/nl/kvk.js +1 -7
  406. package/dist/nl/kvk.js.map +1 -1
  407. package/dist/nl/vat.d.ts +2 -2
  408. package/dist/nl/vat.js +1 -13
  409. package/dist/nl/vat.js.map +1 -1
  410. package/dist/no/fodselsnummer.d.ts +2 -2
  411. package/dist/no/fodselsnummer.js +2 -10
  412. package/dist/no/fodselsnummer.js.map +1 -1
  413. package/dist/no/mva.d.ts +2 -2
  414. package/dist/no/mva.js +1 -8
  415. package/dist/no/mva.js.map +1 -1
  416. package/dist/no/orgnr.d.ts +2 -2
  417. package/dist/no/orgnr.js +2 -8
  418. package/dist/no/orgnr.js.map +1 -1
  419. package/dist/nz/ird.d.ts +2 -2
  420. package/dist/nz/ird.js +2 -11
  421. package/dist/nz/ird.js.map +1 -1
  422. package/dist/pa/ruc.d.ts +2 -2
  423. package/dist/pa/ruc.js +1 -18
  424. package/dist/pa/ruc.js.map +1 -1
  425. package/dist/patterns.d.ts +8 -7
  426. package/dist/patterns.js +3 -5
  427. package/dist/patterns.js.map +1 -1
  428. package/dist/pe/ruc.d.ts +2 -2
  429. package/dist/pe/ruc.js +1 -15
  430. package/dist/pe/ruc.js.map +1 -1
  431. package/dist/ph/philid.d.ts +14 -2
  432. package/dist/ph/philid.js +1 -12
  433. package/dist/ph/philid.js.map +1 -1
  434. package/dist/pk/cnic.d.ts +14 -2
  435. package/dist/pk/cnic.js +1 -12
  436. package/dist/pk/cnic.js.map +1 -1
  437. package/dist/pl/nip.d.ts +2 -2
  438. package/dist/pl/nip.js +2 -10
  439. package/dist/pl/nip.js.map +1 -1
  440. package/dist/pl/pesel.d.ts +2 -2
  441. package/dist/pl/pesel.js +3 -13
  442. package/dist/pl/pesel.js.map +1 -1
  443. package/dist/pl/regon.d.ts +2 -2
  444. package/dist/pl/regon.js +2 -11
  445. package/dist/pl/regon.js.map +1 -1
  446. package/dist/pt/cc.d.ts +2 -2
  447. package/dist/pt/cc.js +1 -9
  448. package/dist/pt/cc.js.map +1 -1
  449. package/dist/pt/vat.d.ts +2 -2
  450. package/dist/pt/vat.js +3 -11
  451. package/dist/pt/vat.js.map +1 -1
  452. package/dist/ro/cnp.d.ts +2 -2
  453. package/dist/ro/cnp.js +4 -14
  454. package/dist/ro/cnp.js.map +1 -1
  455. package/dist/ro/vat.d.ts +2 -2
  456. package/dist/ro/vat.js +13 -11
  457. package/dist/ro/vat.js.map +1 -1
  458. package/dist/rs/pib.d.ts +2 -2
  459. package/dist/rs/pib.js +1 -9
  460. package/dist/rs/pib.js.map +1 -1
  461. package/dist/ru/inn.d.ts +2 -2
  462. package/dist/ru/inn.js +1 -11
  463. package/dist/ru/inn.js.map +1 -1
  464. package/dist/se/orgnr.d.ts +2 -2
  465. package/dist/se/orgnr.js +2 -9
  466. package/dist/se/orgnr.js.map +1 -1
  467. package/dist/se/personnummer.d.ts +2 -2
  468. package/dist/se/personnummer.js +7 -15
  469. package/dist/se/personnummer.js.map +1 -1
  470. package/dist/se/vat.d.ts +2 -2
  471. package/dist/se/vat.js +3 -10
  472. package/dist/se/vat.js.map +1 -1
  473. package/dist/sg/uen.d.ts +2 -2
  474. package/dist/sg/uen.js +1 -15
  475. package/dist/sg/uen.js.map +1 -1
  476. package/dist/si/emso.d.ts +2 -2
  477. package/dist/si/emso.js +3 -18
  478. package/dist/si/emso.js.map +1 -1
  479. package/dist/si/vat.d.ts +2 -2
  480. package/dist/si/vat.js +3 -12
  481. package/dist/si/vat.js.map +1 -1
  482. package/dist/sk/dic.d.ts +2 -2
  483. package/dist/sk/dic.js +1 -0
  484. package/dist/sk/dic.js.map +1 -1
  485. package/dist/sk/ico.d.ts +2 -2
  486. package/dist/sk/ico.js +1 -0
  487. package/dist/sk/ico.js.map +1 -1
  488. package/dist/sk/rc.d.ts +2 -2
  489. package/dist/sk/rc.js +1 -0
  490. package/dist/sk/rc.js.map +1 -1
  491. package/dist/th/tin.d.ts +2 -2
  492. package/dist/th/tin.js +1 -11
  493. package/dist/th/tin.js.map +1 -1
  494. package/dist/tr/tckimlik.d.ts +2 -2
  495. package/dist/tr/tckimlik.js +1 -20
  496. package/dist/tr/tckimlik.js.map +1 -1
  497. package/dist/tr/vkn.d.ts +2 -2
  498. package/dist/tr/vkn.js +1 -20
  499. package/dist/tr/vkn.js.map +1 -1
  500. package/dist/tw/ubn.d.ts +2 -2
  501. package/dist/tw/ubn.js +1 -11
  502. package/dist/tw/ubn.js.map +1 -1
  503. package/dist/types.d.ts +26 -4
  504. package/dist/ua/edrpou.d.ts +2 -2
  505. package/dist/ua/edrpou.js +1 -11
  506. package/dist/ua/edrpou.js.map +1 -1
  507. package/dist/us/ein.d.ts +12 -2
  508. package/dist/us/ein.js +1 -10
  509. package/dist/us/ein.js.map +1 -1
  510. package/dist/us/itin.d.ts +13 -2
  511. package/dist/us/itin.js +1 -11
  512. package/dist/us/itin.js.map +1 -1
  513. package/dist/us/rtn.d.ts +2 -2
  514. package/dist/us/rtn.js +3 -18
  515. package/dist/us/rtn.js.map +1 -1
  516. package/dist/us/ssn.d.ts +13 -2
  517. package/dist/us/ssn.js +1 -11
  518. package/dist/us/ssn.js.map +1 -1
  519. package/dist/uy/rut.d.ts +2 -2
  520. package/dist/uy/rut.js +1 -14
  521. package/dist/uy/rut.js.map +1 -1
  522. package/dist/ve/rif.d.ts +2 -2
  523. package/dist/ve/rif.js +2 -15
  524. package/dist/ve/rif.js.map +1 -1
  525. package/dist/vn/mst.d.ts +2 -2
  526. package/dist/vn/mst.js +1 -12
  527. package/dist/vn/mst.js.map +1 -1
  528. package/dist/za/idnr.d.ts +2 -2
  529. package/dist/za/idnr.js +3 -16
  530. package/dist/za/idnr.js.map +1 -1
  531. package/package.json +22 -12
  532. package/src/_checksums/mod1110.ts +1 -1
  533. package/src/ad/nrt.ts +7 -3
  534. package/src/ae/eid.ts +7 -3
  535. package/src/ai/tin.ts +7 -3
  536. package/src/al/nipt.ts +7 -3
  537. package/src/am/tin.ts +7 -3
  538. package/src/ar/cbu.ts +7 -3
  539. package/src/ar/cuit.ts +7 -3
  540. package/src/ar/dni.ts +7 -3
  541. package/src/at/businessid.ts +7 -3
  542. package/src/at/tin.ts +7 -3
  543. package/src/at/uid.ts +7 -3
  544. package/src/at/vnr.ts +37 -9
  545. package/src/au/abn.ts +7 -3
  546. package/src/au/acn.ts +7 -3
  547. package/src/au/tfn.ts +7 -3
  548. package/src/az/voen.ts +7 -3
  549. package/src/ba/jmbg.ts +8 -7
  550. package/src/bd/nid.ts +7 -3
  551. package/src/be/bis.ts +8 -4
  552. package/src/be/nn.ts +7 -3
  553. package/src/be/vat.ts +7 -3
  554. package/src/bg/egn.ts +8 -7
  555. package/src/bg/pnf.ts +7 -3
  556. package/src/bg/vat.ts +8 -3
  557. package/src/bh/cpr.ts +7 -3
  558. package/src/bic.ts +7 -3
  559. package/src/br/cnpj.ts +7 -3
  560. package/src/br/cpf.ts +7 -3
  561. package/src/by/unp.ts +10 -5
  562. package/src/bz/tin.ts +7 -3
  563. package/src/ca/bn.ts +7 -3
  564. package/src/ca/sin.ts +7 -3
  565. package/src/ch/ssn.ts +7 -3
  566. package/src/ch/uid.ts +7 -3
  567. package/src/ch/vat.ts +9 -5
  568. package/src/cl/rut.ts +7 -3
  569. package/src/cn/ric.ts +8 -7
  570. package/src/cn/uscc.ts +7 -3
  571. package/src/co/nit.ts +8 -4
  572. package/src/cr/cpf.ts +7 -3
  573. package/src/creditcard.ts +10 -6
  574. package/src/cu/ni.ts +8 -7
  575. package/src/cy/vat.ts +7 -3
  576. package/src/cz/dic.ts +9 -4
  577. package/src/cz/ico.ts +7 -3
  578. package/src/cz/rc.ts +8 -7
  579. package/src/de/handelsreg.ts +7 -3
  580. package/src/de/idnr.ts +7 -3
  581. package/src/de/stnr.ts +7 -3
  582. package/src/de/svnr.ts +7 -3
  583. package/src/de/vat.ts +7 -3
  584. package/src/dk/cpr.ts +8 -7
  585. package/src/dk/cvr.ts +7 -3
  586. package/src/dk/vat.ts +8 -3
  587. package/src/do/rnc.ts +7 -3
  588. package/src/ec/ruc.ts +7 -3
  589. package/src/ee/ik.ts +8 -7
  590. package/src/ee/registrikood.ts +8 -4
  591. package/src/ee/vat.ts +7 -3
  592. package/src/eg/tn.ts +7 -3
  593. package/src/es/cif.ts +8 -4
  594. package/src/es/dni.ts +7 -3
  595. package/src/es/nie.ts +8 -4
  596. package/src/es/nss.ts +7 -3
  597. package/src/es/vat.ts +13 -5
  598. package/src/eu/vat.ts +10 -6
  599. package/src/fi/hetu.ts +8 -7
  600. package/src/fi/vat.ts +8 -3
  601. package/src/fi/ytunnus.ts +7 -3
  602. package/src/fr/nif.ts +7 -3
  603. package/src/fr/nir.ts +8 -7
  604. package/src/fr/siren.ts +7 -3
  605. package/src/fr/siret.ts +7 -3
  606. package/src/fr/tva.ts +7 -3
  607. package/src/gb/nino.ts +7 -3
  608. package/src/gb/sedol.ts +7 -3
  609. package/src/gb/utr.ts +7 -3
  610. package/src/gb/vat.ts +7 -3
  611. package/src/ge/pin.ts +7 -3
  612. package/src/gh/tin.ts +7 -3
  613. package/src/gr/amka.ts +7 -3
  614. package/src/gr/vat.ts +7 -3
  615. package/src/gt/nit.ts +7 -3
  616. package/src/hk/hkid.ts +7 -3
  617. package/src/hr/vat.ts +7 -3
  618. package/src/hu/vat.ts +8 -3
  619. package/src/iban.ts +7 -3
  620. package/src/id/npwp.ts +7 -3
  621. package/src/ie/pps.ts +7 -3
  622. package/src/ie/vat.ts +7 -3
  623. package/src/il/idnr.ts +7 -3
  624. package/src/in/aadhaar.ts +7 -3
  625. package/src/in/gstin.ts +7 -3
  626. package/src/in/pan.ts +7 -3
  627. package/src/index.ts +3 -0
  628. package/src/iq/nid.ts +7 -3
  629. package/src/ir/nid.ts +7 -3
  630. package/src/is/kennitala.ts +7 -3
  631. package/src/is/vsk.ts +7 -3
  632. package/src/isin.ts +7 -3
  633. package/src/it/codicefiscale.ts +11 -7
  634. package/src/it/iva.ts +7 -3
  635. package/src/jp/cn.ts +7 -3
  636. package/src/jp/mynumber.ts +7 -3
  637. package/src/kr/brn.ts +7 -3
  638. package/src/kr/rrn.ts +8 -7
  639. package/src/kw/civil.ts +8 -7
  640. package/src/kz/iin.ts +8 -8
  641. package/src/lei.ts +7 -3
  642. package/src/li/peid.ts +7 -3
  643. package/src/lk/nic.ts +8 -7
  644. package/src/lt/asmens.ts +8 -4
  645. package/src/lt/vat.ts +8 -3
  646. package/src/lu/vat.ts +8 -3
  647. package/src/luhn.ts +7 -3
  648. package/src/lv/vat.ts +7 -3
  649. package/src/ma/ice.ts +7 -3
  650. package/src/mc/tva.ts +9 -5
  651. package/src/md/idno.ts +7 -3
  652. package/src/me/pib.ts +7 -3
  653. package/src/mk/edb.ts +7 -3
  654. package/src/mt/vat.ts +8 -3
  655. package/src/mu/brn.ts +7 -3
  656. package/src/mx/clabe.ts +7 -3
  657. package/src/mx/curp.ts +9 -8
  658. package/src/mx/rfc.ts +8 -4
  659. package/src/my/nric.ts +8 -7
  660. package/src/ng/nin.ts +7 -3
  661. package/src/ni/ruc.ts +7 -3
  662. package/src/nl/bsn.ts +7 -3
  663. package/src/nl/kvk.ts +7 -3
  664. package/src/nl/vat.ts +7 -3
  665. package/src/no/fodselsnummer.ts +11 -7
  666. package/src/no/mva.ts +9 -5
  667. package/src/no/orgnr.ts +7 -3
  668. package/src/nz/ird.ts +8 -4
  669. package/src/pa/ruc.ts +7 -3
  670. package/src/patterns.ts +49 -18
  671. package/src/pe/ruc.ts +7 -3
  672. package/src/ph/philid.ts +7 -3
  673. package/src/pk/cnic.ts +7 -3
  674. package/src/pl/nip.ts +7 -3
  675. package/src/pl/pesel.ts +8 -7
  676. package/src/pl/regon.ts +7 -3
  677. package/src/pt/cc.ts +7 -3
  678. package/src/pt/vat.ts +8 -3
  679. package/src/ro/cnp.ts +15 -8
  680. package/src/ro/vat.ts +8 -3
  681. package/src/rs/pib.ts +7 -3
  682. package/src/ru/inn.ts +7 -3
  683. package/src/se/orgnr.ts +7 -3
  684. package/src/se/personnummer.ts +35 -33
  685. package/src/se/vat.ts +8 -3
  686. package/src/sg/uen.ts +7 -3
  687. package/src/si/emso.ts +8 -7
  688. package/src/si/vat.ts +8 -3
  689. package/src/sk/dic.ts +8 -4
  690. package/src/sk/ico.ts +3 -2
  691. package/src/sk/rc.ts +6 -2
  692. package/src/th/tin.ts +7 -3
  693. package/src/tr/tckimlik.ts +7 -3
  694. package/src/tr/vkn.ts +7 -3
  695. package/src/tw/ubn.ts +7 -3
  696. package/src/types.ts +34 -3
  697. package/src/ua/edrpou.ts +7 -3
  698. package/src/us/ein.ts +7 -3
  699. package/src/us/itin.ts +7 -3
  700. package/src/us/rtn.ts +16 -8
  701. package/src/us/ssn.ts +7 -3
  702. package/src/uy/rut.ts +7 -3
  703. package/src/ve/rif.ts +8 -6
  704. package/src/vn/mst.ts +7 -3
  705. package/src/za/idnr.ts +8 -7
package/dist/gt/nit.js CHANGED
@@ -4,18 +4,6 @@ import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/gt/nit.ts
6
6
  /**
7
- * NIT (Número de Identificación Tributaria,
8
- * Guatemala tax number).
9
- *
10
- * 2–12 characters: body digits followed by a check
11
- * character. The check character is computed via a
12
- * weighted sum mod 11; remainder 10 maps to 'K'.
13
- *
14
- * Ported from python-stdnum gt.nit module.
15
- *
16
- * @see https://portal.sat.gob.gt/portal/
17
- */
18
- /**
19
7
  * Compact: strip spaces, hyphens, leading zeros,
20
8
  * and uppercase.
21
9
  */
@@ -68,6 +56,7 @@ const nit = {
68
56
  abbreviation: "NIT",
69
57
  aliases: ["NIT"],
70
58
  candidatePattern: "\\d{7,8}-?\\d",
59
+ scope: "country",
71
60
  country: "GT",
72
61
  entityType: "any",
73
62
  description: "Tax identifier issued by Guatemala's SAT",
@@ -1 +1 @@
1
- {"version":3,"file":"nit.js","names":[],"sources":["../../src/gt/nit.ts"],"sourcesContent":["/**\n * NIT (Número de Identificación Tributaria,\n * Guatemala tax number).\n *\n * 2–12 characters: body digits followed by a check\n * character. The check character is computed via a\n * weighted sum mod 11; remainder 10 maps to 'K'.\n *\n * Ported from python-stdnum gt.nit module.\n *\n * @see https://portal.sat.gob.gt/portal/\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\n/**\n * Compact: strip spaces, hyphens, leading zeros,\n * and uppercase.\n */\nconst compact = (value: string): string => {\n const v = clean(value, \" -\").trim().toUpperCase();\n return v.replace(/^0+/, \"\");\n};\n\n/**\n * Calculate the check character for a body string.\n * Weighted sum mod 11; remainder 10 yields 'K'.\n */\nconst calcCheckChar = (body: string): string => {\n let sum = 0;\n const len = body.length;\n for (let i = 0; i < len; i++) {\n sum += (len - i + 1) * Number(body[i]);\n }\n const remainder = ((-sum % 11) + 11) % 11;\n return remainder === 10 ? \"K\" : String(remainder);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length < 2 || v.length > 12) {\n return err(\n \"INVALID_LENGTH\",\n \"Guatemala NIT must be 2–12 characters\",\n );\n }\n\n const body = v.slice(0, -1);\n const check = v.slice(-1);\n\n if (!isdigits(body)) {\n return err(\n \"INVALID_FORMAT\",\n \"Guatemala NIT body must contain only digits\",\n );\n }\n\n if (check !== \"K\" && !/^\\d$/.test(check)) {\n return err(\n \"INVALID_FORMAT\",\n \"Guatemala NIT check character must be a digit or K\",\n );\n }\n\n if (check !== calcCheckChar(body)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Guatemala NIT check character does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\n/**\n * Format: insert a hyphen before the check character.\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 NIT (7 body digits). */\nconst generate = (): string => {\n for (;;) {\n const body = randomDigits(7);\n if (body.startsWith(\"0\")) continue;\n const check = calcCheckChar(body);\n return `${body}${check}`;\n }\n};\n\n/** Guatemala tax identification number. */\nconst nit: Validator = {\n name: \"Tax Identification Number\",\n localName: \"Número de Identificación Tributaria\",\n abbreviation: \"NIT\",\n aliases: [\"NIT\"] as const,\n candidatePattern: \"\\\\d{7,8}-?\\\\d\",\n country: \"GT\",\n entityType: \"any\",\n description: \"Tax identifier issued by Guatemala's SAT\",\n sourceUrl: \"https://portal.sat.gob.gt/portal/\",\n lengths: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] as const,\n examples: [\"576937K\", \"39525503\", \"71080\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nit;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,WAAW,UAA0B;AAEzC,QADU,MAAM,OAAO,KAAK,CAAC,MAAM,CAAC,aAAa,CACxC,QAAQ,OAAO,GAAG;;;;;;AAO7B,MAAM,iBAAiB,SAAyB;CAC9C,IAAI,MAAM;CACV,MAAM,MAAM,KAAK;AACjB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IACvB,SAAQ,MAAM,IAAI,KAAK,OAAO,KAAK,GAAG;CAExC,MAAM,aAAc,CAAC,MAAM,KAAM,MAAM;AACvC,QAAO,cAAc,KAAK,MAAM,OAAO,UAAU;;AAGnD,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,SAAS,KAAK,EAAE,SAAS,GAC7B,QAAO,IACL,kBACA,wCACD;CAGH,MAAM,OAAO,EAAE,MAAM,GAAG,GAAG;CAC3B,MAAM,QAAQ,EAAE,MAAM,GAAG;AAEzB,KAAI,CAAC,SAAS,KAAK,CACjB,QAAO,IACL,kBACA,8CACD;AAGH,KAAI,UAAU,OAAO,CAAC,OAAO,KAAK,MAAM,CACtC,QAAO,IACL,kBACA,qDACD;AAGH,KAAI,UAAU,cAAc,KAAK,CAC/B,QAAO,IACL,oBACA,+CACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;;;;AAMpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG;;;AAIzC,MAAM,iBAAyB;AAC7B,UAAS;EACP,MAAM,OAAO,aAAa,EAAE;AAC5B,MAAI,KAAK,WAAW,IAAI,CAAE;AAE1B,SAAO,GAAG,OADI,cAAc,KAAK;;;;AAMrC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,MAAM;CAChB,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,aAAa;CACb,WAAW;CACX,SAAS;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAI;EAAI;EAAG;CAC7C,UAAU;EAAC;EAAW;EAAY;EAAQ;CAC1C;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"nit.js","names":[],"sources":["../../src/gt/nit.ts"],"sourcesContent":["/**\n * NIT (Número de Identificación Tributaria,\n * Guatemala tax number).\n *\n * 2–12 characters: body digits followed by a check\n * character. The check character is computed via a\n * weighted sum mod 11; remainder 10 maps to 'K'.\n *\n * Ported from python-stdnum gt.nit module.\n *\n * @see https://portal.sat.gob.gt/portal/\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\n/**\n * Compact: strip spaces, hyphens, leading zeros,\n * and uppercase.\n */\nconst compact = (value: string): string => {\n const v = clean(value, \" -\").trim().toUpperCase();\n return v.replace(/^0+/, \"\");\n};\n\n/**\n * Calculate the check character for a body string.\n * Weighted sum mod 11; remainder 10 yields 'K'.\n */\nconst calcCheckChar = (body: string): string => {\n let sum = 0;\n const len = body.length;\n for (let i = 0; i < len; i++) {\n sum += (len - i + 1) * Number(body[i]);\n }\n const remainder = ((-sum % 11) + 11) % 11;\n return remainder === 10 ? \"K\" : String(remainder);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length < 2 || v.length > 12) {\n return err(\n \"INVALID_LENGTH\",\n \"Guatemala NIT must be 2–12 characters\",\n );\n }\n\n const body = v.slice(0, -1);\n const check = v.slice(-1);\n\n if (!isdigits(body)) {\n return err(\n \"INVALID_FORMAT\",\n \"Guatemala NIT body must contain only digits\",\n );\n }\n\n if (check !== \"K\" && !/^\\d$/.test(check)) {\n return err(\n \"INVALID_FORMAT\",\n \"Guatemala NIT check character must be a digit or K\",\n );\n }\n\n if (check !== calcCheckChar(body)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Guatemala NIT check character does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\n/**\n * Format: insert a hyphen before the check character.\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 NIT (7 body digits). */\nconst generate = (): string => {\n for (;;) {\n const body = randomDigits(7);\n if (body.startsWith(\"0\")) continue;\n const check = calcCheckChar(body);\n return `${body}${check}`;\n }\n};\n\n/** Guatemala tax identification number. */\nconst nit: CountryValidator<\"GT\"> = {\n name: \"Tax Identification Number\",\n localName: \"Número de Identificación Tributaria\",\n abbreviation: \"NIT\",\n aliases: [\"NIT\"] as const,\n candidatePattern: \"\\\\d{7,8}-?\\\\d\",\n scope: \"country\",\n country: \"GT\",\n entityType: \"any\",\n description: \"Tax identifier issued by Guatemala's SAT\",\n sourceUrl: \"https://portal.sat.gob.gt/portal/\",\n lengths: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] as const,\n examples: [\"576937K\", \"39525503\", \"71080\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nit;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;;;;AA2BA,MAAM,WAAW,UAA0B;CAEzC,OADU,MAAM,OAAO,IAAI,EAAE,KAAK,EAAE,YAC7B,EAAE,QAAQ,OAAO,EAAE;AAC5B;;;;;AAMA,MAAM,iBAAiB,SAAyB;CAC9C,IAAI,MAAM;CACV,MAAM,MAAM,KAAK;CACjB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KACvB,QAAQ,MAAM,IAAI,KAAK,OAAO,KAAK,EAAE;CAEvC,MAAM,aAAc,CAAC,MAAM,KAAM,MAAM;CACvC,OAAO,cAAc,KAAK,MAAM,OAAO,SAAS;AAClD;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,SAAS,KAAK,EAAE,SAAS,IAC7B,OAAO,IACL,kBACA,uCACF;CAGF,MAAM,OAAO,EAAE,MAAM,GAAG,EAAE;CAC1B,MAAM,QAAQ,EAAE,MAAM,EAAE;CAExB,IAAI,CAAC,SAAS,IAAI,GAChB,OAAO,IACL,kBACA,6CACF;CAGF,IAAI,UAAU,OAAO,CAAC,OAAO,KAAK,KAAK,GACrC,OAAO,IACL,kBACA,oDACF;CAGF,IAAI,UAAU,cAAc,IAAI,GAC9B,OAAO,IACL,oBACA,8CACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;;;;AAKA,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,SAAS;EACP,MAAM,OAAO,aAAa,CAAC;EAC3B,IAAI,KAAK,WAAW,GAAG,GAAG;EAE1B,OAAO,GAAG,OADI,cAAc,IACP;CACvB;AACF;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,KAAK;CACf,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aAAa;CACb,WAAW;CACX,SAAS;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAI;EAAI;CAAE;CAC5C,UAAU;EAAC;EAAW;EAAY;CAAO;CACzC;CACA;CACA;CACA;AACF"}
package/dist/hk/hkid.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/hk/hkid.d.ts
4
4
  /** Strip spaces, parentheses, and dashes. */
@@ -8,7 +8,7 @@ declare const format: (value: string) => string;
8
8
  /** Generate a random valid HKID. */
9
9
  declare const generate: () => string;
10
10
  /** Hong Kong Identity Card number. */
11
- declare const hkid: Validator;
11
+ declare const hkid: CountryValidator<"HK">;
12
12
  //#endregion
13
13
  export { compact, hkid as default, format, generate, validate };
14
14
  //# sourceMappingURL=hkid.d.ts.map
package/dist/hk/hkid.js CHANGED
@@ -2,16 +2,6 @@ import { clean } from "../_util/clean.js";
2
2
  import { randomDigits, randomInt } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  //#region src/hk/hkid.ts
5
- /**
6
- * HKID (Hong Kong Identity Card number).
7
- *
8
- * 1-2 letters + 6 digits + check digit in parentheses.
9
- * The check digit is computed via a weighted sum mod 11,
10
- * where letters have values A=10, B=11, ..., Z=35.
11
- * A remainder of 10 yields check digit 'A'.
12
- *
13
- * @see https://en.wikipedia.org/wiki/Hong_Kong_identity_card
14
- */
15
5
  /** Strip spaces, parentheses, and dashes. */
16
6
  const compact = (value) => clean(value, " -()").toUpperCase();
17
7
  /**
@@ -76,6 +66,7 @@ const hkid = {
76
66
  abbreviation: "HKID",
77
67
  aliases: ["HKID", "香港身份證"],
78
68
  candidatePattern: "[A-Z]{1,2}\\d{6}[\\dA]",
69
+ scope: "country",
79
70
  country: "HK",
80
71
  entityType: "person",
81
72
  lengths: [8, 9],
@@ -1 +1 @@
1
- {"version":3,"file":"hkid.js","names":[],"sources":["../../src/hk/hkid.ts"],"sourcesContent":["/**\n * HKID (Hong Kong Identity Card number).\n *\n * 1-2 letters + 6 digits + check digit in parentheses.\n * The check digit is computed via a weighted sum mod 11,\n * where letters have values A=10, B=11, ..., Z=35.\n * A remainder of 10 yields check digit 'A'.\n *\n * @see https://en.wikipedia.org/wiki/Hong_Kong_identity_card\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\n/** Strip spaces, parentheses, and dashes. */\nconst compact = (value: string): string =>\n clean(value, \" -()\").toUpperCase();\n\n/**\n * Compute the weighted check character.\n *\n * For a two-letter prefix the weights are 9,8,7,6,5,4,3,2\n * over the 8 characters (2 letters + 6 digits). For a\n * single-letter prefix, a space (value 36) is prepended\n * so the weights stay the same.\n */\nconst computeCheck = (body: string): string => {\n const padded = body.length === 7 ? ` ${body}` : body;\n\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n const ch = padded[i];\n if (ch === undefined) continue;\n let val: number;\n if (ch === \" \") {\n val = 36;\n } else if (ch >= \"A\" && ch <= \"Z\") {\n val = ch.charCodeAt(0) - 55; // A=10\n } else {\n val = Number(ch);\n }\n sum += val * (9 - i);\n }\n\n const remainder = sum % 11;\n if (remainder === 0) return \"0\";\n if (remainder === 1) return \"A\";\n return String(11 - remainder);\n};\n\nconst HKID_RE = /^[A-Z]{1,2}\\d{6}[0-9A]$/;\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 \"HKID must be 8 or 9 characters\",\n );\n }\n if (!HKID_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"HKID must be 1-2 letters, 6 digits, \" +\n \"and a check character\",\n );\n }\n\n const body = v.slice(0, -1);\n const check = v.slice(-1);\n if (computeCheck(body) !== check) {\n return err(\n \"INVALID_CHECKSUM\",\n \"HKID check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const prefix = v.slice(0, -7);\n const digits = v.slice(-7, -1);\n const check = v.slice(-1);\n return `${prefix}${digits}(${check})`;\n};\n\n/** Generate a random valid HKID. */\nconst generate = (): string => {\n for (;;) {\n const letter = String.fromCharCode(\n 65 + randomInt(0, 25),\n );\n const digits = randomDigits(6);\n for (let d = 0; d <= 9; d++) {\n const c = letter + digits + String(d);\n if (validate(c).valid) return compact(c);\n }\n const cA = letter + digits + \"A\";\n if (validate(cA).valid) return compact(cA);\n }\n};\n\n/** Hong Kong Identity Card number. */\nconst hkid: Validator = {\n name: \"Hong Kong Identity Card Number\",\n localName: \"Hong Kong Identity Card Number\",\n abbreviation: \"HKID\",\n aliases: [\"HKID\", \"香港身份證\"] as const,\n candidatePattern: \"[A-Z]{1,2}\\\\d{6}[\\\\dA]\",\n country: \"HK\",\n entityType: \"person\",\n lengths: [8, 9],\n examples: [\"G123456A\", \"AB9876543\"],\n description:\n \"Identity card number issued by the Hong Kong \" +\n \"Immigration Department\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/\" +\n \"Hong_Kong_identity_card\",\n compact,\n format,\n validate,\n generate,\n};\n\nexport default hkid;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,WAAW,UACf,MAAM,OAAO,OAAO,CAAC,aAAa;;;;;;;;;AAUpC,MAAM,gBAAgB,SAAyB;CAC7C,MAAM,SAAS,KAAK,WAAW,IAAI,IAAI,SAAS;CAEhD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EAC1B,MAAM,KAAK,OAAO;AAClB,MAAI,OAAO,KAAA,EAAW;EACtB,IAAI;AACJ,MAAI,OAAO,IACT,OAAM;WACG,MAAM,OAAO,MAAM,IAC5B,OAAM,GAAG,WAAW,EAAE,GAAG;MAEzB,OAAM,OAAO,GAAG;AAElB,SAAO,OAAO,IAAI;;CAGpB,MAAM,YAAY,MAAM;AACxB,KAAI,cAAc,EAAG,QAAO;AAC5B,KAAI,cAAc,EAAG,QAAO;AAC5B,QAAO,OAAO,KAAK,UAAU;;AAG/B,MAAM,UAAU;AAEhB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EACjC,QAAO,IACL,kBACA,iCACD;AAEH,KAAI,CAAC,QAAQ,KAAK,EAAE,CAClB,QAAO,IACL,kBACA,4DAED;CAGH,MAAM,OAAO,EAAE,MAAM,GAAG,GAAG;CAC3B,MAAM,QAAQ,EAAE,MAAM,GAAG;AACzB,KAAI,aAAa,KAAK,KAAK,MACzB,QAAO,IACL,oBACA,4BACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AAIxB,QAAO,GAHQ,EAAE,MAAM,GAAG,GAAG,GACd,EAAE,MAAM,IAAI,GAAG,CAEJ,GADZ,EAAE,MAAM,GAAG,CACU;;;AAIrC,MAAM,iBAAyB;AAC7B,UAAS;EACP,MAAM,SAAS,OAAO,aACpB,KAAK,UAAU,GAAG,GAAG,CACtB;EACD,MAAM,SAAS,aAAa,EAAE;AAC9B,OAAK,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK;GAC3B,MAAM,IAAI,SAAS,SAAS,OAAO,EAAE;AACrC,OAAI,SAAS,EAAE,CAAC,MAAO,QAAO,QAAQ,EAAE;;EAE1C,MAAM,KAAK,SAAS,SAAS;AAC7B,MAAI,SAAS,GAAG,CAAC,MAAO,QAAO,QAAQ,GAAG;;;;AAK9C,MAAM,OAAkB;CACtB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,QAAQ,QAAQ;CAC1B,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,GAAG,EAAE;CACf,UAAU,CAAC,YAAY,YAAY;CACnC,aACE;CAEF,WACE;CAEF;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"hkid.js","names":[],"sources":["../../src/hk/hkid.ts"],"sourcesContent":["/**\n * HKID (Hong Kong Identity Card number).\n *\n * 1-2 letters + 6 digits + check digit in parentheses.\n * The check digit is computed via a weighted sum mod 11,\n * where letters have values A=10, B=11, ..., Z=35.\n * A remainder of 10 yields check digit 'A'.\n *\n * @see https://en.wikipedia.org/wiki/Hong_Kong_identity_card\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\n/** Strip spaces, parentheses, and dashes. */\nconst compact = (value: string): string =>\n clean(value, \" -()\").toUpperCase();\n\n/**\n * Compute the weighted check character.\n *\n * For a two-letter prefix the weights are 9,8,7,6,5,4,3,2\n * over the 8 characters (2 letters + 6 digits). For a\n * single-letter prefix, a space (value 36) is prepended\n * so the weights stay the same.\n */\nconst computeCheck = (body: string): string => {\n const padded = body.length === 7 ? ` ${body}` : body;\n\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n const ch = padded[i];\n if (ch === undefined) continue;\n let val: number;\n if (ch === \" \") {\n val = 36;\n } else if (ch >= \"A\" && ch <= \"Z\") {\n val = ch.charCodeAt(0) - 55; // A=10\n } else {\n val = Number(ch);\n }\n sum += val * (9 - i);\n }\n\n const remainder = sum % 11;\n if (remainder === 0) return \"0\";\n if (remainder === 1) return \"A\";\n return String(11 - remainder);\n};\n\nconst HKID_RE = /^[A-Z]{1,2}\\d{6}[0-9A]$/;\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 \"HKID must be 8 or 9 characters\",\n );\n }\n if (!HKID_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"HKID must be 1-2 letters, 6 digits, \" +\n \"and a check character\",\n );\n }\n\n const body = v.slice(0, -1);\n const check = v.slice(-1);\n if (computeCheck(body) !== check) {\n return err(\n \"INVALID_CHECKSUM\",\n \"HKID check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const prefix = v.slice(0, -7);\n const digits = v.slice(-7, -1);\n const check = v.slice(-1);\n return `${prefix}${digits}(${check})`;\n};\n\n/** Generate a random valid HKID. */\nconst generate = (): string => {\n for (;;) {\n const letter = String.fromCharCode(\n 65 + randomInt(0, 25),\n );\n const digits = randomDigits(6);\n for (let d = 0; d <= 9; d++) {\n const c = letter + digits + String(d);\n if (validate(c).valid) return compact(c);\n }\n const cA = letter + digits + \"A\";\n if (validate(cA).valid) return compact(cA);\n }\n};\n\n/** Hong Kong Identity Card number. */\nconst hkid: CountryValidator<\"HK\"> = {\n name: \"Hong Kong Identity Card Number\",\n localName: \"Hong Kong Identity Card Number\",\n abbreviation: \"HKID\",\n aliases: [\"HKID\", \"香港身份證\"] as const,\n candidatePattern: \"[A-Z]{1,2}\\\\d{6}[\\\\dA]\",\n scope: \"country\",\n country: \"HK\",\n entityType: \"person\",\n lengths: [8, 9],\n examples: [\"G123456A\", \"AB9876543\"],\n description:\n \"Identity card number issued by the Hong Kong \" +\n \"Immigration Department\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/\" +\n \"Hong_Kong_identity_card\",\n compact,\n format,\n validate,\n generate,\n};\n\nexport default hkid;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAqBA,MAAM,WAAW,UACf,MAAM,OAAO,MAAM,EAAE,YAAY;;;;;;;;;AAUnC,MAAM,gBAAgB,SAAyB;CAC7C,MAAM,SAAS,KAAK,WAAW,IAAI,IAAI,SAAS;CAEhD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EAC1B,MAAM,KAAK,OAAO;EAClB,IAAI,OAAO,KAAA,GAAW;EACtB,IAAI;EACJ,IAAI,OAAO,KACT,MAAM;OACD,IAAI,MAAM,OAAO,MAAM,KAC5B,MAAM,GAAG,WAAW,CAAC,IAAI;OAEzB,MAAM,OAAO,EAAE;EAEjB,OAAO,OAAO,IAAI;CACpB;CAEA,MAAM,YAAY,MAAM;CACxB,IAAI,cAAc,GAAG,OAAO;CAC5B,IAAI,cAAc,GAAG,OAAO;CAC5B,OAAO,OAAO,KAAK,SAAS;AAC9B;AAEA,MAAM,UAAU;AAEhB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,OAAO,IACL,kBACA,gCACF;CAEF,IAAI,CAAC,QAAQ,KAAK,CAAC,GACjB,OAAO,IACL,kBACA,2DAEF;CAGF,MAAM,OAAO,EAAE,MAAM,GAAG,EAAE;CAC1B,MAAM,QAAQ,EAAE,MAAM,EAAE;CACxB,IAAI,aAAa,IAAI,MAAM,OACzB,OAAO,IACL,oBACA,2BACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CAIvB,OAAO,GAHQ,EAAE,MAAM,GAAG,EAGX,IAFA,EAAE,MAAM,IAAI,EAEH,EAAE,GADZ,EAAE,MAAM,EACW,EAAE;AACrC;;AAGA,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,SAAS,OAAO,aACpB,KAAK,UAAU,GAAG,EAAE,CACtB;EACA,MAAM,SAAS,aAAa,CAAC;EAC7B,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK;GAC3B,MAAM,IAAI,SAAS,SAAS,OAAO,CAAC;GACpC,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO,QAAQ,CAAC;EACzC;EACA,MAAM,KAAK,SAAS,SAAS;EAC7B,IAAI,SAAS,EAAE,EAAE,OAAO,OAAO,QAAQ,EAAE;CAC3C;AACF;;AAGA,MAAM,OAA+B;CACnC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,QAAQ,OAAO;CACzB,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,GAAG,CAAC;CACd,UAAU,CAAC,YAAY,WAAW;CAClC,aACE;CAEF,WACE;CAEF;CACA;CACA;CACA;AACF"}
package/dist/hr/vat.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/hr/vat.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Croatian OIB. */
8
8
  declare const generate: () => string;
9
9
  /** Croatian VAT Number. */
10
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"HR">;
11
11
  //#endregion
12
12
  export { compact, vat as default, format, generate, validate };
13
13
  //# sourceMappingURL=vat.d.ts.map
package/dist/hr/vat.js CHANGED
@@ -1,17 +1,9 @@
1
+ import { mod1110checkDigit, mod1110validate } from "../_checksums/mod1110.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 { mod1110checkDigit, mod1110validate } from "../_checksums/mod1110.js";
6
6
  //#region src/hr/vat.ts
7
- /**
8
- * OIB (Croatian VAT number).
9
- *
10
- * 11 digits. ISO 7064 Mod 11,10 checksum.
11
- *
12
- * @see https://www.vatify.eu/croatia-vat-number.html
13
- * @see https://www.porezna-uprava.hr/
14
- */
15
7
  const compact = (value) => {
16
8
  let v = clean(value, " -/.");
17
9
  if (v.startsWith("HR") || v.startsWith("hr")) v = v.slice(2);
@@ -40,6 +32,7 @@ const vat = {
40
32
  abbreviation: "OIB",
41
33
  aliases: ["OIB", "osobni identifikacijski broj"],
42
34
  candidatePattern: "HR\\d{11}",
35
+ scope: "country",
43
36
  country: "HR",
44
37
  entityType: "any",
45
38
  sourceUrl: "https://www.porezna-uprava.hr/",
@@ -1 +1 @@
1
- {"version":3,"file":"vat.js","names":[],"sources":["../../src/hr/vat.ts"],"sourcesContent":["/**\n * OIB (Croatian VAT number).\n *\n * 11 digits. ISO 7064 Mod 11,10 checksum.\n *\n * @see https://www.vatify.eu/croatia-vat-number.html\n * @see https://www.porezna-uprava.hr/\n */\n\nimport {\n mod1110validate,\n mod1110checkDigit,\n} from \"#checksums/mod1110\";\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 let v = clean(value, \" -/.\");\n if (v.startsWith(\"HR\") || v.startsWith(\"hr\")) {\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 !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"Croatian VAT number must be 11 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Croatian VAT number must contain only digits\",\n );\n }\n if (!mod1110validate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Croatian VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `HR${compact(value)}`;\n\n/** Generate a random valid Croatian OIB. */\nconst generate = (): string => {\n const payload = randomDigits(10);\n return payload + String(mod1110checkDigit(payload));\n};\n\n/** Croatian VAT Number. */\nconst vat: Validator = {\n name: \"Croatian VAT Number\",\n localName: \"Osobni identifikacijski broj\",\n abbreviation: \"OIB\",\n aliases: [\"OIB\", \"osobni identifikacijski broj\"] as const,\n candidatePattern: \"HR\\\\d{11}\",\n country: \"HR\",\n entityType: \"any\",\n sourceUrl: \"https://www.porezna-uprava.hr/\",\n examples: [\"33392005961\"] 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,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,GACf,QAAO,IACL,kBACA,wCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+CACD;AAEH,KAAI,CAAC,gBAAgB,EAAE,CACrB,QAAO,IACL,oBACA,2CACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UACd,KAAK,QAAQ,MAAM;;AAGrB,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,GAAG;AAChC,QAAO,UAAU,OAAO,kBAAkB,QAAQ,CAAC;;;AAIrD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,+BAA+B;CAChD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,cAAc;CACzB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"vat.js","names":[],"sources":["../../src/hr/vat.ts"],"sourcesContent":["/**\n * OIB (Croatian VAT number).\n *\n * 11 digits. ISO 7064 Mod 11,10 checksum.\n *\n * @see https://www.vatify.eu/croatia-vat-number.html\n * @see https://www.porezna-uprava.hr/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n mod1110validate,\n mod1110checkDigit,\n} from \"#checksums/mod1110\";\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 let v = clean(value, \" -/.\");\n if (v.startsWith(\"HR\") || v.startsWith(\"hr\")) {\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 !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"Croatian VAT number must be 11 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Croatian VAT number must contain only digits\",\n );\n }\n if (!mod1110validate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Croatian VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `HR${compact(value)}`;\n\n/** Generate a random valid Croatian OIB. */\nconst generate = (): string => {\n const payload = randomDigits(10);\n return payload + String(mod1110checkDigit(payload));\n};\n\n/** Croatian VAT Number. */\nconst vat: CountryValidator<\"HR\"> = {\n name: \"Croatian VAT Number\",\n localName: \"Osobni identifikacijski broj\",\n abbreviation: \"OIB\",\n aliases: [\"OIB\", \"osobni identifikacijski broj\"] as const,\n candidatePattern: \"HR\\\\d{11}\",\n scope: \"country\",\n country: \"HR\",\n entityType: \"any\",\n sourceUrl: \"https://www.porezna-uprava.hr/\",\n examples: [\"33392005961\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAuBA,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,IACf,OAAO,IACL,kBACA,uCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8CACF;CAEF,IAAI,CAAC,gBAAgB,CAAC,GACpB,OAAO,IACL,oBACA,0CACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UACd,KAAK,QAAQ,KAAK;;AAGpB,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,EAAE;CAC/B,OAAO,UAAU,OAAO,kBAAkB,OAAO,CAAC;AACpD;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,8BAA8B;CAC/C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,aAAa;CACxB;CACA;CACA;CACA;AACF"}
package/dist/hu/vat.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/hu/vat.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Hungarian VAT number. */
8
8
  declare const generate: () => string;
9
9
  /** Hungarian VAT Number. */
10
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"HU">;
11
11
  //#endregion
12
12
  export { compact, vat as default, format, generate, validate };
13
13
  //# sourceMappingURL=vat.d.ts.map
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,4 +1,4 @@
1
- import { ValidateResult, Validator } from "./types.js";
1
+ import { GlobalValidator, ValidateResult } from "./types.js";
2
2
 
3
3
  //#region src/iban.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -9,7 +9,7 @@ declare const format: (value: string) => string;
9
9
  */
10
10
  declare const generate: () => string;
11
11
  /** International Bank Account Number. */
12
- declare const iban: Validator;
12
+ declare const iban: GlobalValidator;
13
13
  //#endregion
14
14
  export { compact, iban as default, format, generate, validate };
15
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/npwp.d.ts CHANGED
@@ -1,4 +1,4 @@
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
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid 15-digit NPWP. */
8
8
  declare const generate: () => string;
9
9
  /** Indonesian Taxpayer Identification Number. */
10
- declare const npwp: Validator;
10
+ declare const npwp: CountryValidator<"ID">;
11
11
  //#endregion
12
12
  export { compact, npwp as default, format, generate, validate };
13
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/pps.d.ts CHANGED
@@ -1,4 +1,4 @@
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
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Irish PPS number. */
8
8
  declare const generate: () => string;
9
9
  /** Irish Personal Public Service Number. */
10
- declare const pps: Validator;
10
+ declare const pps: CountryValidator<"IE">;
11
11
  //#endregion
12
12
  export { compact, pps as default, format, generate, validate };
13
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,4 +1,4 @@
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
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Irish VAT number. */
8
8
  declare const generate: () => string;
9
9
  /** Irish VAT Number. */
10
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"IE">;
11
11
  //#endregion
12
12
  export { compact, vat as default, format, generate, validate };
13
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"}