@stll/stdnum 0.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (808) hide show
  1. package/LICENSE +1 -5
  2. package/README.md +28 -4
  3. package/dist/_checksums/luhn.js.map +1 -1
  4. package/dist/_checksums/mod1110.js +1 -1
  5. package/dist/_checksums/mod1110.js.map +1 -1
  6. package/dist/_checksums/mod112.js +5 -5
  7. package/dist/_checksums/mod112.js.map +1 -1
  8. package/dist/_checksums/mod97.js.map +1 -1
  9. package/dist/_checksums/verhoeff.js.map +1 -1
  10. package/dist/_checksums/weighted-sum.js.map +1 -1
  11. package/dist/_util/arabic.js.map +1 -1
  12. package/dist/_util/clean.js.map +1 -1
  13. package/dist/_util/date.js.map +1 -1
  14. package/dist/_util/generate.d.ts +13 -1
  15. package/dist/_util/generate.js +23 -1
  16. package/dist/_util/generate.js.map +1 -1
  17. package/dist/_util/result.js.map +1 -1
  18. package/dist/_util/strings.js.map +1 -1
  19. package/dist/ad/mod.d.ts +3 -2
  20. package/dist/ad/nrt.d.ts +16 -2
  21. package/dist/ad/nrt.js +4 -16
  22. package/dist/ad/nrt.js.map +1 -1
  23. package/dist/ae/eid.d.ts +2 -3
  24. package/dist/ae/eid.js +2 -12
  25. package/dist/ae/eid.js.map +1 -1
  26. package/dist/ae/mod.d.ts +3 -2
  27. package/dist/ai/mod.d.ts +3 -2
  28. package/dist/ai/tin.d.ts +20 -2
  29. package/dist/ai/tin.js +1 -18
  30. package/dist/ai/tin.js.map +1 -1
  31. package/dist/al/mod.d.ts +3 -2
  32. package/dist/al/nipt.d.ts +13 -2
  33. package/dist/al/nipt.js +1 -11
  34. package/dist/al/nipt.js.map +1 -1
  35. package/dist/am/mod.d.ts +3 -2
  36. package/dist/am/tin.d.ts +16 -2
  37. package/dist/am/tin.js +1 -14
  38. package/dist/am/tin.js.map +1 -1
  39. package/dist/ar/cbu.d.ts +2 -3
  40. package/dist/ar/cbu.js +2 -10
  41. package/dist/ar/cbu.js.map +1 -1
  42. package/dist/ar/cuit.d.ts +2 -3
  43. package/dist/ar/cuit.js +13 -29
  44. package/dist/ar/cuit.js.map +1 -1
  45. package/dist/ar/dni.d.ts +11 -2
  46. package/dist/ar/dni.js +1 -9
  47. package/dist/ar/dni.js.map +1 -1
  48. package/dist/ar/mod.d.ts +3 -2
  49. package/dist/at/businessid.d.ts +10 -2
  50. package/dist/at/businessid.js +1 -8
  51. package/dist/at/businessid.js.map +1 -1
  52. package/dist/at/mod.d.ts +3 -2
  53. package/dist/at/tin.d.ts +2 -3
  54. package/dist/at/tin.js +1 -11
  55. package/dist/at/tin.js.map +1 -1
  56. package/dist/at/uid.d.ts +2 -3
  57. package/dist/at/uid.js +2 -10
  58. package/dist/at/uid.js.map +1 -1
  59. package/dist/at/vnr.d.ts +5 -4
  60. package/dist/at/vnr.js +23 -16
  61. package/dist/at/vnr.js.map +1 -1
  62. package/dist/au/abn.d.ts +2 -3
  63. package/dist/au/abn.js +1 -10
  64. package/dist/au/abn.js.map +1 -1
  65. package/dist/au/acn.d.ts +2 -3
  66. package/dist/au/acn.js +1 -10
  67. package/dist/au/acn.js.map +1 -1
  68. package/dist/au/mod.d.ts +3 -2
  69. package/dist/au/tfn.d.ts +2 -3
  70. package/dist/au/tfn.js +1 -10
  71. package/dist/au/tfn.js.map +1 -1
  72. package/dist/az/mod.d.ts +3 -2
  73. package/dist/az/voen.d.ts +2 -3
  74. package/dist/az/voen.js +1 -14
  75. package/dist/az/voen.js.map +1 -1
  76. package/dist/ba/jmbg.d.ts +2 -3
  77. package/dist/ba/jmbg.js +4 -11
  78. package/dist/ba/jmbg.js.map +1 -1
  79. package/dist/ba/mod.d.ts +3 -2
  80. package/dist/bd/mod.d.ts +3 -2
  81. package/dist/bd/nid.d.ts +23 -2
  82. package/dist/bd/nid.js +11 -32
  83. package/dist/bd/nid.js.map +1 -1
  84. package/dist/be/bis.d.ts +2 -3
  85. package/dist/be/bis.js +1 -11
  86. package/dist/be/bis.js.map +1 -1
  87. package/dist/be/mod.d.ts +3 -2
  88. package/dist/be/nn.d.ts +2 -3
  89. package/dist/be/nn.js +1 -11
  90. package/dist/be/nn.js.map +1 -1
  91. package/dist/be/vat.d.ts +2 -3
  92. package/dist/be/vat.js +1 -9
  93. package/dist/be/vat.js.map +1 -1
  94. package/dist/bg/egn.d.ts +2 -3
  95. package/dist/bg/egn.js +5 -13
  96. package/dist/bg/egn.js.map +1 -1
  97. package/dist/bg/mod.d.ts +3 -2
  98. package/dist/bg/pnf.d.ts +2 -3
  99. package/dist/bg/pnf.js +1 -8
  100. package/dist/bg/pnf.js.map +1 -1
  101. package/dist/bg/vat.d.ts +2 -3
  102. package/dist/bg/vat.js +3 -9
  103. package/dist/bg/vat.js.map +1 -1
  104. package/dist/bh/cpr.d.ts +5 -4
  105. package/dist/bh/cpr.js +9 -19
  106. package/dist/bh/cpr.js.map +1 -1
  107. package/dist/bh/mod.d.ts +3 -2
  108. package/dist/bic.d.ts +13 -2
  109. package/dist/bic.js +14 -26
  110. package/dist/bic.js.map +1 -1
  111. package/dist/br/cnpj.d.ts +2 -3
  112. package/dist/br/cnpj.js +1 -20
  113. package/dist/br/cnpj.js.map +1 -1
  114. package/dist/br/cpf.d.ts +2 -3
  115. package/dist/br/cpf.js +1 -14
  116. package/dist/br/cpf.js.map +1 -1
  117. package/dist/br/mod.d.ts +3 -2
  118. package/dist/by/mod.d.ts +3 -2
  119. package/dist/by/unp.d.ts +2 -3
  120. package/dist/by/unp.js +9 -17
  121. package/dist/by/unp.js.map +1 -1
  122. package/dist/bz/mod.d.ts +3 -2
  123. package/dist/bz/tin.d.ts +5 -4
  124. package/dist/bz/tin.js +10 -27
  125. package/dist/bz/tin.js.map +1 -1
  126. package/dist/ca/bn.d.ts +2 -3
  127. package/dist/ca/bn.js +2 -10
  128. package/dist/ca/bn.js.map +1 -1
  129. package/dist/ca/mod.d.ts +3 -2
  130. package/dist/ca/sin.d.ts +2 -3
  131. package/dist/ca/sin.js +2 -10
  132. package/dist/ca/sin.js.map +1 -1
  133. package/dist/ch/mod.d.ts +3 -2
  134. package/dist/ch/ssn.d.ts +2 -3
  135. package/dist/ch/ssn.js +1 -9
  136. package/dist/ch/ssn.js.map +1 -1
  137. package/dist/ch/uid.d.ts +2 -3
  138. package/dist/ch/uid.js +1 -9
  139. package/dist/ch/uid.js.map +1 -1
  140. package/dist/ch/vat.d.ts +2 -3
  141. package/dist/ch/vat.js +1 -9
  142. package/dist/ch/vat.js.map +1 -1
  143. package/dist/cl/mod.d.ts +3 -2
  144. package/dist/cl/rut.d.ts +2 -3
  145. package/dist/cl/rut.js +2 -15
  146. package/dist/cl/rut.js.map +1 -1
  147. package/dist/cn/mod.d.ts +3 -2
  148. package/dist/cn/ric.d.ts +2 -3
  149. package/dist/cn/ric.js +4 -14
  150. package/dist/cn/ric.js.map +1 -1
  151. package/dist/cn/uscc.d.ts +2 -3
  152. package/dist/cn/uscc.js +8 -16
  153. package/dist/cn/uscc.js.map +1 -1
  154. package/dist/co/mod.d.ts +3 -2
  155. package/dist/co/nit.d.ts +2 -3
  156. package/dist/co/nit.js +6 -13
  157. package/dist/co/nit.js.map +1 -1
  158. package/dist/cr/cpf.d.ts +18 -2
  159. package/dist/cr/cpf.js +5 -19
  160. package/dist/cr/cpf.js.map +1 -1
  161. package/dist/cr/mod.d.ts +3 -2
  162. package/dist/creditcard.d.ts +2 -3
  163. package/dist/creditcard.js +5 -14
  164. package/dist/creditcard.js.map +1 -1
  165. package/dist/cu/mod.d.ts +3 -2
  166. package/dist/cu/ni.d.ts +5 -4
  167. package/dist/cu/ni.js +13 -18
  168. package/dist/cu/ni.js.map +1 -1
  169. package/dist/cy/mod.d.ts +3 -2
  170. package/dist/cy/vat.d.ts +2 -3
  171. package/dist/cy/vat.js +1 -8
  172. package/dist/cy/vat.js.map +1 -1
  173. package/dist/cz/dic.d.ts +2 -3
  174. package/dist/cz/dic.js +7 -13
  175. package/dist/cz/dic.js.map +1 -1
  176. package/dist/cz/ico.d.ts +2 -3
  177. package/dist/cz/ico.js +2 -10
  178. package/dist/cz/ico.js.map +1 -1
  179. package/dist/cz/mod.d.ts +3 -2
  180. package/dist/cz/rc.d.ts +2 -3
  181. package/dist/cz/rc.js +22 -21
  182. package/dist/cz/rc.js.map +1 -1
  183. package/dist/de/handelsreg.d.ts +19 -2
  184. package/dist/de/handelsreg.js +10 -26
  185. package/dist/de/handelsreg.js.map +1 -1
  186. package/dist/de/idnr.d.ts +2 -3
  187. package/dist/de/idnr.js +2 -12
  188. package/dist/de/idnr.js.map +1 -1
  189. package/dist/de/mod.d.ts +3 -2
  190. package/dist/de/stnr.d.ts +17 -3
  191. package/dist/de/stnr.js +1 -15
  192. package/dist/de/stnr.js.map +1 -1
  193. package/dist/de/svnr.d.ts +2 -3
  194. package/dist/de/svnr.js +4 -13
  195. package/dist/de/svnr.js.map +1 -1
  196. package/dist/de/vat.d.ts +2 -3
  197. package/dist/de/vat.js +2 -11
  198. package/dist/de/vat.js.map +1 -1
  199. package/dist/dk/cpr.d.ts +5 -4
  200. package/dist/dk/cpr.js +14 -12
  201. package/dist/dk/cpr.js.map +1 -1
  202. package/dist/dk/cvr.d.ts +2 -3
  203. package/dist/dk/cvr.js +2 -15
  204. package/dist/dk/cvr.js.map +1 -1
  205. package/dist/dk/mod.d.ts +3 -2
  206. package/dist/dk/vat.d.ts +2 -3
  207. package/dist/dk/vat.js +3 -13
  208. package/dist/dk/vat.js.map +1 -1
  209. package/dist/do/mod.d.ts +3 -2
  210. package/dist/do/rnc.d.ts +2 -3
  211. package/dist/do/rnc.js +3 -17
  212. package/dist/do/rnc.js.map +1 -1
  213. package/dist/ec/mod.d.ts +3 -2
  214. package/dist/ec/ruc.d.ts +2 -3
  215. package/dist/ec/ruc.js +2 -19
  216. package/dist/ec/ruc.js.map +1 -1
  217. package/dist/ee/ik.d.ts +2 -3
  218. package/dist/ee/ik.js +6 -15
  219. package/dist/ee/ik.js.map +1 -1
  220. package/dist/ee/mod.d.ts +3 -2
  221. package/dist/ee/registrikood.d.ts +2 -3
  222. package/dist/ee/registrikood.js +9 -15
  223. package/dist/ee/registrikood.js.map +1 -1
  224. package/dist/ee/vat.d.ts +2 -3
  225. package/dist/ee/vat.js +2 -10
  226. package/dist/ee/vat.js.map +1 -1
  227. package/dist/eg/mod.d.ts +3 -2
  228. package/dist/eg/tn.d.ts +11 -2
  229. package/dist/eg/tn.js +1 -9
  230. package/dist/eg/tn.js.map +1 -1
  231. package/dist/es/cif.d.ts +2 -3
  232. package/dist/es/cif.js +3 -12
  233. package/dist/es/cif.js.map +1 -1
  234. package/dist/es/dni.d.ts +2 -3
  235. package/dist/es/dni.js +1 -9
  236. package/dist/es/dni.js.map +1 -1
  237. package/dist/es/mod.d.ts +3 -2
  238. package/dist/es/nie.d.ts +2 -3
  239. package/dist/es/nie.js +14 -22
  240. package/dist/es/nie.js.map +1 -1
  241. package/dist/es/nss.d.ts +2 -3
  242. package/dist/es/nss.js +1 -16
  243. package/dist/es/nss.js.map +1 -1
  244. package/dist/es/vat.d.ts +2 -3
  245. package/dist/es/vat.js +5 -10
  246. package/dist/es/vat.js.map +1 -1
  247. package/dist/eu/mod.d.ts +3 -2
  248. package/dist/eu/vat.d.ts +5 -4
  249. package/dist/eu/vat.js +44 -2
  250. package/dist/eu/vat.js.map +1 -1
  251. package/dist/fi/hetu.d.ts +5 -4
  252. package/dist/fi/hetu.js +19 -12
  253. package/dist/fi/hetu.js.map +1 -1
  254. package/dist/fi/mod.d.ts +3 -2
  255. package/dist/fi/vat.d.ts +2 -3
  256. package/dist/fi/vat.js +3 -10
  257. package/dist/fi/vat.js.map +1 -1
  258. package/dist/fi/ytunnus.d.ts +2 -3
  259. package/dist/fi/ytunnus.js +2 -10
  260. package/dist/fi/ytunnus.js.map +1 -1
  261. package/dist/fr/mod.d.ts +3 -2
  262. package/dist/fr/nif.d.ts +2 -3
  263. package/dist/fr/nif.js +1 -9
  264. package/dist/fr/nif.js.map +1 -1
  265. package/dist/fr/nir.d.ts +2 -3
  266. package/dist/fr/nir.js +3 -14
  267. package/dist/fr/nir.js.map +1 -1
  268. package/dist/fr/siren.d.ts +2 -3
  269. package/dist/fr/siren.js +2 -10
  270. package/dist/fr/siren.js.map +1 -1
  271. package/dist/fr/siret.d.ts +2 -3
  272. package/dist/fr/siret.js +2 -11
  273. package/dist/fr/siret.js.map +1 -1
  274. package/dist/fr/tva.d.ts +2 -3
  275. package/dist/fr/tva.js +2 -12
  276. package/dist/fr/tva.js.map +1 -1
  277. package/dist/gb/mod.d.ts +3 -2
  278. package/dist/gb/nino.d.ts +12 -2
  279. package/dist/gb/nino.js +8 -17
  280. package/dist/gb/nino.js.map +1 -1
  281. package/dist/gb/sedol.d.ts +2 -3
  282. package/dist/gb/sedol.js +9 -18
  283. package/dist/gb/sedol.js.map +1 -1
  284. package/dist/gb/utr.d.ts +2 -3
  285. package/dist/gb/utr.js +2 -10
  286. package/dist/gb/utr.js.map +1 -1
  287. package/dist/gb/vat.d.ts +2 -3
  288. package/dist/gb/vat.js +2 -11
  289. package/dist/gb/vat.js.map +1 -1
  290. package/dist/ge/mod.d.ts +3 -2
  291. package/dist/ge/pin.d.ts +14 -2
  292. package/dist/ge/pin.js +1 -12
  293. package/dist/ge/pin.js.map +1 -1
  294. package/dist/gh/mod.d.ts +3 -2
  295. package/dist/gh/tin.d.ts +2 -3
  296. package/dist/gh/tin.js +10 -24
  297. package/dist/gh/tin.js.map +1 -1
  298. package/dist/gr/amka.d.ts +2 -3
  299. package/dist/gr/amka.js +3 -11
  300. package/dist/gr/amka.js.map +1 -1
  301. package/dist/gr/mod.d.ts +3 -2
  302. package/dist/gr/vat.d.ts +2 -3
  303. package/dist/gr/vat.js +1 -10
  304. package/dist/gr/vat.js.map +1 -1
  305. package/dist/gt/mod.d.ts +3 -2
  306. package/dist/gt/nit.d.ts +2 -3
  307. package/dist/gt/nit.js +6 -14
  308. package/dist/gt/nit.js.map +1 -1
  309. package/dist/hk/hkid.d.ts +2 -3
  310. package/dist/hk/hkid.js +2 -10
  311. package/dist/hk/hkid.js.map +1 -1
  312. package/dist/hk/mod.d.ts +3 -2
  313. package/dist/hr/mod.d.ts +3 -2
  314. package/dist/hr/vat.d.ts +2 -3
  315. package/dist/hr/vat.js +2 -9
  316. package/dist/hr/vat.js.map +1 -1
  317. package/dist/hu/mod.d.ts +3 -2
  318. package/dist/hu/vat.d.ts +2 -3
  319. package/dist/hu/vat.js +3 -10
  320. package/dist/hu/vat.js.map +1 -1
  321. package/dist/iban.d.ts +2 -3
  322. package/dist/iban.js +2 -8
  323. package/dist/iban.js.map +1 -1
  324. package/dist/id/mod.d.ts +3 -2
  325. package/dist/id/npwp.d.ts +2 -3
  326. package/dist/id/npwp.js +3 -13
  327. package/dist/id/npwp.js.map +1 -1
  328. package/dist/ie/mod.d.ts +3 -2
  329. package/dist/ie/pps.d.ts +2 -3
  330. package/dist/ie/pps.js +1 -10
  331. package/dist/ie/pps.js.map +1 -1
  332. package/dist/ie/vat.d.ts +2 -3
  333. package/dist/ie/vat.js +1 -9
  334. package/dist/ie/vat.js.map +1 -1
  335. package/dist/il/idnr.d.ts +2 -3
  336. package/dist/il/idnr.js +2 -9
  337. package/dist/il/idnr.js.map +1 -1
  338. package/dist/il/mod.d.ts +3 -2
  339. package/dist/in/aadhaar.d.ts +2 -3
  340. package/dist/in/aadhaar.js +2 -12
  341. package/dist/in/aadhaar.js.map +1 -1
  342. package/dist/in/gstin.d.ts +2 -3
  343. package/dist/in/gstin.js +4 -11
  344. package/dist/in/gstin.js.map +1 -1
  345. package/dist/in/mod.d.ts +3 -2
  346. package/dist/in/pan.d.ts +15 -2
  347. package/dist/in/pan.js +3 -15
  348. package/dist/in/pan.js.map +1 -1
  349. package/dist/index.d.ts +2 -2
  350. package/dist/index.js +6 -6
  351. package/dist/iq/mod.d.ts +3 -2
  352. package/dist/iq/nid.d.ts +16 -2
  353. package/dist/iq/nid.js +2 -15
  354. package/dist/iq/nid.js.map +1 -1
  355. package/dist/ir/mod.d.ts +3 -2
  356. package/dist/ir/nid.d.ts +2 -3
  357. package/dist/ir/nid.js +2 -24
  358. package/dist/ir/nid.js.map +1 -1
  359. package/dist/is/kennitala.d.ts +2 -3
  360. package/dist/is/kennitala.js +2 -13
  361. package/dist/is/kennitala.js.map +1 -1
  362. package/dist/is/mod.d.ts +3 -2
  363. package/dist/is/vsk.d.ts +9 -2
  364. package/dist/is/vsk.js +1 -7
  365. package/dist/is/vsk.js.map +1 -1
  366. package/dist/isin.d.ts +2 -3
  367. package/dist/isin.js +11 -21
  368. package/dist/isin.js.map +1 -1
  369. package/dist/it/codicefiscale.d.ts +5 -4
  370. package/dist/it/codicefiscale.js +27 -23
  371. package/dist/it/codicefiscale.js.map +1 -1
  372. package/dist/it/iva.d.ts +2 -3
  373. package/dist/it/iva.js +2 -9
  374. package/dist/it/iva.js.map +1 -1
  375. package/dist/it/mod.d.ts +3 -2
  376. package/dist/jp/cn.d.ts +2 -3
  377. package/dist/jp/cn.js +1 -9
  378. package/dist/jp/cn.js.map +1 -1
  379. package/dist/jp/mod.d.ts +3 -2
  380. package/dist/jp/mynumber.d.ts +2 -3
  381. package/dist/jp/mynumber.js +1 -10
  382. package/dist/jp/mynumber.js.map +1 -1
  383. package/dist/kr/brn.d.ts +11 -2
  384. package/dist/kr/brn.js +1 -9
  385. package/dist/kr/brn.js.map +1 -1
  386. package/dist/kr/mod.d.ts +3 -2
  387. package/dist/kr/rrn.d.ts +5 -4
  388. package/dist/kr/rrn.js +15 -13
  389. package/dist/kr/rrn.js.map +1 -1
  390. package/dist/kw/civil.d.ts +6 -5
  391. package/dist/kw/civil.js +20 -17
  392. package/dist/kw/civil.js.map +1 -1
  393. package/dist/kw/mod.d.ts +3 -2
  394. package/dist/kz/iin.d.ts +2 -3
  395. package/dist/kz/iin.js +4 -18
  396. package/dist/kz/iin.js.map +1 -1
  397. package/dist/kz/mod.d.ts +3 -2
  398. package/dist/lei.d.ts +2 -3
  399. package/dist/lei.js +2 -11
  400. package/dist/lei.js.map +1 -1
  401. package/dist/li/mod.d.ts +3 -2
  402. package/dist/li/peid.d.ts +11 -2
  403. package/dist/li/peid.js +1 -9
  404. package/dist/li/peid.js.map +1 -1
  405. package/dist/lk/mod.d.ts +3 -2
  406. package/dist/lk/nic.d.ts +5 -4
  407. package/dist/lk/nic.js +16 -16
  408. package/dist/lk/nic.js.map +1 -1
  409. package/dist/lt/asmens.d.ts +2 -3
  410. package/dist/lt/asmens.js +2 -1
  411. package/dist/lt/asmens.js.map +1 -1
  412. package/dist/lt/mod.d.ts +3 -2
  413. package/dist/lt/vat.d.ts +2 -3
  414. package/dist/lt/vat.js +2 -10
  415. package/dist/lt/vat.js.map +1 -1
  416. package/dist/lu/mod.d.ts +3 -2
  417. package/dist/lu/vat.d.ts +2 -3
  418. package/dist/lu/vat.js +2 -8
  419. package/dist/lu/vat.js.map +1 -1
  420. package/dist/luhn.d.ts +2 -3
  421. package/dist/luhn.js +9 -9
  422. package/dist/luhn.js.map +1 -1
  423. package/dist/lv/mod.d.ts +3 -2
  424. package/dist/lv/vat.d.ts +2 -3
  425. package/dist/lv/vat.js +19 -18
  426. package/dist/lv/vat.js.map +1 -1
  427. package/dist/ma/ice.d.ts +2 -3
  428. package/dist/ma/ice.js +2 -11
  429. package/dist/ma/ice.js.map +1 -1
  430. package/dist/ma/mod.d.ts +3 -2
  431. package/dist/mc/mod.d.ts +3 -2
  432. package/dist/mc/tva.d.ts +2 -3
  433. package/dist/mc/tva.js +1 -0
  434. package/dist/mc/tva.js.map +1 -1
  435. package/dist/md/idno.d.ts +2 -3
  436. package/dist/md/idno.js +1 -10
  437. package/dist/md/idno.js.map +1 -1
  438. package/dist/md/mod.d.ts +3 -2
  439. package/dist/me/mod.d.ts +3 -2
  440. package/dist/me/pib.d.ts +2 -3
  441. package/dist/me/pib.js +2 -10
  442. package/dist/me/pib.js.map +1 -1
  443. package/dist/mk/edb.d.ts +2 -3
  444. package/dist/mk/edb.js +2 -11
  445. package/dist/mk/edb.js.map +1 -1
  446. package/dist/mk/mod.d.ts +3 -2
  447. package/dist/mt/mod.d.ts +3 -2
  448. package/dist/mt/vat.d.ts +2 -3
  449. package/dist/mt/vat.js +3 -10
  450. package/dist/mt/vat.js.map +1 -1
  451. package/dist/mu/brn.d.ts +23 -2
  452. package/dist/mu/brn.js +1 -21
  453. package/dist/mu/brn.js.map +1 -1
  454. package/dist/mu/mod.d.ts +3 -2
  455. package/dist/mx/clabe.d.ts +2 -3
  456. package/dist/mx/clabe.js +1 -14
  457. package/dist/mx/clabe.js.map +1 -1
  458. package/dist/mx/curp.d.ts +5 -4
  459. package/dist/mx/curp.js +27 -19
  460. package/dist/mx/curp.js.map +1 -1
  461. package/dist/mx/mod.d.ts +3 -2
  462. package/dist/mx/rfc.d.ts +5 -4
  463. package/dist/mx/rfc.js +23 -20
  464. package/dist/mx/rfc.js.map +1 -1
  465. package/dist/my/mod.d.ts +3 -2
  466. package/dist/my/nric.d.ts +5 -4
  467. package/dist/my/nric.js +18 -16
  468. package/dist/my/nric.js.map +1 -1
  469. package/dist/ng/mod.d.ts +3 -2
  470. package/dist/ng/nin.d.ts +13 -2
  471. package/dist/ng/nin.js +1 -11
  472. package/dist/ng/nin.js.map +1 -1
  473. package/dist/ni/mod.d.ts +3 -2
  474. package/dist/ni/ruc.d.ts +2 -3
  475. package/dist/ni/ruc.js +1 -23
  476. package/dist/ni/ruc.js.map +1 -1
  477. package/dist/nl/bsn.d.ts +2 -3
  478. package/dist/nl/bsn.js +2 -10
  479. package/dist/nl/bsn.js.map +1 -1
  480. package/dist/nl/kvk.d.ts +9 -2
  481. package/dist/nl/kvk.js +1 -7
  482. package/dist/nl/kvk.js.map +1 -1
  483. package/dist/nl/mod.d.ts +3 -2
  484. package/dist/nl/vat.d.ts +2 -3
  485. package/dist/nl/vat.js +4 -50
  486. package/dist/nl/vat.js.map +1 -1
  487. package/dist/no/fodselsnummer.d.ts +2 -3
  488. package/dist/no/fodselsnummer.js +3 -10
  489. package/dist/no/fodselsnummer.js.map +1 -1
  490. package/dist/no/mod.d.ts +3 -2
  491. package/dist/no/mva.d.ts +2 -3
  492. package/dist/no/mva.js +1 -8
  493. package/dist/no/mva.js.map +1 -1
  494. package/dist/no/orgnr.d.ts +2 -3
  495. package/dist/no/orgnr.js +2 -8
  496. package/dist/no/orgnr.js.map +1 -1
  497. package/dist/nz/ird.d.ts +2 -3
  498. package/dist/nz/ird.js +4 -13
  499. package/dist/nz/ird.js.map +1 -1
  500. package/dist/nz/mod.d.ts +3 -2
  501. package/dist/pa/mod.d.ts +3 -2
  502. package/dist/pa/ruc.d.ts +2 -3
  503. package/dist/pa/ruc.js +4 -19
  504. package/dist/pa/ruc.js.map +1 -1
  505. package/dist/patterns.d.ts +8 -10
  506. package/dist/patterns.js +83 -28
  507. package/dist/patterns.js.map +1 -1
  508. package/dist/pe/mod.d.ts +3 -2
  509. package/dist/pe/ruc.d.ts +2 -3
  510. package/dist/pe/ruc.js +10 -24
  511. package/dist/pe/ruc.js.map +1 -1
  512. package/dist/ph/mod.d.ts +3 -2
  513. package/dist/ph/philid.d.ts +14 -2
  514. package/dist/ph/philid.js +1 -12
  515. package/dist/ph/philid.js.map +1 -1
  516. package/dist/pk/cnic.d.ts +14 -2
  517. package/dist/pk/cnic.js +1 -12
  518. package/dist/pk/cnic.js.map +1 -1
  519. package/dist/pk/mod.d.ts +3 -2
  520. package/dist/pl/mod.d.ts +3 -2
  521. package/dist/pl/nip.d.ts +2 -3
  522. package/dist/pl/nip.js +2 -10
  523. package/dist/pl/nip.js.map +1 -1
  524. package/dist/pl/pesel.d.ts +2 -3
  525. package/dist/pl/pesel.js +4 -13
  526. package/dist/pl/pesel.js.map +1 -1
  527. package/dist/pl/regon.d.ts +2 -3
  528. package/dist/pl/regon.js +2 -11
  529. package/dist/pl/regon.js.map +1 -1
  530. package/dist/pt/cc.d.ts +2 -3
  531. package/dist/pt/cc.js +7 -13
  532. package/dist/pt/cc.js.map +1 -1
  533. package/dist/pt/mod.d.ts +3 -2
  534. package/dist/pt/vat.d.ts +2 -3
  535. package/dist/pt/vat.js +3 -11
  536. package/dist/pt/vat.js.map +1 -1
  537. package/dist/ro/cnp.d.ts +2 -3
  538. package/dist/ro/cnp.js +5 -14
  539. package/dist/ro/cnp.js.map +1 -1
  540. package/dist/ro/mod.d.ts +3 -2
  541. package/dist/ro/vat.d.ts +2 -3
  542. package/dist/ro/vat.js +13 -11
  543. package/dist/ro/vat.js.map +1 -1
  544. package/dist/rs/mod.d.ts +3 -2
  545. package/dist/rs/pib.d.ts +2 -3
  546. package/dist/rs/pib.js +1 -9
  547. package/dist/rs/pib.js.map +1 -1
  548. package/dist/ru/inn.d.ts +2 -3
  549. package/dist/ru/inn.js +2 -12
  550. package/dist/ru/inn.js.map +1 -1
  551. package/dist/ru/mod.d.ts +3 -2
  552. package/dist/se/mod.d.ts +3 -2
  553. package/dist/se/orgnr.d.ts +2 -3
  554. package/dist/se/orgnr.js +2 -9
  555. package/dist/se/orgnr.js.map +1 -1
  556. package/dist/se/personnummer.d.ts +2 -3
  557. package/dist/se/personnummer.js +8 -15
  558. package/dist/se/personnummer.js.map +1 -1
  559. package/dist/se/vat.d.ts +2 -3
  560. package/dist/se/vat.js +3 -10
  561. package/dist/se/vat.js.map +1 -1
  562. package/dist/sg/mod.d.ts +3 -2
  563. package/dist/sg/uen.d.ts +2 -3
  564. package/dist/sg/uen.js +47 -70
  565. package/dist/sg/uen.js.map +1 -1
  566. package/dist/si/emso.d.ts +2 -3
  567. package/dist/si/emso.js +12 -14
  568. package/dist/si/emso.js.map +1 -1
  569. package/dist/si/mod.d.ts +3 -2
  570. package/dist/si/vat.d.ts +2 -3
  571. package/dist/si/vat.js +3 -12
  572. package/dist/si/vat.js.map +1 -1
  573. package/dist/sk/dic.d.ts +2 -3
  574. package/dist/sk/dic.js +1 -0
  575. package/dist/sk/dic.js.map +1 -1
  576. package/dist/sk/ico.d.ts +2 -3
  577. package/dist/sk/ico.js +1 -0
  578. package/dist/sk/ico.js.map +1 -1
  579. package/dist/sk/mod.d.ts +3 -2
  580. package/dist/sk/rc.d.ts +4 -5
  581. package/dist/sk/rc.js +6 -2
  582. package/dist/sk/rc.js.map +1 -1
  583. package/dist/th/mod.d.ts +3 -2
  584. package/dist/th/tin.d.ts +2 -3
  585. package/dist/th/tin.js +1 -11
  586. package/dist/th/tin.js.map +1 -1
  587. package/dist/tr/mod.d.ts +3 -2
  588. package/dist/tr/tckimlik.d.ts +2 -3
  589. package/dist/tr/tckimlik.js +1 -20
  590. package/dist/tr/tckimlik.js.map +1 -1
  591. package/dist/tr/vkn.d.ts +2 -3
  592. package/dist/tr/vkn.js +1 -20
  593. package/dist/tr/vkn.js.map +1 -1
  594. package/dist/tw/mod.d.ts +3 -2
  595. package/dist/tw/ubn.d.ts +2 -3
  596. package/dist/tw/ubn.js +2 -12
  597. package/dist/tw/ubn.js.map +1 -1
  598. package/dist/types.d.ts +56 -21
  599. package/dist/ua/edrpou.d.ts +2 -3
  600. package/dist/ua/edrpou.js +5 -12
  601. package/dist/ua/edrpou.js.map +1 -1
  602. package/dist/ua/mod.d.ts +3 -2
  603. package/dist/us/ein.d.ts +12 -2
  604. package/dist/us/ein.js +88 -97
  605. package/dist/us/ein.js.map +1 -1
  606. package/dist/us/itin.d.ts +13 -2
  607. package/dist/us/itin.js +4 -15
  608. package/dist/us/itin.js.map +1 -1
  609. package/dist/us/mod.d.ts +3 -2
  610. package/dist/us/rtn.d.ts +2 -3
  611. package/dist/us/rtn.js +11 -23
  612. package/dist/us/rtn.js.map +1 -1
  613. package/dist/us/ssn.d.ts +13 -2
  614. package/dist/us/ssn.js +1 -11
  615. package/dist/us/ssn.js.map +1 -1
  616. package/dist/uy/mod.d.ts +3 -2
  617. package/dist/uy/rut.d.ts +2 -3
  618. package/dist/uy/rut.js +2 -15
  619. package/dist/uy/rut.js.map +1 -1
  620. package/dist/ve/mod.d.ts +3 -2
  621. package/dist/ve/rif.d.ts +2 -3
  622. package/dist/ve/rif.js +13 -26
  623. package/dist/ve/rif.js.map +1 -1
  624. package/dist/vn/mod.d.ts +3 -2
  625. package/dist/vn/mst.d.ts +2 -3
  626. package/dist/vn/mst.js +1 -12
  627. package/dist/vn/mst.js.map +1 -1
  628. package/dist/za/idnr.d.ts +2 -3
  629. package/dist/za/idnr.js +4 -16
  630. package/dist/za/idnr.js.map +1 -1
  631. package/dist/za/mod.d.ts +3 -2
  632. package/package.json +34 -21
  633. package/src/_checksums/mod1110.ts +1 -1
  634. package/src/_checksums/mod112.ts +7 -6
  635. package/src/_util/generate.ts +38 -0
  636. package/src/ad/nrt.ts +19 -7
  637. package/src/ae/eid.ts +7 -3
  638. package/src/ai/tin.ts +7 -3
  639. package/src/al/nipt.ts +7 -3
  640. package/src/am/tin.ts +7 -3
  641. package/src/ar/cbu.ts +9 -5
  642. package/src/ar/cuit.ts +22 -10
  643. package/src/ar/dni.ts +7 -3
  644. package/src/at/businessid.ts +7 -3
  645. package/src/at/tin.ts +7 -3
  646. package/src/at/uid.ts +7 -3
  647. package/src/at/vnr.ts +62 -12
  648. package/src/au/abn.ts +7 -3
  649. package/src/au/acn.ts +7 -3
  650. package/src/au/tfn.ts +7 -3
  651. package/src/az/voen.ts +9 -3
  652. package/src/ba/jmbg.ts +9 -7
  653. package/src/bd/nid.ts +11 -7
  654. package/src/be/bis.ts +8 -4
  655. package/src/be/nn.ts +7 -3
  656. package/src/be/vat.ts +7 -3
  657. package/src/bg/egn.ts +19 -10
  658. package/src/bg/pnf.ts +7 -3
  659. package/src/bg/vat.ts +8 -3
  660. package/src/bh/cpr.ts +17 -4
  661. package/src/bic.ts +26 -20
  662. package/src/br/cnpj.ts +7 -3
  663. package/src/br/cpf.ts +7 -3
  664. package/src/by/unp.ts +19 -9
  665. package/src/bz/tin.ts +19 -4
  666. package/src/ca/bn.ts +7 -3
  667. package/src/ca/sin.ts +7 -3
  668. package/src/ch/ssn.ts +7 -3
  669. package/src/ch/uid.ts +7 -3
  670. package/src/ch/vat.ts +9 -5
  671. package/src/cl/rut.ts +11 -5
  672. package/src/cn/ric.ts +11 -7
  673. package/src/cn/uscc.ts +27 -11
  674. package/src/co/nit.ts +14 -6
  675. package/src/cr/cpf.ts +11 -6
  676. package/src/creditcard.ts +10 -6
  677. package/src/cu/ni.ts +28 -7
  678. package/src/cy/vat.ts +7 -3
  679. package/src/cz/dic.ts +9 -4
  680. package/src/cz/ico.ts +7 -3
  681. package/src/cz/rc.ts +61 -29
  682. package/src/de/handelsreg.ts +21 -6
  683. package/src/de/idnr.ts +10 -3
  684. package/src/de/stnr.ts +11 -3
  685. package/src/de/svnr.ts +14 -5
  686. package/src/de/vat.ts +7 -3
  687. package/src/dk/cpr.ts +23 -8
  688. package/src/dk/cvr.ts +7 -3
  689. package/src/dk/vat.ts +8 -3
  690. package/src/do/rnc.ts +9 -5
  691. package/src/ec/ruc.ts +9 -5
  692. package/src/ee/ik.ts +21 -10
  693. package/src/ee/registrikood.ts +12 -7
  694. package/src/ee/vat.ts +7 -3
  695. package/src/eg/tn.ts +7 -3
  696. package/src/es/cif.ts +10 -7
  697. package/src/es/dni.ts +7 -3
  698. package/src/es/nie.ts +18 -9
  699. package/src/es/nss.ts +7 -3
  700. package/src/es/vat.ts +13 -5
  701. package/src/eu/vat.ts +55 -6
  702. package/src/fi/hetu.ts +26 -8
  703. package/src/fi/vat.ts +8 -3
  704. package/src/fi/ytunnus.ts +7 -3
  705. package/src/fr/nif.ts +7 -3
  706. package/src/fr/nir.ts +9 -7
  707. package/src/fr/siren.ts +7 -3
  708. package/src/fr/siret.ts +7 -3
  709. package/src/fr/tva.ts +7 -3
  710. package/src/gb/nino.ts +18 -13
  711. package/src/gb/sedol.ts +21 -15
  712. package/src/gb/utr.ts +7 -3
  713. package/src/gb/vat.ts +7 -3
  714. package/src/ge/pin.ts +7 -3
  715. package/src/gh/tin.ts +11 -6
  716. package/src/gr/amka.ts +7 -3
  717. package/src/gr/vat.ts +7 -3
  718. package/src/gt/nit.ts +13 -6
  719. package/src/hk/hkid.ts +9 -4
  720. package/src/hr/vat.ts +7 -3
  721. package/src/hu/vat.ts +8 -3
  722. package/src/iban.ts +7 -3
  723. package/src/id/npwp.ts +7 -3
  724. package/src/ie/pps.ts +7 -3
  725. package/src/ie/vat.ts +7 -3
  726. package/src/il/idnr.ts +7 -3
  727. package/src/in/aadhaar.ts +7 -3
  728. package/src/in/gstin.ts +10 -4
  729. package/src/in/pan.ts +15 -6
  730. package/src/index.ts +6 -0
  731. package/src/iq/nid.ts +7 -3
  732. package/src/ir/nid.ts +7 -3
  733. package/src/is/kennitala.ts +7 -3
  734. package/src/is/vsk.ts +7 -3
  735. package/src/isin.ts +17 -7
  736. package/src/it/codicefiscale.ts +49 -7
  737. package/src/it/iva.ts +7 -3
  738. package/src/jp/cn.ts +7 -3
  739. package/src/jp/mynumber.ts +7 -3
  740. package/src/kr/brn.ts +7 -3
  741. package/src/kr/rrn.ts +27 -8
  742. package/src/kw/civil.ts +31 -14
  743. package/src/kz/iin.ts +9 -8
  744. package/src/lei.ts +7 -3
  745. package/src/li/peid.ts +7 -3
  746. package/src/lk/nic.ts +31 -8
  747. package/src/lt/asmens.ts +8 -4
  748. package/src/lt/vat.ts +8 -3
  749. package/src/lu/vat.ts +8 -3
  750. package/src/luhn.ts +10 -3
  751. package/src/lv/vat.ts +53 -23
  752. package/src/ma/ice.ts +7 -3
  753. package/src/mc/tva.ts +9 -5
  754. package/src/md/idno.ts +7 -3
  755. package/src/me/pib.ts +7 -3
  756. package/src/mk/edb.ts +7 -3
  757. package/src/mt/vat.ts +8 -3
  758. package/src/mu/brn.ts +7 -3
  759. package/src/mx/clabe.ts +7 -3
  760. package/src/mx/curp.ts +47 -10
  761. package/src/mx/rfc.ts +42 -7
  762. package/src/my/nric.ts +33 -8
  763. package/src/ng/nin.ts +7 -3
  764. package/src/ni/ruc.ts +7 -3
  765. package/src/nl/bsn.ts +7 -3
  766. package/src/nl/kvk.ts +7 -3
  767. package/src/nl/vat.ts +18 -69
  768. package/src/no/fodselsnummer.ts +12 -7
  769. package/src/no/mva.ts +9 -5
  770. package/src/no/orgnr.ts +7 -3
  771. package/src/nz/ird.ts +12 -8
  772. package/src/pa/ruc.ts +39 -11
  773. package/src/patterns.ts +184 -46
  774. package/src/pe/ruc.ts +13 -10
  775. package/src/ph/philid.ts +7 -3
  776. package/src/pk/cnic.ts +9 -3
  777. package/src/pl/nip.ts +7 -3
  778. package/src/pl/pesel.ts +9 -7
  779. package/src/pl/regon.ts +7 -3
  780. package/src/pt/cc.ts +13 -7
  781. package/src/pt/vat.ts +8 -3
  782. package/src/ro/cnp.ts +16 -8
  783. package/src/ro/vat.ts +8 -3
  784. package/src/rs/pib.ts +7 -3
  785. package/src/ru/inn.ts +9 -5
  786. package/src/se/orgnr.ts +7 -3
  787. package/src/se/personnummer.ts +35 -32
  788. package/src/se/vat.ts +8 -3
  789. package/src/sg/uen.ts +44 -23
  790. package/src/si/emso.ts +37 -11
  791. package/src/si/vat.ts +8 -3
  792. package/src/sk/dic.ts +8 -4
  793. package/src/sk/ico.ts +3 -2
  794. package/src/sk/rc.ts +17 -4
  795. package/src/th/tin.ts +7 -3
  796. package/src/tr/tckimlik.ts +7 -3
  797. package/src/tr/vkn.ts +7 -3
  798. package/src/tw/ubn.ts +9 -5
  799. package/src/types.ts +69 -7
  800. package/src/ua/edrpou.ts +10 -5
  801. package/src/us/ein.ts +95 -91
  802. package/src/us/itin.ts +14 -11
  803. package/src/us/rtn.ts +32 -19
  804. package/src/us/ssn.ts +7 -3
  805. package/src/uy/rut.ts +9 -5
  806. package/src/ve/rif.ts +19 -12
  807. package/src/vn/mst.ts +7 -3
  808. package/src/za/idnr.ts +9 -7
@@ -1 +1 @@
1
- {"version":3,"file":"tin.js","names":[],"sources":["../../src/at/tin.ts"],"sourcesContent":["/**\n * TIN (Abgabenkontonummer).\n *\n * Austrian tax identification number. 9 digits:\n * 2-digit tax office code (Finanzamtsnummer) +\n * 6-digit subject number + 1 check digit.\n * Uses a variant of the Luhn algorithm.\n *\n * @see https://de.wikipedia.org/wiki/Abgabenkontonummer\n * @see https://service.bmf.gv.at/Service/Anwend/Behoerden/show_mast.asp\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/** Luhn-variant doubling table: position-dependent. */\nconst DOUBLE = \"0246813579\";\n\nconst compact = (value: string): string =>\n clean(value, \" -./,\");\n\nconst calcCheckDigit = (number: string): string => {\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n const d = Number(number[i]);\n // Even positions (0-indexed) add digit as-is;\n // odd positions use the doubling table\n sum += i % 2 === 0 ? d : Number(DOUBLE[d]);\n }\n return String((10 - (sum % 10)) % 10);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Austrian TIN must be exactly 9 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Austrian TIN must contain only digits\",\n );\n }\n if (calcCheckDigit(v) !== v[8]) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Austrian TIN check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 2)}-${v.slice(2, 8)}/${v.slice(8)}`;\n};\n\n/** Generate a random valid Austrian TIN. */\nconst generate = (): string => {\n const payload = randomDigits(8);\n return payload + calcCheckDigit(payload);\n};\n\n/** Austrian Tax Identification Number. */\nconst tin: Validator = {\n name: \"Austrian Tax Identification Number\",\n localName: \"Abgabenkontonummer\",\n abbreviation: \"TIN\",\n aliases: [\"Steuernummer\", \"St.Nr.\", \"TIN\"] as const,\n candidatePattern: \"\\\\d{2}-?\\\\d{3}/\\\\d{4}\",\n country: \"AT\",\n entityType: \"any\",\n sourceUrl:\n \"https://de.wikipedia.org/wiki/Abgabenkontonummer\",\n examples: [\"591199013\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default tin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;AAoBA,MAAM,SAAS;AAEf,MAAM,WAAW,UACf,MAAM,OAAO,QAAQ;AAEvB,MAAM,kBAAkB,WAA2B;CACjD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EAC1B,MAAM,IAAI,OAAO,OAAO,GAAG;AAG3B,SAAO,IAAI,MAAM,IAAI,IAAI,OAAO,OAAO,GAAG;;AAE5C,QAAO,QAAQ,KAAM,MAAM,MAAO,GAAG;;AAGvC,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,wCACD;AAEH,KAAI,eAAe,EAAE,KAAK,EAAE,GAC1B,QAAO,IACL,oBACA,oCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;;;AAIxD,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,EAAE;AAC/B,QAAO,UAAU,eAAe,QAAQ;;;AAI1C,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAgB;EAAU;EAAM;CAC1C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,YAAY;CACvB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"tin.js","names":[],"sources":["../../src/at/tin.ts"],"sourcesContent":["/**\n * TIN (Abgabenkontonummer).\n *\n * Austrian tax identification number. 9 digits:\n * 2-digit tax office code (Finanzamtsnummer) +\n * 6-digit subject number + 1 check digit.\n * Uses a variant of the Luhn algorithm.\n *\n * @see https://de.wikipedia.org/wiki/Abgabenkontonummer\n * @see https://service.bmf.gv.at/Service/Anwend/Behoerden/show_mast.asp\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/** Luhn-variant doubling table: position-dependent. */\nconst DOUBLE = \"0246813579\";\n\nconst compact = (value: string): string =>\n clean(value, \" -./,\");\n\nconst calcCheckDigit = (number: string): string => {\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n const d = Number(number[i]);\n // Even positions (0-indexed) add digit as-is;\n // odd positions use the doubling table\n sum += i % 2 === 0 ? d : Number(DOUBLE[d]);\n }\n return String((10 - (sum % 10)) % 10);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Austrian TIN must be exactly 9 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Austrian TIN must contain only digits\",\n );\n }\n if (calcCheckDigit(v) !== v[8]) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Austrian TIN check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 2)}-${v.slice(2, 8)}/${v.slice(8)}`;\n};\n\n/** Generate a random valid Austrian TIN. */\nconst generate = (): string => {\n const payload = randomDigits(8);\n return payload + calcCheckDigit(payload);\n};\n\n/** Austrian Tax Identification Number. */\nconst tin: CountryValidator<\"AT\"> = {\n name: \"Austrian Tax Identification Number\",\n localName: \"Abgabenkontonummer\",\n abbreviation: \"TIN\",\n aliases: [\"Steuernummer\", \"St.Nr.\", \"TIN\"] as const,\n candidatePattern: \"\\\\d{2}-?\\\\d{3}/\\\\d{4}\",\n scope: \"country\",\n country: \"AT\",\n entityType: \"any\",\n sourceUrl:\n \"https://de.wikipedia.org/wiki/Abgabenkontonummer\",\n examples: [\"591199013\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default tin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAuBA,MAAM,SAAS;AAEf,MAAM,WAAW,UACf,MAAM,OAAO,OAAO;AAEtB,MAAM,kBAAkB,WAA2B;CACjD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EAC1B,MAAM,IAAI,OAAO,OAAO,EAAE;EAG1B,OAAO,IAAI,MAAM,IAAI,IAAI,OAAO,OAAO,EAAE;CAC3C;CACA,OAAO,QAAQ,KAAM,MAAM,MAAO,EAAE;AACtC;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,uCACF;CAEF,IAAI,eAAe,CAAC,MAAM,EAAE,IAC1B,OAAO,IACL,oBACA,mCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;AACvD;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,CAAC;CAC9B,OAAO,UAAU,eAAe,OAAO;AACzC;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAgB;EAAU;CAAK;CACzC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;AACF"}
package/dist/at/uid.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/at/uid.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid Austrian UID. */
9
8
  declare const generate: () => string;
10
9
  /** Austrian VAT Identification Number. */
11
- declare const uid: Validator;
10
+ declare const uid: CountryValidator<"AT">;
12
11
  //#endregion
13
12
  export { compact, uid as default, format, generate, validate };
14
13
  //# sourceMappingURL=uid.d.ts.map
package/dist/at/uid.js CHANGED
@@ -1,18 +1,9 @@
1
+ import { luhnChecksum } from "../_checksums/luhn.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits } from "../_util/generate.js";
3
4
  import { err } from "../_util/result.js";
4
- import { luhnChecksum } from "../_checksums/luhn.js";
5
5
  import { isdigits } from "../_util/strings.js";
6
6
  //#region src/at/uid.ts
7
- /**
8
- * UID (Umsatzsteuer-Identifikationsnummer).
9
- *
10
- * Austrian VAT identification number. Format:
11
- * "U" + 7 digits + 1 check digit. Uses a
12
- * modified Luhn algorithm.
13
- *
14
- * @see https://www.bmf.gv.at/
15
- */
16
7
  const compact = (value) => {
17
8
  let v = clean(value, " -/");
18
9
  if (v.startsWith("AT") || v.startsWith("at")) v = v.slice(2);
@@ -49,6 +40,7 @@ const uid = {
49
40
  "ATU"
50
41
  ],
51
42
  candidatePattern: "ATU\\d{8}",
43
+ scope: "country",
52
44
  country: "AT",
53
45
  entityType: "company",
54
46
  sourceUrl: "https://www.bmf.gv.at/",
@@ -1 +1 @@
1
- {"version":3,"file":"uid.js","names":[],"sources":["../../src/at/uid.ts"],"sourcesContent":["/**\n * UID (Umsatzsteuer-Identifikationsnummer).\n *\n * Austrian VAT identification number. Format:\n * \"U\" + 7 digits + 1 check digit. Uses a\n * modified Luhn algorithm.\n *\n * @see https://www.bmf.gv.at/\n */\n\nimport { luhnChecksum } from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/\");\n if (v.startsWith(\"AT\") || v.startsWith(\"at\")) {\n v = v.slice(2);\n }\n return v.toUpperCase();\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Austrian UID must be U + 8 digits\",\n );\n }\n if (v[0] !== \"U\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Austrian UID must start with U\",\n );\n }\n const digits = v.slice(1);\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"Austrian UID must be U + 8 digits\",\n );\n }\n const cs = luhnChecksum(digits.slice(0, 7));\n const check = (((6 - cs) % 10) + 10) % 10;\n if (check < 0 || check !== Number(digits[7])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Austrian UID check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `AT${compact(value)}`;\n\n/** Generate a random valid Austrian UID. */\nconst generate = (): string => {\n const payload = randomDigits(7);\n const cs = luhnChecksum(payload);\n const check = (((6 - cs) % 10) + 10) % 10;\n return \"U\" + payload + String(check);\n};\n\n/** Austrian VAT Identification Number. */\nconst uid: Validator = {\n name: \"Austrian VAT Number\",\n localName: \"Umsatzsteuer-Identifikationsnummer\",\n abbreviation: \"UID\",\n aliases: [\n \"UID\",\n \"Umsatzsteuer-Identifikationsnummer\",\n \"ATU\",\n ] as const,\n candidatePattern: \"ATU\\\\d{8}\",\n country: \"AT\",\n entityType: \"company\",\n sourceUrl: \"https://www.bmf.gv.at/\",\n examples: [\"U13585627\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default uid;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,MAAM;AAC3B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,KAAI,EAAE,MAAM,EAAE;AAEhB,QAAO,EAAE,aAAa;;AAGxB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,oCACD;AAEH,KAAI,EAAE,OAAO,IACX,QAAO,IACL,qBACA,iCACD;CAEH,MAAM,SAAS,EAAE,MAAM,EAAE;AACzB,KAAI,CAAC,SAAS,OAAO,CACnB,QAAO,IACL,kBACA,oCACD;CAGH,MAAM,UAAW,IADN,aAAa,OAAO,MAAM,GAAG,EAAE,CAAC,IAChB,KAAM,MAAM;AACvC,KAAI,QAAQ,KAAK,UAAU,OAAO,OAAO,GAAG,CAC1C,QAAO,IACL,oBACA,oCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UACd,KAAK,QAAQ,MAAM;;AAGrB,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,EAAE;CAE/B,MAAM,UAAW,IADN,aAAa,QAAQ,IACL,KAAM,MAAM;AACvC,QAAO,MAAM,UAAU,OAAO,MAAM;;;AAItC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,YAAY;CACvB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"uid.js","names":[],"sources":["../../src/at/uid.ts"],"sourcesContent":["/**\n * UID (Umsatzsteuer-Identifikationsnummer).\n *\n * Austrian VAT identification number. Format:\n * \"U\" + 7 digits + 1 check digit. Uses a\n * modified Luhn algorithm.\n *\n * @see https://www.bmf.gv.at/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { luhnChecksum } from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/\");\n if (v.startsWith(\"AT\") || v.startsWith(\"at\")) {\n v = v.slice(2);\n }\n return v.toUpperCase();\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Austrian UID must be U + 8 digits\",\n );\n }\n if (v[0] !== \"U\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Austrian UID must start with U\",\n );\n }\n const digits = v.slice(1);\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"Austrian UID must be U + 8 digits\",\n );\n }\n const cs = luhnChecksum(digits.slice(0, 7));\n const check = (((6 - cs) % 10) + 10) % 10;\n if (check < 0 || check !== Number(digits[7])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Austrian UID check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `AT${compact(value)}`;\n\n/** Generate a random valid Austrian UID. */\nconst generate = (): string => {\n const payload = randomDigits(7);\n const cs = luhnChecksum(payload);\n const check = (((6 - cs) % 10) + 10) % 10;\n return \"U\" + payload + String(check);\n};\n\n/** Austrian VAT Identification Number. */\nconst uid: CountryValidator<\"AT\"> = {\n name: \"Austrian VAT Number\",\n localName: \"Umsatzsteuer-Identifikationsnummer\",\n abbreviation: \"UID\",\n aliases: [\n \"UID\",\n \"Umsatzsteuer-Identifikationsnummer\",\n \"ATU\",\n ] as const,\n candidatePattern: \"ATU\\\\d{8}\",\n scope: \"country\",\n country: \"AT\",\n entityType: \"company\",\n sourceUrl: \"https://www.bmf.gv.at/\",\n examples: [\"U13585627\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default uid;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAqBA,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,KAAK;CAC1B,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO,EAAE,YAAY;AACvB;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,mCACF;CAEF,IAAI,EAAE,OAAO,KACX,OAAO,IACL,qBACA,gCACF;CAEF,MAAM,SAAS,EAAE,MAAM,CAAC;CACxB,IAAI,CAAC,SAAS,MAAM,GAClB,OAAO,IACL,kBACA,mCACF;CAGF,MAAM,UAAW,IADN,aAAa,OAAO,MAAM,GAAG,CAAC,CACnB,KAAK,KAAM,MAAM;CACvC,IAAI,QAAQ,KAAK,UAAU,OAAO,OAAO,EAAE,GACzC,OAAO,IACL,oBACA,mCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UACd,KAAK,QAAQ,KAAK;;AAGpB,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,CAAC;CAE9B,MAAM,UAAW,IADN,aAAa,OACF,KAAK,KAAM,MAAM;CACvC,OAAO,MAAM,UAAU,OAAO,KAAK;AACrC;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;AACF"}
package/dist/at/vnr.d.ts CHANGED
@@ -1,12 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/at/vnr.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
7
+ /** Generate a random valid Austrian VNR. */
8
+ declare const generate: () => string;
8
9
  /** Austrian Social Insurance Number. */
9
- declare const vnr: Validator;
10
+ declare const vnr: CountryValidator<"AT">;
10
11
  //#endregion
11
- export { compact, vnr as default, format, validate };
12
+ export { compact, vnr as default, format, generate, validate };
12
13
  //# sourceMappingURL=vnr.d.ts.map
package/dist/at/vnr.js CHANGED
@@ -1,19 +1,9 @@
1
1
  import { clean } from "../_util/clean.js";
2
+ import { randomDigits, randomInt } from "../_util/generate.js";
2
3
  import { err } from "../_util/result.js";
3
4
  import { isdigits } from "../_util/strings.js";
4
5
  //#region src/at/vnr.ts
5
6
  /**
6
- * VNR (Versicherungsnummer).
7
- *
8
- * Austrian social insurance number. 10 digits: 3-digit
9
- * serial + 1 check digit + 6-digit birth date (DDMMYY).
10
- * The check digit is computed using a weighted sum
11
- * mod 11 over the 9 non-check digits.
12
- *
13
- * @see https://de.wikipedia.org/wiki/Sozialversicherungsnummer#%C3%96sterreich
14
- * @see https://www.sozialversicherung.at/
15
- */
16
- /**
17
7
  * Weights for the 9 non-check digits (positions
18
8
  * 0,1,2, then 4,5,6,7,8,9). Check digit is at
19
9
  * position 3 and equals the weighted sum mod 11.
@@ -34,12 +24,12 @@ const validate = (value) => {
34
24
  const v = compact(value);
35
25
  if (v.length !== 10) return err("INVALID_LENGTH", "Austrian VNR must be 10 digits");
36
26
  if (!isdigits(v)) return err("INVALID_FORMAT", "Austrian VNR must contain only digits");
27
+ if (v[0] === "0") return err("INVALID_COMPONENT", "Austrian VNR serial must not start with zero");
37
28
  const day = Number(v.slice(4, 6));
38
- const month = Number(v.slice(6, 8));
39
- if (day < 1 || day > 31 || month < 1 || month > 12) return err("INVALID_COMPONENT", "Austrian VNR contains an invalid birth date");
29
+ if (day < 1 || day > 31) return err("INVALID_COMPONENT", "Austrian VNR day field must be within 01-31");
40
30
  const digits = v.slice(0, 3) + v.slice(4);
41
31
  let sum = 0;
42
- for (let i = 0; i < 9; i++) sum += Number(digits[i]) * WEIGHTS[i];
32
+ for (const [i, weight] of WEIGHTS.entries()) sum += Number(digits[i]) * weight;
43
33
  const check = sum % 11;
44
34
  if (check === 10) return err("INVALID_CHECKSUM", "Austrian VNR check digit is invalid (mod 11 remainder is 10)");
45
35
  if (check !== Number(v[3])) return err("INVALID_CHECKSUM", "Austrian VNR check digit mismatch");
@@ -52,6 +42,21 @@ const format = (value) => {
52
42
  const v = compact(value);
53
43
  return `${v.slice(0, 4)} ${v.slice(4, 6)}${v.slice(6, 8)}${v.slice(8)}`;
54
44
  };
45
+ /** Generate a random valid Austrian VNR. */
46
+ const generate = () => {
47
+ for (;;) {
48
+ const serial = String(randomInt(1, 9)) + randomDigits(2);
49
+ const day = String(randomInt(1, 28)).padStart(2, "0");
50
+ const month = String(randomInt(1, 12)).padStart(2, "0");
51
+ const year = String(randomInt(0, 99)).padStart(2, "0");
52
+ const digits = `${serial}${day}${month}${year}`;
53
+ let sum = 0;
54
+ for (const [i, weight] of WEIGHTS.entries()) sum += Number(digits[i]) * weight;
55
+ const check = sum % 11;
56
+ if (check === 10) continue;
57
+ return `${serial}${String(check)}${day}${month}${year}`;
58
+ }
59
+ };
55
60
  /** Austrian Social Insurance Number. */
56
61
  const vnr = {
57
62
  name: "Austrian Social Insurance Number",
@@ -64,6 +69,7 @@ const vnr = {
64
69
  "Sozialversicherungsnummer"
65
70
  ],
66
71
  candidatePattern: "\\d{4}\\s?\\d{6}",
72
+ scope: "country",
67
73
  country: "AT",
68
74
  entityType: "person",
69
75
  sourceUrl: "https://de.wikipedia.org/wiki/Sozialversicherungsnummer",
@@ -71,9 +77,10 @@ const vnr = {
71
77
  examples: ["1237010180"],
72
78
  compact,
73
79
  format,
74
- validate
80
+ validate,
81
+ generate
75
82
  };
76
83
  //#endregion
77
- export { compact, vnr as default, format, validate };
84
+ export { compact, vnr as default, format, generate, validate };
78
85
 
79
86
  //# sourceMappingURL=vnr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vnr.js","names":[],"sources":["../../src/at/vnr.ts"],"sourcesContent":["/**\n * VNR (Versicherungsnummer).\n *\n * Austrian social insurance number. 10 digits: 3-digit\n * serial + 1 check digit + 6-digit birth date (DDMMYY).\n * The check digit is computed using a weighted sum\n * mod 11 over the 9 non-check digits.\n *\n * @see https://de.wikipedia.org/wiki/Sozialversicherungsnummer#%C3%96sterreich\n * @see https://www.sozialversicherung.at/\n */\n\nimport { clean } from \"#util/clean\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\n/**\n * Weights for the 9 non-check digits (positions\n * 0,1,2, then 4,5,6,7,8,9). Check digit is at\n * position 3 and equals the weighted sum mod 11.\n */\nconst WEIGHTS = [3, 7, 9, 5, 8, 4, 2, 1, 6];\n\nconst compact = (value: string): string =>\n clean(value, \" -/\").trim();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Austrian VNR must be 10 digits\",\n );\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Austrian VNR must contain only digits\",\n );\n }\n\n // Validate birth date (DDMMYY in positions 4-9)\n const day = Number(v.slice(4, 6));\n const month = Number(v.slice(6, 8));\n if (day < 1 || day > 31 || month < 1 || month > 12) {\n return err(\n \"INVALID_COMPONENT\",\n \"Austrian VNR contains an invalid birth date\",\n );\n }\n\n // Check digit at position 3: weighted sum of the\n // other 9 digits mod 11. If remainder is 10 the\n // number is invalid.\n const digits = v.slice(0, 3) + v.slice(4);\n let sum = 0;\n for (let i = 0; i < 9; i++) {\n sum += Number(digits[i]) * WEIGHTS[i]!;\n }\n const check = sum % 11;\n if (check === 10) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Austrian VNR check digit is invalid (mod 11 \" +\n \"remainder is 10)\",\n );\n }\n if (check !== Number(v[3])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Austrian VNR 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 return `${v.slice(0, 4)} ${v.slice(4, 6)}${v.slice(6, 8)}${v.slice(8)}`;\n};\n\n/** Austrian Social Insurance Number. */\nconst vnr: Validator = {\n name: \"Austrian Social Insurance Number\",\n localName: \"Versicherungsnummer\",\n abbreviation: \"VNR\",\n aliases: [\n \"VNR\",\n \"SVNR\",\n \"Versicherungsnummer\",\n \"Sozialversicherungsnummer\",\n ] as const,\n candidatePattern: \"\\\\d{4}\\\\s?\\\\d{6}\",\n country: \"AT\",\n entityType: \"person\",\n sourceUrl:\n \"https://de.wikipedia.org/wiki/Sozialversicherungsnummer\",\n lengths: [10] as const,\n examples: [\"1237010180\"] as const,\n compact,\n format,\n validate,\n};\n\nexport default vnr;\nexport { compact, format, validate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAE3C,MAAM,WAAW,UACf,MAAM,OAAO,MAAM,CAAC,MAAM;AAE5B,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,iCACD;AAGH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,wCACD;CAIH,MAAM,MAAM,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CACjC,MAAM,QAAQ,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;AACnC,KAAI,MAAM,KAAK,MAAM,MAAM,QAAQ,KAAK,QAAQ,GAC9C,QAAO,IACL,qBACA,8CACD;CAMH,MAAM,SAAS,EAAE,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE;CACzC,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,QAAO,OAAO,OAAO,GAAG,GAAG,QAAQ;CAErC,MAAM,QAAQ,MAAM;AACpB,KAAI,UAAU,GACZ,QAAO,IACL,oBACA,+DAED;AAEH,KAAI,UAAU,OAAO,EAAE,GAAG,CACxB,QAAO,IACL,oBACA,oCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE;;;AAIvE,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WACE;CACF,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,aAAa;CACxB;CACA;CACA;CACD"}
1
+ {"version":3,"file":"vnr.js","names":[],"sources":["../../src/at/vnr.ts"],"sourcesContent":["/**\n * VNR (Versicherungsnummer).\n *\n * Austrian social insurance number. 10 digits: 3-digit\n * serial + 1 check digit + 6-digit birth date (DDMMYY).\n * The check digit is computed using a weighted sum\n * mod 11 over the 9 non-check digits.\n *\n * The 6-digit \"birth date\" field is not always a real\n * calendar date. Sozialversicherung.at documents that\n * persons with unknown date of birth are issued\n * substitute values (01.01. or 01.07.), and that\n * months 13, 14, etc. are issued when the daily serial\n * pool for a given substitute date is exhausted. We\n * therefore do not enforce a calendar-valid month here.\n * The day field, however, is always within 01-31 — even\n * in the documented overflow cases the day stays \"01\"\n * — so we keep the day-bounds check.\n *\n * @see https://de.wikipedia.org/wiki/Sozialversicherungsnummer#%C3%96sterreich\n * @see https://www.sozialversicherung.at/cdscontent/?contentid=10007.820902&viewmode=content\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\";\nimport { isdigits } from \"#util/strings\";\n\n/**\n * Weights for the 9 non-check digits (positions\n * 0,1,2, then 4,5,6,7,8,9). Check digit is at\n * position 3 and equals the weighted sum mod 11.\n */\nconst WEIGHTS = [3, 7, 9, 5, 8, 4, 2, 1, 6] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -/\").trim();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Austrian VNR must be 10 digits\",\n );\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Austrian VNR must contain only digits\",\n );\n }\n\n // Per sozialversicherung.at, the 3-digit serial\n // (positions 0-2) never starts with zero.\n if (v[0] === \"0\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Austrian VNR serial must not start with zero\",\n );\n }\n\n // Day (positions 4-5) is always within 01-31, even\n // in the documented substitute and overflow cases\n // where the month is shifted. The month is left\n // unchecked per the source.\n const day = Number(v.slice(4, 6));\n if (day < 1 || day > 31) {\n return err(\n \"INVALID_COMPONENT\",\n \"Austrian VNR day field must be within 01-31\",\n );\n }\n\n // Check digit at position 3: weighted sum of the\n // other 9 digits mod 11. If remainder is 10 the\n // number is invalid.\n const digits = v.slice(0, 3) + v.slice(4);\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n sum += Number(digits[i]) * weight;\n }\n const check = sum % 11;\n if (check === 10) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Austrian VNR check digit is invalid (mod 11 \" +\n \"remainder is 10)\",\n );\n }\n if (check !== Number(v[3])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Austrian VNR 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 return `${v.slice(0, 4)} ${v.slice(4, 6)}${v.slice(6, 8)}${v.slice(8)}`;\n};\n\n/** Generate a random valid Austrian VNR. */\nconst generate = (): string => {\n for (;;) {\n // Serial must not start with zero (see validate).\n const serial =\n String(randomInt(1, 9)) + randomDigits(2);\n const day = String(randomInt(1, 28)).padStart(2, \"0\");\n const month = String(randomInt(1, 12)).padStart(2, \"0\");\n const year = String(randomInt(0, 99)).padStart(2, \"0\");\n const digits = `${serial}${day}${month}${year}`;\n\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n sum += Number(digits[i]) * weight;\n }\n\n const check = sum % 11;\n if (check === 10) continue;\n return `${serial}${String(check)}${day}${month}${year}`;\n }\n};\n\n/** Austrian Social Insurance Number. */\nconst vnr: CountryValidator<\"AT\"> = {\n name: \"Austrian Social Insurance Number\",\n localName: \"Versicherungsnummer\",\n abbreviation: \"VNR\",\n aliases: [\n \"VNR\",\n \"SVNR\",\n \"Versicherungsnummer\",\n \"Sozialversicherungsnummer\",\n ] as const,\n candidatePattern: \"\\\\d{4}\\\\s?\\\\d{6}\",\n scope: \"country\",\n country: \"AT\",\n entityType: \"person\",\n sourceUrl:\n \"https://de.wikipedia.org/wiki/Sozialversicherungsnummer\",\n lengths: [10] as const,\n examples: [\"1237010180\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vnr;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;;;;;AAsCA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAE1C,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,EAAE,KAAK;AAE3B,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,gCACF;CAGF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,uCACF;CAKF,IAAI,EAAE,OAAO,KACX,OAAO,IACL,qBACA,8CACF;CAOF,MAAM,MAAM,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAChC,IAAI,MAAM,KAAK,MAAM,IACnB,OAAO,IACL,qBACA,6CACF;CAMF,MAAM,SAAS,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC;CACxC,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GACxC,OAAO,OAAO,OAAO,EAAE,IAAI;CAE7B,MAAM,QAAQ,MAAM;CACpB,IAAI,UAAU,IACZ,OAAO,IACL,oBACA,8DAEF;CAEF,IAAI,UAAU,OAAO,EAAE,EAAE,GACvB,OAAO,IACL,oBACA,mCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC;AACtE;;AAGA,MAAM,iBAAyB;CAC7B,SAAS;EAEP,MAAM,SACJ,OAAO,UAAU,GAAG,CAAC,CAAC,IAAI,aAAa,CAAC;EAC1C,MAAM,MAAM,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;EACpD,MAAM,QAAQ,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;EACtD,MAAM,OAAO,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;EACrD,MAAM,SAAS,GAAG,SAAS,MAAM,QAAQ;EAEzC,IAAI,MAAM;EACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GACxC,OAAO,OAAO,OAAO,EAAE,IAAI;EAG7B,MAAM,QAAQ,MAAM;EACpB,IAAI,UAAU,IAAI;EAClB,OAAO,GAAG,SAAS,OAAO,KAAK,IAAI,MAAM,QAAQ;CACnD;AACF;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,YAAY;CACvB;CACA;CACA;CACA;AACF"}
package/dist/au/abn.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/au/abn.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid ABN. */
9
8
  declare const generate: () => string;
10
9
  /** Australian Business Number. */
11
- declare const abn: Validator;
10
+ declare const abn: CountryValidator<"AU">;
12
11
  //#endregion
13
12
  export { compact, abn as default, format, generate, validate };
14
13
  //# sourceMappingURL=abn.d.ts.map
package/dist/au/abn.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/au/abn.ts
6
- /**
7
- * ABN (Australian Business Number).
8
- *
9
- * 11-digit identifier. Subtract 1 from the first
10
- * digit, then apply weights [10,1,3,5,7,9,11,13,
11
- * 15,17,19]; sum mod 89 must equal 0.
12
- *
13
- * @see https://en.wikipedia.org/wiki/Australian_Business_Number
14
- * @see https://abr.business.gov.au/
15
- */
16
6
  const WEIGHTS = [
17
7
  10,
18
8
  1,
@@ -62,6 +52,7 @@ const abn = {
62
52
  abbreviation: "ABN",
63
53
  aliases: ["ABN", "Australian Business Number"],
64
54
  candidatePattern: "\\d{2}\\s?\\d{3}\\s?\\d{3}\\s?\\d{3}",
55
+ scope: "country",
65
56
  country: "AU",
66
57
  entityType: "company",
67
58
  sourceUrl: "https://abr.business.gov.au/",
@@ -1 +1 @@
1
- {"version":3,"file":"abn.js","names":[],"sources":["../../src/au/abn.ts"],"sourcesContent":["/**\n * ABN (Australian Business Number).\n *\n * 11-digit identifier. Subtract 1 from the first\n * digit, then apply weights [10,1,3,5,7,9,11,13,\n * 15,17,19]; sum mod 89 must equal 0.\n *\n * @see https://en.wikipedia.org/wiki/Australian_Business_Number\n * @see https://abr.business.gov.au/\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 WEIGHTS = [\n 10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19,\n] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"ABN must contain only digits\",\n );\n }\n if (v.length !== 11) {\n return err(\"INVALID_LENGTH\", \"ABN must be 11 digits\");\n }\n\n let sum = 0;\n for (let i = 0; i < 11; i++) {\n let d = Number(v.charAt(i));\n if (i === 0) d -= 1;\n sum += d * (WEIGHTS[i] ?? 0);\n }\n if (sum % 89 !== 0) {\n return err(\"INVALID_CHECKSUM\", \"ABN checksum mismatch\");\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 11) {\n return `${v.slice(0, 2)} ${v.slice(2, 5)} ${v.slice(5, 8)} ${v.slice(8)}`;\n }\n return v;\n};\n\n/** Generate a random valid ABN. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(11);\n if (validate(c).valid) return c;\n }\n};\n\n/** Australian Business Number. */\nconst abn: Validator = {\n name: \"Australian Business Number\",\n localName: \"Australian Business Number\",\n abbreviation: \"ABN\",\n aliases: [\"ABN\", \"Australian Business Number\"] as const,\n candidatePattern: \"\\\\d{2}\\\\s?\\\\d{3}\\\\s?\\\\d{3}\\\\s?\\\\d{3}\",\n country: \"AU\",\n entityType: \"company\",\n sourceUrl: \"https://abr.business.gov.au/\",\n examples: [\"83914571673\", \"51824753556\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default abn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,UAAU;CACd;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CACpC;AAED,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;AAEH,KAAI,EAAE,WAAW,GACf,QAAO,IAAI,kBAAkB,wBAAwB;CAGvD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;EAC3B,IAAI,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;AAC3B,MAAI,MAAM,EAAG,MAAK;AAClB,SAAO,KAAK,QAAQ,MAAM;;AAE5B,KAAI,MAAM,OAAO,EACf,QAAO,IAAI,oBAAoB,wBAAwB;AAGzD,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;AAEzE,QAAO;;;AAIT,MAAM,iBAAyB;AAC7B,UAAS;EACP,MAAM,IAAI,aAAa,GAAG;AAC1B,MAAI,SAAS,EAAE,CAAC,MAAO,QAAO;;;;AAKlC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,6BAA6B;CAC9C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,eAAe,cAAc;CACxC;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"abn.js","names":[],"sources":["../../src/au/abn.ts"],"sourcesContent":["/**\n * ABN (Australian Business Number).\n *\n * 11-digit identifier. Subtract 1 from the first\n * digit, then apply weights [10,1,3,5,7,9,11,13,\n * 15,17,19]; sum mod 89 must equal 0.\n *\n * @see https://en.wikipedia.org/wiki/Australian_Business_Number\n * @see https://abr.business.gov.au/\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 WEIGHTS = [\n 10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19,\n] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"ABN must contain only digits\",\n );\n }\n if (v.length !== 11) {\n return err(\"INVALID_LENGTH\", \"ABN must be 11 digits\");\n }\n\n let sum = 0;\n for (let i = 0; i < 11; i++) {\n let d = Number(v.charAt(i));\n if (i === 0) d -= 1;\n sum += d * (WEIGHTS[i] ?? 0);\n }\n if (sum % 89 !== 0) {\n return err(\"INVALID_CHECKSUM\", \"ABN checksum mismatch\");\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 11) {\n return `${v.slice(0, 2)} ${v.slice(2, 5)} ${v.slice(5, 8)} ${v.slice(8)}`;\n }\n return v;\n};\n\n/** Generate a random valid ABN. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(11);\n if (validate(c).valid) return c;\n }\n};\n\n/** Australian Business Number. */\nconst abn: CountryValidator<\"AU\"> = {\n name: \"Australian Business Number\",\n localName: \"Australian Business Number\",\n abbreviation: \"ABN\",\n aliases: [\"ABN\", \"Australian Business Number\"] as const,\n candidatePattern: \"\\\\d{2}\\\\s?\\\\d{3}\\\\s?\\\\d{3}\\\\s?\\\\d{3}\",\n scope: \"country\",\n country: \"AU\",\n entityType: \"company\",\n sourceUrl: \"https://abr.business.gov.au/\",\n examples: [\"83914571673\", \"51824753556\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default abn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAqBA,MAAM,UAAU;CACd;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;AACrC;AAEA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAEF,IAAI,EAAE,WAAW,IACf,OAAO,IAAI,kBAAkB,uBAAuB;CAGtD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;EAC3B,IAAI,IAAI,OAAO,EAAE,OAAO,CAAC,CAAC;EAC1B,IAAI,MAAM,GAAG,KAAK;EAClB,OAAO,KAAK,QAAQ,MAAM;CAC5B;CACA,IAAI,MAAM,OAAO,GACf,OAAO,IAAI,oBAAoB,uBAAuB;CAGxD,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;CAExE,OAAO;AACT;;AAGA,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,IAAI,aAAa,EAAE;EACzB,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO;CAChC;AACF;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,4BAA4B;CAC7C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,eAAe,aAAa;CACvC;CACA;CACA;CACA;AACF"}
package/dist/au/acn.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/au/acn.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid ACN. */
9
8
  declare const generate: () => string;
10
9
  /** Australian Company Number. */
11
- declare const acn: Validator;
10
+ declare const acn: CountryValidator<"AU">;
12
11
  //#endregion
13
12
  export { compact, acn as default, format, generate, validate };
14
13
  //# sourceMappingURL=acn.d.ts.map
package/dist/au/acn.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/au/acn.ts
6
- /**
7
- * ACN (Australian Company Number).
8
- *
9
- * 9-digit identifier. Weights [8,7,6,5,4,3,2,1]
10
- * applied to the first 8 digits; check digit is
11
- * (10 - sum % 10) % 10.
12
- *
13
- * @see https://en.wikipedia.org/wiki/Australian_Company_Number
14
- * @see https://asic.gov.au/
15
- */
16
6
  const WEIGHTS = [
17
7
  8,
18
8
  7,
@@ -55,6 +45,7 @@ const acn = {
55
45
  abbreviation: "ACN",
56
46
  aliases: ["ACN", "Australian Company Number"],
57
47
  candidatePattern: "\\d{3}\\s?\\d{3}\\s?\\d{3}",
48
+ scope: "country",
58
49
  country: "AU",
59
50
  entityType: "company",
60
51
  sourceUrl: "https://asic.gov.au/",
@@ -1 +1 @@
1
- {"version":3,"file":"acn.js","names":[],"sources":["../../src/au/acn.ts"],"sourcesContent":["/**\n * ACN (Australian Company Number).\n *\n * 9-digit identifier. Weights [8,7,6,5,4,3,2,1]\n * applied to the first 8 digits; check digit is\n * (10 - sum % 10) % 10.\n *\n * @see https://en.wikipedia.org/wiki/Australian_Company_Number\n * @see https://asic.gov.au/\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 WEIGHTS = [8, 7, 6, 5, 4, 3, 2, 1] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"ACN must contain only digits\",\n );\n }\n if (v.length !== 9) {\n return err(\"INVALID_LENGTH\", \"ACN must be 9 digits\");\n }\n\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n sum += Number(v.charAt(i)) * (WEIGHTS[i] ?? 0);\n }\n const check = (10 - (sum % 10)) % 10;\n if (check !== Number(v.charAt(8))) {\n return err(\n \"INVALID_CHECKSUM\",\n \"ACN 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 if (v.length === 9) {\n return `${v.slice(0, 3)} ${v.slice(3, 6)} ${v.slice(6)}`;\n }\n return v;\n};\n\n/** Generate a random valid ACN. */\nconst generate = (): string => {\n const payload = randomDigits(8);\n let sum = 0;\n for (let i = 0; i < 8; i++)\n sum += Number(payload.charAt(i)) * (WEIGHTS[i] ?? 0);\n return payload + String((10 - (sum % 10)) % 10);\n};\n\n/** Australian Company Number. */\nconst acn: Validator = {\n name: \"Australian Company Number\",\n localName: \"Australian Company Number\",\n abbreviation: \"ACN\",\n aliases: [\"ACN\", \"Australian Company Number\"] as const,\n candidatePattern: \"\\\\d{3}\\\\s?\\\\d{3}\\\\s?\\\\d{3}\",\n country: \"AU\",\n entityType: \"company\",\n sourceUrl: \"https://asic.gov.au/\",\n examples: [\"004085616\", \"010499966\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default acn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAExC,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;AAEH,KAAI,EAAE,WAAW,EACf,QAAO,IAAI,kBAAkB,uBAAuB;CAGtD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,QAAO,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,QAAQ,MAAM;AAG9C,MADe,KAAM,MAAM,MAAO,OACpB,OAAO,EAAE,OAAO,EAAE,CAAC,CAC/B,QAAO,IACL,oBACA,2BACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;AAExD,QAAO;;;AAIT,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,EAAE;CAC/B,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,QAAO,OAAO,QAAQ,OAAO,EAAE,CAAC,IAAI,QAAQ,MAAM;AACpD,QAAO,UAAU,QAAQ,KAAM,MAAM,MAAO,GAAG;;;AAIjD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,4BAA4B;CAC7C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,aAAa,YAAY;CACpC;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"acn.js","names":[],"sources":["../../src/au/acn.ts"],"sourcesContent":["/**\n * ACN (Australian Company Number).\n *\n * 9-digit identifier. Weights [8,7,6,5,4,3,2,1]\n * applied to the first 8 digits; check digit is\n * (10 - sum % 10) % 10.\n *\n * @see https://en.wikipedia.org/wiki/Australian_Company_Number\n * @see https://asic.gov.au/\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 WEIGHTS = [8, 7, 6, 5, 4, 3, 2, 1] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"ACN must contain only digits\",\n );\n }\n if (v.length !== 9) {\n return err(\"INVALID_LENGTH\", \"ACN must be 9 digits\");\n }\n\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n sum += Number(v.charAt(i)) * (WEIGHTS[i] ?? 0);\n }\n const check = (10 - (sum % 10)) % 10;\n if (check !== Number(v.charAt(8))) {\n return err(\n \"INVALID_CHECKSUM\",\n \"ACN 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 if (v.length === 9) {\n return `${v.slice(0, 3)} ${v.slice(3, 6)} ${v.slice(6)}`;\n }\n return v;\n};\n\n/** Generate a random valid ACN. */\nconst generate = (): string => {\n const payload = randomDigits(8);\n let sum = 0;\n for (let i = 0; i < 8; i++)\n sum += Number(payload.charAt(i)) * (WEIGHTS[i] ?? 0);\n return payload + String((10 - (sum % 10)) % 10);\n};\n\n/** Australian Company Number. */\nconst acn: CountryValidator<\"AU\"> = {\n name: \"Australian Company Number\",\n localName: \"Australian Company Number\",\n abbreviation: \"ACN\",\n aliases: [\"ACN\", \"Australian Company Number\"] as const,\n candidatePattern: \"\\\\d{3}\\\\s?\\\\d{3}\\\\s?\\\\d{3}\",\n scope: \"country\",\n country: \"AU\",\n entityType: \"company\",\n sourceUrl: \"https://asic.gov.au/\",\n examples: [\"004085616\", \"010499966\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default acn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAqBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAEvC,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAEF,IAAI,EAAE,WAAW,GACf,OAAO,IAAI,kBAAkB,sBAAsB;CAGrD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,OAAO,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,QAAQ,MAAM;CAG9C,KADe,KAAM,MAAM,MAAO,OACpB,OAAO,EAAE,OAAO,CAAC,CAAC,GAC9B,OAAO,IACL,oBACA,0BACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;CAEvD,OAAO;AACT;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,CAAC;CAC9B,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,OAAO,OAAO,QAAQ,OAAO,CAAC,CAAC,KAAK,QAAQ,MAAM;CACpD,OAAO,UAAU,QAAQ,KAAM,MAAM,MAAO,EAAE;AAChD;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,2BAA2B;CAC5C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,aAAa,WAAW;CACnC;CACA;CACA;CACA;AACF"}
package/dist/au/mod.d.ts CHANGED
@@ -1,10 +1,11 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import abn from "./abn.js";
3
2
  import acn from "./acn.js";
4
3
  import tfn from "./tfn.js";
5
4
 
6
5
  //#region src/au/mod.d.ts
7
-
6
+ declare namespace mod_d_exports {
7
+ export { abn, acn, tfn };
8
+ }
8
9
  //#endregion
9
10
  export { abn, acn, mod_d_exports, tfn };
10
11
  //# sourceMappingURL=mod.d.ts.map
package/dist/au/tfn.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/au/tfn.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid TFN. */
9
8
  declare const generate: () => string;
10
9
  /** Australian Tax File Number. */
11
- declare const tfn: Validator;
10
+ declare const tfn: CountryValidator<"AU">;
12
11
  //#endregion
13
12
  export { compact, tfn as default, format, generate, validate };
14
13
  //# sourceMappingURL=tfn.d.ts.map
package/dist/au/tfn.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/au/tfn.ts
6
- /**
7
- * TFN (Australian Tax File Number).
8
- *
9
- * 8 or 9 digit identifier. Weighted checksum with
10
- * weights [1,4,3,7,5,8,6,9,10]; sum mod 11
11
- * must equal 0.
12
- *
13
- * @see https://en.wikipedia.org/wiki/Tax_file_number
14
- * @see https://www.ato.gov.au/Individuals/Tax-file-number/
15
- */
16
6
  const WEIGHTS = [
17
7
  1,
18
8
  4,
@@ -56,6 +46,7 @@ const tfn = {
56
46
  abbreviation: "TFN",
57
47
  aliases: ["TFN", "Tax File Number"],
58
48
  candidatePattern: "\\d{8,9}",
49
+ scope: "country",
59
50
  country: "AU",
60
51
  entityType: "person",
61
52
  sourceUrl: "https://www.ato.gov.au/individuals-and-families/tax-file-number",
@@ -1 +1 @@
1
- {"version":3,"file":"tfn.js","names":[],"sources":["../../src/au/tfn.ts"],"sourcesContent":["/**\n * TFN (Australian Tax File Number).\n *\n * 8 or 9 digit identifier. Weighted checksum with\n * weights [1,4,3,7,5,8,6,9,10]; sum mod 11\n * must equal 0.\n *\n * @see https://en.wikipedia.org/wiki/Tax_file_number\n * @see https://www.ato.gov.au/Individuals/Tax-file-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 WEIGHTS = [1, 4, 3, 7, 5, 8, 6, 9, 10] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"TFN must contain only digits\",\n );\n }\n if (v.length !== 8 && v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"TFN must be 8 or 9 digits\",\n );\n }\n\n let sum = 0;\n for (let i = 0; i < v.length; i++) {\n sum += Number(v.charAt(i)) * (WEIGHTS[i] ?? 0);\n }\n if (sum % 11 !== 0) {\n return err(\"INVALID_CHECKSUM\", \"TFN checksum mismatch\");\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 8 || v.length === 9) {\n return `${v.slice(0, 3)} ${v.slice(3, 6)} ${v.slice(6)}`;\n }\n return v;\n};\n\n/** Generate a random valid TFN. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(9);\n if (validate(c).valid) return c;\n }\n};\n\n/** Australian Tax File Number. */\nconst tfn: Validator = {\n name: \"Tax File Number\",\n localName: \"Tax File Number\",\n abbreviation: \"TFN\",\n aliases: [\"TFN\", \"Tax File Number\"] as const,\n candidatePattern: \"\\\\d{8,9}\",\n country: \"AU\",\n entityType: \"person\",\n sourceUrl:\n \"https://www.ato.gov.au/individuals-and-families/tax-file-number\",\n examples: [\"87650006\", \"123456782\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default tfn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAE5C,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;AAEH,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EACjC,QAAO,IACL,kBACA,4BACD;CAGH,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,IAC5B,QAAO,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,QAAQ,MAAM;AAE9C,KAAI,MAAM,OAAO,EACf,QAAO,IAAI,oBAAoB,wBAAwB;AAGzD,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EACjC,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;AAExD,QAAO;;;AAIT,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,OAAO,kBAAkB;CACnC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,YAAY,YAAY;CACnC;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"tfn.js","names":[],"sources":["../../src/au/tfn.ts"],"sourcesContent":["/**\n * TFN (Australian Tax File Number).\n *\n * 8 or 9 digit identifier. Weighted checksum with\n * weights [1,4,3,7,5,8,6,9,10]; sum mod 11\n * must equal 0.\n *\n * @see https://en.wikipedia.org/wiki/Tax_file_number\n * @see https://www.ato.gov.au/Individuals/Tax-file-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 WEIGHTS = [1, 4, 3, 7, 5, 8, 6, 9, 10] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"TFN must contain only digits\",\n );\n }\n if (v.length !== 8 && v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"TFN must be 8 or 9 digits\",\n );\n }\n\n let sum = 0;\n for (let i = 0; i < v.length; i++) {\n sum += Number(v.charAt(i)) * (WEIGHTS[i] ?? 0);\n }\n if (sum % 11 !== 0) {\n return err(\"INVALID_CHECKSUM\", \"TFN checksum mismatch\");\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 8 || v.length === 9) {\n return `${v.slice(0, 3)} ${v.slice(3, 6)} ${v.slice(6)}`;\n }\n return v;\n};\n\n/** Generate a random valid TFN. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(9);\n if (validate(c).valid) return c;\n }\n};\n\n/** Australian Tax File Number. */\nconst tfn: CountryValidator<\"AU\"> = {\n name: \"Tax File Number\",\n localName: \"Tax File Number\",\n abbreviation: \"TFN\",\n aliases: [\"TFN\", \"Tax File Number\"] as const,\n candidatePattern: \"\\\\d{8,9}\",\n scope: \"country\",\n country: \"AU\",\n entityType: \"person\",\n sourceUrl:\n \"https://www.ato.gov.au/individuals-and-families/tax-file-number\",\n examples: [\"87650006\", \"123456782\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default tfn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAqBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAE;AAE3C,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAEF,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,OAAO,IACL,kBACA,2BACF;CAGF,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAC5B,OAAO,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,QAAQ,MAAM;CAE9C,IAAI,MAAM,OAAO,GACf,OAAO,IAAI,oBAAoB,uBAAuB;CAGxD,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;CAEvD,OAAO;AACT;;AAGA,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,OAAO,iBAAiB;CAClC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,YAAY,WAAW;CAClC;CACA;CACA;CACA;AACF"}
package/dist/az/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import voen from "./voen.js";
3
2
 
4
3
  //#region src/az/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { voen };
6
+ }
6
7
  //#endregion
7
8
  export { mod_d_exports, voen };
8
9
  //# sourceMappingURL=mod.d.ts.map
package/dist/az/voen.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/az/voen.d.ts
4
-
5
4
  /**
6
5
  * Compact: strip spaces, prepend '0' if 9 digits.
7
6
  */
@@ -15,7 +14,7 @@ declare const generate: () => string;
15
14
  *
16
15
  * Examples sourced from python-stdnum test suite.
17
16
  */
18
- declare const voen: Validator;
17
+ declare const voen: CountryValidator<"AZ">;
19
18
  //#endregion
20
19
  export { compact, voen as default, format, generate, validate };
21
20
  //# sourceMappingURL=voen.d.ts.map
package/dist/az/voen.js CHANGED
@@ -2,20 +2,6 @@ import { clean } from "../_util/clean.js";
2
2
  import { randomDigits } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  //#region src/az/voen.ts
5
- /**
6
- * VÖEN (Vergi Ödəyicisinin Eyniləşdirmə Nömrəsi,
7
- * Azerbaijani tax identification number).
8
- *
9
- * 10 digits: TTSSSSSSCD where:
10
- * - TT = territorial unit code
11
- * - SSSSSS = serial number
12
- * - C = check digit (weighted sum mod 11)
13
- * - D = legal status (1=legal person, 2=natural person)
14
- *
15
- * Ported from python-stdnum az.voen module.
16
- *
17
- * @see https://www.taxes.gov.az/
18
- */
19
5
  /** Weights for check digit computation (positions 0-7). */
20
6
  const WEIGHTS = [
21
7
  4,
@@ -84,6 +70,7 @@ const voen = {
84
70
  abbreviation: "VÖEN",
85
71
  aliases: ["VÖEN"],
86
72
  candidatePattern: "\\d{10}",
73
+ scope: "country",
87
74
  country: "AZ",
88
75
  entityType: "any",
89
76
  lengths: [10],
@@ -1 +1 @@
1
- {"version":3,"file":"voen.js","names":[],"sources":["../../src/az/voen.ts"],"sourcesContent":["/**\n * VÖEN (Vergi Ödəyicisinin Eyniləşdirmə Nömrəsi,\n * Azerbaijani tax identification number).\n *\n * 10 digits: TTSSSSSSCD where:\n * - TT = territorial unit code\n * - SSSSSS = serial number\n * - C = check digit (weighted sum mod 11)\n * - D = legal status (1=legal person, 2=natural person)\n *\n * Ported from python-stdnum az.voen module.\n *\n * @see https://www.taxes.gov.az/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\n/** Weights for check digit computation (positions 0-7). */\nconst WEIGHTS = [4, 1, 8, 6, 2, 7, 5, 3] as const;\n\n/**\n * Compact: strip spaces, prepend '0' if 9 digits.\n */\nconst compact = (value: string): string => {\n let number = clean(value, \" \").trim();\n if (number.length === 9) {\n number = \"0\" + number;\n }\n return number;\n};\n\n/**\n * Calculate the check digit (position 8) using\n * weighted sum of the first 8 digits mod 11.\n */\nconst calcCheckDigit = (value: string): string | null => {\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n sum += (WEIGHTS[i] ?? 0) * Number(value.charAt(i));\n }\n const result = sum % 11;\n return result === 10 ? null : String(result);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Azerbaijani VÖEN must be 10 digits\",\n );\n }\n\n if (!/^\\d{10}$/.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Azerbaijani VÖEN must contain only digits\",\n );\n }\n\n const lastDigit = v[9]!;\n if (lastDigit !== \"1\" && lastDigit !== \"2\") {\n return err(\n \"INVALID_COMPONENT\",\n \"VÖEN last digit must be 1 or 2\",\n );\n }\n\n const expected = calcCheckDigit(v);\n if (expected === null || v[8] !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"VÖEN check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 3)} ${v.slice(3, 6)} ${v.slice(6, 10)}`;\n};\n\n/** Generate a random valid VOEN. */\nconst generate = (): string => {\n for (let i = 0; i < 100; i++) {\n const payload = randomDigits(8);\n const check = calcCheckDigit(payload);\n if (check === null) continue;\n const status = Math.random() < 0.5 ? \"1\" : \"2\";\n return payload + check + status;\n }\n throw new Error(\"Failed to generate valid VOEN\");\n};\n\n/**\n * Azerbaijani tax identification number (VÖEN).\n *\n * Examples sourced from python-stdnum test suite.\n */\nconst voen: Validator = {\n name: \"Azerbaijani Tax ID\",\n localName: \"Vergi Ödəyicisinin Eyniləşdirmə Nömrəsi\",\n abbreviation: \"VÖEN\",\n aliases: [\"VÖEN\"] as const,\n candidatePattern: \"\\\\d{10}\",\n country: \"AZ\",\n entityType: \"any\",\n lengths: [10] as const,\n examples: [\"1401555071\", \"1400057421\"] as const,\n compact,\n format,\n validate,\n sourceUrl: \"https://www.taxes.gov.az/\",\n generate,\n};\n\nexport default voen;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAsBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;;;;AAKxC,MAAM,WAAW,UAA0B;CACzC,IAAI,SAAS,MAAM,OAAO,IAAI,CAAC,MAAM;AACrC,KAAI,OAAO,WAAW,EACpB,UAAS,MAAM;AAEjB,QAAO;;;;;;AAOT,MAAM,kBAAkB,UAAiC;CACvD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,SAAQ,QAAQ,MAAM,KAAK,OAAO,MAAM,OAAO,EAAE,CAAC;CAEpD,MAAM,SAAS,MAAM;AACrB,QAAO,WAAW,KAAK,OAAO,OAAO,OAAO;;AAG9C,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,qCACD;AAGH,KAAI,CAAC,WAAW,KAAK,EAAE,CACrB,QAAO,IACL,kBACA,4CACD;CAGH,MAAM,YAAY,EAAE;AACpB,KAAI,cAAc,OAAO,cAAc,IACrC,QAAO,IACL,qBACA,iCACD;CAGH,MAAM,WAAW,eAAe,EAAE;AAClC,KAAI,aAAa,QAAQ,EAAE,OAAO,SAChC,QAAO,IACL,oBACA,kCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG;;;AAI5D,MAAM,iBAAyB;AAC7B,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;EAC5B,MAAM,UAAU,aAAa,EAAE;EAC/B,MAAM,QAAQ,eAAe,QAAQ;AACrC,MAAI,UAAU,KAAM;EACpB,MAAM,SAAS,KAAK,QAAQ,GAAG,KAAM,MAAM;AAC3C,SAAO,UAAU,QAAQ;;AAE3B,OAAM,IAAI,MAAM,gCAAgC;;;;;;;AAQlD,MAAM,OAAkB;CACtB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO;CACjB,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,cAAc,aAAa;CACtC;CACA;CACA;CACA,WAAW;CACX;CACD"}
1
+ {"version":3,"file":"voen.js","names":[],"sources":["../../src/az/voen.ts"],"sourcesContent":["/**\n * VÖEN (Vergi Ödəyicisinin Eyniləşdirmə Nömrəsi,\n * Azerbaijani tax identification number).\n *\n * 10 digits: TTSSSSSSCD where:\n * - TT = territorial unit code\n * - SSSSSS = serial number\n * - C = check digit (weighted sum mod 11)\n * - D = legal status (1=legal person, 2=natural person)\n *\n * Ported from python-stdnum az.voen module.\n *\n * @see https://www.taxes.gov.az/\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\";\n\n/** Weights for check digit computation (positions 0-7). */\nconst WEIGHTS = [4, 1, 8, 6, 2, 7, 5, 3] as const;\n\n/**\n * Compact: strip spaces, prepend '0' if 9 digits.\n */\nconst compact = (value: string): string => {\n let number = clean(value, \" \").trim();\n if (number.length === 9) {\n number = \"0\" + number;\n }\n return number;\n};\n\n/**\n * Calculate the check digit (position 8) using\n * weighted sum of the first 8 digits mod 11.\n */\nconst calcCheckDigit = (value: string): string | null => {\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n sum += (WEIGHTS[i] ?? 0) * Number(value.charAt(i));\n }\n const result = sum % 11;\n return result === 10 ? null : String(result);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Azerbaijani VÖEN must be 10 digits\",\n );\n }\n\n if (!/^\\d{10}$/.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Azerbaijani VÖEN must contain only digits\",\n );\n }\n\n // SAFETY: regex above guarantees length === 10.\n // eslint-disable-next-line no-non-null-assertion\n const lastDigit = v[9]!;\n if (lastDigit !== \"1\" && lastDigit !== \"2\") {\n return err(\n \"INVALID_COMPONENT\",\n \"VÖEN last digit must be 1 or 2\",\n );\n }\n\n const expected = calcCheckDigit(v);\n if (expected === null || v[8] !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"VÖEN check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 3)} ${v.slice(3, 6)} ${v.slice(6, 10)}`;\n};\n\n/** Generate a random valid VOEN. */\nconst generate = (): string => {\n for (let i = 0; i < 100; i++) {\n const payload = randomDigits(8);\n const check = calcCheckDigit(payload);\n if (check === null) continue;\n const status = Math.random() < 0.5 ? \"1\" : \"2\";\n return payload + check + status;\n }\n throw new Error(\"Failed to generate valid VOEN\");\n};\n\n/**\n * Azerbaijani tax identification number (VÖEN).\n *\n * Examples sourced from python-stdnum test suite.\n */\nconst voen: CountryValidator<\"AZ\"> = {\n name: \"Azerbaijani Tax ID\",\n localName: \"Vergi Ödəyicisinin Eyniləşdirmə Nömrəsi\",\n abbreviation: \"VÖEN\",\n aliases: [\"VÖEN\"] as const,\n candidatePattern: \"\\\\d{10}\",\n scope: \"country\",\n country: \"AZ\",\n entityType: \"any\",\n lengths: [10] as const,\n examples: [\"1401555071\", \"1400057421\"] as const,\n compact,\n format,\n validate,\n sourceUrl: \"https://www.taxes.gov.az/\",\n generate,\n};\n\nexport default voen;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAyBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;;;;AAKvC,MAAM,WAAW,UAA0B;CACzC,IAAI,SAAS,MAAM,OAAO,GAAG,EAAE,KAAK;CACpC,IAAI,OAAO,WAAW,GACpB,SAAS,MAAM;CAEjB,OAAO;AACT;;;;;AAMA,MAAM,kBAAkB,UAAiC;CACvD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,QAAQ,QAAQ,MAAM,KAAK,OAAO,MAAM,OAAO,CAAC,CAAC;CAEnD,MAAM,SAAS,MAAM;CACrB,OAAO,WAAW,KAAK,OAAO,OAAO,MAAM;AAC7C;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,oCACF;CAGF,IAAI,CAAC,WAAW,KAAK,CAAC,GACpB,OAAO,IACL,kBACA,2CACF;CAKF,MAAM,YAAY,EAAE;CACpB,IAAI,cAAc,OAAO,cAAc,KACrC,OAAO,IACL,qBACA,gCACF;CAGF,MAAM,WAAW,eAAe,CAAC;CACjC,IAAI,aAAa,QAAQ,EAAE,OAAO,UAChC,OAAO,IACL,oBACA,iCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE;AAC3D;;AAGA,MAAM,iBAAyB;CAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;EAC5B,MAAM,UAAU,aAAa,CAAC;EAC9B,MAAM,QAAQ,eAAe,OAAO;EACpC,IAAI,UAAU,MAAM;EACpB,MAAM,SAAS,KAAK,OAAO,IAAI,KAAM,MAAM;EAC3C,OAAO,UAAU,QAAQ;CAC3B;CACA,MAAM,IAAI,MAAM,+BAA+B;AACjD;;;;;;AAOA,MAAM,OAA+B;CACnC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,MAAM;CAChB,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,cAAc,YAAY;CACrC;CACA;CACA;CACA,WAAW;CACX;AACF"}
package/dist/ba/jmbg.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { ParsedPersonId, ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ParsedPersonId, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ba/jmbg.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
@@ -9,7 +8,7 @@ declare const parse: (value: string) => ParsedPersonId | null;
9
8
  /** Generate a random valid JMBG. */
10
9
  declare const generate: () => string;
11
10
  /** Bosnian Unique Master Citizen Number. */
12
- declare const jmbg: Validator;
11
+ declare const jmbg: CountryValidator<"BA", ParsedPersonId>;
13
12
  //#endregion
14
13
  export { compact, jmbg as default, format, generate, parse, validate };
15
14
  //# sourceMappingURL=jmbg.d.ts.map
package/dist/ba/jmbg.js CHANGED
@@ -1,19 +1,10 @@
1
+ import { weightedSum } from "../_checksums/weighted-sum.js";
1
2
  import { clean } from "../_util/clean.js";
3
+ import { isValidDate } from "../_util/date.js";
2
4
  import { randomInt } from "../_util/generate.js";
3
5
  import { err } from "../_util/result.js";
4
6
  import { isdigits } from "../_util/strings.js";
5
- import { weightedSum } from "../_checksums/weighted-sum.js";
6
- import { isValidDate } from "../_util/date.js";
7
7
  //#region src/ba/jmbg.ts
8
- /**
9
- * JMBG (Jedinstveni matični broj građana).
10
- *
11
- * Bosnian unique master citizen number. 13 digits
12
- * encoding DDMMYYY (7-digit birth year), region code,
13
- * serial number, and a check digit.
14
- *
15
- * @see https://en.wikipedia.org/wiki/Unique_Master_Citizen_Number
16
- */
17
8
  const WEIGHTS = [
18
9
  7,
19
10
  6,
@@ -81,6 +72,7 @@ const jmbg = {
81
72
  abbreviation: "JMBG",
82
73
  aliases: ["JMBG", "matični broj"],
83
74
  candidatePattern: "\\d{13}",
75
+ scope: "country",
84
76
  country: "BA",
85
77
  entityType: "person",
86
78
  lengths: [13],
@@ -88,6 +80,7 @@ const jmbg = {
88
80
  examples: ["0101006500006"],
89
81
  compact,
90
82
  format,
83
+ parse,
91
84
  validate,
92
85
  generate
93
86
  };