@stll/stdnum 0.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (808) hide show
  1. package/LICENSE +1 -5
  2. package/README.md +28 -4
  3. package/dist/_checksums/luhn.js.map +1 -1
  4. package/dist/_checksums/mod1110.js +1 -1
  5. package/dist/_checksums/mod1110.js.map +1 -1
  6. package/dist/_checksums/mod112.js +5 -5
  7. package/dist/_checksums/mod112.js.map +1 -1
  8. package/dist/_checksums/mod97.js.map +1 -1
  9. package/dist/_checksums/verhoeff.js.map +1 -1
  10. package/dist/_checksums/weighted-sum.js.map +1 -1
  11. package/dist/_util/arabic.js.map +1 -1
  12. package/dist/_util/clean.js.map +1 -1
  13. package/dist/_util/date.js.map +1 -1
  14. package/dist/_util/generate.d.ts +13 -1
  15. package/dist/_util/generate.js +23 -1
  16. package/dist/_util/generate.js.map +1 -1
  17. package/dist/_util/result.js.map +1 -1
  18. package/dist/_util/strings.js.map +1 -1
  19. package/dist/ad/mod.d.ts +3 -2
  20. package/dist/ad/nrt.d.ts +16 -2
  21. package/dist/ad/nrt.js +4 -16
  22. package/dist/ad/nrt.js.map +1 -1
  23. package/dist/ae/eid.d.ts +2 -3
  24. package/dist/ae/eid.js +2 -12
  25. package/dist/ae/eid.js.map +1 -1
  26. package/dist/ae/mod.d.ts +3 -2
  27. package/dist/ai/mod.d.ts +3 -2
  28. package/dist/ai/tin.d.ts +20 -2
  29. package/dist/ai/tin.js +1 -18
  30. package/dist/ai/tin.js.map +1 -1
  31. package/dist/al/mod.d.ts +3 -2
  32. package/dist/al/nipt.d.ts +13 -2
  33. package/dist/al/nipt.js +1 -11
  34. package/dist/al/nipt.js.map +1 -1
  35. package/dist/am/mod.d.ts +3 -2
  36. package/dist/am/tin.d.ts +16 -2
  37. package/dist/am/tin.js +1 -14
  38. package/dist/am/tin.js.map +1 -1
  39. package/dist/ar/cbu.d.ts +2 -3
  40. package/dist/ar/cbu.js +2 -10
  41. package/dist/ar/cbu.js.map +1 -1
  42. package/dist/ar/cuit.d.ts +2 -3
  43. package/dist/ar/cuit.js +13 -29
  44. package/dist/ar/cuit.js.map +1 -1
  45. package/dist/ar/dni.d.ts +11 -2
  46. package/dist/ar/dni.js +1 -9
  47. package/dist/ar/dni.js.map +1 -1
  48. package/dist/ar/mod.d.ts +3 -2
  49. package/dist/at/businessid.d.ts +10 -2
  50. package/dist/at/businessid.js +1 -8
  51. package/dist/at/businessid.js.map +1 -1
  52. package/dist/at/mod.d.ts +3 -2
  53. package/dist/at/tin.d.ts +2 -3
  54. package/dist/at/tin.js +1 -11
  55. package/dist/at/tin.js.map +1 -1
  56. package/dist/at/uid.d.ts +2 -3
  57. package/dist/at/uid.js +2 -10
  58. package/dist/at/uid.js.map +1 -1
  59. package/dist/at/vnr.d.ts +5 -4
  60. package/dist/at/vnr.js +23 -16
  61. package/dist/at/vnr.js.map +1 -1
  62. package/dist/au/abn.d.ts +2 -3
  63. package/dist/au/abn.js +1 -10
  64. package/dist/au/abn.js.map +1 -1
  65. package/dist/au/acn.d.ts +2 -3
  66. package/dist/au/acn.js +1 -10
  67. package/dist/au/acn.js.map +1 -1
  68. package/dist/au/mod.d.ts +3 -2
  69. package/dist/au/tfn.d.ts +2 -3
  70. package/dist/au/tfn.js +1 -10
  71. package/dist/au/tfn.js.map +1 -1
  72. package/dist/az/mod.d.ts +3 -2
  73. package/dist/az/voen.d.ts +2 -3
  74. package/dist/az/voen.js +1 -14
  75. package/dist/az/voen.js.map +1 -1
  76. package/dist/ba/jmbg.d.ts +2 -3
  77. package/dist/ba/jmbg.js +4 -11
  78. package/dist/ba/jmbg.js.map +1 -1
  79. package/dist/ba/mod.d.ts +3 -2
  80. package/dist/bd/mod.d.ts +3 -2
  81. package/dist/bd/nid.d.ts +23 -2
  82. package/dist/bd/nid.js +11 -32
  83. package/dist/bd/nid.js.map +1 -1
  84. package/dist/be/bis.d.ts +2 -3
  85. package/dist/be/bis.js +1 -11
  86. package/dist/be/bis.js.map +1 -1
  87. package/dist/be/mod.d.ts +3 -2
  88. package/dist/be/nn.d.ts +2 -3
  89. package/dist/be/nn.js +1 -11
  90. package/dist/be/nn.js.map +1 -1
  91. package/dist/be/vat.d.ts +2 -3
  92. package/dist/be/vat.js +1 -9
  93. package/dist/be/vat.js.map +1 -1
  94. package/dist/bg/egn.d.ts +2 -3
  95. package/dist/bg/egn.js +5 -13
  96. package/dist/bg/egn.js.map +1 -1
  97. package/dist/bg/mod.d.ts +3 -2
  98. package/dist/bg/pnf.d.ts +2 -3
  99. package/dist/bg/pnf.js +1 -8
  100. package/dist/bg/pnf.js.map +1 -1
  101. package/dist/bg/vat.d.ts +2 -3
  102. package/dist/bg/vat.js +3 -9
  103. package/dist/bg/vat.js.map +1 -1
  104. package/dist/bh/cpr.d.ts +5 -4
  105. package/dist/bh/cpr.js +9 -19
  106. package/dist/bh/cpr.js.map +1 -1
  107. package/dist/bh/mod.d.ts +3 -2
  108. package/dist/bic.d.ts +13 -2
  109. package/dist/bic.js +14 -26
  110. package/dist/bic.js.map +1 -1
  111. package/dist/br/cnpj.d.ts +2 -3
  112. package/dist/br/cnpj.js +1 -20
  113. package/dist/br/cnpj.js.map +1 -1
  114. package/dist/br/cpf.d.ts +2 -3
  115. package/dist/br/cpf.js +1 -14
  116. package/dist/br/cpf.js.map +1 -1
  117. package/dist/br/mod.d.ts +3 -2
  118. package/dist/by/mod.d.ts +3 -2
  119. package/dist/by/unp.d.ts +2 -3
  120. package/dist/by/unp.js +9 -17
  121. package/dist/by/unp.js.map +1 -1
  122. package/dist/bz/mod.d.ts +3 -2
  123. package/dist/bz/tin.d.ts +5 -4
  124. package/dist/bz/tin.js +10 -27
  125. package/dist/bz/tin.js.map +1 -1
  126. package/dist/ca/bn.d.ts +2 -3
  127. package/dist/ca/bn.js +2 -10
  128. package/dist/ca/bn.js.map +1 -1
  129. package/dist/ca/mod.d.ts +3 -2
  130. package/dist/ca/sin.d.ts +2 -3
  131. package/dist/ca/sin.js +2 -10
  132. package/dist/ca/sin.js.map +1 -1
  133. package/dist/ch/mod.d.ts +3 -2
  134. package/dist/ch/ssn.d.ts +2 -3
  135. package/dist/ch/ssn.js +1 -9
  136. package/dist/ch/ssn.js.map +1 -1
  137. package/dist/ch/uid.d.ts +2 -3
  138. package/dist/ch/uid.js +1 -9
  139. package/dist/ch/uid.js.map +1 -1
  140. package/dist/ch/vat.d.ts +2 -3
  141. package/dist/ch/vat.js +1 -9
  142. package/dist/ch/vat.js.map +1 -1
  143. package/dist/cl/mod.d.ts +3 -2
  144. package/dist/cl/rut.d.ts +2 -3
  145. package/dist/cl/rut.js +2 -15
  146. package/dist/cl/rut.js.map +1 -1
  147. package/dist/cn/mod.d.ts +3 -2
  148. package/dist/cn/ric.d.ts +2 -3
  149. package/dist/cn/ric.js +4 -14
  150. package/dist/cn/ric.js.map +1 -1
  151. package/dist/cn/uscc.d.ts +2 -3
  152. package/dist/cn/uscc.js +8 -16
  153. package/dist/cn/uscc.js.map +1 -1
  154. package/dist/co/mod.d.ts +3 -2
  155. package/dist/co/nit.d.ts +2 -3
  156. package/dist/co/nit.js +6 -13
  157. package/dist/co/nit.js.map +1 -1
  158. package/dist/cr/cpf.d.ts +18 -2
  159. package/dist/cr/cpf.js +5 -19
  160. package/dist/cr/cpf.js.map +1 -1
  161. package/dist/cr/mod.d.ts +3 -2
  162. package/dist/creditcard.d.ts +2 -3
  163. package/dist/creditcard.js +5 -14
  164. package/dist/creditcard.js.map +1 -1
  165. package/dist/cu/mod.d.ts +3 -2
  166. package/dist/cu/ni.d.ts +5 -4
  167. package/dist/cu/ni.js +13 -18
  168. package/dist/cu/ni.js.map +1 -1
  169. package/dist/cy/mod.d.ts +3 -2
  170. package/dist/cy/vat.d.ts +2 -3
  171. package/dist/cy/vat.js +1 -8
  172. package/dist/cy/vat.js.map +1 -1
  173. package/dist/cz/dic.d.ts +2 -3
  174. package/dist/cz/dic.js +7 -13
  175. package/dist/cz/dic.js.map +1 -1
  176. package/dist/cz/ico.d.ts +2 -3
  177. package/dist/cz/ico.js +2 -10
  178. package/dist/cz/ico.js.map +1 -1
  179. package/dist/cz/mod.d.ts +3 -2
  180. package/dist/cz/rc.d.ts +2 -3
  181. package/dist/cz/rc.js +22 -21
  182. package/dist/cz/rc.js.map +1 -1
  183. package/dist/de/handelsreg.d.ts +19 -2
  184. package/dist/de/handelsreg.js +10 -26
  185. package/dist/de/handelsreg.js.map +1 -1
  186. package/dist/de/idnr.d.ts +2 -3
  187. package/dist/de/idnr.js +2 -12
  188. package/dist/de/idnr.js.map +1 -1
  189. package/dist/de/mod.d.ts +3 -2
  190. package/dist/de/stnr.d.ts +17 -3
  191. package/dist/de/stnr.js +1 -15
  192. package/dist/de/stnr.js.map +1 -1
  193. package/dist/de/svnr.d.ts +2 -3
  194. package/dist/de/svnr.js +4 -13
  195. package/dist/de/svnr.js.map +1 -1
  196. package/dist/de/vat.d.ts +2 -3
  197. package/dist/de/vat.js +2 -11
  198. package/dist/de/vat.js.map +1 -1
  199. package/dist/dk/cpr.d.ts +5 -4
  200. package/dist/dk/cpr.js +14 -12
  201. package/dist/dk/cpr.js.map +1 -1
  202. package/dist/dk/cvr.d.ts +2 -3
  203. package/dist/dk/cvr.js +2 -15
  204. package/dist/dk/cvr.js.map +1 -1
  205. package/dist/dk/mod.d.ts +3 -2
  206. package/dist/dk/vat.d.ts +2 -3
  207. package/dist/dk/vat.js +3 -13
  208. package/dist/dk/vat.js.map +1 -1
  209. package/dist/do/mod.d.ts +3 -2
  210. package/dist/do/rnc.d.ts +2 -3
  211. package/dist/do/rnc.js +3 -17
  212. package/dist/do/rnc.js.map +1 -1
  213. package/dist/ec/mod.d.ts +3 -2
  214. package/dist/ec/ruc.d.ts +2 -3
  215. package/dist/ec/ruc.js +2 -19
  216. package/dist/ec/ruc.js.map +1 -1
  217. package/dist/ee/ik.d.ts +2 -3
  218. package/dist/ee/ik.js +6 -15
  219. package/dist/ee/ik.js.map +1 -1
  220. package/dist/ee/mod.d.ts +3 -2
  221. package/dist/ee/registrikood.d.ts +2 -3
  222. package/dist/ee/registrikood.js +9 -15
  223. package/dist/ee/registrikood.js.map +1 -1
  224. package/dist/ee/vat.d.ts +2 -3
  225. package/dist/ee/vat.js +2 -10
  226. package/dist/ee/vat.js.map +1 -1
  227. package/dist/eg/mod.d.ts +3 -2
  228. package/dist/eg/tn.d.ts +11 -2
  229. package/dist/eg/tn.js +1 -9
  230. package/dist/eg/tn.js.map +1 -1
  231. package/dist/es/cif.d.ts +2 -3
  232. package/dist/es/cif.js +3 -12
  233. package/dist/es/cif.js.map +1 -1
  234. package/dist/es/dni.d.ts +2 -3
  235. package/dist/es/dni.js +1 -9
  236. package/dist/es/dni.js.map +1 -1
  237. package/dist/es/mod.d.ts +3 -2
  238. package/dist/es/nie.d.ts +2 -3
  239. package/dist/es/nie.js +14 -22
  240. package/dist/es/nie.js.map +1 -1
  241. package/dist/es/nss.d.ts +2 -3
  242. package/dist/es/nss.js +1 -16
  243. package/dist/es/nss.js.map +1 -1
  244. package/dist/es/vat.d.ts +2 -3
  245. package/dist/es/vat.js +5 -10
  246. package/dist/es/vat.js.map +1 -1
  247. package/dist/eu/mod.d.ts +3 -2
  248. package/dist/eu/vat.d.ts +5 -4
  249. package/dist/eu/vat.js +44 -2
  250. package/dist/eu/vat.js.map +1 -1
  251. package/dist/fi/hetu.d.ts +5 -4
  252. package/dist/fi/hetu.js +19 -12
  253. package/dist/fi/hetu.js.map +1 -1
  254. package/dist/fi/mod.d.ts +3 -2
  255. package/dist/fi/vat.d.ts +2 -3
  256. package/dist/fi/vat.js +3 -10
  257. package/dist/fi/vat.js.map +1 -1
  258. package/dist/fi/ytunnus.d.ts +2 -3
  259. package/dist/fi/ytunnus.js +2 -10
  260. package/dist/fi/ytunnus.js.map +1 -1
  261. package/dist/fr/mod.d.ts +3 -2
  262. package/dist/fr/nif.d.ts +2 -3
  263. package/dist/fr/nif.js +1 -9
  264. package/dist/fr/nif.js.map +1 -1
  265. package/dist/fr/nir.d.ts +2 -3
  266. package/dist/fr/nir.js +3 -14
  267. package/dist/fr/nir.js.map +1 -1
  268. package/dist/fr/siren.d.ts +2 -3
  269. package/dist/fr/siren.js +2 -10
  270. package/dist/fr/siren.js.map +1 -1
  271. package/dist/fr/siret.d.ts +2 -3
  272. package/dist/fr/siret.js +2 -11
  273. package/dist/fr/siret.js.map +1 -1
  274. package/dist/fr/tva.d.ts +2 -3
  275. package/dist/fr/tva.js +2 -12
  276. package/dist/fr/tva.js.map +1 -1
  277. package/dist/gb/mod.d.ts +3 -2
  278. package/dist/gb/nino.d.ts +12 -2
  279. package/dist/gb/nino.js +8 -17
  280. package/dist/gb/nino.js.map +1 -1
  281. package/dist/gb/sedol.d.ts +2 -3
  282. package/dist/gb/sedol.js +9 -18
  283. package/dist/gb/sedol.js.map +1 -1
  284. package/dist/gb/utr.d.ts +2 -3
  285. package/dist/gb/utr.js +2 -10
  286. package/dist/gb/utr.js.map +1 -1
  287. package/dist/gb/vat.d.ts +2 -3
  288. package/dist/gb/vat.js +2 -11
  289. package/dist/gb/vat.js.map +1 -1
  290. package/dist/ge/mod.d.ts +3 -2
  291. package/dist/ge/pin.d.ts +14 -2
  292. package/dist/ge/pin.js +1 -12
  293. package/dist/ge/pin.js.map +1 -1
  294. package/dist/gh/mod.d.ts +3 -2
  295. package/dist/gh/tin.d.ts +2 -3
  296. package/dist/gh/tin.js +10 -24
  297. package/dist/gh/tin.js.map +1 -1
  298. package/dist/gr/amka.d.ts +2 -3
  299. package/dist/gr/amka.js +3 -11
  300. package/dist/gr/amka.js.map +1 -1
  301. package/dist/gr/mod.d.ts +3 -2
  302. package/dist/gr/vat.d.ts +2 -3
  303. package/dist/gr/vat.js +1 -10
  304. package/dist/gr/vat.js.map +1 -1
  305. package/dist/gt/mod.d.ts +3 -2
  306. package/dist/gt/nit.d.ts +2 -3
  307. package/dist/gt/nit.js +6 -14
  308. package/dist/gt/nit.js.map +1 -1
  309. package/dist/hk/hkid.d.ts +2 -3
  310. package/dist/hk/hkid.js +2 -10
  311. package/dist/hk/hkid.js.map +1 -1
  312. package/dist/hk/mod.d.ts +3 -2
  313. package/dist/hr/mod.d.ts +3 -2
  314. package/dist/hr/vat.d.ts +2 -3
  315. package/dist/hr/vat.js +2 -9
  316. package/dist/hr/vat.js.map +1 -1
  317. package/dist/hu/mod.d.ts +3 -2
  318. package/dist/hu/vat.d.ts +2 -3
  319. package/dist/hu/vat.js +3 -10
  320. package/dist/hu/vat.js.map +1 -1
  321. package/dist/iban.d.ts +2 -3
  322. package/dist/iban.js +2 -8
  323. package/dist/iban.js.map +1 -1
  324. package/dist/id/mod.d.ts +3 -2
  325. package/dist/id/npwp.d.ts +2 -3
  326. package/dist/id/npwp.js +3 -13
  327. package/dist/id/npwp.js.map +1 -1
  328. package/dist/ie/mod.d.ts +3 -2
  329. package/dist/ie/pps.d.ts +2 -3
  330. package/dist/ie/pps.js +1 -10
  331. package/dist/ie/pps.js.map +1 -1
  332. package/dist/ie/vat.d.ts +2 -3
  333. package/dist/ie/vat.js +1 -9
  334. package/dist/ie/vat.js.map +1 -1
  335. package/dist/il/idnr.d.ts +2 -3
  336. package/dist/il/idnr.js +2 -9
  337. package/dist/il/idnr.js.map +1 -1
  338. package/dist/il/mod.d.ts +3 -2
  339. package/dist/in/aadhaar.d.ts +2 -3
  340. package/dist/in/aadhaar.js +2 -12
  341. package/dist/in/aadhaar.js.map +1 -1
  342. package/dist/in/gstin.d.ts +2 -3
  343. package/dist/in/gstin.js +4 -11
  344. package/dist/in/gstin.js.map +1 -1
  345. package/dist/in/mod.d.ts +3 -2
  346. package/dist/in/pan.d.ts +15 -2
  347. package/dist/in/pan.js +3 -15
  348. package/dist/in/pan.js.map +1 -1
  349. package/dist/index.d.ts +2 -2
  350. package/dist/index.js +6 -6
  351. package/dist/iq/mod.d.ts +3 -2
  352. package/dist/iq/nid.d.ts +16 -2
  353. package/dist/iq/nid.js +2 -15
  354. package/dist/iq/nid.js.map +1 -1
  355. package/dist/ir/mod.d.ts +3 -2
  356. package/dist/ir/nid.d.ts +2 -3
  357. package/dist/ir/nid.js +2 -24
  358. package/dist/ir/nid.js.map +1 -1
  359. package/dist/is/kennitala.d.ts +2 -3
  360. package/dist/is/kennitala.js +2 -13
  361. package/dist/is/kennitala.js.map +1 -1
  362. package/dist/is/mod.d.ts +3 -2
  363. package/dist/is/vsk.d.ts +9 -2
  364. package/dist/is/vsk.js +1 -7
  365. package/dist/is/vsk.js.map +1 -1
  366. package/dist/isin.d.ts +2 -3
  367. package/dist/isin.js +11 -21
  368. package/dist/isin.js.map +1 -1
  369. package/dist/it/codicefiscale.d.ts +5 -4
  370. package/dist/it/codicefiscale.js +27 -23
  371. package/dist/it/codicefiscale.js.map +1 -1
  372. package/dist/it/iva.d.ts +2 -3
  373. package/dist/it/iva.js +2 -9
  374. package/dist/it/iva.js.map +1 -1
  375. package/dist/it/mod.d.ts +3 -2
  376. package/dist/jp/cn.d.ts +2 -3
  377. package/dist/jp/cn.js +1 -9
  378. package/dist/jp/cn.js.map +1 -1
  379. package/dist/jp/mod.d.ts +3 -2
  380. package/dist/jp/mynumber.d.ts +2 -3
  381. package/dist/jp/mynumber.js +1 -10
  382. package/dist/jp/mynumber.js.map +1 -1
  383. package/dist/kr/brn.d.ts +11 -2
  384. package/dist/kr/brn.js +1 -9
  385. package/dist/kr/brn.js.map +1 -1
  386. package/dist/kr/mod.d.ts +3 -2
  387. package/dist/kr/rrn.d.ts +5 -4
  388. package/dist/kr/rrn.js +15 -13
  389. package/dist/kr/rrn.js.map +1 -1
  390. package/dist/kw/civil.d.ts +6 -5
  391. package/dist/kw/civil.js +20 -17
  392. package/dist/kw/civil.js.map +1 -1
  393. package/dist/kw/mod.d.ts +3 -2
  394. package/dist/kz/iin.d.ts +2 -3
  395. package/dist/kz/iin.js +4 -18
  396. package/dist/kz/iin.js.map +1 -1
  397. package/dist/kz/mod.d.ts +3 -2
  398. package/dist/lei.d.ts +2 -3
  399. package/dist/lei.js +2 -11
  400. package/dist/lei.js.map +1 -1
  401. package/dist/li/mod.d.ts +3 -2
  402. package/dist/li/peid.d.ts +11 -2
  403. package/dist/li/peid.js +1 -9
  404. package/dist/li/peid.js.map +1 -1
  405. package/dist/lk/mod.d.ts +3 -2
  406. package/dist/lk/nic.d.ts +5 -4
  407. package/dist/lk/nic.js +16 -16
  408. package/dist/lk/nic.js.map +1 -1
  409. package/dist/lt/asmens.d.ts +2 -3
  410. package/dist/lt/asmens.js +2 -1
  411. package/dist/lt/asmens.js.map +1 -1
  412. package/dist/lt/mod.d.ts +3 -2
  413. package/dist/lt/vat.d.ts +2 -3
  414. package/dist/lt/vat.js +2 -10
  415. package/dist/lt/vat.js.map +1 -1
  416. package/dist/lu/mod.d.ts +3 -2
  417. package/dist/lu/vat.d.ts +2 -3
  418. package/dist/lu/vat.js +2 -8
  419. package/dist/lu/vat.js.map +1 -1
  420. package/dist/luhn.d.ts +2 -3
  421. package/dist/luhn.js +9 -9
  422. package/dist/luhn.js.map +1 -1
  423. package/dist/lv/mod.d.ts +3 -2
  424. package/dist/lv/vat.d.ts +2 -3
  425. package/dist/lv/vat.js +19 -18
  426. package/dist/lv/vat.js.map +1 -1
  427. package/dist/ma/ice.d.ts +2 -3
  428. package/dist/ma/ice.js +2 -11
  429. package/dist/ma/ice.js.map +1 -1
  430. package/dist/ma/mod.d.ts +3 -2
  431. package/dist/mc/mod.d.ts +3 -2
  432. package/dist/mc/tva.d.ts +2 -3
  433. package/dist/mc/tva.js +1 -0
  434. package/dist/mc/tva.js.map +1 -1
  435. package/dist/md/idno.d.ts +2 -3
  436. package/dist/md/idno.js +1 -10
  437. package/dist/md/idno.js.map +1 -1
  438. package/dist/md/mod.d.ts +3 -2
  439. package/dist/me/mod.d.ts +3 -2
  440. package/dist/me/pib.d.ts +2 -3
  441. package/dist/me/pib.js +2 -10
  442. package/dist/me/pib.js.map +1 -1
  443. package/dist/mk/edb.d.ts +2 -3
  444. package/dist/mk/edb.js +2 -11
  445. package/dist/mk/edb.js.map +1 -1
  446. package/dist/mk/mod.d.ts +3 -2
  447. package/dist/mt/mod.d.ts +3 -2
  448. package/dist/mt/vat.d.ts +2 -3
  449. package/dist/mt/vat.js +3 -10
  450. package/dist/mt/vat.js.map +1 -1
  451. package/dist/mu/brn.d.ts +23 -2
  452. package/dist/mu/brn.js +1 -21
  453. package/dist/mu/brn.js.map +1 -1
  454. package/dist/mu/mod.d.ts +3 -2
  455. package/dist/mx/clabe.d.ts +2 -3
  456. package/dist/mx/clabe.js +1 -14
  457. package/dist/mx/clabe.js.map +1 -1
  458. package/dist/mx/curp.d.ts +5 -4
  459. package/dist/mx/curp.js +27 -19
  460. package/dist/mx/curp.js.map +1 -1
  461. package/dist/mx/mod.d.ts +3 -2
  462. package/dist/mx/rfc.d.ts +5 -4
  463. package/dist/mx/rfc.js +23 -20
  464. package/dist/mx/rfc.js.map +1 -1
  465. package/dist/my/mod.d.ts +3 -2
  466. package/dist/my/nric.d.ts +5 -4
  467. package/dist/my/nric.js +18 -16
  468. package/dist/my/nric.js.map +1 -1
  469. package/dist/ng/mod.d.ts +3 -2
  470. package/dist/ng/nin.d.ts +13 -2
  471. package/dist/ng/nin.js +1 -11
  472. package/dist/ng/nin.js.map +1 -1
  473. package/dist/ni/mod.d.ts +3 -2
  474. package/dist/ni/ruc.d.ts +2 -3
  475. package/dist/ni/ruc.js +1 -23
  476. package/dist/ni/ruc.js.map +1 -1
  477. package/dist/nl/bsn.d.ts +2 -3
  478. package/dist/nl/bsn.js +2 -10
  479. package/dist/nl/bsn.js.map +1 -1
  480. package/dist/nl/kvk.d.ts +9 -2
  481. package/dist/nl/kvk.js +1 -7
  482. package/dist/nl/kvk.js.map +1 -1
  483. package/dist/nl/mod.d.ts +3 -2
  484. package/dist/nl/vat.d.ts +2 -3
  485. package/dist/nl/vat.js +4 -50
  486. package/dist/nl/vat.js.map +1 -1
  487. package/dist/no/fodselsnummer.d.ts +2 -3
  488. package/dist/no/fodselsnummer.js +3 -10
  489. package/dist/no/fodselsnummer.js.map +1 -1
  490. package/dist/no/mod.d.ts +3 -2
  491. package/dist/no/mva.d.ts +2 -3
  492. package/dist/no/mva.js +1 -8
  493. package/dist/no/mva.js.map +1 -1
  494. package/dist/no/orgnr.d.ts +2 -3
  495. package/dist/no/orgnr.js +2 -8
  496. package/dist/no/orgnr.js.map +1 -1
  497. package/dist/nz/ird.d.ts +2 -3
  498. package/dist/nz/ird.js +4 -13
  499. package/dist/nz/ird.js.map +1 -1
  500. package/dist/nz/mod.d.ts +3 -2
  501. package/dist/pa/mod.d.ts +3 -2
  502. package/dist/pa/ruc.d.ts +2 -3
  503. package/dist/pa/ruc.js +4 -19
  504. package/dist/pa/ruc.js.map +1 -1
  505. package/dist/patterns.d.ts +8 -10
  506. package/dist/patterns.js +83 -28
  507. package/dist/patterns.js.map +1 -1
  508. package/dist/pe/mod.d.ts +3 -2
  509. package/dist/pe/ruc.d.ts +2 -3
  510. package/dist/pe/ruc.js +10 -24
  511. package/dist/pe/ruc.js.map +1 -1
  512. package/dist/ph/mod.d.ts +3 -2
  513. package/dist/ph/philid.d.ts +14 -2
  514. package/dist/ph/philid.js +1 -12
  515. package/dist/ph/philid.js.map +1 -1
  516. package/dist/pk/cnic.d.ts +14 -2
  517. package/dist/pk/cnic.js +1 -12
  518. package/dist/pk/cnic.js.map +1 -1
  519. package/dist/pk/mod.d.ts +3 -2
  520. package/dist/pl/mod.d.ts +3 -2
  521. package/dist/pl/nip.d.ts +2 -3
  522. package/dist/pl/nip.js +2 -10
  523. package/dist/pl/nip.js.map +1 -1
  524. package/dist/pl/pesel.d.ts +2 -3
  525. package/dist/pl/pesel.js +4 -13
  526. package/dist/pl/pesel.js.map +1 -1
  527. package/dist/pl/regon.d.ts +2 -3
  528. package/dist/pl/regon.js +2 -11
  529. package/dist/pl/regon.js.map +1 -1
  530. package/dist/pt/cc.d.ts +2 -3
  531. package/dist/pt/cc.js +7 -13
  532. package/dist/pt/cc.js.map +1 -1
  533. package/dist/pt/mod.d.ts +3 -2
  534. package/dist/pt/vat.d.ts +2 -3
  535. package/dist/pt/vat.js +3 -11
  536. package/dist/pt/vat.js.map +1 -1
  537. package/dist/ro/cnp.d.ts +2 -3
  538. package/dist/ro/cnp.js +5 -14
  539. package/dist/ro/cnp.js.map +1 -1
  540. package/dist/ro/mod.d.ts +3 -2
  541. package/dist/ro/vat.d.ts +2 -3
  542. package/dist/ro/vat.js +13 -11
  543. package/dist/ro/vat.js.map +1 -1
  544. package/dist/rs/mod.d.ts +3 -2
  545. package/dist/rs/pib.d.ts +2 -3
  546. package/dist/rs/pib.js +1 -9
  547. package/dist/rs/pib.js.map +1 -1
  548. package/dist/ru/inn.d.ts +2 -3
  549. package/dist/ru/inn.js +2 -12
  550. package/dist/ru/inn.js.map +1 -1
  551. package/dist/ru/mod.d.ts +3 -2
  552. package/dist/se/mod.d.ts +3 -2
  553. package/dist/se/orgnr.d.ts +2 -3
  554. package/dist/se/orgnr.js +2 -9
  555. package/dist/se/orgnr.js.map +1 -1
  556. package/dist/se/personnummer.d.ts +2 -3
  557. package/dist/se/personnummer.js +8 -15
  558. package/dist/se/personnummer.js.map +1 -1
  559. package/dist/se/vat.d.ts +2 -3
  560. package/dist/se/vat.js +3 -10
  561. package/dist/se/vat.js.map +1 -1
  562. package/dist/sg/mod.d.ts +3 -2
  563. package/dist/sg/uen.d.ts +2 -3
  564. package/dist/sg/uen.js +47 -70
  565. package/dist/sg/uen.js.map +1 -1
  566. package/dist/si/emso.d.ts +2 -3
  567. package/dist/si/emso.js +12 -14
  568. package/dist/si/emso.js.map +1 -1
  569. package/dist/si/mod.d.ts +3 -2
  570. package/dist/si/vat.d.ts +2 -3
  571. package/dist/si/vat.js +3 -12
  572. package/dist/si/vat.js.map +1 -1
  573. package/dist/sk/dic.d.ts +2 -3
  574. package/dist/sk/dic.js +1 -0
  575. package/dist/sk/dic.js.map +1 -1
  576. package/dist/sk/ico.d.ts +2 -3
  577. package/dist/sk/ico.js +1 -0
  578. package/dist/sk/ico.js.map +1 -1
  579. package/dist/sk/mod.d.ts +3 -2
  580. package/dist/sk/rc.d.ts +4 -5
  581. package/dist/sk/rc.js +6 -2
  582. package/dist/sk/rc.js.map +1 -1
  583. package/dist/th/mod.d.ts +3 -2
  584. package/dist/th/tin.d.ts +2 -3
  585. package/dist/th/tin.js +1 -11
  586. package/dist/th/tin.js.map +1 -1
  587. package/dist/tr/mod.d.ts +3 -2
  588. package/dist/tr/tckimlik.d.ts +2 -3
  589. package/dist/tr/tckimlik.js +1 -20
  590. package/dist/tr/tckimlik.js.map +1 -1
  591. package/dist/tr/vkn.d.ts +2 -3
  592. package/dist/tr/vkn.js +1 -20
  593. package/dist/tr/vkn.js.map +1 -1
  594. package/dist/tw/mod.d.ts +3 -2
  595. package/dist/tw/ubn.d.ts +2 -3
  596. package/dist/tw/ubn.js +2 -12
  597. package/dist/tw/ubn.js.map +1 -1
  598. package/dist/types.d.ts +56 -21
  599. package/dist/ua/edrpou.d.ts +2 -3
  600. package/dist/ua/edrpou.js +5 -12
  601. package/dist/ua/edrpou.js.map +1 -1
  602. package/dist/ua/mod.d.ts +3 -2
  603. package/dist/us/ein.d.ts +12 -2
  604. package/dist/us/ein.js +88 -97
  605. package/dist/us/ein.js.map +1 -1
  606. package/dist/us/itin.d.ts +13 -2
  607. package/dist/us/itin.js +4 -15
  608. package/dist/us/itin.js.map +1 -1
  609. package/dist/us/mod.d.ts +3 -2
  610. package/dist/us/rtn.d.ts +2 -3
  611. package/dist/us/rtn.js +11 -23
  612. package/dist/us/rtn.js.map +1 -1
  613. package/dist/us/ssn.d.ts +13 -2
  614. package/dist/us/ssn.js +1 -11
  615. package/dist/us/ssn.js.map +1 -1
  616. package/dist/uy/mod.d.ts +3 -2
  617. package/dist/uy/rut.d.ts +2 -3
  618. package/dist/uy/rut.js +2 -15
  619. package/dist/uy/rut.js.map +1 -1
  620. package/dist/ve/mod.d.ts +3 -2
  621. package/dist/ve/rif.d.ts +2 -3
  622. package/dist/ve/rif.js +13 -26
  623. package/dist/ve/rif.js.map +1 -1
  624. package/dist/vn/mod.d.ts +3 -2
  625. package/dist/vn/mst.d.ts +2 -3
  626. package/dist/vn/mst.js +1 -12
  627. package/dist/vn/mst.js.map +1 -1
  628. package/dist/za/idnr.d.ts +2 -3
  629. package/dist/za/idnr.js +4 -16
  630. package/dist/za/idnr.js.map +1 -1
  631. package/dist/za/mod.d.ts +3 -2
  632. package/package.json +34 -21
  633. package/src/_checksums/mod1110.ts +1 -1
  634. package/src/_checksums/mod112.ts +7 -6
  635. package/src/_util/generate.ts +38 -0
  636. package/src/ad/nrt.ts +19 -7
  637. package/src/ae/eid.ts +7 -3
  638. package/src/ai/tin.ts +7 -3
  639. package/src/al/nipt.ts +7 -3
  640. package/src/am/tin.ts +7 -3
  641. package/src/ar/cbu.ts +9 -5
  642. package/src/ar/cuit.ts +22 -10
  643. package/src/ar/dni.ts +7 -3
  644. package/src/at/businessid.ts +7 -3
  645. package/src/at/tin.ts +7 -3
  646. package/src/at/uid.ts +7 -3
  647. package/src/at/vnr.ts +62 -12
  648. package/src/au/abn.ts +7 -3
  649. package/src/au/acn.ts +7 -3
  650. package/src/au/tfn.ts +7 -3
  651. package/src/az/voen.ts +9 -3
  652. package/src/ba/jmbg.ts +9 -7
  653. package/src/bd/nid.ts +11 -7
  654. package/src/be/bis.ts +8 -4
  655. package/src/be/nn.ts +7 -3
  656. package/src/be/vat.ts +7 -3
  657. package/src/bg/egn.ts +19 -10
  658. package/src/bg/pnf.ts +7 -3
  659. package/src/bg/vat.ts +8 -3
  660. package/src/bh/cpr.ts +17 -4
  661. package/src/bic.ts +26 -20
  662. package/src/br/cnpj.ts +7 -3
  663. package/src/br/cpf.ts +7 -3
  664. package/src/by/unp.ts +19 -9
  665. package/src/bz/tin.ts +19 -4
  666. package/src/ca/bn.ts +7 -3
  667. package/src/ca/sin.ts +7 -3
  668. package/src/ch/ssn.ts +7 -3
  669. package/src/ch/uid.ts +7 -3
  670. package/src/ch/vat.ts +9 -5
  671. package/src/cl/rut.ts +11 -5
  672. package/src/cn/ric.ts +11 -7
  673. package/src/cn/uscc.ts +27 -11
  674. package/src/co/nit.ts +14 -6
  675. package/src/cr/cpf.ts +11 -6
  676. package/src/creditcard.ts +10 -6
  677. package/src/cu/ni.ts +28 -7
  678. package/src/cy/vat.ts +7 -3
  679. package/src/cz/dic.ts +9 -4
  680. package/src/cz/ico.ts +7 -3
  681. package/src/cz/rc.ts +61 -29
  682. package/src/de/handelsreg.ts +21 -6
  683. package/src/de/idnr.ts +10 -3
  684. package/src/de/stnr.ts +11 -3
  685. package/src/de/svnr.ts +14 -5
  686. package/src/de/vat.ts +7 -3
  687. package/src/dk/cpr.ts +23 -8
  688. package/src/dk/cvr.ts +7 -3
  689. package/src/dk/vat.ts +8 -3
  690. package/src/do/rnc.ts +9 -5
  691. package/src/ec/ruc.ts +9 -5
  692. package/src/ee/ik.ts +21 -10
  693. package/src/ee/registrikood.ts +12 -7
  694. package/src/ee/vat.ts +7 -3
  695. package/src/eg/tn.ts +7 -3
  696. package/src/es/cif.ts +10 -7
  697. package/src/es/dni.ts +7 -3
  698. package/src/es/nie.ts +18 -9
  699. package/src/es/nss.ts +7 -3
  700. package/src/es/vat.ts +13 -5
  701. package/src/eu/vat.ts +55 -6
  702. package/src/fi/hetu.ts +26 -8
  703. package/src/fi/vat.ts +8 -3
  704. package/src/fi/ytunnus.ts +7 -3
  705. package/src/fr/nif.ts +7 -3
  706. package/src/fr/nir.ts +9 -7
  707. package/src/fr/siren.ts +7 -3
  708. package/src/fr/siret.ts +7 -3
  709. package/src/fr/tva.ts +7 -3
  710. package/src/gb/nino.ts +18 -13
  711. package/src/gb/sedol.ts +21 -15
  712. package/src/gb/utr.ts +7 -3
  713. package/src/gb/vat.ts +7 -3
  714. package/src/ge/pin.ts +7 -3
  715. package/src/gh/tin.ts +11 -6
  716. package/src/gr/amka.ts +7 -3
  717. package/src/gr/vat.ts +7 -3
  718. package/src/gt/nit.ts +13 -6
  719. package/src/hk/hkid.ts +9 -4
  720. package/src/hr/vat.ts +7 -3
  721. package/src/hu/vat.ts +8 -3
  722. package/src/iban.ts +7 -3
  723. package/src/id/npwp.ts +7 -3
  724. package/src/ie/pps.ts +7 -3
  725. package/src/ie/vat.ts +7 -3
  726. package/src/il/idnr.ts +7 -3
  727. package/src/in/aadhaar.ts +7 -3
  728. package/src/in/gstin.ts +10 -4
  729. package/src/in/pan.ts +15 -6
  730. package/src/index.ts +6 -0
  731. package/src/iq/nid.ts +7 -3
  732. package/src/ir/nid.ts +7 -3
  733. package/src/is/kennitala.ts +7 -3
  734. package/src/is/vsk.ts +7 -3
  735. package/src/isin.ts +17 -7
  736. package/src/it/codicefiscale.ts +49 -7
  737. package/src/it/iva.ts +7 -3
  738. package/src/jp/cn.ts +7 -3
  739. package/src/jp/mynumber.ts +7 -3
  740. package/src/kr/brn.ts +7 -3
  741. package/src/kr/rrn.ts +27 -8
  742. package/src/kw/civil.ts +31 -14
  743. package/src/kz/iin.ts +9 -8
  744. package/src/lei.ts +7 -3
  745. package/src/li/peid.ts +7 -3
  746. package/src/lk/nic.ts +31 -8
  747. package/src/lt/asmens.ts +8 -4
  748. package/src/lt/vat.ts +8 -3
  749. package/src/lu/vat.ts +8 -3
  750. package/src/luhn.ts +10 -3
  751. package/src/lv/vat.ts +53 -23
  752. package/src/ma/ice.ts +7 -3
  753. package/src/mc/tva.ts +9 -5
  754. package/src/md/idno.ts +7 -3
  755. package/src/me/pib.ts +7 -3
  756. package/src/mk/edb.ts +7 -3
  757. package/src/mt/vat.ts +8 -3
  758. package/src/mu/brn.ts +7 -3
  759. package/src/mx/clabe.ts +7 -3
  760. package/src/mx/curp.ts +47 -10
  761. package/src/mx/rfc.ts +42 -7
  762. package/src/my/nric.ts +33 -8
  763. package/src/ng/nin.ts +7 -3
  764. package/src/ni/ruc.ts +7 -3
  765. package/src/nl/bsn.ts +7 -3
  766. package/src/nl/kvk.ts +7 -3
  767. package/src/nl/vat.ts +18 -69
  768. package/src/no/fodselsnummer.ts +12 -7
  769. package/src/no/mva.ts +9 -5
  770. package/src/no/orgnr.ts +7 -3
  771. package/src/nz/ird.ts +12 -8
  772. package/src/pa/ruc.ts +39 -11
  773. package/src/patterns.ts +184 -46
  774. package/src/pe/ruc.ts +13 -10
  775. package/src/ph/philid.ts +7 -3
  776. package/src/pk/cnic.ts +9 -3
  777. package/src/pl/nip.ts +7 -3
  778. package/src/pl/pesel.ts +9 -7
  779. package/src/pl/regon.ts +7 -3
  780. package/src/pt/cc.ts +13 -7
  781. package/src/pt/vat.ts +8 -3
  782. package/src/ro/cnp.ts +16 -8
  783. package/src/ro/vat.ts +8 -3
  784. package/src/rs/pib.ts +7 -3
  785. package/src/ru/inn.ts +9 -5
  786. package/src/se/orgnr.ts +7 -3
  787. package/src/se/personnummer.ts +35 -32
  788. package/src/se/vat.ts +8 -3
  789. package/src/sg/uen.ts +44 -23
  790. package/src/si/emso.ts +37 -11
  791. package/src/si/vat.ts +8 -3
  792. package/src/sk/dic.ts +8 -4
  793. package/src/sk/ico.ts +3 -2
  794. package/src/sk/rc.ts +17 -4
  795. package/src/th/tin.ts +7 -3
  796. package/src/tr/tckimlik.ts +7 -3
  797. package/src/tr/vkn.ts +7 -3
  798. package/src/tw/ubn.ts +9 -5
  799. package/src/types.ts +69 -7
  800. package/src/ua/edrpou.ts +10 -5
  801. package/src/us/ein.ts +95 -91
  802. package/src/us/itin.ts +14 -11
  803. package/src/us/rtn.ts +32 -19
  804. package/src/us/ssn.ts +7 -3
  805. package/src/uy/rut.ts +9 -5
  806. package/src/ve/rif.ts +19 -12
  807. package/src/vn/mst.ts +7 -3
  808. package/src/za/idnr.ts +9 -7
package/dist/pt/vat.js CHANGED
@@ -1,19 +1,9 @@
1
+ import { weightedSum } from "../_checksums/weighted-sum.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits, randomInt } from "../_util/generate.js";
3
4
  import { err } from "../_util/result.js";
4
5
  import { isdigits } from "../_util/strings.js";
5
- import { weightedSum } from "../_checksums/weighted-sum.js";
6
6
  //#region src/pt/vat.ts
7
- /**
8
- * NIF (Portuguese VAT number).
9
- *
10
- * 9 digits, no leading 0.
11
- * Weights [9,8,7,6,5,4,3,2],
12
- * check = (11 - sum) % 11 % 10 === d[8].
13
- *
14
- * @see https://www.vatify.eu/portugal-vat-number.html
15
- * @see https://www.portaldasfinancas.gov.pt/
16
- */
17
7
  const WEIGHTS = [
18
8
  9,
19
9
  8,
@@ -58,9 +48,11 @@ const vat = {
58
48
  "contribuinte"
59
49
  ],
60
50
  candidatePattern: "PT\\d{9}",
51
+ scope: "country",
61
52
  country: "PT",
62
53
  entityType: "any",
63
54
  sourceUrl: "https://www.portaldasfinancas.gov.pt/",
55
+ lengths: [9],
64
56
  examples: ["501964843"],
65
57
  compact,
66
58
  format,
@@ -1 +1 @@
1
- {"version":3,"file":"vat.js","names":[],"sources":["../../src/pt/vat.ts"],"sourcesContent":["/**\n * NIF (Portuguese VAT number).\n *\n * 9 digits, no leading 0.\n * Weights [9,8,7,6,5,4,3,2],\n * check = (11 - sum) % 11 % 10 === d[8].\n *\n * @see https://www.vatify.eu/portugal-vat-number.html\n * @see https://www.portaldasfinancas.gov.pt/\n */\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst WEIGHTS = [9, 8, 7, 6, 5, 4, 3, 2];\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"PT\") || v.startsWith(\"pt\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Portuguese VAT number must be 9 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Portuguese VAT number must contain only digits\",\n );\n }\n if (v[0] === \"0\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Portuguese VAT number cannot start with 0\",\n );\n }\n const sum = weightedSum(v.slice(0, 8), WEIGHTS, 11);\n const check = ((11 - sum) % 11) % 10;\n if (check !== Number(v[8])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Portuguese VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `PT${compact(value)}`;\n\n/** Generate a random valid Portuguese NIF. */\nconst generate = (): string => {\n const payload = String(randomInt(1, 9)) + randomDigits(7);\n const sum = weightedSum(payload, WEIGHTS, 11);\n return payload + String(((11 - sum) % 11) % 10);\n};\n\n/** Portuguese VAT Number. */\nconst vat: Validator = {\n name: \"Portuguese VAT Number\",\n localName: \"Número de Identificação Fiscal\",\n abbreviation: \"NIF\",\n aliases: [\n \"NIF\",\n \"número de identificação fiscal\",\n \"contribuinte\",\n ] as const,\n candidatePattern: \"PT\\\\d{9}\",\n country: \"PT\",\n entityType: \"any\",\n sourceUrl: \"https://www.portaldasfinancas.gov.pt/\",\n examples: [\"501964843\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAExC,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,OAAO;AAC5B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,KAAI,EAAE,MAAM,EAAE;AAEhB,QAAO;;AAGT,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,yCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,iDACD;AAEH,KAAI,EAAE,OAAO,IACX,QAAO,IACL,qBACA,4CACD;AAIH,MADgB,KADJ,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,SAAS,GAAG,IACvB,KAAM,OACpB,OAAO,EAAE,GAAG,CACxB,QAAO,IACL,oBACA,6CACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UACd,KAAK,QAAQ,MAAM;;AAGrB,MAAM,iBAAyB;CAC7B,MAAM,UAAU,OAAO,UAAU,GAAG,EAAE,CAAC,GAAG,aAAa,EAAE;CACzD,MAAM,MAAM,YAAY,SAAS,SAAS,GAAG;AAC7C,QAAO,UAAU,QAAS,KAAK,OAAO,KAAM,GAAG;;;AAIjD,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":"vat.js","names":[],"sources":["../../src/pt/vat.ts"],"sourcesContent":["/**\n * NIF (Portuguese VAT number).\n *\n * 9 digits, no leading 0.\n * Weights [9,8,7,6,5,4,3,2],\n * check = (11 - sum) % 11 % 10 === d[8].\n *\n * @see https://www.vatify.eu/portugal-vat-number.html\n * @see https://www.portaldasfinancas.gov.pt/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [9, 8, 7, 6, 5, 4, 3, 2];\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"PT\") || v.startsWith(\"pt\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Portuguese VAT number must be 9 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Portuguese VAT number must contain only digits\",\n );\n }\n if (v[0] === \"0\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Portuguese VAT number cannot start with 0\",\n );\n }\n const sum = weightedSum(v.slice(0, 8), WEIGHTS, 11);\n const check = ((11 - sum) % 11) % 10;\n if (check !== Number(v[8])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Portuguese VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `PT${compact(value)}`;\n\n/** Generate a random valid Portuguese NIF. */\nconst generate = (): string => {\n const payload = String(randomInt(1, 9)) + randomDigits(7);\n const sum = weightedSum(payload, WEIGHTS, 11);\n return payload + String(((11 - sum) % 11) % 10);\n};\n\n/** Portuguese VAT Number. */\nconst vat: CountryValidator<\"PT\"> = {\n name: \"Portuguese VAT Number\",\n localName: \"Número de Identificação Fiscal\",\n abbreviation: \"NIF\",\n aliases: [\n \"NIF\",\n \"número de identificação fiscal\",\n \"contribuinte\",\n ] as const,\n candidatePattern: \"PT\\\\d{9}\",\n scope: \"country\",\n country: \"PT\",\n entityType: \"any\",\n sourceUrl: \"https://www.portaldasfinancas.gov.pt/\",\n lengths: [9] as const,\n examples: [\"501964843\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAsBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAEvC,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,MAAM;CAC3B,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO;AACT;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,wCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,gDACF;CAEF,IAAI,EAAE,OAAO,KACX,OAAO,IACL,qBACA,2CACF;CAIF,KADgB,KADJ,YAAY,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,EACzB,KAAK,KAAM,OACpB,OAAO,EAAE,EAAE,GACvB,OAAO,IACL,oBACA,4CACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UACd,KAAK,QAAQ,KAAK;;AAGpB,MAAM,iBAAyB;CAC7B,MAAM,UAAU,OAAO,UAAU,GAAG,CAAC,CAAC,IAAI,aAAa,CAAC;CACxD,MAAM,MAAM,YAAY,SAAS,SAAS,EAAE;CAC5C,OAAO,UAAU,QAAS,KAAK,OAAO,KAAM,EAAE;AAChD;;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,SAAS,CAAC,CAAC;CACX,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;AACF"}
package/dist/ro/cnp.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/ro/cnp.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;
@@ -13,7 +12,7 @@ declare const parse: (value: string) => ParsedPersonId | null;
13
12
  /** Generate a random valid Romanian CNP. */
14
13
  declare const generate: () => string;
15
14
  /** Romanian Personal Identification Number. */
16
- declare const cnp: Validator;
15
+ declare const cnp: CountryValidator<"RO", ParsedPersonId>;
17
16
  //#endregion
18
17
  export { compact, cnp as default, format, generate, parse, validate };
19
18
  //# sourceMappingURL=cnp.d.ts.map
package/dist/ro/cnp.js CHANGED
@@ -1,20 +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/ro/cnp.ts
8
- /**
9
- * CNP (Cod Numeric Personal).
10
- *
11
- * Romanian personal identification number. 13 digits
12
- * encoding gender/century, date of birth, county code,
13
- * serial number, and a check digit.
14
- *
15
- * @see https://ro.wikipedia.org/wiki/Cod_numeric_personal
16
- * @see https://www.cnp.ro/
17
- */
18
8
  const WEIGHTS = [
19
9
  2,
20
10
  7,
@@ -78,8 +68,6 @@ const VALID_COUNTIES = new Set([
78
68
  46,
79
69
  47,
80
70
  48,
81
- 49,
82
- 50,
83
71
  51,
84
72
  52,
85
73
  70,
@@ -161,12 +149,15 @@ const cnp = {
161
149
  abbreviation: "CNP",
162
150
  aliases: ["CNP", "cod numeric personal"],
163
151
  candidatePattern: "[1-8]\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])\\d{6}",
152
+ scope: "country",
164
153
  country: "RO",
165
154
  entityType: "person",
166
155
  sourceUrl: "https://www.cnp.ro/",
156
+ lengths: [13],
167
157
  examples: ["1630615123457"],
168
158
  compact,
169
159
  format,
160
+ parse,
170
161
  validate,
171
162
  generate
172
163
  };
@@ -1 +1 @@
1
- {"version":3,"file":"cnp.js","names":[],"sources":["../../src/ro/cnp.ts"],"sourcesContent":["/**\n * CNP (Cod Numeric Personal).\n *\n * Romanian personal identification number. 13 digits\n * encoding gender/century, date of birth, county code,\n * serial number, and a check digit.\n *\n * @see https://ro.wikipedia.org/wiki/Cod_numeric_personal\n * @see https://www.cnp.ro/\n */\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type {\n ParsedPersonId,\n ValidateResult,\n Validator,\n} from \"../types\";\n\nconst WEIGHTS = [\n 2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9,\n] as const;\n\nconst VALID_COUNTIES = new Set([\n 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,\n 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,\n 46, 47, 48, 49, 50, 51, 52, 70, 80, 81, 82, 83,\n]);\n\nconst centuryMap: Record<number, number> = {\n 1: 1900,\n 2: 1900,\n 3: 1800,\n 4: 1800,\n 5: 2000,\n 6: 2000,\n 7: 1900, // foreign residents\n 8: 1900, // foreign residents\n};\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"CNP must be exactly 13 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CNP must contain only digits\",\n );\n }\n\n const g = Number(v[0]);\n if (g < 1 || g > 9) {\n return err(\n \"INVALID_COMPONENT\",\n \"CNP gender/century digit is invalid\",\n );\n }\n\n const century = centuryMap[g] ?? 1900;\n const yy = Number(v.slice(1, 3));\n const mm = Number(v.slice(3, 5));\n const dd = Number(v.slice(5, 7));\n const year = century + yy;\n\n if (!isValidDate(year, mm, dd)) {\n return err(\n \"INVALID_COMPONENT\",\n \"CNP contains an invalid date\",\n );\n }\n\n const county = Number(v.slice(7, 9));\n if (!VALID_COUNTIES.has(county)) {\n return err(\n \"INVALID_COMPONENT\",\n \"CNP county code is invalid\",\n );\n }\n\n const sum = weightedSum(v.slice(0, 12), WEIGHTS, 11);\n const check = sum === 10 ? 1 : sum;\n if (check !== Number(v[12])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CNP check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/**\n * Extract birth date and gender from a CNP.\n * Returns null if the value is not valid.\n */\nconst parse = (value: string): ParsedPersonId | null => {\n const result = validate(value);\n if (!result.valid) return null;\n\n const v = result.compact;\n const g = Number(v[0]);\n const century = centuryMap[g] ?? 1900;\n const yy = Number(v.slice(1, 3));\n const mm = Number(v.slice(3, 5));\n const dd = Number(v.slice(5, 7));\n const year = century + yy;\n\n return {\n birthDate: new Date(year, mm - 1, dd),\n gender: g % 2 === 1 ? \"male\" : \"female\",\n };\n};\n\n/** Generate a random valid Romanian CNP. */\nconst generate = (): string => {\n for (;;) {\n const g = String(randomInt(1, 6));\n const yy = String(randomInt(0, 99)).padStart(2, \"0\");\n const mm = String(randomInt(1, 12)).padStart(2, \"0\");\n const dd = String(randomInt(1, 28)).padStart(2, \"0\");\n const county = String(randomInt(1, 52)).padStart(\n 2,\n \"0\",\n );\n const serial = String(randomInt(1, 999)).padStart(\n 3,\n \"0\",\n );\n const payload = g + yy + mm + dd + county + serial;\n const sum = weightedSum(payload, WEIGHTS, 11);\n const c = payload + String(sum === 10 ? 1 : sum);\n if (validate(c).valid) return c;\n }\n};\n\n/** Romanian Personal Identification Number. */\nconst cnp: Validator = {\n name: \"Romanian Personal ID\",\n localName: \"Cod Numeric Personal\",\n abbreviation: \"CNP\",\n aliases: [\"CNP\", \"cod numeric personal\"] as const,\n candidatePattern:\n \"[1-8]\\\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\\\d|3[01])\\\\d{6}\",\n country: \"RO\",\n entityType: \"person\",\n sourceUrl: \"https://www.cnp.ro/\",\n examples: [\"1630615123457\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cnp;\nexport { compact, format, parse, validate, generate };\n"],"mappings":"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"}
1
+ {"version":3,"file":"cnp.js","names":[],"sources":["../../src/ro/cnp.ts"],"sourcesContent":["/**\n * CNP (Cod Numeric Personal).\n *\n * Romanian personal identification number. 13 digits\n * encoding gender/century, date of birth, county code,\n * serial number, and a check digit.\n *\n * @see https://ro.wikipedia.org/wiki/Cod_numeric_personal\n * @see https://www.cnp.ro/\n */\n\nimport type {\n ParsedPersonId,\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [\n 2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9,\n] as const;\n\n// Counties 01-39 are the 39 modern judete; 40-46 are\n// Bucuresti sectors 1-6; 47-48 are the abolished\n// sectors 7-8; 51-52 are Calarasi/Giurgiu; 70 is \"Any\";\n// 80-83 are reserved. 49 and 50 are not allocated.\n// See https://github.com/vimishor/cnp-spec.\nconst VALID_COUNTIES = new Set([\n 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,\n 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,\n 46, 47, 48, 51, 52, 70, 80, 81, 82, 83,\n]);\n\nconst centuryMap: Record<number, number> = {\n 1: 1900,\n 2: 1900,\n 3: 1800,\n 4: 1800,\n 5: 2000,\n 6: 2000,\n 7: 1900, // foreign residents\n 8: 1900, // foreign residents\n};\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"CNP must be exactly 13 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CNP must contain only digits\",\n );\n }\n\n const g = Number(v[0]);\n if (g < 1 || g > 9) {\n return err(\n \"INVALID_COMPONENT\",\n \"CNP gender/century digit is invalid\",\n );\n }\n\n const century = centuryMap[g] ?? 1900;\n const yy = Number(v.slice(1, 3));\n const mm = Number(v.slice(3, 5));\n const dd = Number(v.slice(5, 7));\n const year = century + yy;\n\n if (!isValidDate(year, mm, dd)) {\n return err(\n \"INVALID_COMPONENT\",\n \"CNP contains an invalid date\",\n );\n }\n\n const county = Number(v.slice(7, 9));\n if (!VALID_COUNTIES.has(county)) {\n return err(\n \"INVALID_COMPONENT\",\n \"CNP county code is invalid\",\n );\n }\n\n const sum = weightedSum(v.slice(0, 12), WEIGHTS, 11);\n const check = sum === 10 ? 1 : sum;\n if (check !== Number(v[12])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CNP check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/**\n * Extract birth date and gender from a CNP.\n * Returns null if the value is not valid.\n */\nconst parse = (value: string): ParsedPersonId | null => {\n const result = validate(value);\n if (!result.valid) return null;\n\n const v = result.compact;\n const g = Number(v[0]);\n const century = centuryMap[g] ?? 1900;\n const yy = Number(v.slice(1, 3));\n const mm = Number(v.slice(3, 5));\n const dd = Number(v.slice(5, 7));\n const year = century + yy;\n\n return {\n birthDate: new Date(year, mm - 1, dd),\n gender: g % 2 === 1 ? \"male\" : \"female\",\n };\n};\n\n/** Generate a random valid Romanian CNP. */\nconst generate = (): string => {\n for (;;) {\n const g = String(randomInt(1, 6));\n const yy = String(randomInt(0, 99)).padStart(2, \"0\");\n const mm = String(randomInt(1, 12)).padStart(2, \"0\");\n const dd = String(randomInt(1, 28)).padStart(2, \"0\");\n const county = String(randomInt(1, 52)).padStart(\n 2,\n \"0\",\n );\n const serial = String(randomInt(1, 999)).padStart(\n 3,\n \"0\",\n );\n const payload = g + yy + mm + dd + county + serial;\n const sum = weightedSum(payload, WEIGHTS, 11);\n const c = payload + String(sum === 10 ? 1 : sum);\n if (validate(c).valid) return c;\n }\n};\n\n/** Romanian Personal Identification Number. */\nconst cnp: CountryValidator<\"RO\", ParsedPersonId> = {\n name: \"Romanian Personal ID\",\n localName: \"Cod Numeric Personal\",\n abbreviation: \"CNP\",\n aliases: [\"CNP\", \"cod numeric personal\"] as const,\n candidatePattern:\n \"[1-8]\\\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\\\d|3[01])\\\\d{6}\",\n scope: \"country\",\n country: \"RO\",\n entityType: \"person\",\n sourceUrl: \"https://www.cnp.ro/\",\n lengths: [13] as const,\n examples: [\"1630615123457\"] as const,\n compact,\n format,\n parse,\n validate,\n generate,\n};\n\nexport default cnp;\nexport { compact, format, parse, validate, generate };\n"],"mappings":"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"}
package/dist/ro/mod.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import cnp from "./cnp.js";
3
2
  import vat from "./vat.js";
4
3
 
5
4
  //#region src/ro/mod.d.ts
6
-
5
+ declare namespace mod_d_exports {
6
+ export { cnp, vat };
7
+ }
7
8
  //#endregion
8
9
  export { cnp, mod_d_exports, vat };
9
10
  //# sourceMappingURL=mod.d.ts.map
package/dist/ro/vat.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ro/vat.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid Romanian VAT number. */
9
8
  declare const generate: () => string;
10
9
  /** Romanian VAT Number. */
11
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"RO">;
12
11
  //#endregion
13
12
  export { compact, vat as default, format, generate, validate };
14
13
  //# sourceMappingURL=vat.d.ts.map
package/dist/ro/vat.js CHANGED
@@ -1,19 +1,9 @@
1
+ import { weightedSum } from "../_checksums/weighted-sum.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits, randomInt } from "../_util/generate.js";
3
4
  import { err } from "../_util/result.js";
4
5
  import { isdigits } from "../_util/strings.js";
5
- import { weightedSum } from "../_checksums/weighted-sum.js";
6
6
  //#region src/ro/vat.ts
7
- /**
8
- * CIF/CUI (Romanian VAT number).
9
- *
10
- * 2-10 digits. Pad to 10, weights
11
- * [7,5,3,2,1,7,5,3,2], check =
12
- * (10 * sum) % 11 % 10 === last digit.
13
- *
14
- * @see https://www.vatify.eu/romania-vat-number.html
15
- * @see https://www.anaf.ro/
16
- */
17
7
  const WEIGHTS = [
18
8
  7,
19
9
  5,
@@ -61,9 +51,21 @@ const vat = {
61
51
  "cod fiscal"
62
52
  ],
63
53
  candidatePattern: "RO\\d{2,10}",
54
+ scope: "country",
64
55
  country: "RO",
65
56
  entityType: "any",
66
57
  sourceUrl: "https://www.anaf.ro/",
58
+ lengths: [
59
+ 2,
60
+ 3,
61
+ 4,
62
+ 5,
63
+ 6,
64
+ 7,
65
+ 8,
66
+ 9,
67
+ 10
68
+ ],
67
69
  examples: ["18547290"],
68
70
  compact,
69
71
  format,
@@ -1 +1 @@
1
- {"version":3,"file":"vat.js","names":[],"sources":["../../src/ro/vat.ts"],"sourcesContent":["/**\n * CIF/CUI (Romanian VAT number).\n *\n * 2-10 digits. Pad to 10, weights\n * [7,5,3,2,1,7,5,3,2], check =\n * (10 * sum) % 11 % 10 === last digit.\n *\n * @see https://www.vatify.eu/romania-vat-number.html\n * @see https://www.anaf.ro/\n */\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst WEIGHTS = [7, 5, 3, 2, 1, 7, 5, 3, 2];\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"RO\") || v.startsWith(\"ro\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length < 2 || v.length > 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Romanian VAT number must be 2 to 10 digits\",\n );\n }\n if (!isdigits(v) || v[0] === \"0\") {\n return err(\n \"INVALID_FORMAT\",\n \"Romanian VAT number must contain only digits \" +\n \"and must not start with 0\",\n );\n }\n // Pad to 10 digits\n const padded = v.padStart(10, \"0\");\n const sum = weightedSum(padded.slice(0, 9), WEIGHTS, 11);\n const check = ((sum * 10) % 11) % 10;\n if (check !== Number(padded[9])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Romanian VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `RO${compact(value)}`;\n\n/** Generate a random valid Romanian VAT number. */\nconst generate = (): string => {\n for (;;) {\n const c =\n String(randomInt(1, 9)) +\n randomDigits(randomInt(1, 9));\n if (validate(c).valid) return c;\n }\n};\n\n/** Romanian VAT Number. */\nconst vat: Validator = {\n name: \"Romanian VAT Number\",\n localName: \"Cod de Identificare Fiscală\",\n abbreviation: \"CIF\",\n aliases: [\n \"CUI\",\n \"CIF\",\n \"cod de identificare fiscală\",\n \"cod fiscal\",\n ] as const,\n candidatePattern: \"RO\\\\d{2,10}\",\n country: \"RO\",\n entityType: \"any\",\n sourceUrl: \"https://www.anaf.ro/\",\n examples: [\"18547290\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAE3C,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,OAAO;AAC5B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,KAAI,EAAE,MAAM,EAAE;AAEhB,QAAO;;AAGT,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,SAAS,KAAK,EAAE,SAAS,GAC7B,QAAO,IACL,kBACA,6CACD;AAEH,KAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,IAC3B,QAAO,IACL,kBACA,yEAED;CAGH,MAAM,SAAS,EAAE,SAAS,IAAI,IAAI;AAGlC,KAFY,YAAY,OAAO,MAAM,GAAG,EAAE,EAAE,SAAS,GAAG,GAClC,KAAM,KAAM,OACpB,OAAO,OAAO,GAAG,CAC7B,QAAO,IACL,oBACA,2CACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UACd,KAAK,QAAQ,MAAM;;AAGrB,MAAM,iBAAyB;AAC7B,UAAS;EACP,MAAM,IACJ,OAAO,UAAU,GAAG,EAAE,CAAC,GACvB,aAAa,UAAU,GAAG,EAAE,CAAC;AAC/B,MAAI,SAAS,EAAE,CAAC,MAAO,QAAO;;;;AAKlC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"vat.js","names":[],"sources":["../../src/ro/vat.ts"],"sourcesContent":["/**\n * CIF/CUI (Romanian VAT number).\n *\n * 2-10 digits. Pad to 10, weights\n * [7,5,3,2,1,7,5,3,2], check =\n * (10 * sum) % 11 % 10 === last digit.\n *\n * @see https://www.vatify.eu/romania-vat-number.html\n * @see https://www.anaf.ro/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [7, 5, 3, 2, 1, 7, 5, 3, 2];\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"RO\") || v.startsWith(\"ro\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length < 2 || v.length > 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Romanian VAT number must be 2 to 10 digits\",\n );\n }\n if (!isdigits(v) || v[0] === \"0\") {\n return err(\n \"INVALID_FORMAT\",\n \"Romanian VAT number must contain only digits \" +\n \"and must not start with 0\",\n );\n }\n // Pad to 10 digits\n const padded = v.padStart(10, \"0\");\n const sum = weightedSum(padded.slice(0, 9), WEIGHTS, 11);\n const check = ((sum * 10) % 11) % 10;\n if (check !== Number(padded[9])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Romanian VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `RO${compact(value)}`;\n\n/** Generate a random valid Romanian VAT number. */\nconst generate = (): string => {\n for (;;) {\n const c =\n String(randomInt(1, 9)) +\n randomDigits(randomInt(1, 9));\n if (validate(c).valid) return c;\n }\n};\n\n/** Romanian VAT Number. */\nconst vat: CountryValidator<\"RO\"> = {\n name: \"Romanian VAT Number\",\n localName: \"Cod de Identificare Fiscală\",\n abbreviation: \"CIF\",\n aliases: [\n \"CUI\",\n \"CIF\",\n \"cod de identificare fiscală\",\n \"cod fiscal\",\n ] as const,\n candidatePattern: \"RO\\\\d{2,10}\",\n scope: \"country\",\n country: \"RO\",\n entityType: \"any\",\n sourceUrl: \"https://www.anaf.ro/\",\n lengths: [2, 3, 4, 5, 6, 7, 8, 9, 10] as const,\n examples: [\"18547290\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAsBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAE1C,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,MAAM;CAC3B,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO;AACT;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,SAAS,KAAK,EAAE,SAAS,IAC7B,OAAO,IACL,kBACA,4CACF;CAEF,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,KAC3B,OAAO,IACL,kBACA,wEAEF;CAGF,MAAM,SAAS,EAAE,SAAS,IAAI,GAAG;CAGjC,IAFY,YAAY,OAAO,MAAM,GAAG,CAAC,GAAG,SAAS,EACnC,IAAI,KAAM,KAAM,OACpB,OAAO,OAAO,EAAE,GAC5B,OAAO,IACL,oBACA,0CACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UACd,KAAK,QAAQ,KAAK;;AAGpB,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,IACJ,OAAO,UAAU,GAAG,CAAC,CAAC,IACtB,aAAa,UAAU,GAAG,CAAC,CAAC;EAC9B,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO;CAChC;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,WAAW;CACX,SAAS;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAE;CACpC,UAAU,CAAC,UAAU;CACrB;CACA;CACA;CACA;AACF"}
package/dist/rs/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import pib from "./pib.js";
3
2
 
4
3
  //#region src/rs/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { pib };
6
+ }
6
7
  //#endregion
7
8
  export { mod_d_exports, pib };
8
9
  //# sourceMappingURL=mod.d.ts.map
package/dist/rs/pib.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/rs/pib.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 Serbian PIB. */
9
8
  declare const generate: () => string;
10
9
  /** Serbian Tax Identification Number. */
11
- declare const pib: Validator;
10
+ declare const pib: CountryValidator<"RS">;
12
11
  //#endregion
13
12
  export { compact, pib as default, format, generate, validate };
14
13
  //# sourceMappingURL=pib.d.ts.map
package/dist/rs/pib.js CHANGED
@@ -3,15 +3,6 @@ import { randomDigits } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/rs/pib.ts
6
- /**
7
- * PIB (Poreski identifikacioni broj).
8
- *
9
- * Serbian tax identification number. 9 digits with
10
- * a mod 11 checksum (ISO 7064 variant).
11
- *
12
- * @see https://en.wikipedia.org/wiki/Tax_identification_number_(Serbia)
13
- * @see https://www.purs.gov.rs/
14
- */
15
6
  const compact = (value) => clean(value, " -");
16
7
  const validate = (value) => {
17
8
  const v = compact(value);
@@ -44,6 +35,7 @@ const pib = {
44
35
  abbreviation: "PIB",
45
36
  aliases: ["PIB", "poreski identifikacioni broj"],
46
37
  candidatePattern: "\\d{9}",
38
+ scope: "country",
47
39
  country: "RS",
48
40
  entityType: "any",
49
41
  lengths: [9],
@@ -1 +1 @@
1
- {"version":3,"file":"pib.js","names":[],"sources":["../../src/rs/pib.ts"],"sourcesContent":["/**\n * PIB (Poreski identifikacioni broj).\n *\n * Serbian tax identification number. 9 digits with\n * a mod 11 checksum (ISO 7064 variant).\n *\n * @see https://en.wikipedia.org/wiki/Tax_identification_number_(Serbia)\n * @see https://www.purs.gov.rs/\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 compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"PIB must be exactly 9 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"PIB must contain only digits\",\n );\n }\n\n // ISO 7064 Mod 11, 10 checksum\n let t = 10;\n for (let i = 0; i < 8; i++) {\n t = (t + Number(v[i])) % 10;\n if (t === 0) t = 10;\n t = (t * 2) % 11;\n }\n const check = (11 - t) % 10;\n if (check !== Number(v[8])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"PIB check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Serbian PIB. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(9);\n if (validate(c).valid) return c;\n }\n};\n\n/** Serbian Tax Identification Number. */\nconst pib: Validator = {\n name: \"Serbian Tax ID\",\n localName: \"Poreski identifikacioni broj\",\n abbreviation: \"PIB\",\n aliases: [\"PIB\", \"poreski identifikacioni broj\"] as const,\n candidatePattern: \"\\\\d{9}\",\n country: \"RS\",\n entityType: \"any\",\n lengths: [9] as const,\n sourceUrl: \"https://www.purs.gov.rs/\",\n examples: [\"101134702\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default pib;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,+BACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;CAIH,IAAI,IAAI;AACR,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,OAAK,IAAI,OAAO,EAAE,GAAG,IAAI;AACzB,MAAI,MAAM,EAAG,KAAI;AACjB,MAAK,IAAI,IAAK;;AAGhB,MADe,KAAK,KAAK,OACX,OAAO,EAAE,GAAG,CACxB,QAAO,IACL,oBACA,2BACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,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,+BAA+B;CAChD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,WAAW;CACX,UAAU,CAAC,YAAY;CACvB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"pib.js","names":[],"sources":["../../src/rs/pib.ts"],"sourcesContent":["/**\n * PIB (Poreski identifikacioni broj).\n *\n * Serbian tax identification number. 9 digits with\n * a mod 11 checksum (ISO 7064 variant).\n *\n * @see https://en.wikipedia.org/wiki/Tax_identification_number_(Serbia)\n * @see https://www.purs.gov.rs/\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 compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"PIB must be exactly 9 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"PIB must contain only digits\",\n );\n }\n\n // ISO 7064 Mod 11, 10 checksum\n let t = 10;\n for (let i = 0; i < 8; i++) {\n t = (t + Number(v[i])) % 10;\n if (t === 0) t = 10;\n t = (t * 2) % 11;\n }\n const check = (11 - t) % 10;\n if (check !== Number(v[8])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"PIB check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Serbian PIB. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(9);\n if (validate(c).valid) return c;\n }\n};\n\n/** Serbian Tax Identification Number. */\nconst pib: CountryValidator<\"RS\"> = {\n name: \"Serbian Tax ID\",\n localName: \"Poreski identifikacioni broj\",\n abbreviation: \"PIB\",\n aliases: [\"PIB\", \"poreski identifikacioni broj\"] as const,\n candidatePattern: \"\\\\d{9}\",\n scope: \"country\",\n country: \"RS\",\n entityType: \"any\",\n lengths: [9] as const,\n sourceUrl: \"https://www.purs.gov.rs/\",\n examples: [\"101134702\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default pib;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAoBA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,8BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAIF,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EAC1B,KAAK,IAAI,OAAO,EAAE,EAAE,KAAK;EACzB,IAAI,MAAM,GAAG,IAAI;EACjB,IAAK,IAAI,IAAK;CAChB;CAEA,KADe,KAAK,KAAK,OACX,OAAO,EAAE,EAAE,GACvB,OAAO,IACL,oBACA,0BACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,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,8BAA8B;CAC/C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,CAAC;CACX,WAAW;CACX,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;AACF"}
package/dist/ru/inn.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/ru/inn.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 10-digit Russian INN. */
9
8
  declare const generate: () => string;
10
9
  /** Russian Taxpayer Identification Number. */
11
- declare const inn: Validator;
10
+ declare const inn: CountryValidator<"RU">;
12
11
  //#endregion
13
12
  export { compact, inn as default, format, generate, validate };
14
13
  //# sourceMappingURL=inn.d.ts.map
package/dist/ru/inn.js CHANGED
@@ -3,17 +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/ru/inn.ts
6
- /**
7
- * INN (Идентификационный номер налогоплательщика).
8
- *
9
- * Russian taxpayer identification number. 10 digits
10
- * for companies (1 check digit), 12 digits for
11
- * individuals (2 check digits). Check digits are
12
- * computed as weighted sum mod 11 mod 10.
13
- *
14
- * @see https://en.wikipedia.org/wiki/Taxpayer_Identification_Number_(Russia)
15
- * @see https://www.nalog.gov.ru/
16
- */
17
6
  const WEIGHTS_10 = [
18
7
  2,
19
8
  4,
@@ -52,7 +41,7 @@ const WEIGHTS_12 = [
52
41
  ];
53
42
  const checkDigit = (value, weights) => {
54
43
  let sum = 0;
55
- for (let i = 0; i < weights.length; i++) sum += Number(value[i]) * weights[i];
44
+ for (const [i, weight] of weights.entries()) sum += Number(value[i]) * weight;
56
45
  return sum % 11 % 10;
57
46
  };
58
47
  const compact = (value) => clean(value, " -");
@@ -87,6 +76,7 @@ const inn = {
87
76
  abbreviation: "ИНН",
88
77
  aliases: ["ИНН", "INN"],
89
78
  candidatePattern: "\\d{10,12}",
79
+ scope: "country",
90
80
  country: "RU",
91
81
  entityType: "any",
92
82
  lengths: [10, 12],
@@ -1 +1 @@
1
- {"version":3,"file":"inn.js","names":[],"sources":["../../src/ru/inn.ts"],"sourcesContent":["/**\n * INN (Идентификационный номер налогоплательщика).\n *\n * Russian taxpayer identification number. 10 digits\n * for companies (1 check digit), 12 digits for\n * individuals (2 check digits). Check digits are\n * computed as weighted sum mod 11 mod 10.\n *\n * @see https://en.wikipedia.org/wiki/Taxpayer_Identification_Number_(Russia)\n * @see https://www.nalog.gov.ru/\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_10 = [2, 4, 10, 3, 5, 9, 4, 6, 8] as const;\nconst WEIGHTS_11 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8] as const;\nconst WEIGHTS_12 = [\n 3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8,\n] as const;\n\nconst checkDigit = (\n value: string,\n weights: readonly number[],\n): number => {\n let sum = 0;\n for (let i = 0; i < weights.length; i++) {\n sum += Number(value[i]) * weights[i]!;\n }\n return (sum % 11) % 10;\n};\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 10 && v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"INN must be 10 or 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"INN must contain only digits\",\n );\n }\n\n if (v.length === 10) {\n const check = checkDigit(v, WEIGHTS_10);\n if (check !== Number(v[9])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"INN check digit mismatch\",\n );\n }\n } else {\n const check11 = checkDigit(v, WEIGHTS_11);\n const check12 = checkDigit(v, WEIGHTS_12);\n if (\n check11 !== Number(v[10]) ||\n check12 !== Number(v[11])\n ) {\n return err(\n \"INVALID_CHECKSUM\",\n \"INN check digit mismatch\",\n );\n }\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid 10-digit Russian INN. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(10);\n if (validate(c).valid) return c;\n }\n};\n\n/** Russian Taxpayer Identification Number. */\nconst inn: Validator = {\n name: \"Russian Tax ID\",\n localName: \"Идентификационный номер налогоплательщика\",\n abbreviation: \"ИНН\",\n aliases: [\"ИНН\", \"INN\"] as const,\n candidatePattern: \"\\\\d{10,12}\",\n country: \"RU\",\n entityType: \"any\",\n lengths: [10, 12] as const,\n sourceUrl: \"https://www.nalog.gov.ru/\",\n examples: [\"7707083893\", \"526317984689\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default inn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,MAAM,aAAa;CAAC;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAC/C,MAAM,aAAa;CAAC;CAAG;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAClD,MAAM,aAAa;CACjB;CAAG;CAAG;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAChC;AAED,MAAM,cACJ,OACA,YACW;CACX,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAClC,QAAO,OAAO,MAAM,GAAG,GAAG,QAAQ;AAEpC,QAAQ,MAAM,KAAM;;AAGtB,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,MAAM,EAAE,WAAW,GAClC,QAAO,IACL,kBACA,8BACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;AAGH,KAAI,EAAE,WAAW;MACD,WAAW,GAAG,WAAW,KACzB,OAAO,EAAE,GAAG,CACxB,QAAO,IACL,oBACA,2BACD;QAEE;EACL,MAAM,UAAU,WAAW,GAAG,WAAW;EACzC,MAAM,UAAU,WAAW,GAAG,WAAW;AACzC,MACE,YAAY,OAAO,EAAE,IAAI,IACzB,YAAY,OAAO,EAAE,IAAI,CAEzB,QAAO,IACL,oBACA,2BACD;;AAIL,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,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,MAAM;CACvB,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,IAAI,GAAG;CACjB,WAAW;CACX,UAAU,CAAC,cAAc,eAAe;CACxC;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"inn.js","names":[],"sources":["../../src/ru/inn.ts"],"sourcesContent":["/**\n * INN (Идентификационный номер налогоплательщика).\n *\n * Russian taxpayer identification number. 10 digits\n * for companies (1 check digit), 12 digits for\n * individuals (2 check digits). Check digits are\n * computed as weighted sum mod 11 mod 10.\n *\n * @see https://en.wikipedia.org/wiki/Taxpayer_Identification_Number_(Russia)\n * @see https://www.nalog.gov.ru/\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_10 = [2, 4, 10, 3, 5, 9, 4, 6, 8] as const;\nconst WEIGHTS_11 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8] as const;\nconst WEIGHTS_12 = [\n 3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8,\n] as const;\n\nconst checkDigit = (\n value: string,\n weights: readonly number[],\n): number => {\n let sum = 0;\n for (const [i, weight] of weights.entries()) {\n sum += Number(value[i]) * weight;\n }\n return (sum % 11) % 10;\n};\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 10 && v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"INN must be 10 or 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"INN must contain only digits\",\n );\n }\n\n if (v.length === 10) {\n const check = checkDigit(v, WEIGHTS_10);\n if (check !== Number(v[9])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"INN check digit mismatch\",\n );\n }\n } else {\n const check11 = checkDigit(v, WEIGHTS_11);\n const check12 = checkDigit(v, WEIGHTS_12);\n if (\n check11 !== Number(v[10]) ||\n check12 !== Number(v[11])\n ) {\n return err(\n \"INVALID_CHECKSUM\",\n \"INN check digit mismatch\",\n );\n }\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid 10-digit Russian INN. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(10);\n if (validate(c).valid) return c;\n }\n};\n\n/** Russian Taxpayer Identification Number. */\nconst inn: CountryValidator<\"RU\"> = {\n name: \"Russian Tax ID\",\n localName: \"Идентификационный номер налогоплательщика\",\n abbreviation: \"ИНН\",\n aliases: [\"ИНН\", \"INN\"] as const,\n candidatePattern: \"\\\\d{10,12}\",\n scope: \"country\",\n country: \"RU\",\n entityType: \"any\",\n lengths: [10, 12] as const,\n sourceUrl: \"https://www.nalog.gov.ru/\",\n examples: [\"7707083893\", \"526317984689\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default inn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAsBA,MAAM,aAAa;CAAC;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAC9C,MAAM,aAAa;CAAC;CAAG;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AACjD,MAAM,aAAa;CACjB;CAAG;CAAG;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;AACjC;AAEA,MAAM,cACJ,OACA,YACW;CACX,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GACxC,OAAO,OAAO,MAAM,EAAE,IAAI;CAE5B,OAAQ,MAAM,KAAM;AACtB;AAEA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,MAAM,EAAE,WAAW,IAClC,OAAO,IACL,kBACA,6BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAGF,IAAI,EAAE,WAAW;MACD,WAAW,GAAG,UACpB,MAAM,OAAO,EAAE,EAAE,GACvB,OAAO,IACL,oBACA,0BACF;CAAA,OAEG;EACL,MAAM,UAAU,WAAW,GAAG,UAAU;EACxC,MAAM,UAAU,WAAW,GAAG,UAAU;EACxC,IACE,YAAY,OAAO,EAAE,GAAG,KACxB,YAAY,OAAO,EAAE,GAAG,GAExB,OAAO,IACL,oBACA,0BACF;CAEJ;CAEA,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,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,KAAK;CACtB,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,IAAI,EAAE;CAChB,WAAW;CACX,UAAU,CAAC,cAAc,cAAc;CACvC;CACA;CACA;CACA;AACF"}
package/dist/ru/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import inn from "./inn.js";
3
2
 
4
3
  //#region src/ru/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { inn };
6
+ }
6
7
  //#endregion
7
8
  export { inn, mod_d_exports };
8
9
  //# sourceMappingURL=mod.d.ts.map
package/dist/se/mod.d.ts CHANGED
@@ -1,10 +1,11 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import orgnr from "./orgnr.js";
3
2
  import personnummer from "./personnummer.js";
4
3
  import vat from "./vat.js";
5
4
 
6
5
  //#region src/se/mod.d.ts
7
-
6
+ declare namespace mod_d_exports {
7
+ export { orgnr, personnummer, vat };
8
+ }
8
9
  //#endregion
9
10
  export { mod_d_exports, orgnr, personnummer, vat };
10
11
  //# sourceMappingURL=mod.d.ts.map
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/se/orgnr.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 Swedish org number. */
9
8
  declare const generate: () => string;
10
9
  /** Swedish Organization Number. */
11
- declare const orgnr: Validator;
10
+ declare const orgnr: CountryValidator<"SE">;
12
11
  //#endregion
13
12
  export { compact, orgnr as default, format, generate, validate };
14
13
  //# sourceMappingURL=orgnr.d.ts.map
package/dist/se/orgnr.js CHANGED
@@ -1,17 +1,9 @@
1
+ import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits } from "../_util/generate.js";
3
4
  import { err } from "../_util/result.js";
4
- import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
5
5
  import { isdigits } from "../_util/strings.js";
6
6
  //#region src/se/orgnr.ts
7
- /**
8
- * Organisationsnummer (Swedish organization number).
9
- *
10
- * 10 digits. Standard Luhn checksum.
11
- * Display format: NNNNNN-NNNN.
12
- *
13
- * @see https://www.skatteverket.se/
14
- */
15
7
  const compact = (value) => clean(value, " -");
16
8
  const validate = (value) => {
17
9
  const v = compact(value);
@@ -44,6 +36,7 @@ const orgnr = {
44
36
  "org nr"
45
37
  ],
46
38
  candidatePattern: "\\d{6}-\\d{4}",
39
+ scope: "country",
47
40
  country: "SE",
48
41
  entityType: "company",
49
42
  sourceUrl: "https://www.skatteverket.se/",
@@ -1 +1 @@
1
- {"version":3,"file":"orgnr.js","names":[],"sources":["../../src/se/orgnr.ts"],"sourcesContent":["/**\n * Organisationsnummer (Swedish organization number).\n *\n * 10 digits. Standard Luhn checksum.\n * Display format: NNNNNN-NNNN.\n *\n * @see https://www.skatteverket.se/\n */\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Swedish Organisationsnummer must be 10 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Swedish Organisationsnummer must contain only digits\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Swedish Organisationsnummer Luhn check failed\",\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, 6)}-${v.slice(6)}`;\n};\n\n/** Generate a random valid Swedish org number. */\nconst generate = (): string => {\n const p = randomDigits(9);\n const cs = luhnChecksum(p + \"0\");\n return p + String((10 - cs) % 10);\n};\n\n/** Swedish Organization Number. */\nconst orgnr: Validator = {\n name: \"Swedish Organization Number\",\n localName: \"Organisationsnummer\",\n abbreviation: \"Orgnr\",\n aliases: [\n \"organisationsnummer\",\n \"org.nr\",\n \"org nr\",\n ] as const,\n candidatePattern: \"\\\\d{6}-\\\\d{4}\",\n country: \"SE\",\n entityType: \"company\",\n sourceUrl: \"https://www.skatteverket.se/\",\n examples: [\"1234567897\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default orgnr;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;AAoBA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,gDACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,uDACD;AAEH,KAAI,CAAC,aAAa,EAAE,CAClB,QAAO,IACL,oBACA,gDACD;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,EAAE;;;AAIvC,MAAM,iBAAyB;CAC7B,MAAM,IAAI,aAAa,EAAE;CACzB,MAAM,KAAK,aAAa,IAAI,IAAI;AAChC,QAAO,IAAI,QAAQ,KAAK,MAAM,GAAG;;;AAInC,MAAM,QAAmB;CACvB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,aAAa;CACxB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"orgnr.js","names":[],"sources":["../../src/se/orgnr.ts"],"sourcesContent":["/**\n * Organisationsnummer (Swedish organization number).\n *\n * 10 digits. Standard Luhn checksum.\n * Display format: NNNNNN-NNNN.\n *\n * @see https://www.skatteverket.se/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Swedish Organisationsnummer must be 10 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Swedish Organisationsnummer must contain only digits\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Swedish Organisationsnummer Luhn check failed\",\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, 6)}-${v.slice(6)}`;\n};\n\n/** Generate a random valid Swedish org number. */\nconst generate = (): string => {\n const p = randomDigits(9);\n const cs = luhnChecksum(p + \"0\");\n return p + String((10 - cs) % 10);\n};\n\n/** Swedish Organization Number. */\nconst orgnr: CountryValidator<\"SE\"> = {\n name: \"Swedish Organization Number\",\n localName: \"Organisationsnummer\",\n abbreviation: \"Orgnr\",\n aliases: [\n \"organisationsnummer\",\n \"org.nr\",\n \"org nr\",\n ] as const,\n candidatePattern: \"\\\\d{6}-\\\\d{4}\",\n scope: \"country\",\n country: \"SE\",\n entityType: \"company\",\n sourceUrl: \"https://www.skatteverket.se/\",\n examples: [\"1234567897\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default orgnr;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAuBA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,+CACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,sDACF;CAEF,IAAI,CAAC,aAAa,CAAC,GACjB,OAAO,IACL,oBACA,+CACF;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,CAAC;AACtC;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,IAAI,aAAa,CAAC;CACxB,MAAM,KAAK,aAAa,IAAI,GAAG;CAC/B,OAAO,IAAI,QAAQ,KAAK,MAAM,EAAE;AAClC;;AAGA,MAAM,QAAgC;CACpC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,YAAY;CACvB;CACA;CACA;CACA;AACF"}
@@ -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/se/personnummer.d.ts
4
-
5
4
  /**
6
5
  * Match python-stdnum's compact: preserve the '-' or '+'
7
6
  * separator at position -5, and strip any others.
@@ -17,7 +16,7 @@ declare const parse: (value: string) => ParsedPersonId | null;
17
16
  /** Generate a random valid Swedish personnummer. */
18
17
  declare const generate: () => string;
19
18
  /** Swedish Personal Identity Number. */
20
- declare const personnummer: Validator;
19
+ declare const personnummer: CountryValidator<"SE", ParsedPersonId>;
21
20
  //#endregion
22
21
  export { compact, personnummer as default, format, generate, parse, validate };
23
22
  //# sourceMappingURL=personnummer.d.ts.map
@@ -1,26 +1,17 @@
1
+ import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
1
2
  import { clean } from "../_util/clean.js";
3
+ import { isValidDate } from "../_util/date.js";
2
4
  import { randomInt } from "../_util/generate.js";
3
5
  import { err } from "../_util/result.js";
4
- import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
5
6
  import { isdigits } from "../_util/strings.js";
6
- import { isValidDate } from "../_util/date.js";
7
7
  //#region src/se/personnummer.ts
8
8
  /**
9
- * Personnummer (Personal Identity Number).
10
- *
11
- * Swedish personal identification number. 10 digits
12
- * in compact form (YYMMDDNNNC) with a Luhn checksum
13
- * on all 10 digits.
14
- *
15
- * @see https://www.skatteverket.se/privat/folkbokforing/personnummer.4.3810a01c150939e893f18c29.html
16
- */
17
- /**
18
9
  * Match python-stdnum's compact: preserve the '-' or '+'
19
10
  * separator at position -5, and strip any others.
20
11
  */
21
12
  const compact = (value) => {
22
13
  let v = clean(value, " :");
23
- if ((v.length === 10 || v.length === 12) && v[v.length - 5] !== "-" && v[v.length - 5] !== "+") v = `${v.slice(0, -4)}-${v.slice(-4)}`;
14
+ if ((v.length === 10 || v.length === 12) && v.at(-5) !== "-" && v.at(-5) !== "+") v = `${v.slice(0, -4)}-${v.slice(-4)}`;
24
15
  return `${v.slice(0, -5).replace(/-/g, "").replace(/\+/g, "")}${v.slice(-5)}`;
25
16
  };
26
17
  /**
@@ -40,7 +31,7 @@ const getBirthDate = (v) => {
40
31
  let century = Math.floor(currentYear / 100);
41
32
  const yy = Number(v.slice(0, 2));
42
33
  if (yy > currentYear % 100) century -= 1;
43
- if (v[v.length - 5] === "+") century -= 1;
34
+ if (v.at(-5) === "+") century -= 1;
44
35
  year = century * 100 + yy;
45
36
  month = Number(v.slice(2, 4));
46
37
  day = Number(v.slice(4, 6));
@@ -56,7 +47,7 @@ const validate = (value) => {
56
47
  const v = compact(value);
57
48
  if (v.length !== 11 && v.length !== 13) return err("INVALID_LENGTH", "Personnummer must be 10 or 12 digits");
58
49
  const digits = v.slice(0, -5) + v.slice(-4);
59
- const sep = v[v.length - 5];
50
+ const sep = v.at(-5);
60
51
  if (sep !== "-" && sep !== "+" || !isdigits(digits)) return err("INVALID_FORMAT", "Personnummer has invalid format");
61
52
  if (getBirthDate(v) === null) return err("INVALID_COMPONENT", "Personnummer contains an invalid date");
62
53
  if (!luhnValidate(digits.slice(-10))) return err("INVALID_CHECKSUM", "Personnummer Luhn check does not match");
@@ -76,7 +67,7 @@ const parse = (value) => {
76
67
  const v = result.compact;
77
68
  const birthDate = getBirthDate(v);
78
69
  if (birthDate === null) return null;
79
- const genderDigit = Number(v[v.length - 2]);
70
+ const genderDigit = Number(v.at(-2));
80
71
  return {
81
72
  birthDate: new Date(birthDate.year, birthDate.month - 1, birthDate.day),
82
73
  gender: genderDigit % 2 === 0 ? "female" : "male"
@@ -107,12 +98,14 @@ const personnummer = {
107
98
  "personal identity number"
108
99
  ],
109
100
  candidatePattern: "\\d{6,8}-\\d{4}",
101
+ scope: "country",
110
102
  country: "SE",
111
103
  entityType: "person",
112
104
  sourceUrl: "https://www.skatteverket.se/privat/folkbokforing/personnummer.4.3810a01c150939e893f18c29.html",
113
105
  examples: ["880320-0016"],
114
106
  compact,
115
107
  format,
108
+ parse,
116
109
  validate,
117
110
  generate
118
111
  };