@stll/stdnum 1.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (705) hide show
  1. package/README.md +1 -4
  2. package/dist/_checksums/luhn.js.map +1 -1
  3. package/dist/_checksums/mod1110.js +1 -1
  4. package/dist/_checksums/mod1110.js.map +1 -1
  5. package/dist/_checksums/mod112.js.map +1 -1
  6. package/dist/_checksums/mod97.js.map +1 -1
  7. package/dist/_checksums/verhoeff.js.map +1 -1
  8. package/dist/_checksums/weighted-sum.js.map +1 -1
  9. package/dist/_util/arabic.js.map +1 -1
  10. package/dist/_util/clean.js.map +1 -1
  11. package/dist/_util/date.js.map +1 -1
  12. package/dist/_util/generate.js.map +1 -1
  13. package/dist/_util/result.js.map +1 -1
  14. package/dist/_util/strings.js.map +1 -1
  15. package/dist/ad/nrt.d.ts +16 -2
  16. package/dist/ad/nrt.js +1 -14
  17. package/dist/ad/nrt.js.map +1 -1
  18. package/dist/ae/eid.d.ts +2 -2
  19. package/dist/ae/eid.js +2 -12
  20. package/dist/ae/eid.js.map +1 -1
  21. package/dist/ai/tin.d.ts +20 -2
  22. package/dist/ai/tin.js +1 -18
  23. package/dist/ai/tin.js.map +1 -1
  24. package/dist/al/nipt.d.ts +13 -2
  25. package/dist/al/nipt.js +1 -11
  26. package/dist/al/nipt.js.map +1 -1
  27. package/dist/am/tin.d.ts +16 -2
  28. package/dist/am/tin.js +1 -14
  29. package/dist/am/tin.js.map +1 -1
  30. package/dist/ar/cbu.d.ts +2 -2
  31. package/dist/ar/cbu.js +1 -9
  32. package/dist/ar/cbu.js.map +1 -1
  33. package/dist/ar/cuit.d.ts +2 -2
  34. package/dist/ar/cuit.js +1 -17
  35. package/dist/ar/cuit.js.map +1 -1
  36. package/dist/ar/dni.d.ts +11 -2
  37. package/dist/ar/dni.js +1 -9
  38. package/dist/ar/dni.js.map +1 -1
  39. package/dist/at/businessid.d.ts +10 -2
  40. package/dist/at/businessid.js +1 -8
  41. package/dist/at/businessid.js.map +1 -1
  42. package/dist/at/tin.d.ts +2 -2
  43. package/dist/at/tin.js +1 -11
  44. package/dist/at/tin.js.map +1 -1
  45. package/dist/at/uid.d.ts +2 -2
  46. package/dist/at/uid.js +2 -10
  47. package/dist/at/uid.js.map +1 -1
  48. package/dist/at/vnr.d.ts +2 -2
  49. package/dist/at/vnr.js +4 -14
  50. package/dist/at/vnr.js.map +1 -1
  51. package/dist/au/abn.d.ts +2 -2
  52. package/dist/au/abn.js +1 -10
  53. package/dist/au/abn.js.map +1 -1
  54. package/dist/au/acn.d.ts +2 -2
  55. package/dist/au/acn.js +1 -10
  56. package/dist/au/acn.js.map +1 -1
  57. package/dist/au/tfn.d.ts +2 -2
  58. package/dist/au/tfn.js +1 -10
  59. package/dist/au/tfn.js.map +1 -1
  60. package/dist/az/voen.d.ts +2 -2
  61. package/dist/az/voen.js +1 -14
  62. package/dist/az/voen.js.map +1 -1
  63. package/dist/ba/jmbg.d.ts +2 -2
  64. package/dist/ba/jmbg.js +3 -11
  65. package/dist/ba/jmbg.js.map +1 -1
  66. package/dist/bd/nid.d.ts +23 -2
  67. package/dist/bd/nid.js +1 -21
  68. package/dist/bd/nid.js.map +1 -1
  69. package/dist/be/bis.d.ts +2 -2
  70. package/dist/be/bis.js +1 -11
  71. package/dist/be/bis.js.map +1 -1
  72. package/dist/be/nn.d.ts +2 -2
  73. package/dist/be/nn.js +1 -11
  74. package/dist/be/nn.js.map +1 -1
  75. package/dist/be/vat.d.ts +2 -2
  76. package/dist/be/vat.js +1 -9
  77. package/dist/be/vat.js.map +1 -1
  78. package/dist/bg/egn.d.ts +2 -2
  79. package/dist/bg/egn.js +3 -18
  80. package/dist/bg/egn.js.map +1 -1
  81. package/dist/bg/pnf.d.ts +2 -2
  82. package/dist/bg/pnf.js +1 -8
  83. package/dist/bg/pnf.js.map +1 -1
  84. package/dist/bg/vat.d.ts +2 -2
  85. package/dist/bg/vat.js +3 -9
  86. package/dist/bg/vat.js.map +1 -1
  87. package/dist/bh/cpr.d.ts +2 -2
  88. package/dist/bh/cpr.js +1 -17
  89. package/dist/bh/cpr.js.map +1 -1
  90. package/dist/bic.d.ts +13 -2
  91. package/dist/bic.js +1 -11
  92. package/dist/bic.js.map +1 -1
  93. package/dist/br/cnpj.d.ts +2 -2
  94. package/dist/br/cnpj.js +1 -20
  95. package/dist/br/cnpj.js.map +1 -1
  96. package/dist/br/cpf.d.ts +2 -2
  97. package/dist/br/cpf.js +1 -14
  98. package/dist/br/cpf.js.map +1 -1
  99. package/dist/by/unp.d.ts +2 -2
  100. package/dist/by/unp.js +3 -14
  101. package/dist/by/unp.js.map +1 -1
  102. package/dist/bz/tin.d.ts +2 -2
  103. package/dist/bz/tin.js +1 -26
  104. package/dist/bz/tin.js.map +1 -1
  105. package/dist/ca/bn.d.ts +2 -2
  106. package/dist/ca/bn.js +2 -10
  107. package/dist/ca/bn.js.map +1 -1
  108. package/dist/ca/sin.d.ts +2 -2
  109. package/dist/ca/sin.js +2 -10
  110. package/dist/ca/sin.js.map +1 -1
  111. package/dist/ch/ssn.d.ts +2 -2
  112. package/dist/ch/ssn.js +1 -9
  113. package/dist/ch/ssn.js.map +1 -1
  114. package/dist/ch/uid.d.ts +2 -2
  115. package/dist/ch/uid.js +1 -9
  116. package/dist/ch/uid.js.map +1 -1
  117. package/dist/ch/vat.d.ts +2 -2
  118. package/dist/ch/vat.js +1 -9
  119. package/dist/ch/vat.js.map +1 -1
  120. package/dist/cl/rut.d.ts +2 -2
  121. package/dist/cl/rut.js +1 -14
  122. package/dist/cl/rut.js.map +1 -1
  123. package/dist/cn/ric.d.ts +2 -2
  124. package/dist/cn/ric.js +3 -14
  125. package/dist/cn/ric.js.map +1 -1
  126. package/dist/cn/uscc.d.ts +2 -2
  127. package/dist/cn/uscc.js +1 -10
  128. package/dist/cn/uscc.js.map +1 -1
  129. package/dist/co/nit.d.ts +2 -2
  130. package/dist/co/nit.js +2 -12
  131. package/dist/co/nit.js.map +1 -1
  132. package/dist/cr/cpf.d.ts +18 -2
  133. package/dist/cr/cpf.js +1 -16
  134. package/dist/cr/cpf.js.map +1 -1
  135. package/dist/creditcard.d.ts +2 -2
  136. package/dist/creditcard.js +5 -14
  137. package/dist/creditcard.js.map +1 -1
  138. package/dist/cu/ni.d.ts +2 -2
  139. package/dist/cu/ni.js +2 -17
  140. package/dist/cu/ni.js.map +1 -1
  141. package/dist/cy/vat.d.ts +2 -2
  142. package/dist/cy/vat.js +1 -8
  143. package/dist/cy/vat.js.map +1 -1
  144. package/dist/cz/dic.d.ts +2 -2
  145. package/dist/cz/dic.js +7 -13
  146. package/dist/cz/dic.js.map +1 -1
  147. package/dist/cz/ico.d.ts +2 -2
  148. package/dist/cz/ico.js +2 -10
  149. package/dist/cz/ico.js.map +1 -1
  150. package/dist/cz/rc.d.ts +2 -2
  151. package/dist/cz/rc.js +2 -26
  152. package/dist/cz/rc.js.map +1 -1
  153. package/dist/de/handelsreg.d.ts +19 -2
  154. package/dist/de/handelsreg.js +1 -17
  155. package/dist/de/handelsreg.js.map +1 -1
  156. package/dist/de/idnr.d.ts +2 -2
  157. package/dist/de/idnr.js +2 -12
  158. package/dist/de/idnr.js.map +1 -1
  159. package/dist/de/stnr.d.ts +17 -2
  160. package/dist/de/stnr.js +1 -15
  161. package/dist/de/stnr.js.map +1 -1
  162. package/dist/de/svnr.d.ts +2 -2
  163. package/dist/de/svnr.js +2 -11
  164. package/dist/de/svnr.js.map +1 -1
  165. package/dist/de/vat.d.ts +2 -2
  166. package/dist/de/vat.js +2 -11
  167. package/dist/de/vat.js.map +1 -1
  168. package/dist/dk/cpr.d.ts +2 -2
  169. package/dist/dk/cpr.js +2 -10
  170. package/dist/dk/cpr.js.map +1 -1
  171. package/dist/dk/cvr.d.ts +2 -2
  172. package/dist/dk/cvr.js +2 -15
  173. package/dist/dk/cvr.js.map +1 -1
  174. package/dist/dk/vat.d.ts +2 -2
  175. package/dist/dk/vat.js +3 -13
  176. package/dist/dk/vat.js.map +1 -1
  177. package/dist/do/rnc.d.ts +2 -2
  178. package/dist/do/rnc.js +2 -16
  179. package/dist/do/rnc.js.map +1 -1
  180. package/dist/ec/ruc.d.ts +2 -2
  181. package/dist/ec/ruc.js +1 -18
  182. package/dist/ec/ruc.js.map +1 -1
  183. package/dist/ee/ik.d.ts +2 -2
  184. package/dist/ee/ik.js +3 -20
  185. package/dist/ee/ik.js.map +1 -1
  186. package/dist/ee/registrikood.d.ts +2 -2
  187. package/dist/ee/registrikood.js +1 -8
  188. package/dist/ee/registrikood.js.map +1 -1
  189. package/dist/ee/vat.d.ts +2 -2
  190. package/dist/ee/vat.js +2 -10
  191. package/dist/ee/vat.js.map +1 -1
  192. package/dist/eg/tn.d.ts +11 -2
  193. package/dist/eg/tn.js +1 -9
  194. package/dist/eg/tn.js.map +1 -1
  195. package/dist/es/cif.d.ts +2 -2
  196. package/dist/es/cif.js +1 -10
  197. package/dist/es/cif.js.map +1 -1
  198. package/dist/es/dni.d.ts +2 -2
  199. package/dist/es/dni.js +1 -9
  200. package/dist/es/dni.js.map +1 -1
  201. package/dist/es/nie.d.ts +2 -2
  202. package/dist/es/nie.js +1 -9
  203. package/dist/es/nie.js.map +1 -1
  204. package/dist/es/nss.d.ts +2 -2
  205. package/dist/es/nss.js +1 -16
  206. package/dist/es/nss.js.map +1 -1
  207. package/dist/es/vat.d.ts +2 -2
  208. package/dist/es/vat.js +5 -10
  209. package/dist/es/vat.js.map +1 -1
  210. package/dist/eu/vat.d.ts +2 -2
  211. package/dist/eu/vat.js +1 -0
  212. package/dist/eu/vat.js.map +1 -1
  213. package/dist/fi/hetu.d.ts +2 -2
  214. package/dist/fi/hetu.js +2 -10
  215. package/dist/fi/hetu.js.map +1 -1
  216. package/dist/fi/vat.d.ts +2 -2
  217. package/dist/fi/vat.js +3 -10
  218. package/dist/fi/vat.js.map +1 -1
  219. package/dist/fi/ytunnus.d.ts +2 -2
  220. package/dist/fi/ytunnus.js +2 -10
  221. package/dist/fi/ytunnus.js.map +1 -1
  222. package/dist/fr/nif.d.ts +2 -2
  223. package/dist/fr/nif.js +1 -9
  224. package/dist/fr/nif.js.map +1 -1
  225. package/dist/fr/nir.d.ts +2 -2
  226. package/dist/fr/nir.js +2 -14
  227. package/dist/fr/nir.js.map +1 -1
  228. package/dist/fr/siren.d.ts +2 -2
  229. package/dist/fr/siren.js +2 -10
  230. package/dist/fr/siren.js.map +1 -1
  231. package/dist/fr/siret.d.ts +2 -2
  232. package/dist/fr/siret.js +2 -11
  233. package/dist/fr/siret.js.map +1 -1
  234. package/dist/fr/tva.d.ts +2 -2
  235. package/dist/fr/tva.js +2 -12
  236. package/dist/fr/tva.js.map +1 -1
  237. package/dist/gb/nino.d.ts +12 -2
  238. package/dist/gb/nino.js +1 -10
  239. package/dist/gb/nino.js.map +1 -1
  240. package/dist/gb/sedol.d.ts +2 -2
  241. package/dist/gb/sedol.js +1 -11
  242. package/dist/gb/sedol.js.map +1 -1
  243. package/dist/gb/utr.d.ts +2 -2
  244. package/dist/gb/utr.js +2 -10
  245. package/dist/gb/utr.js.map +1 -1
  246. package/dist/gb/vat.d.ts +2 -2
  247. package/dist/gb/vat.js +2 -11
  248. package/dist/gb/vat.js.map +1 -1
  249. package/dist/ge/pin.d.ts +14 -2
  250. package/dist/ge/pin.js +1 -12
  251. package/dist/ge/pin.js.map +1 -1
  252. package/dist/gh/tin.d.ts +2 -2
  253. package/dist/gh/tin.js +1 -15
  254. package/dist/gh/tin.js.map +1 -1
  255. package/dist/gr/amka.d.ts +2 -2
  256. package/dist/gr/amka.js +3 -11
  257. package/dist/gr/amka.js.map +1 -1
  258. package/dist/gr/vat.d.ts +2 -2
  259. package/dist/gr/vat.js +1 -10
  260. package/dist/gr/vat.js.map +1 -1
  261. package/dist/gt/nit.d.ts +2 -2
  262. package/dist/gt/nit.js +1 -12
  263. package/dist/gt/nit.js.map +1 -1
  264. package/dist/hk/hkid.d.ts +2 -2
  265. package/dist/hk/hkid.js +1 -10
  266. package/dist/hk/hkid.js.map +1 -1
  267. package/dist/hr/vat.d.ts +2 -2
  268. package/dist/hr/vat.js +2 -9
  269. package/dist/hr/vat.js.map +1 -1
  270. package/dist/hu/vat.d.ts +2 -2
  271. package/dist/hu/vat.js +3 -10
  272. package/dist/hu/vat.js.map +1 -1
  273. package/dist/iban.d.ts +2 -2
  274. package/dist/iban.js +2 -8
  275. package/dist/iban.js.map +1 -1
  276. package/dist/id/npwp.d.ts +2 -2
  277. package/dist/id/npwp.js +3 -13
  278. package/dist/id/npwp.js.map +1 -1
  279. package/dist/ie/pps.d.ts +2 -2
  280. package/dist/ie/pps.js +1 -10
  281. package/dist/ie/pps.js.map +1 -1
  282. package/dist/ie/vat.d.ts +2 -2
  283. package/dist/ie/vat.js +1 -9
  284. package/dist/ie/vat.js.map +1 -1
  285. package/dist/il/idnr.d.ts +2 -2
  286. package/dist/il/idnr.js +2 -9
  287. package/dist/il/idnr.js.map +1 -1
  288. package/dist/in/aadhaar.d.ts +2 -2
  289. package/dist/in/aadhaar.js +2 -12
  290. package/dist/in/aadhaar.js.map +1 -1
  291. package/dist/in/gstin.d.ts +2 -2
  292. package/dist/in/gstin.js +1 -10
  293. package/dist/in/gstin.js.map +1 -1
  294. package/dist/in/pan.d.ts +15 -2
  295. package/dist/in/pan.js +1 -13
  296. package/dist/in/pan.js.map +1 -1
  297. package/dist/index.d.ts +2 -2
  298. package/dist/index.js +6 -6
  299. package/dist/iq/nid.d.ts +16 -2
  300. package/dist/iq/nid.js +2 -15
  301. package/dist/iq/nid.js.map +1 -1
  302. package/dist/ir/nid.d.ts +2 -2
  303. package/dist/ir/nid.js +2 -24
  304. package/dist/ir/nid.js.map +1 -1
  305. package/dist/is/kennitala.d.ts +2 -2
  306. package/dist/is/kennitala.js +2 -13
  307. package/dist/is/kennitala.js.map +1 -1
  308. package/dist/is/vsk.d.ts +9 -2
  309. package/dist/is/vsk.js +1 -7
  310. package/dist/is/vsk.js.map +1 -1
  311. package/dist/isin.d.ts +2 -2
  312. package/dist/isin.js +2 -12
  313. package/dist/isin.js.map +1 -1
  314. package/dist/it/codicefiscale.d.ts +2 -2
  315. package/dist/it/codicefiscale.js +1 -21
  316. package/dist/it/codicefiscale.js.map +1 -1
  317. package/dist/it/iva.d.ts +2 -2
  318. package/dist/it/iva.js +2 -9
  319. package/dist/it/iva.js.map +1 -1
  320. package/dist/jp/cn.d.ts +2 -2
  321. package/dist/jp/cn.js +1 -9
  322. package/dist/jp/cn.js.map +1 -1
  323. package/dist/jp/mynumber.d.ts +2 -2
  324. package/dist/jp/mynumber.js +1 -10
  325. package/dist/jp/mynumber.js.map +1 -1
  326. package/dist/kr/brn.d.ts +11 -2
  327. package/dist/kr/brn.js +1 -9
  328. package/dist/kr/brn.js.map +1 -1
  329. package/dist/kr/rrn.d.ts +2 -2
  330. package/dist/kr/rrn.js +2 -11
  331. package/dist/kr/rrn.js.map +1 -1
  332. package/dist/kw/civil.d.ts +2 -2
  333. package/dist/kw/civil.js +2 -14
  334. package/dist/kw/civil.js.map +1 -1
  335. package/dist/kz/iin.d.ts +2 -2
  336. package/dist/kz/iin.js +3 -18
  337. package/dist/kz/iin.js.map +1 -1
  338. package/dist/lei.d.ts +2 -2
  339. package/dist/lei.js +2 -11
  340. package/dist/lei.js.map +1 -1
  341. package/dist/li/peid.d.ts +11 -2
  342. package/dist/li/peid.js +1 -9
  343. package/dist/li/peid.js.map +1 -1
  344. package/dist/lk/nic.d.ts +2 -2
  345. package/dist/lk/nic.js +2 -14
  346. package/dist/lk/nic.js.map +1 -1
  347. package/dist/lt/asmens.d.ts +2 -2
  348. package/dist/lt/asmens.js +2 -1
  349. package/dist/lt/asmens.js.map +1 -1
  350. package/dist/lt/vat.d.ts +2 -2
  351. package/dist/lt/vat.js +2 -10
  352. package/dist/lt/vat.js.map +1 -1
  353. package/dist/lu/vat.d.ts +2 -2
  354. package/dist/lu/vat.js +2 -8
  355. package/dist/lu/vat.js.map +1 -1
  356. package/dist/luhn.d.ts +2 -2
  357. package/dist/luhn.js +2 -9
  358. package/dist/luhn.js.map +1 -1
  359. package/dist/lv/vat.d.ts +2 -2
  360. package/dist/lv/vat.js +2 -28
  361. package/dist/lv/vat.js.map +1 -1
  362. package/dist/ma/ice.d.ts +2 -2
  363. package/dist/ma/ice.js +2 -11
  364. package/dist/ma/ice.js.map +1 -1
  365. package/dist/mc/tva.d.ts +2 -2
  366. package/dist/mc/tva.js +1 -0
  367. package/dist/mc/tva.js.map +1 -1
  368. package/dist/md/idno.d.ts +2 -2
  369. package/dist/md/idno.js +1 -10
  370. package/dist/md/idno.js.map +1 -1
  371. package/dist/me/pib.d.ts +2 -2
  372. package/dist/me/pib.js +2 -10
  373. package/dist/me/pib.js.map +1 -1
  374. package/dist/mk/edb.d.ts +2 -2
  375. package/dist/mk/edb.js +2 -11
  376. package/dist/mk/edb.js.map +1 -1
  377. package/dist/mt/vat.d.ts +2 -2
  378. package/dist/mt/vat.js +3 -10
  379. package/dist/mt/vat.js.map +1 -1
  380. package/dist/mu/brn.d.ts +23 -2
  381. package/dist/mu/brn.js +1 -21
  382. package/dist/mu/brn.js.map +1 -1
  383. package/dist/mx/clabe.d.ts +2 -2
  384. package/dist/mx/clabe.js +1 -14
  385. package/dist/mx/clabe.js.map +1 -1
  386. package/dist/mx/curp.d.ts +2 -2
  387. package/dist/mx/curp.js +3 -17
  388. package/dist/mx/curp.js.map +1 -1
  389. package/dist/mx/rfc.d.ts +2 -2
  390. package/dist/mx/rfc.js +3 -19
  391. package/dist/mx/rfc.js.map +1 -1
  392. package/dist/my/nric.d.ts +2 -2
  393. package/dist/my/nric.js +2 -14
  394. package/dist/my/nric.js.map +1 -1
  395. package/dist/ng/nin.d.ts +13 -2
  396. package/dist/ng/nin.js +1 -11
  397. package/dist/ng/nin.js.map +1 -1
  398. package/dist/ni/ruc.d.ts +2 -2
  399. package/dist/ni/ruc.js +1 -23
  400. package/dist/ni/ruc.js.map +1 -1
  401. package/dist/nl/bsn.d.ts +2 -2
  402. package/dist/nl/bsn.js +2 -10
  403. package/dist/nl/bsn.js.map +1 -1
  404. package/dist/nl/kvk.d.ts +9 -2
  405. package/dist/nl/kvk.js +1 -7
  406. package/dist/nl/kvk.js.map +1 -1
  407. package/dist/nl/vat.d.ts +2 -2
  408. package/dist/nl/vat.js +1 -13
  409. package/dist/nl/vat.js.map +1 -1
  410. package/dist/no/fodselsnummer.d.ts +2 -2
  411. package/dist/no/fodselsnummer.js +2 -10
  412. package/dist/no/fodselsnummer.js.map +1 -1
  413. package/dist/no/mva.d.ts +2 -2
  414. package/dist/no/mva.js +1 -8
  415. package/dist/no/mva.js.map +1 -1
  416. package/dist/no/orgnr.d.ts +2 -2
  417. package/dist/no/orgnr.js +2 -8
  418. package/dist/no/orgnr.js.map +1 -1
  419. package/dist/nz/ird.d.ts +2 -2
  420. package/dist/nz/ird.js +2 -11
  421. package/dist/nz/ird.js.map +1 -1
  422. package/dist/pa/ruc.d.ts +2 -2
  423. package/dist/pa/ruc.js +1 -18
  424. package/dist/pa/ruc.js.map +1 -1
  425. package/dist/patterns.d.ts +8 -7
  426. package/dist/patterns.js +3 -5
  427. package/dist/patterns.js.map +1 -1
  428. package/dist/pe/ruc.d.ts +2 -2
  429. package/dist/pe/ruc.js +1 -15
  430. package/dist/pe/ruc.js.map +1 -1
  431. package/dist/ph/philid.d.ts +14 -2
  432. package/dist/ph/philid.js +1 -12
  433. package/dist/ph/philid.js.map +1 -1
  434. package/dist/pk/cnic.d.ts +14 -2
  435. package/dist/pk/cnic.js +1 -12
  436. package/dist/pk/cnic.js.map +1 -1
  437. package/dist/pl/nip.d.ts +2 -2
  438. package/dist/pl/nip.js +2 -10
  439. package/dist/pl/nip.js.map +1 -1
  440. package/dist/pl/pesel.d.ts +2 -2
  441. package/dist/pl/pesel.js +3 -13
  442. package/dist/pl/pesel.js.map +1 -1
  443. package/dist/pl/regon.d.ts +2 -2
  444. package/dist/pl/regon.js +2 -11
  445. package/dist/pl/regon.js.map +1 -1
  446. package/dist/pt/cc.d.ts +2 -2
  447. package/dist/pt/cc.js +1 -9
  448. package/dist/pt/cc.js.map +1 -1
  449. package/dist/pt/vat.d.ts +2 -2
  450. package/dist/pt/vat.js +3 -11
  451. package/dist/pt/vat.js.map +1 -1
  452. package/dist/ro/cnp.d.ts +2 -2
  453. package/dist/ro/cnp.js +4 -14
  454. package/dist/ro/cnp.js.map +1 -1
  455. package/dist/ro/vat.d.ts +2 -2
  456. package/dist/ro/vat.js +13 -11
  457. package/dist/ro/vat.js.map +1 -1
  458. package/dist/rs/pib.d.ts +2 -2
  459. package/dist/rs/pib.js +1 -9
  460. package/dist/rs/pib.js.map +1 -1
  461. package/dist/ru/inn.d.ts +2 -2
  462. package/dist/ru/inn.js +1 -11
  463. package/dist/ru/inn.js.map +1 -1
  464. package/dist/se/orgnr.d.ts +2 -2
  465. package/dist/se/orgnr.js +2 -9
  466. package/dist/se/orgnr.js.map +1 -1
  467. package/dist/se/personnummer.d.ts +2 -2
  468. package/dist/se/personnummer.js +7 -15
  469. package/dist/se/personnummer.js.map +1 -1
  470. package/dist/se/vat.d.ts +2 -2
  471. package/dist/se/vat.js +3 -10
  472. package/dist/se/vat.js.map +1 -1
  473. package/dist/sg/uen.d.ts +2 -2
  474. package/dist/sg/uen.js +1 -15
  475. package/dist/sg/uen.js.map +1 -1
  476. package/dist/si/emso.d.ts +2 -2
  477. package/dist/si/emso.js +3 -18
  478. package/dist/si/emso.js.map +1 -1
  479. package/dist/si/vat.d.ts +2 -2
  480. package/dist/si/vat.js +3 -12
  481. package/dist/si/vat.js.map +1 -1
  482. package/dist/sk/dic.d.ts +2 -2
  483. package/dist/sk/dic.js +1 -0
  484. package/dist/sk/dic.js.map +1 -1
  485. package/dist/sk/ico.d.ts +2 -2
  486. package/dist/sk/ico.js +1 -0
  487. package/dist/sk/ico.js.map +1 -1
  488. package/dist/sk/rc.d.ts +2 -2
  489. package/dist/sk/rc.js +1 -0
  490. package/dist/sk/rc.js.map +1 -1
  491. package/dist/th/tin.d.ts +2 -2
  492. package/dist/th/tin.js +1 -11
  493. package/dist/th/tin.js.map +1 -1
  494. package/dist/tr/tckimlik.d.ts +2 -2
  495. package/dist/tr/tckimlik.js +1 -20
  496. package/dist/tr/tckimlik.js.map +1 -1
  497. package/dist/tr/vkn.d.ts +2 -2
  498. package/dist/tr/vkn.js +1 -20
  499. package/dist/tr/vkn.js.map +1 -1
  500. package/dist/tw/ubn.d.ts +2 -2
  501. package/dist/tw/ubn.js +1 -11
  502. package/dist/tw/ubn.js.map +1 -1
  503. package/dist/types.d.ts +26 -4
  504. package/dist/ua/edrpou.d.ts +2 -2
  505. package/dist/ua/edrpou.js +1 -11
  506. package/dist/ua/edrpou.js.map +1 -1
  507. package/dist/us/ein.d.ts +12 -2
  508. package/dist/us/ein.js +1 -10
  509. package/dist/us/ein.js.map +1 -1
  510. package/dist/us/itin.d.ts +13 -2
  511. package/dist/us/itin.js +1 -11
  512. package/dist/us/itin.js.map +1 -1
  513. package/dist/us/rtn.d.ts +2 -2
  514. package/dist/us/rtn.js +3 -18
  515. package/dist/us/rtn.js.map +1 -1
  516. package/dist/us/ssn.d.ts +13 -2
  517. package/dist/us/ssn.js +1 -11
  518. package/dist/us/ssn.js.map +1 -1
  519. package/dist/uy/rut.d.ts +2 -2
  520. package/dist/uy/rut.js +1 -14
  521. package/dist/uy/rut.js.map +1 -1
  522. package/dist/ve/rif.d.ts +2 -2
  523. package/dist/ve/rif.js +2 -15
  524. package/dist/ve/rif.js.map +1 -1
  525. package/dist/vn/mst.d.ts +2 -2
  526. package/dist/vn/mst.js +1 -12
  527. package/dist/vn/mst.js.map +1 -1
  528. package/dist/za/idnr.d.ts +2 -2
  529. package/dist/za/idnr.js +3 -16
  530. package/dist/za/idnr.js.map +1 -1
  531. package/package.json +22 -12
  532. package/src/_checksums/mod1110.ts +1 -1
  533. package/src/ad/nrt.ts +7 -3
  534. package/src/ae/eid.ts +7 -3
  535. package/src/ai/tin.ts +7 -3
  536. package/src/al/nipt.ts +7 -3
  537. package/src/am/tin.ts +7 -3
  538. package/src/ar/cbu.ts +7 -3
  539. package/src/ar/cuit.ts +7 -3
  540. package/src/ar/dni.ts +7 -3
  541. package/src/at/businessid.ts +7 -3
  542. package/src/at/tin.ts +7 -3
  543. package/src/at/uid.ts +7 -3
  544. package/src/at/vnr.ts +37 -9
  545. package/src/au/abn.ts +7 -3
  546. package/src/au/acn.ts +7 -3
  547. package/src/au/tfn.ts +7 -3
  548. package/src/az/voen.ts +7 -3
  549. package/src/ba/jmbg.ts +8 -7
  550. package/src/bd/nid.ts +7 -3
  551. package/src/be/bis.ts +8 -4
  552. package/src/be/nn.ts +7 -3
  553. package/src/be/vat.ts +7 -3
  554. package/src/bg/egn.ts +8 -7
  555. package/src/bg/pnf.ts +7 -3
  556. package/src/bg/vat.ts +8 -3
  557. package/src/bh/cpr.ts +7 -3
  558. package/src/bic.ts +7 -3
  559. package/src/br/cnpj.ts +7 -3
  560. package/src/br/cpf.ts +7 -3
  561. package/src/by/unp.ts +10 -5
  562. package/src/bz/tin.ts +7 -3
  563. package/src/ca/bn.ts +7 -3
  564. package/src/ca/sin.ts +7 -3
  565. package/src/ch/ssn.ts +7 -3
  566. package/src/ch/uid.ts +7 -3
  567. package/src/ch/vat.ts +9 -5
  568. package/src/cl/rut.ts +7 -3
  569. package/src/cn/ric.ts +8 -7
  570. package/src/cn/uscc.ts +7 -3
  571. package/src/co/nit.ts +8 -4
  572. package/src/cr/cpf.ts +7 -3
  573. package/src/creditcard.ts +10 -6
  574. package/src/cu/ni.ts +8 -7
  575. package/src/cy/vat.ts +7 -3
  576. package/src/cz/dic.ts +9 -4
  577. package/src/cz/ico.ts +7 -3
  578. package/src/cz/rc.ts +8 -7
  579. package/src/de/handelsreg.ts +7 -3
  580. package/src/de/idnr.ts +7 -3
  581. package/src/de/stnr.ts +7 -3
  582. package/src/de/svnr.ts +7 -3
  583. package/src/de/vat.ts +7 -3
  584. package/src/dk/cpr.ts +8 -7
  585. package/src/dk/cvr.ts +7 -3
  586. package/src/dk/vat.ts +8 -3
  587. package/src/do/rnc.ts +7 -3
  588. package/src/ec/ruc.ts +7 -3
  589. package/src/ee/ik.ts +8 -7
  590. package/src/ee/registrikood.ts +8 -4
  591. package/src/ee/vat.ts +7 -3
  592. package/src/eg/tn.ts +7 -3
  593. package/src/es/cif.ts +8 -4
  594. package/src/es/dni.ts +7 -3
  595. package/src/es/nie.ts +8 -4
  596. package/src/es/nss.ts +7 -3
  597. package/src/es/vat.ts +13 -5
  598. package/src/eu/vat.ts +10 -6
  599. package/src/fi/hetu.ts +8 -7
  600. package/src/fi/vat.ts +8 -3
  601. package/src/fi/ytunnus.ts +7 -3
  602. package/src/fr/nif.ts +7 -3
  603. package/src/fr/nir.ts +8 -7
  604. package/src/fr/siren.ts +7 -3
  605. package/src/fr/siret.ts +7 -3
  606. package/src/fr/tva.ts +7 -3
  607. package/src/gb/nino.ts +7 -3
  608. package/src/gb/sedol.ts +7 -3
  609. package/src/gb/utr.ts +7 -3
  610. package/src/gb/vat.ts +7 -3
  611. package/src/ge/pin.ts +7 -3
  612. package/src/gh/tin.ts +7 -3
  613. package/src/gr/amka.ts +7 -3
  614. package/src/gr/vat.ts +7 -3
  615. package/src/gt/nit.ts +7 -3
  616. package/src/hk/hkid.ts +7 -3
  617. package/src/hr/vat.ts +7 -3
  618. package/src/hu/vat.ts +8 -3
  619. package/src/iban.ts +7 -3
  620. package/src/id/npwp.ts +7 -3
  621. package/src/ie/pps.ts +7 -3
  622. package/src/ie/vat.ts +7 -3
  623. package/src/il/idnr.ts +7 -3
  624. package/src/in/aadhaar.ts +7 -3
  625. package/src/in/gstin.ts +7 -3
  626. package/src/in/pan.ts +7 -3
  627. package/src/index.ts +3 -0
  628. package/src/iq/nid.ts +7 -3
  629. package/src/ir/nid.ts +7 -3
  630. package/src/is/kennitala.ts +7 -3
  631. package/src/is/vsk.ts +7 -3
  632. package/src/isin.ts +7 -3
  633. package/src/it/codicefiscale.ts +11 -7
  634. package/src/it/iva.ts +7 -3
  635. package/src/jp/cn.ts +7 -3
  636. package/src/jp/mynumber.ts +7 -3
  637. package/src/kr/brn.ts +7 -3
  638. package/src/kr/rrn.ts +8 -7
  639. package/src/kw/civil.ts +8 -7
  640. package/src/kz/iin.ts +8 -8
  641. package/src/lei.ts +7 -3
  642. package/src/li/peid.ts +7 -3
  643. package/src/lk/nic.ts +8 -7
  644. package/src/lt/asmens.ts +8 -4
  645. package/src/lt/vat.ts +8 -3
  646. package/src/lu/vat.ts +8 -3
  647. package/src/luhn.ts +7 -3
  648. package/src/lv/vat.ts +7 -3
  649. package/src/ma/ice.ts +7 -3
  650. package/src/mc/tva.ts +9 -5
  651. package/src/md/idno.ts +7 -3
  652. package/src/me/pib.ts +7 -3
  653. package/src/mk/edb.ts +7 -3
  654. package/src/mt/vat.ts +8 -3
  655. package/src/mu/brn.ts +7 -3
  656. package/src/mx/clabe.ts +7 -3
  657. package/src/mx/curp.ts +9 -8
  658. package/src/mx/rfc.ts +8 -4
  659. package/src/my/nric.ts +8 -7
  660. package/src/ng/nin.ts +7 -3
  661. package/src/ni/ruc.ts +7 -3
  662. package/src/nl/bsn.ts +7 -3
  663. package/src/nl/kvk.ts +7 -3
  664. package/src/nl/vat.ts +7 -3
  665. package/src/no/fodselsnummer.ts +11 -7
  666. package/src/no/mva.ts +9 -5
  667. package/src/no/orgnr.ts +7 -3
  668. package/src/nz/ird.ts +8 -4
  669. package/src/pa/ruc.ts +7 -3
  670. package/src/patterns.ts +49 -18
  671. package/src/pe/ruc.ts +7 -3
  672. package/src/ph/philid.ts +7 -3
  673. package/src/pk/cnic.ts +7 -3
  674. package/src/pl/nip.ts +7 -3
  675. package/src/pl/pesel.ts +8 -7
  676. package/src/pl/regon.ts +7 -3
  677. package/src/pt/cc.ts +7 -3
  678. package/src/pt/vat.ts +8 -3
  679. package/src/ro/cnp.ts +15 -8
  680. package/src/ro/vat.ts +8 -3
  681. package/src/rs/pib.ts +7 -3
  682. package/src/ru/inn.ts +7 -3
  683. package/src/se/orgnr.ts +7 -3
  684. package/src/se/personnummer.ts +35 -33
  685. package/src/se/vat.ts +8 -3
  686. package/src/sg/uen.ts +7 -3
  687. package/src/si/emso.ts +8 -7
  688. package/src/si/vat.ts +8 -3
  689. package/src/sk/dic.ts +8 -4
  690. package/src/sk/ico.ts +3 -2
  691. package/src/sk/rc.ts +6 -2
  692. package/src/th/tin.ts +7 -3
  693. package/src/tr/tckimlik.ts +7 -3
  694. package/src/tr/vkn.ts +7 -3
  695. package/src/tw/ubn.ts +7 -3
  696. package/src/types.ts +34 -3
  697. package/src/ua/edrpou.ts +7 -3
  698. package/src/us/ein.ts +7 -3
  699. package/src/us/itin.ts +7 -3
  700. package/src/us/rtn.ts +16 -8
  701. package/src/us/ssn.ts +7 -3
  702. package/src/uy/rut.ts +7 -3
  703. package/src/ve/rif.ts +8 -6
  704. package/src/vn/mst.ts +7 -3
  705. package/src/za/idnr.ts +8 -7
@@ -1 +1 @@
1
- {"version":3,"file":"pesel.js","names":[],"sources":["../../src/pl/pesel.ts"],"sourcesContent":["/**\n * PESEL (Powszechny Elektroniczny System\n * Ewidencji Ludności).\n *\n * Polish national identification number.\n * 11 digits encoding date of birth, serial\n * number, gender, and a check digit.\n *\n * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/poland-tin.pdf\n * @see https://www.gov.pl/web/cyfryzacja/numer-pesel\n */\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomDigits, 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 = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"PESEL must be exactly 11 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"PESEL must contain only digits\",\n );\n }\n\n const yy = Number(v.slice(0, 2));\n const mm = Number(v.slice(2, 4));\n const dd = Number(v.slice(4, 6));\n\n // Century encoding via month offset\n let century: number;\n if (mm >= 81 && mm <= 92) {\n century = 1800;\n } else if (mm >= 1 && mm <= 12) {\n century = 1900;\n } else if (mm >= 21 && mm <= 32) {\n century = 2000;\n } else if (mm >= 41 && mm <= 52) {\n century = 2100;\n } else if (mm >= 61 && mm <= 72) {\n century = 2200;\n } else {\n return err(\n \"INVALID_COMPONENT\",\n \"PESEL contains an invalid month\",\n );\n }\n\n const year = century + yy;\n const month = mm % 20;\n if (!isValidDate(year, month, dd)) {\n return err(\n \"INVALID_COMPONENT\",\n \"PESEL contains an invalid date\",\n );\n }\n\n const sum = weightedSum(v.slice(0, 10), WEIGHTS, 10);\n const check = (10 - sum) % 10;\n if (check !== Number(v[10])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"PESEL 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 PESEL number.\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 yy = Number(v.slice(0, 2));\n const mm = Number(v.slice(2, 4));\n const dd = Number(v.slice(4, 6));\n const serial = Number(v[9]);\n\n let century: number;\n if (mm >= 81) century = 1800;\n else if (mm <= 12) century = 1900;\n else if (mm <= 32) century = 2000;\n else if (mm <= 52) century = 2100;\n else century = 2200;\n\n return {\n birthDate: new Date(century + yy, (mm % 20) - 1, dd),\n gender: serial % 2 === 0 ? \"female\" : \"male\",\n };\n};\n\n/** Generate a random valid Polish PESEL. */\nconst generate = (): string => {\n for (;;) {\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 serial = randomDigits(4);\n const payload = yy + mm + dd + serial;\n const sum = weightedSum(payload, WEIGHTS, 10);\n const c = payload + String((10 - sum) % 10);\n if (validate(c).valid) return c;\n }\n};\n\n/** Polish National Identification Number. */\nconst pesel: Validator<ParsedPersonId> = {\n name: \"Polish National ID\",\n localName:\n \"Powszechny Elektroniczny System Ewidencji Ludności\",\n abbreviation: \"PESEL\",\n aliases: [\"PESEL\"] as const,\n candidatePattern: \"\\\\d{11}\",\n country: \"PL\",\n entityType: \"person\",\n sourceUrl:\n \"https://www.gov.pl/web/cyfryzacja/numer-pesel\",\n examples: [\"02070803628\"] as const,\n compact,\n format,\n parse,\n validate,\n generate,\n};\n\nexport default pesel;\nexport { compact, format, parse, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAyBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAE9C,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,kCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,iCACD;CAGH,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAChC,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAChC,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAGhC,IAAI;AACJ,KAAI,MAAM,MAAM,MAAM,GACpB,WAAU;UACD,MAAM,KAAK,MAAM,GAC1B,WAAU;UACD,MAAM,MAAM,MAAM,GAC3B,WAAU;UACD,MAAM,MAAM,MAAM,GAC3B,WAAU;UACD,MAAM,MAAM,MAAM,GAC3B,WAAU;KAEV,QAAO,IACL,qBACA,kCACD;AAKH,KAAI,CAAC,YAFQ,UAAU,IACT,KAAK,IACW,GAAG,CAC/B,QAAO,IACL,qBACA,iCACD;AAKH,MADe,KADH,YAAY,EAAE,MAAM,GAAG,GAAG,EAAE,SAAS,GAAG,IACzB,OACb,OAAO,EAAE,IAAI,CACzB,QAAO,IACL,oBACA,mCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;;;;AAMxD,MAAM,SAAS,UAAyC;CACtD,MAAM,SAAS,SAAS,MAAM;AAC9B,KAAI,CAAC,OAAO,MAAO,QAAO;CAE1B,MAAM,IAAI,OAAO;CACjB,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAChC,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAChC,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAChC,MAAM,SAAS,OAAO,EAAE,GAAG;CAE3B,IAAI;AACJ,KAAI,MAAM,GAAI,WAAU;UACf,MAAM,GAAI,WAAU;UACpB,MAAM,GAAI,WAAU;UACpB,MAAM,GAAI,WAAU;KACxB,WAAU;AAEf,QAAO;EACL,WAAW,IAAI,KAAK,UAAU,IAAK,KAAK,KAAM,GAAG,GAAG;EACpD,QAAQ,SAAS,MAAM,IAAI,WAAW;EACvC;;;AAIH,MAAM,iBAAyB;AAC7B,UAAS;EACP,MAAM,KAAK,OAAO,UAAU,GAAG,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI;EACpD,MAAM,KAAK,OAAO,UAAU,GAAG,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI;EACpD,MAAM,KAAK,OAAO,UAAU,GAAG,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI;EACpD,MAAM,SAAS,aAAa,EAAE;EAC9B,MAAM,UAAU,KAAK,KAAK,KAAK;EAC/B,MAAM,MAAM,YAAY,SAAS,SAAS,GAAG;EAC7C,MAAM,IAAI,UAAU,QAAQ,KAAK,OAAO,GAAG;AAC3C,MAAI,SAAS,EAAE,CAAC,MAAO,QAAO;;;;AAKlC,MAAM,QAAmC;CACvC,MAAM;CACN,WACE;CACF,cAAc;CACd,SAAS,CAAC,QAAQ;CAClB,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,cAAc;CACzB;CACA;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"pesel.js","names":[],"sources":["../../src/pl/pesel.ts"],"sourcesContent":["/**\n * PESEL (Powszechny Elektroniczny System\n * Ewidencji Ludności).\n *\n * Polish national identification number.\n * 11 digits encoding date of birth, serial\n * number, gender, and a check digit.\n *\n * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/poland-tin.pdf\n * @see https://www.gov.pl/web/cyfryzacja/numer-pesel\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 { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"PESEL must be exactly 11 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"PESEL must contain only digits\",\n );\n }\n\n const yy = Number(v.slice(0, 2));\n const mm = Number(v.slice(2, 4));\n const dd = Number(v.slice(4, 6));\n\n // Century encoding via month offset\n let century: number;\n if (mm >= 81 && mm <= 92) {\n century = 1800;\n } else if (mm >= 1 && mm <= 12) {\n century = 1900;\n } else if (mm >= 21 && mm <= 32) {\n century = 2000;\n } else if (mm >= 41 && mm <= 52) {\n century = 2100;\n } else if (mm >= 61 && mm <= 72) {\n century = 2200;\n } else {\n return err(\n \"INVALID_COMPONENT\",\n \"PESEL contains an invalid month\",\n );\n }\n\n const year = century + yy;\n const month = mm % 20;\n if (!isValidDate(year, month, dd)) {\n return err(\n \"INVALID_COMPONENT\",\n \"PESEL contains an invalid date\",\n );\n }\n\n const sum = weightedSum(v.slice(0, 10), WEIGHTS, 10);\n const check = (10 - sum) % 10;\n if (check !== Number(v[10])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"PESEL 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 PESEL number.\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 yy = Number(v.slice(0, 2));\n const mm = Number(v.slice(2, 4));\n const dd = Number(v.slice(4, 6));\n const serial = Number(v[9]);\n\n let century: number;\n if (mm >= 81) century = 1800;\n else if (mm <= 12) century = 1900;\n else if (mm <= 32) century = 2000;\n else if (mm <= 52) century = 2100;\n else century = 2200;\n\n return {\n birthDate: new Date(century + yy, (mm % 20) - 1, dd),\n gender: serial % 2 === 0 ? \"female\" : \"male\",\n };\n};\n\n/** Generate a random valid Polish PESEL. */\nconst generate = (): string => {\n for (;;) {\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 serial = randomDigits(4);\n const payload = yy + mm + dd + serial;\n const sum = weightedSum(payload, WEIGHTS, 10);\n const c = payload + String((10 - sum) % 10);\n if (validate(c).valid) return c;\n }\n};\n\n/** Polish National Identification Number. */\nconst pesel: CountryValidator<\"PL\", ParsedPersonId> = {\n name: \"Polish National ID\",\n localName:\n \"Powszechny Elektroniczny System Ewidencji Ludności\",\n abbreviation: \"PESEL\",\n aliases: [\"PESEL\"] as const,\n candidatePattern: \"\\\\d{11}\",\n scope: \"country\",\n country: \"PL\",\n entityType: \"person\",\n sourceUrl:\n \"https://www.gov.pl/web/cyfryzacja/numer-pesel\",\n examples: [\"02070803628\"] as const,\n compact,\n format,\n parse,\n validate,\n generate,\n};\n\nexport default pesel;\nexport { compact, format, parse, validate, generate };\n"],"mappings":";;;;;;;AAyBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAE7C,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,iCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,gCACF;CAGF,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAC/B,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAC/B,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAG/B,IAAI;CACJ,IAAI,MAAM,MAAM,MAAM,IACpB,UAAU;MACL,IAAI,MAAM,KAAK,MAAM,IAC1B,UAAU;MACL,IAAI,MAAM,MAAM,MAAM,IAC3B,UAAU;MACL,IAAI,MAAM,MAAM,MAAM,IAC3B,UAAU;MACL,IAAI,MAAM,MAAM,MAAM,IAC3B,UAAU;MAEV,OAAO,IACL,qBACA,iCACF;CAKF,IAAI,CAAC,YAFQ,UAAU,IACT,KAAK,IACW,EAAE,GAC9B,OAAO,IACL,qBACA,gCACF;CAKF,KADe,KADH,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,SAAS,EAC3B,KAAK,OACb,OAAO,EAAE,GAAG,GACxB,OAAO,IACL,oBACA,kCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;;;;AAMvD,MAAM,SAAS,UAAyC;CACtD,MAAM,SAAS,SAAS,KAAK;CAC7B,IAAI,CAAC,OAAO,OAAO,OAAO;CAE1B,MAAM,IAAI,OAAO;CACjB,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAC/B,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAC/B,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAC/B,MAAM,SAAS,OAAO,EAAE,EAAE;CAE1B,IAAI;CACJ,IAAI,MAAM,IAAI,UAAU;MACnB,IAAI,MAAM,IAAI,UAAU;MACxB,IAAI,MAAM,IAAI,UAAU;MACxB,IAAI,MAAM,IAAI,UAAU;MACxB,UAAU;CAEf,OAAO;EACL,WAAW,IAAI,KAAK,UAAU,IAAK,KAAK,KAAM,GAAG,EAAE;EACnD,QAAQ,SAAS,MAAM,IAAI,WAAW;CACxC;AACF;;AAGA,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,KAAK,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;EACnD,MAAM,KAAK,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;EACnD,MAAM,KAAK,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;EACnD,MAAM,SAAS,aAAa,CAAC;EAC7B,MAAM,UAAU,KAAK,KAAK,KAAK;EAC/B,MAAM,MAAM,YAAY,SAAS,SAAS,EAAE;EAC5C,MAAM,IAAI,UAAU,QAAQ,KAAK,OAAO,EAAE;EAC1C,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO;CAChC;AACF;;AAGA,MAAM,QAAgD;CACpD,MAAM;CACN,WACE;CACF,cAAc;CACd,SAAS,CAAC,OAAO;CACjB,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,aAAa;CACxB;CACA;CACA;CACA;CACA;AACF"}
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/pl/regon.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid 9-digit Polish REGON. */
8
8
  declare const generate: () => string;
9
9
  /** Polish Statistical Identification Number. */
10
- declare const regon: Validator;
10
+ declare const regon: CountryValidator<"PL">;
11
11
  //#endregion
12
12
  export { compact, regon as default, format, generate, validate };
13
13
  //# sourceMappingURL=regon.d.ts.map
package/dist/pl/regon.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 } 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/pl/regon.ts
7
- /**
8
- * REGON (Rejestr Gospodarki Narodowej).
9
- *
10
- * Polish statistical identification number for
11
- * businesses. 9 digits for national entities,
12
- * 14 digits for local units (9 + 5 extension).
13
- * Both have weighted checksums.
14
- *
15
- * @see https://bip.stat.gov.pl/en/regon/
16
- */
17
7
  const WEIGHTS_9 = [
18
8
  8,
19
9
  9,
@@ -70,6 +60,7 @@ const regon = {
70
60
  abbreviation: "REGON",
71
61
  aliases: ["REGON", "numer statystyczny"],
72
62
  candidatePattern: "\\d{9,14}",
63
+ scope: "country",
73
64
  country: "PL",
74
65
  entityType: "company",
75
66
  sourceUrl: "https://bip.stat.gov.pl/en/regon/",
@@ -1 +1 @@
1
- {"version":3,"file":"regon.js","names":[],"sources":["../../src/pl/regon.ts"],"sourcesContent":["/**\n * REGON (Rejestr Gospodarki Narodowej).\n *\n * Polish statistical identification number for\n * businesses. 9 digits for national entities,\n * 14 digits for local units (9 + 5 extension).\n * Both have weighted checksums.\n *\n * @see https://bip.stat.gov.pl/en/regon/\n */\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst WEIGHTS_9 = [8, 9, 2, 3, 4, 5, 6, 7] as const;\nconst WEIGHTS_14 = [\n 2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8,\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 (v.length !== 9 && v.length !== 14) {\n return err(\n \"INVALID_LENGTH\",\n \"REGON must be 9 or 14 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"REGON must contain only digits\",\n );\n }\n\n // Validate 9-digit base\n const sum9 = weightedSum(v.slice(0, 8), WEIGHTS_9, 11);\n if (String(sum9 % 10) !== v[8]) {\n return err(\n \"INVALID_CHECKSUM\",\n \"REGON check digit does not match\",\n );\n }\n\n // Validate 14-digit extension\n if (v.length === 14) {\n const sum14 = weightedSum(\n v.slice(0, 13),\n WEIGHTS_14,\n 11,\n );\n if (String(sum14 % 10) !== v[13]) {\n return err(\n \"INVALID_CHECKSUM\",\n \"REGON local unit 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 9-digit Polish REGON. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(9);\n if (validate(c).valid) return c;\n }\n};\n\n/** Polish Statistical Identification Number. */\nconst regon: Validator = {\n name: \"Polish Business Register Number\",\n localName: \"Rejestr Gospodarki Narodowej\",\n abbreviation: \"REGON\",\n aliases: [\"REGON\", \"numer statystyczny\"] as const,\n candidatePattern: \"\\\\d{9,14}\",\n country: \"PL\",\n entityType: \"company\",\n sourceUrl: \"https://bip.stat.gov.pl/en/regon/\",\n examples: [\"123456785\", \"12345678512347\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default regon;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,MAAM,YAAY;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAC1C,MAAM,aAAa;CACjB;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CACrC;AAED,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,QAAO,IACL,kBACA,+BACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,iCACD;CAIH,MAAM,OAAO,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,WAAW,GAAG;AACtD,KAAI,OAAO,OAAO,GAAG,KAAK,EAAE,GAC1B,QAAO,IACL,oBACA,mCACD;AAIH,KAAI,EAAE,WAAW,IAAI;EACnB,MAAM,QAAQ,YACZ,EAAE,MAAM,GAAG,GAAG,EACd,YACA,GACD;AACD,MAAI,OAAO,QAAQ,GAAG,KAAK,EAAE,IAC3B,QAAO,IACL,oBACA,wCACD;;AAIL,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,QAAmB;CACvB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,SAAS,qBAAqB;CACxC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,aAAa,iBAAiB;CACzC;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"regon.js","names":[],"sources":["../../src/pl/regon.ts"],"sourcesContent":["/**\n * REGON (Rejestr Gospodarki Narodowej).\n *\n * Polish statistical identification number for\n * businesses. 9 digits for national entities,\n * 14 digits for local units (9 + 5 extension).\n * Both have weighted checksums.\n *\n * @see https://bip.stat.gov.pl/en/regon/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS_9 = [8, 9, 2, 3, 4, 5, 6, 7] as const;\nconst WEIGHTS_14 = [\n 2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8,\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 (v.length !== 9 && v.length !== 14) {\n return err(\n \"INVALID_LENGTH\",\n \"REGON must be 9 or 14 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"REGON must contain only digits\",\n );\n }\n\n // Validate 9-digit base\n const sum9 = weightedSum(v.slice(0, 8), WEIGHTS_9, 11);\n if (String(sum9 % 10) !== v[8]) {\n return err(\n \"INVALID_CHECKSUM\",\n \"REGON check digit does not match\",\n );\n }\n\n // Validate 14-digit extension\n if (v.length === 14) {\n const sum14 = weightedSum(\n v.slice(0, 13),\n WEIGHTS_14,\n 11,\n );\n if (String(sum14 % 10) !== v[13]) {\n return err(\n \"INVALID_CHECKSUM\",\n \"REGON local unit 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 9-digit Polish REGON. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(9);\n if (validate(c).valid) return c;\n }\n};\n\n/** Polish Statistical Identification Number. */\nconst regon: CountryValidator<\"PL\"> = {\n name: \"Polish Business Register Number\",\n localName: \"Rejestr Gospodarki Narodowej\",\n abbreviation: \"REGON\",\n aliases: [\"REGON\", \"numer statystyczny\"] as const,\n candidatePattern: \"\\\\d{9,14}\",\n scope: \"country\",\n country: \"PL\",\n entityType: \"company\",\n sourceUrl: \"https://bip.stat.gov.pl/en/regon/\",\n examples: [\"123456785\", \"12345678512347\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default regon;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAsBA,MAAM,YAAY;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AACzC,MAAM,aAAa;CACjB;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AACtC;AAEA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,IACjC,OAAO,IACL,kBACA,8BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,gCACF;CAIF,MAAM,OAAO,YAAY,EAAE,MAAM,GAAG,CAAC,GAAG,WAAW,EAAE;CACrD,IAAI,OAAO,OAAO,EAAE,MAAM,EAAE,IAC1B,OAAO,IACL,oBACA,kCACF;CAIF,IAAI,EAAE,WAAW,IAAI;EACnB,MAAM,QAAQ,YACZ,EAAE,MAAM,GAAG,EAAE,GACb,YACA,EACF;EACA,IAAI,OAAO,QAAQ,EAAE,MAAM,EAAE,KAC3B,OAAO,IACL,oBACA,uCACF;CAEJ;CAEA,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,QAAgC;CACpC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,SAAS,oBAAoB;CACvC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,aAAa,gBAAgB;CACxC;CACA;CACA;CACA;AACF"}
package/dist/pt/cc.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/pt/cc.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Portuguese CC number. */
8
8
  declare const generate: () => string;
9
9
  /** Portuguese Identity Card number. */
10
- declare const cc: Validator;
10
+ declare const cc: CountryValidator<"PT">;
11
11
  //#endregion
12
12
  export { compact, cc as default, format, generate, validate };
13
13
  //# sourceMappingURL=cc.d.ts.map
package/dist/pt/cc.js CHANGED
@@ -2,15 +2,6 @@ import { clean } from "../_util/clean.js";
2
2
  import { randomChar, randomDigits } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  //#region src/pt/cc.ts
5
- /**
6
- * CC (Cartão de Cidadão, Portuguese Identity number).
7
- *
8
- * Alphanumeric: numeric civil ID + 2-letter version +
9
- * 1 check digit. Validated with a Luhn-like algorithm
10
- * over an alphanumeric alphabet (0-9, A-Z = 0-35).
11
- *
12
- * @see https://pt.wikipedia.org/wiki/Cartão_de_cidadão
13
- */
14
5
  const CC_RE = /^\d{9}[A-Z0-9]{2}\d$/;
15
6
  const ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
16
7
  const compact = (value) => clean(value, " ").toUpperCase();
@@ -62,6 +53,7 @@ const cc = {
62
53
  "número de identificação civil"
63
54
  ],
64
55
  candidatePattern: "\\d{8}\\s?\\d\\s?[A-Z]{2}\\d",
56
+ scope: "country",
65
57
  country: "PT",
66
58
  entityType: "person",
67
59
  description: "Alphanumeric national identity card number with Luhn-like check digit",
package/dist/pt/cc.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cc.js","names":[],"sources":["../../src/pt/cc.ts"],"sourcesContent":["/**\n * CC (Cartão de Cidadão, Portuguese Identity number).\n *\n * Alphanumeric: numeric civil ID + 2-letter version +\n * 1 check digit. Validated with a Luhn-like algorithm\n * over an alphanumeric alphabet (0-9, A-Z = 0-35).\n *\n * @see https://pt.wikipedia.org/wiki/Cartão_de_cidadão\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomChar, randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst CC_RE = /^\\d{9}[A-Z0-9]{2}\\d$/;\n\nconst ALPHABET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\nconst compact = (value: string): string =>\n clean(value, \" \").toUpperCase();\n\nconst calcCheckDigit = (value: string): string => {\n let sum = 0;\n for (let i = value.length - 1; i >= 0; i--) {\n const ch = value[i];\n if (ch === undefined) continue;\n const pos = value.length - 1 - i;\n let n = ALPHABET.indexOf(ch);\n if (pos % 2 === 0) {\n n *= 2;\n if (n > 9) n = Math.floor(n / 10) + (n % 10);\n }\n sum += n;\n }\n return String((10 - (sum % 10)) % 10);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"CC must be 12 characters\",\n );\n }\n\n if (!CC_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CC must be 9 digits, 2 alphanumeric version characters, and a check digit\",\n );\n }\n\n if (calcCheckDigit(v.slice(0, -1)) !== v.at(-1)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CC 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, -1)} ${v.at(-1)}`;\n};\n\n/** Generate a random valid Portuguese CC number. */\nconst generate = (): string => {\n const digits = randomDigits(9);\n const v0 = randomChar(ALPHABET);\n const v1 = randomChar(ALPHABET);\n const body = digits + v0 + v1;\n const check = calcCheckDigit(body);\n return body + check;\n};\n\n/** Portuguese Identity Card number. */\nconst cc: Validator = {\n name: \"Portuguese Identity Card\",\n localName: \"Cartão de Cidadão\",\n abbreviation: \"CC\",\n aliases: [\n \"cartão de cidadão\",\n \"CC\",\n \"número de identificação civil\",\n ] as const,\n candidatePattern: \"\\\\d{8}\\\\s?\\\\d\\\\s?[A-Z]{2}\\\\d\",\n country: \"PT\",\n entityType: \"person\",\n description:\n \"Alphanumeric national identity card number with Luhn-like check digit\",\n sourceUrl:\n \"https://pt.wikipedia.org/wiki/Cartão_de_cidadão\",\n lengths: [12] as const,\n examples: [\"000000000ZZ8\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cc;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;AAgBA,MAAM,QAAQ;AAEd,MAAM,WAAW;AAEjB,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,CAAC,aAAa;AAEjC,MAAM,kBAAkB,UAA0B;CAChD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,MAAM,KAAK,MAAM;AACjB,MAAI,OAAO,KAAA,EAAW;EACtB,MAAM,MAAM,MAAM,SAAS,IAAI;EAC/B,IAAI,IAAI,SAAS,QAAQ,GAAG;AAC5B,MAAI,MAAM,MAAM,GAAG;AACjB,QAAK;AACL,OAAI,IAAI,EAAG,KAAI,KAAK,MAAM,IAAI,GAAG,GAAI,IAAI;;AAE3C,SAAO;;AAET,QAAO,QAAQ,KAAM,MAAM,MAAO,GAAG;;AAGvC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,2BACD;AAGH,KAAI,CAAC,MAAM,KAAK,EAAE,CAChB,QAAO,IACL,kBACA,4EACD;AAGH,KAAI,eAAe,EAAE,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,CAC7C,QAAO,IACL,oBACA,gCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG;;;AAIzD,MAAM,iBAAyB;CAC7B,MAAM,SAAS,aAAa,EAAE;CAC9B,MAAM,KAAK,WAAW,SAAS;CAC/B,MAAM,KAAK,WAAW,SAAS;CAC/B,MAAM,OAAO,SAAS,KAAK;AAE3B,QAAO,OADO,eAAe,KAAK;;;AAKpC,MAAM,KAAgB;CACpB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,aACE;CACF,WACE;CACF,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,eAAe;CAC1B;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"cc.js","names":[],"sources":["../../src/pt/cc.ts"],"sourcesContent":["/**\n * CC (Cartão de Cidadão, Portuguese Identity number).\n *\n * Alphanumeric: numeric civil ID + 2-letter version +\n * 1 check digit. Validated with a Luhn-like algorithm\n * over an alphanumeric alphabet (0-9, A-Z = 0-35).\n *\n * @see https://pt.wikipedia.org/wiki/Cartão_de_cidadão\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomChar, randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nconst CC_RE = /^\\d{9}[A-Z0-9]{2}\\d$/;\n\nconst ALPHABET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\nconst compact = (value: string): string =>\n clean(value, \" \").toUpperCase();\n\nconst calcCheckDigit = (value: string): string => {\n let sum = 0;\n for (let i = value.length - 1; i >= 0; i--) {\n const ch = value[i];\n if (ch === undefined) continue;\n const pos = value.length - 1 - i;\n let n = ALPHABET.indexOf(ch);\n if (pos % 2 === 0) {\n n *= 2;\n if (n > 9) n = Math.floor(n / 10) + (n % 10);\n }\n sum += n;\n }\n return String((10 - (sum % 10)) % 10);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"CC must be 12 characters\",\n );\n }\n\n if (!CC_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CC must be 9 digits, 2 alphanumeric version characters, and a check digit\",\n );\n }\n\n if (calcCheckDigit(v.slice(0, -1)) !== v.at(-1)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CC 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, -1)} ${v.at(-1)}`;\n};\n\n/** Generate a random valid Portuguese CC number. */\nconst generate = (): string => {\n const digits = randomDigits(9);\n const v0 = randomChar(ALPHABET);\n const v1 = randomChar(ALPHABET);\n const body = digits + v0 + v1;\n const check = calcCheckDigit(body);\n return body + check;\n};\n\n/** Portuguese Identity Card number. */\nconst cc: CountryValidator<\"PT\"> = {\n name: \"Portuguese Identity Card\",\n localName: \"Cartão de Cidadão\",\n abbreviation: \"CC\",\n aliases: [\n \"cartão de cidadão\",\n \"CC\",\n \"número de identificação civil\",\n ] as const,\n candidatePattern: \"\\\\d{8}\\\\s?\\\\d\\\\s?[A-Z]{2}\\\\d\",\n scope: \"country\",\n country: \"PT\",\n entityType: \"person\",\n description:\n \"Alphanumeric national identity card number with Luhn-like check digit\",\n sourceUrl:\n \"https://pt.wikipedia.org/wiki/Cartão_de_cidadão\",\n lengths: [12] as const,\n examples: [\"000000000ZZ8\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cc;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;AAmBA,MAAM,QAAQ;AAEd,MAAM,WAAW;AAEjB,MAAM,WAAW,UACf,MAAM,OAAO,GAAG,EAAE,YAAY;AAEhC,MAAM,kBAAkB,UAA0B;CAChD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,MAAM,KAAK,MAAM;EACjB,IAAI,OAAO,KAAA,GAAW;EACtB,MAAM,MAAM,MAAM,SAAS,IAAI;EAC/B,IAAI,IAAI,SAAS,QAAQ,EAAE;EAC3B,IAAI,MAAM,MAAM,GAAG;GACjB,KAAK;GACL,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,IAAI,EAAE,IAAK,IAAI;EAC3C;EACA,OAAO;CACT;CACA,OAAO,QAAQ,KAAM,MAAM,MAAO,EAAE;AACtC;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,0BACF;CAGF,IAAI,CAAC,MAAM,KAAK,CAAC,GACf,OAAO,IACL,kBACA,2EACF;CAGF,IAAI,eAAe,EAAE,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAC5C,OAAO,IACL,oBACA,+BACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;AACxD;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,SAAS,aAAa,CAAC;CAC7B,MAAM,KAAK,WAAW,QAAQ;CAC9B,MAAM,KAAK,WAAW,QAAQ;CAC9B,MAAM,OAAO,SAAS,KAAK;CAE3B,OAAO,OADO,eAAe,IACX;AACpB;;AAGA,MAAM,KAA6B;CACjC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aACE;CACF,WACE;CACF,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,cAAc;CACzB;CACA;CACA;CACA;AACF"}
package/dist/pt/vat.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/pt/vat.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Portuguese NIF. */
8
8
  declare const generate: () => string;
9
9
  /** Portuguese VAT Number. */
10
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"PT">;
11
11
  //#endregion
12
12
  export { compact, vat as default, format, generate, validate };
13
13
  //# sourceMappingURL=vat.d.ts.map
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,4 +1,4 @@
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
4
  declare const compact: (value: string) => string;
@@ -12,7 +12,7 @@ declare const parse: (value: string) => ParsedPersonId | null;
12
12
  /** Generate a random valid Romanian CNP. */
13
13
  declare const generate: () => string;
14
14
  /** Romanian Personal Identification Number. */
15
- declare const cnp: Validator<ParsedPersonId>;
15
+ declare const cnp: CountryValidator<"RO", ParsedPersonId>;
16
16
  //#endregion
17
17
  export { compact, cnp as default, format, generate, parse, validate };
18
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,9 +149,11 @@ 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,
@@ -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<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 country: \"RO\",\n entityType: \"person\",\n sourceUrl: \"https://www.cnp.ro/\",\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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"}
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/vat.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ro/vat.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Romanian VAT number. */
8
8
  declare const generate: () => string;
9
9
  /** Romanian VAT Number. */
10
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"RO">;
11
11
  //#endregion
12
12
  export { compact, vat as default, format, generate, validate };
13
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/pib.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/rs/pib.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Serbian PIB. */
8
8
  declare const generate: () => string;
9
9
  /** Serbian Tax Identification Number. */
10
- declare const pib: Validator;
10
+ declare const pib: CountryValidator<"RS">;
11
11
  //#endregion
12
12
  export { compact, pib as default, format, generate, validate };
13
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,4 +1,4 @@
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
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid 10-digit Russian INN. */
8
8
  declare const generate: () => string;
9
9
  /** Russian Taxpayer Identification Number. */
10
- declare const inn: Validator;
10
+ declare const inn: CountryValidator<"RU">;
11
11
  //#endregion
12
12
  export { compact, inn as default, format, generate, validate };
13
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,
@@ -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 (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: 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,MAAM,CAAC,GAAG,WAAW,QAAQ,SAAS,CACzC,QAAO,OAAO,MAAM,GAAG,GAAG;AAE5B,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"}
@@ -1,4 +1,4 @@
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
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Swedish org number. */
8
8
  declare const generate: () => string;
9
9
  /** Swedish Organization Number. */
10
- declare const orgnr: Validator;
10
+ declare const orgnr: CountryValidator<"SE">;
11
11
  //#endregion
12
12
  export { compact, orgnr as default, format, generate, validate };
13
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/",