@stll/stdnum 0.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (808) hide show
  1. package/LICENSE +1 -5
  2. package/README.md +28 -4
  3. package/dist/_checksums/luhn.js.map +1 -1
  4. package/dist/_checksums/mod1110.js +1 -1
  5. package/dist/_checksums/mod1110.js.map +1 -1
  6. package/dist/_checksums/mod112.js +5 -5
  7. package/dist/_checksums/mod112.js.map +1 -1
  8. package/dist/_checksums/mod97.js.map +1 -1
  9. package/dist/_checksums/verhoeff.js.map +1 -1
  10. package/dist/_checksums/weighted-sum.js.map +1 -1
  11. package/dist/_util/arabic.js.map +1 -1
  12. package/dist/_util/clean.js.map +1 -1
  13. package/dist/_util/date.js.map +1 -1
  14. package/dist/_util/generate.d.ts +13 -1
  15. package/dist/_util/generate.js +23 -1
  16. package/dist/_util/generate.js.map +1 -1
  17. package/dist/_util/result.js.map +1 -1
  18. package/dist/_util/strings.js.map +1 -1
  19. package/dist/ad/mod.d.ts +3 -2
  20. package/dist/ad/nrt.d.ts +16 -2
  21. package/dist/ad/nrt.js +4 -16
  22. package/dist/ad/nrt.js.map +1 -1
  23. package/dist/ae/eid.d.ts +2 -3
  24. package/dist/ae/eid.js +2 -12
  25. package/dist/ae/eid.js.map +1 -1
  26. package/dist/ae/mod.d.ts +3 -2
  27. package/dist/ai/mod.d.ts +3 -2
  28. package/dist/ai/tin.d.ts +20 -2
  29. package/dist/ai/tin.js +1 -18
  30. package/dist/ai/tin.js.map +1 -1
  31. package/dist/al/mod.d.ts +3 -2
  32. package/dist/al/nipt.d.ts +13 -2
  33. package/dist/al/nipt.js +1 -11
  34. package/dist/al/nipt.js.map +1 -1
  35. package/dist/am/mod.d.ts +3 -2
  36. package/dist/am/tin.d.ts +16 -2
  37. package/dist/am/tin.js +1 -14
  38. package/dist/am/tin.js.map +1 -1
  39. package/dist/ar/cbu.d.ts +2 -3
  40. package/dist/ar/cbu.js +2 -10
  41. package/dist/ar/cbu.js.map +1 -1
  42. package/dist/ar/cuit.d.ts +2 -3
  43. package/dist/ar/cuit.js +13 -29
  44. package/dist/ar/cuit.js.map +1 -1
  45. package/dist/ar/dni.d.ts +11 -2
  46. package/dist/ar/dni.js +1 -9
  47. package/dist/ar/dni.js.map +1 -1
  48. package/dist/ar/mod.d.ts +3 -2
  49. package/dist/at/businessid.d.ts +10 -2
  50. package/dist/at/businessid.js +1 -8
  51. package/dist/at/businessid.js.map +1 -1
  52. package/dist/at/mod.d.ts +3 -2
  53. package/dist/at/tin.d.ts +2 -3
  54. package/dist/at/tin.js +1 -11
  55. package/dist/at/tin.js.map +1 -1
  56. package/dist/at/uid.d.ts +2 -3
  57. package/dist/at/uid.js +2 -10
  58. package/dist/at/uid.js.map +1 -1
  59. package/dist/at/vnr.d.ts +5 -4
  60. package/dist/at/vnr.js +23 -16
  61. package/dist/at/vnr.js.map +1 -1
  62. package/dist/au/abn.d.ts +2 -3
  63. package/dist/au/abn.js +1 -10
  64. package/dist/au/abn.js.map +1 -1
  65. package/dist/au/acn.d.ts +2 -3
  66. package/dist/au/acn.js +1 -10
  67. package/dist/au/acn.js.map +1 -1
  68. package/dist/au/mod.d.ts +3 -2
  69. package/dist/au/tfn.d.ts +2 -3
  70. package/dist/au/tfn.js +1 -10
  71. package/dist/au/tfn.js.map +1 -1
  72. package/dist/az/mod.d.ts +3 -2
  73. package/dist/az/voen.d.ts +2 -3
  74. package/dist/az/voen.js +1 -14
  75. package/dist/az/voen.js.map +1 -1
  76. package/dist/ba/jmbg.d.ts +2 -3
  77. package/dist/ba/jmbg.js +4 -11
  78. package/dist/ba/jmbg.js.map +1 -1
  79. package/dist/ba/mod.d.ts +3 -2
  80. package/dist/bd/mod.d.ts +3 -2
  81. package/dist/bd/nid.d.ts +23 -2
  82. package/dist/bd/nid.js +11 -32
  83. package/dist/bd/nid.js.map +1 -1
  84. package/dist/be/bis.d.ts +2 -3
  85. package/dist/be/bis.js +1 -11
  86. package/dist/be/bis.js.map +1 -1
  87. package/dist/be/mod.d.ts +3 -2
  88. package/dist/be/nn.d.ts +2 -3
  89. package/dist/be/nn.js +1 -11
  90. package/dist/be/nn.js.map +1 -1
  91. package/dist/be/vat.d.ts +2 -3
  92. package/dist/be/vat.js +1 -9
  93. package/dist/be/vat.js.map +1 -1
  94. package/dist/bg/egn.d.ts +2 -3
  95. package/dist/bg/egn.js +5 -13
  96. package/dist/bg/egn.js.map +1 -1
  97. package/dist/bg/mod.d.ts +3 -2
  98. package/dist/bg/pnf.d.ts +2 -3
  99. package/dist/bg/pnf.js +1 -8
  100. package/dist/bg/pnf.js.map +1 -1
  101. package/dist/bg/vat.d.ts +2 -3
  102. package/dist/bg/vat.js +3 -9
  103. package/dist/bg/vat.js.map +1 -1
  104. package/dist/bh/cpr.d.ts +5 -4
  105. package/dist/bh/cpr.js +9 -19
  106. package/dist/bh/cpr.js.map +1 -1
  107. package/dist/bh/mod.d.ts +3 -2
  108. package/dist/bic.d.ts +13 -2
  109. package/dist/bic.js +14 -26
  110. package/dist/bic.js.map +1 -1
  111. package/dist/br/cnpj.d.ts +2 -3
  112. package/dist/br/cnpj.js +1 -20
  113. package/dist/br/cnpj.js.map +1 -1
  114. package/dist/br/cpf.d.ts +2 -3
  115. package/dist/br/cpf.js +1 -14
  116. package/dist/br/cpf.js.map +1 -1
  117. package/dist/br/mod.d.ts +3 -2
  118. package/dist/by/mod.d.ts +3 -2
  119. package/dist/by/unp.d.ts +2 -3
  120. package/dist/by/unp.js +9 -17
  121. package/dist/by/unp.js.map +1 -1
  122. package/dist/bz/mod.d.ts +3 -2
  123. package/dist/bz/tin.d.ts +5 -4
  124. package/dist/bz/tin.js +10 -27
  125. package/dist/bz/tin.js.map +1 -1
  126. package/dist/ca/bn.d.ts +2 -3
  127. package/dist/ca/bn.js +2 -10
  128. package/dist/ca/bn.js.map +1 -1
  129. package/dist/ca/mod.d.ts +3 -2
  130. package/dist/ca/sin.d.ts +2 -3
  131. package/dist/ca/sin.js +2 -10
  132. package/dist/ca/sin.js.map +1 -1
  133. package/dist/ch/mod.d.ts +3 -2
  134. package/dist/ch/ssn.d.ts +2 -3
  135. package/dist/ch/ssn.js +1 -9
  136. package/dist/ch/ssn.js.map +1 -1
  137. package/dist/ch/uid.d.ts +2 -3
  138. package/dist/ch/uid.js +1 -9
  139. package/dist/ch/uid.js.map +1 -1
  140. package/dist/ch/vat.d.ts +2 -3
  141. package/dist/ch/vat.js +1 -9
  142. package/dist/ch/vat.js.map +1 -1
  143. package/dist/cl/mod.d.ts +3 -2
  144. package/dist/cl/rut.d.ts +2 -3
  145. package/dist/cl/rut.js +2 -15
  146. package/dist/cl/rut.js.map +1 -1
  147. package/dist/cn/mod.d.ts +3 -2
  148. package/dist/cn/ric.d.ts +2 -3
  149. package/dist/cn/ric.js +4 -14
  150. package/dist/cn/ric.js.map +1 -1
  151. package/dist/cn/uscc.d.ts +2 -3
  152. package/dist/cn/uscc.js +8 -16
  153. package/dist/cn/uscc.js.map +1 -1
  154. package/dist/co/mod.d.ts +3 -2
  155. package/dist/co/nit.d.ts +2 -3
  156. package/dist/co/nit.js +6 -13
  157. package/dist/co/nit.js.map +1 -1
  158. package/dist/cr/cpf.d.ts +18 -2
  159. package/dist/cr/cpf.js +5 -19
  160. package/dist/cr/cpf.js.map +1 -1
  161. package/dist/cr/mod.d.ts +3 -2
  162. package/dist/creditcard.d.ts +2 -3
  163. package/dist/creditcard.js +5 -14
  164. package/dist/creditcard.js.map +1 -1
  165. package/dist/cu/mod.d.ts +3 -2
  166. package/dist/cu/ni.d.ts +5 -4
  167. package/dist/cu/ni.js +13 -18
  168. package/dist/cu/ni.js.map +1 -1
  169. package/dist/cy/mod.d.ts +3 -2
  170. package/dist/cy/vat.d.ts +2 -3
  171. package/dist/cy/vat.js +1 -8
  172. package/dist/cy/vat.js.map +1 -1
  173. package/dist/cz/dic.d.ts +2 -3
  174. package/dist/cz/dic.js +7 -13
  175. package/dist/cz/dic.js.map +1 -1
  176. package/dist/cz/ico.d.ts +2 -3
  177. package/dist/cz/ico.js +2 -10
  178. package/dist/cz/ico.js.map +1 -1
  179. package/dist/cz/mod.d.ts +3 -2
  180. package/dist/cz/rc.d.ts +2 -3
  181. package/dist/cz/rc.js +22 -21
  182. package/dist/cz/rc.js.map +1 -1
  183. package/dist/de/handelsreg.d.ts +19 -2
  184. package/dist/de/handelsreg.js +10 -26
  185. package/dist/de/handelsreg.js.map +1 -1
  186. package/dist/de/idnr.d.ts +2 -3
  187. package/dist/de/idnr.js +2 -12
  188. package/dist/de/idnr.js.map +1 -1
  189. package/dist/de/mod.d.ts +3 -2
  190. package/dist/de/stnr.d.ts +17 -3
  191. package/dist/de/stnr.js +1 -15
  192. package/dist/de/stnr.js.map +1 -1
  193. package/dist/de/svnr.d.ts +2 -3
  194. package/dist/de/svnr.js +4 -13
  195. package/dist/de/svnr.js.map +1 -1
  196. package/dist/de/vat.d.ts +2 -3
  197. package/dist/de/vat.js +2 -11
  198. package/dist/de/vat.js.map +1 -1
  199. package/dist/dk/cpr.d.ts +5 -4
  200. package/dist/dk/cpr.js +14 -12
  201. package/dist/dk/cpr.js.map +1 -1
  202. package/dist/dk/cvr.d.ts +2 -3
  203. package/dist/dk/cvr.js +2 -15
  204. package/dist/dk/cvr.js.map +1 -1
  205. package/dist/dk/mod.d.ts +3 -2
  206. package/dist/dk/vat.d.ts +2 -3
  207. package/dist/dk/vat.js +3 -13
  208. package/dist/dk/vat.js.map +1 -1
  209. package/dist/do/mod.d.ts +3 -2
  210. package/dist/do/rnc.d.ts +2 -3
  211. package/dist/do/rnc.js +3 -17
  212. package/dist/do/rnc.js.map +1 -1
  213. package/dist/ec/mod.d.ts +3 -2
  214. package/dist/ec/ruc.d.ts +2 -3
  215. package/dist/ec/ruc.js +2 -19
  216. package/dist/ec/ruc.js.map +1 -1
  217. package/dist/ee/ik.d.ts +2 -3
  218. package/dist/ee/ik.js +6 -15
  219. package/dist/ee/ik.js.map +1 -1
  220. package/dist/ee/mod.d.ts +3 -2
  221. package/dist/ee/registrikood.d.ts +2 -3
  222. package/dist/ee/registrikood.js +9 -15
  223. package/dist/ee/registrikood.js.map +1 -1
  224. package/dist/ee/vat.d.ts +2 -3
  225. package/dist/ee/vat.js +2 -10
  226. package/dist/ee/vat.js.map +1 -1
  227. package/dist/eg/mod.d.ts +3 -2
  228. package/dist/eg/tn.d.ts +11 -2
  229. package/dist/eg/tn.js +1 -9
  230. package/dist/eg/tn.js.map +1 -1
  231. package/dist/es/cif.d.ts +2 -3
  232. package/dist/es/cif.js +3 -12
  233. package/dist/es/cif.js.map +1 -1
  234. package/dist/es/dni.d.ts +2 -3
  235. package/dist/es/dni.js +1 -9
  236. package/dist/es/dni.js.map +1 -1
  237. package/dist/es/mod.d.ts +3 -2
  238. package/dist/es/nie.d.ts +2 -3
  239. package/dist/es/nie.js +14 -22
  240. package/dist/es/nie.js.map +1 -1
  241. package/dist/es/nss.d.ts +2 -3
  242. package/dist/es/nss.js +1 -16
  243. package/dist/es/nss.js.map +1 -1
  244. package/dist/es/vat.d.ts +2 -3
  245. package/dist/es/vat.js +5 -10
  246. package/dist/es/vat.js.map +1 -1
  247. package/dist/eu/mod.d.ts +3 -2
  248. package/dist/eu/vat.d.ts +5 -4
  249. package/dist/eu/vat.js +44 -2
  250. package/dist/eu/vat.js.map +1 -1
  251. package/dist/fi/hetu.d.ts +5 -4
  252. package/dist/fi/hetu.js +19 -12
  253. package/dist/fi/hetu.js.map +1 -1
  254. package/dist/fi/mod.d.ts +3 -2
  255. package/dist/fi/vat.d.ts +2 -3
  256. package/dist/fi/vat.js +3 -10
  257. package/dist/fi/vat.js.map +1 -1
  258. package/dist/fi/ytunnus.d.ts +2 -3
  259. package/dist/fi/ytunnus.js +2 -10
  260. package/dist/fi/ytunnus.js.map +1 -1
  261. package/dist/fr/mod.d.ts +3 -2
  262. package/dist/fr/nif.d.ts +2 -3
  263. package/dist/fr/nif.js +1 -9
  264. package/dist/fr/nif.js.map +1 -1
  265. package/dist/fr/nir.d.ts +2 -3
  266. package/dist/fr/nir.js +3 -14
  267. package/dist/fr/nir.js.map +1 -1
  268. package/dist/fr/siren.d.ts +2 -3
  269. package/dist/fr/siren.js +2 -10
  270. package/dist/fr/siren.js.map +1 -1
  271. package/dist/fr/siret.d.ts +2 -3
  272. package/dist/fr/siret.js +2 -11
  273. package/dist/fr/siret.js.map +1 -1
  274. package/dist/fr/tva.d.ts +2 -3
  275. package/dist/fr/tva.js +2 -12
  276. package/dist/fr/tva.js.map +1 -1
  277. package/dist/gb/mod.d.ts +3 -2
  278. package/dist/gb/nino.d.ts +12 -2
  279. package/dist/gb/nino.js +8 -17
  280. package/dist/gb/nino.js.map +1 -1
  281. package/dist/gb/sedol.d.ts +2 -3
  282. package/dist/gb/sedol.js +9 -18
  283. package/dist/gb/sedol.js.map +1 -1
  284. package/dist/gb/utr.d.ts +2 -3
  285. package/dist/gb/utr.js +2 -10
  286. package/dist/gb/utr.js.map +1 -1
  287. package/dist/gb/vat.d.ts +2 -3
  288. package/dist/gb/vat.js +2 -11
  289. package/dist/gb/vat.js.map +1 -1
  290. package/dist/ge/mod.d.ts +3 -2
  291. package/dist/ge/pin.d.ts +14 -2
  292. package/dist/ge/pin.js +1 -12
  293. package/dist/ge/pin.js.map +1 -1
  294. package/dist/gh/mod.d.ts +3 -2
  295. package/dist/gh/tin.d.ts +2 -3
  296. package/dist/gh/tin.js +10 -24
  297. package/dist/gh/tin.js.map +1 -1
  298. package/dist/gr/amka.d.ts +2 -3
  299. package/dist/gr/amka.js +3 -11
  300. package/dist/gr/amka.js.map +1 -1
  301. package/dist/gr/mod.d.ts +3 -2
  302. package/dist/gr/vat.d.ts +2 -3
  303. package/dist/gr/vat.js +1 -10
  304. package/dist/gr/vat.js.map +1 -1
  305. package/dist/gt/mod.d.ts +3 -2
  306. package/dist/gt/nit.d.ts +2 -3
  307. package/dist/gt/nit.js +6 -14
  308. package/dist/gt/nit.js.map +1 -1
  309. package/dist/hk/hkid.d.ts +2 -3
  310. package/dist/hk/hkid.js +2 -10
  311. package/dist/hk/hkid.js.map +1 -1
  312. package/dist/hk/mod.d.ts +3 -2
  313. package/dist/hr/mod.d.ts +3 -2
  314. package/dist/hr/vat.d.ts +2 -3
  315. package/dist/hr/vat.js +2 -9
  316. package/dist/hr/vat.js.map +1 -1
  317. package/dist/hu/mod.d.ts +3 -2
  318. package/dist/hu/vat.d.ts +2 -3
  319. package/dist/hu/vat.js +3 -10
  320. package/dist/hu/vat.js.map +1 -1
  321. package/dist/iban.d.ts +2 -3
  322. package/dist/iban.js +2 -8
  323. package/dist/iban.js.map +1 -1
  324. package/dist/id/mod.d.ts +3 -2
  325. package/dist/id/npwp.d.ts +2 -3
  326. package/dist/id/npwp.js +3 -13
  327. package/dist/id/npwp.js.map +1 -1
  328. package/dist/ie/mod.d.ts +3 -2
  329. package/dist/ie/pps.d.ts +2 -3
  330. package/dist/ie/pps.js +1 -10
  331. package/dist/ie/pps.js.map +1 -1
  332. package/dist/ie/vat.d.ts +2 -3
  333. package/dist/ie/vat.js +1 -9
  334. package/dist/ie/vat.js.map +1 -1
  335. package/dist/il/idnr.d.ts +2 -3
  336. package/dist/il/idnr.js +2 -9
  337. package/dist/il/idnr.js.map +1 -1
  338. package/dist/il/mod.d.ts +3 -2
  339. package/dist/in/aadhaar.d.ts +2 -3
  340. package/dist/in/aadhaar.js +2 -12
  341. package/dist/in/aadhaar.js.map +1 -1
  342. package/dist/in/gstin.d.ts +2 -3
  343. package/dist/in/gstin.js +4 -11
  344. package/dist/in/gstin.js.map +1 -1
  345. package/dist/in/mod.d.ts +3 -2
  346. package/dist/in/pan.d.ts +15 -2
  347. package/dist/in/pan.js +3 -15
  348. package/dist/in/pan.js.map +1 -1
  349. package/dist/index.d.ts +2 -2
  350. package/dist/index.js +6 -6
  351. package/dist/iq/mod.d.ts +3 -2
  352. package/dist/iq/nid.d.ts +16 -2
  353. package/dist/iq/nid.js +2 -15
  354. package/dist/iq/nid.js.map +1 -1
  355. package/dist/ir/mod.d.ts +3 -2
  356. package/dist/ir/nid.d.ts +2 -3
  357. package/dist/ir/nid.js +2 -24
  358. package/dist/ir/nid.js.map +1 -1
  359. package/dist/is/kennitala.d.ts +2 -3
  360. package/dist/is/kennitala.js +2 -13
  361. package/dist/is/kennitala.js.map +1 -1
  362. package/dist/is/mod.d.ts +3 -2
  363. package/dist/is/vsk.d.ts +9 -2
  364. package/dist/is/vsk.js +1 -7
  365. package/dist/is/vsk.js.map +1 -1
  366. package/dist/isin.d.ts +2 -3
  367. package/dist/isin.js +11 -21
  368. package/dist/isin.js.map +1 -1
  369. package/dist/it/codicefiscale.d.ts +5 -4
  370. package/dist/it/codicefiscale.js +27 -23
  371. package/dist/it/codicefiscale.js.map +1 -1
  372. package/dist/it/iva.d.ts +2 -3
  373. package/dist/it/iva.js +2 -9
  374. package/dist/it/iva.js.map +1 -1
  375. package/dist/it/mod.d.ts +3 -2
  376. package/dist/jp/cn.d.ts +2 -3
  377. package/dist/jp/cn.js +1 -9
  378. package/dist/jp/cn.js.map +1 -1
  379. package/dist/jp/mod.d.ts +3 -2
  380. package/dist/jp/mynumber.d.ts +2 -3
  381. package/dist/jp/mynumber.js +1 -10
  382. package/dist/jp/mynumber.js.map +1 -1
  383. package/dist/kr/brn.d.ts +11 -2
  384. package/dist/kr/brn.js +1 -9
  385. package/dist/kr/brn.js.map +1 -1
  386. package/dist/kr/mod.d.ts +3 -2
  387. package/dist/kr/rrn.d.ts +5 -4
  388. package/dist/kr/rrn.js +15 -13
  389. package/dist/kr/rrn.js.map +1 -1
  390. package/dist/kw/civil.d.ts +6 -5
  391. package/dist/kw/civil.js +20 -17
  392. package/dist/kw/civil.js.map +1 -1
  393. package/dist/kw/mod.d.ts +3 -2
  394. package/dist/kz/iin.d.ts +2 -3
  395. package/dist/kz/iin.js +4 -18
  396. package/dist/kz/iin.js.map +1 -1
  397. package/dist/kz/mod.d.ts +3 -2
  398. package/dist/lei.d.ts +2 -3
  399. package/dist/lei.js +2 -11
  400. package/dist/lei.js.map +1 -1
  401. package/dist/li/mod.d.ts +3 -2
  402. package/dist/li/peid.d.ts +11 -2
  403. package/dist/li/peid.js +1 -9
  404. package/dist/li/peid.js.map +1 -1
  405. package/dist/lk/mod.d.ts +3 -2
  406. package/dist/lk/nic.d.ts +5 -4
  407. package/dist/lk/nic.js +16 -16
  408. package/dist/lk/nic.js.map +1 -1
  409. package/dist/lt/asmens.d.ts +2 -3
  410. package/dist/lt/asmens.js +2 -1
  411. package/dist/lt/asmens.js.map +1 -1
  412. package/dist/lt/mod.d.ts +3 -2
  413. package/dist/lt/vat.d.ts +2 -3
  414. package/dist/lt/vat.js +2 -10
  415. package/dist/lt/vat.js.map +1 -1
  416. package/dist/lu/mod.d.ts +3 -2
  417. package/dist/lu/vat.d.ts +2 -3
  418. package/dist/lu/vat.js +2 -8
  419. package/dist/lu/vat.js.map +1 -1
  420. package/dist/luhn.d.ts +2 -3
  421. package/dist/luhn.js +9 -9
  422. package/dist/luhn.js.map +1 -1
  423. package/dist/lv/mod.d.ts +3 -2
  424. package/dist/lv/vat.d.ts +2 -3
  425. package/dist/lv/vat.js +19 -18
  426. package/dist/lv/vat.js.map +1 -1
  427. package/dist/ma/ice.d.ts +2 -3
  428. package/dist/ma/ice.js +2 -11
  429. package/dist/ma/ice.js.map +1 -1
  430. package/dist/ma/mod.d.ts +3 -2
  431. package/dist/mc/mod.d.ts +3 -2
  432. package/dist/mc/tva.d.ts +2 -3
  433. package/dist/mc/tva.js +1 -0
  434. package/dist/mc/tva.js.map +1 -1
  435. package/dist/md/idno.d.ts +2 -3
  436. package/dist/md/idno.js +1 -10
  437. package/dist/md/idno.js.map +1 -1
  438. package/dist/md/mod.d.ts +3 -2
  439. package/dist/me/mod.d.ts +3 -2
  440. package/dist/me/pib.d.ts +2 -3
  441. package/dist/me/pib.js +2 -10
  442. package/dist/me/pib.js.map +1 -1
  443. package/dist/mk/edb.d.ts +2 -3
  444. package/dist/mk/edb.js +2 -11
  445. package/dist/mk/edb.js.map +1 -1
  446. package/dist/mk/mod.d.ts +3 -2
  447. package/dist/mt/mod.d.ts +3 -2
  448. package/dist/mt/vat.d.ts +2 -3
  449. package/dist/mt/vat.js +3 -10
  450. package/dist/mt/vat.js.map +1 -1
  451. package/dist/mu/brn.d.ts +23 -2
  452. package/dist/mu/brn.js +1 -21
  453. package/dist/mu/brn.js.map +1 -1
  454. package/dist/mu/mod.d.ts +3 -2
  455. package/dist/mx/clabe.d.ts +2 -3
  456. package/dist/mx/clabe.js +1 -14
  457. package/dist/mx/clabe.js.map +1 -1
  458. package/dist/mx/curp.d.ts +5 -4
  459. package/dist/mx/curp.js +27 -19
  460. package/dist/mx/curp.js.map +1 -1
  461. package/dist/mx/mod.d.ts +3 -2
  462. package/dist/mx/rfc.d.ts +5 -4
  463. package/dist/mx/rfc.js +23 -20
  464. package/dist/mx/rfc.js.map +1 -1
  465. package/dist/my/mod.d.ts +3 -2
  466. package/dist/my/nric.d.ts +5 -4
  467. package/dist/my/nric.js +18 -16
  468. package/dist/my/nric.js.map +1 -1
  469. package/dist/ng/mod.d.ts +3 -2
  470. package/dist/ng/nin.d.ts +13 -2
  471. package/dist/ng/nin.js +1 -11
  472. package/dist/ng/nin.js.map +1 -1
  473. package/dist/ni/mod.d.ts +3 -2
  474. package/dist/ni/ruc.d.ts +2 -3
  475. package/dist/ni/ruc.js +1 -23
  476. package/dist/ni/ruc.js.map +1 -1
  477. package/dist/nl/bsn.d.ts +2 -3
  478. package/dist/nl/bsn.js +2 -10
  479. package/dist/nl/bsn.js.map +1 -1
  480. package/dist/nl/kvk.d.ts +9 -2
  481. package/dist/nl/kvk.js +1 -7
  482. package/dist/nl/kvk.js.map +1 -1
  483. package/dist/nl/mod.d.ts +3 -2
  484. package/dist/nl/vat.d.ts +2 -3
  485. package/dist/nl/vat.js +4 -50
  486. package/dist/nl/vat.js.map +1 -1
  487. package/dist/no/fodselsnummer.d.ts +2 -3
  488. package/dist/no/fodselsnummer.js +3 -10
  489. package/dist/no/fodselsnummer.js.map +1 -1
  490. package/dist/no/mod.d.ts +3 -2
  491. package/dist/no/mva.d.ts +2 -3
  492. package/dist/no/mva.js +1 -8
  493. package/dist/no/mva.js.map +1 -1
  494. package/dist/no/orgnr.d.ts +2 -3
  495. package/dist/no/orgnr.js +2 -8
  496. package/dist/no/orgnr.js.map +1 -1
  497. package/dist/nz/ird.d.ts +2 -3
  498. package/dist/nz/ird.js +4 -13
  499. package/dist/nz/ird.js.map +1 -1
  500. package/dist/nz/mod.d.ts +3 -2
  501. package/dist/pa/mod.d.ts +3 -2
  502. package/dist/pa/ruc.d.ts +2 -3
  503. package/dist/pa/ruc.js +4 -19
  504. package/dist/pa/ruc.js.map +1 -1
  505. package/dist/patterns.d.ts +8 -10
  506. package/dist/patterns.js +83 -28
  507. package/dist/patterns.js.map +1 -1
  508. package/dist/pe/mod.d.ts +3 -2
  509. package/dist/pe/ruc.d.ts +2 -3
  510. package/dist/pe/ruc.js +10 -24
  511. package/dist/pe/ruc.js.map +1 -1
  512. package/dist/ph/mod.d.ts +3 -2
  513. package/dist/ph/philid.d.ts +14 -2
  514. package/dist/ph/philid.js +1 -12
  515. package/dist/ph/philid.js.map +1 -1
  516. package/dist/pk/cnic.d.ts +14 -2
  517. package/dist/pk/cnic.js +1 -12
  518. package/dist/pk/cnic.js.map +1 -1
  519. package/dist/pk/mod.d.ts +3 -2
  520. package/dist/pl/mod.d.ts +3 -2
  521. package/dist/pl/nip.d.ts +2 -3
  522. package/dist/pl/nip.js +2 -10
  523. package/dist/pl/nip.js.map +1 -1
  524. package/dist/pl/pesel.d.ts +2 -3
  525. package/dist/pl/pesel.js +4 -13
  526. package/dist/pl/pesel.js.map +1 -1
  527. package/dist/pl/regon.d.ts +2 -3
  528. package/dist/pl/regon.js +2 -11
  529. package/dist/pl/regon.js.map +1 -1
  530. package/dist/pt/cc.d.ts +2 -3
  531. package/dist/pt/cc.js +7 -13
  532. package/dist/pt/cc.js.map +1 -1
  533. package/dist/pt/mod.d.ts +3 -2
  534. package/dist/pt/vat.d.ts +2 -3
  535. package/dist/pt/vat.js +3 -11
  536. package/dist/pt/vat.js.map +1 -1
  537. package/dist/ro/cnp.d.ts +2 -3
  538. package/dist/ro/cnp.js +5 -14
  539. package/dist/ro/cnp.js.map +1 -1
  540. package/dist/ro/mod.d.ts +3 -2
  541. package/dist/ro/vat.d.ts +2 -3
  542. package/dist/ro/vat.js +13 -11
  543. package/dist/ro/vat.js.map +1 -1
  544. package/dist/rs/mod.d.ts +3 -2
  545. package/dist/rs/pib.d.ts +2 -3
  546. package/dist/rs/pib.js +1 -9
  547. package/dist/rs/pib.js.map +1 -1
  548. package/dist/ru/inn.d.ts +2 -3
  549. package/dist/ru/inn.js +2 -12
  550. package/dist/ru/inn.js.map +1 -1
  551. package/dist/ru/mod.d.ts +3 -2
  552. package/dist/se/mod.d.ts +3 -2
  553. package/dist/se/orgnr.d.ts +2 -3
  554. package/dist/se/orgnr.js +2 -9
  555. package/dist/se/orgnr.js.map +1 -1
  556. package/dist/se/personnummer.d.ts +2 -3
  557. package/dist/se/personnummer.js +8 -15
  558. package/dist/se/personnummer.js.map +1 -1
  559. package/dist/se/vat.d.ts +2 -3
  560. package/dist/se/vat.js +3 -10
  561. package/dist/se/vat.js.map +1 -1
  562. package/dist/sg/mod.d.ts +3 -2
  563. package/dist/sg/uen.d.ts +2 -3
  564. package/dist/sg/uen.js +47 -70
  565. package/dist/sg/uen.js.map +1 -1
  566. package/dist/si/emso.d.ts +2 -3
  567. package/dist/si/emso.js +12 -14
  568. package/dist/si/emso.js.map +1 -1
  569. package/dist/si/mod.d.ts +3 -2
  570. package/dist/si/vat.d.ts +2 -3
  571. package/dist/si/vat.js +3 -12
  572. package/dist/si/vat.js.map +1 -1
  573. package/dist/sk/dic.d.ts +2 -3
  574. package/dist/sk/dic.js +1 -0
  575. package/dist/sk/dic.js.map +1 -1
  576. package/dist/sk/ico.d.ts +2 -3
  577. package/dist/sk/ico.js +1 -0
  578. package/dist/sk/ico.js.map +1 -1
  579. package/dist/sk/mod.d.ts +3 -2
  580. package/dist/sk/rc.d.ts +4 -5
  581. package/dist/sk/rc.js +6 -2
  582. package/dist/sk/rc.js.map +1 -1
  583. package/dist/th/mod.d.ts +3 -2
  584. package/dist/th/tin.d.ts +2 -3
  585. package/dist/th/tin.js +1 -11
  586. package/dist/th/tin.js.map +1 -1
  587. package/dist/tr/mod.d.ts +3 -2
  588. package/dist/tr/tckimlik.d.ts +2 -3
  589. package/dist/tr/tckimlik.js +1 -20
  590. package/dist/tr/tckimlik.js.map +1 -1
  591. package/dist/tr/vkn.d.ts +2 -3
  592. package/dist/tr/vkn.js +1 -20
  593. package/dist/tr/vkn.js.map +1 -1
  594. package/dist/tw/mod.d.ts +3 -2
  595. package/dist/tw/ubn.d.ts +2 -3
  596. package/dist/tw/ubn.js +2 -12
  597. package/dist/tw/ubn.js.map +1 -1
  598. package/dist/types.d.ts +56 -21
  599. package/dist/ua/edrpou.d.ts +2 -3
  600. package/dist/ua/edrpou.js +5 -12
  601. package/dist/ua/edrpou.js.map +1 -1
  602. package/dist/ua/mod.d.ts +3 -2
  603. package/dist/us/ein.d.ts +12 -2
  604. package/dist/us/ein.js +88 -97
  605. package/dist/us/ein.js.map +1 -1
  606. package/dist/us/itin.d.ts +13 -2
  607. package/dist/us/itin.js +4 -15
  608. package/dist/us/itin.js.map +1 -1
  609. package/dist/us/mod.d.ts +3 -2
  610. package/dist/us/rtn.d.ts +2 -3
  611. package/dist/us/rtn.js +11 -23
  612. package/dist/us/rtn.js.map +1 -1
  613. package/dist/us/ssn.d.ts +13 -2
  614. package/dist/us/ssn.js +1 -11
  615. package/dist/us/ssn.js.map +1 -1
  616. package/dist/uy/mod.d.ts +3 -2
  617. package/dist/uy/rut.d.ts +2 -3
  618. package/dist/uy/rut.js +2 -15
  619. package/dist/uy/rut.js.map +1 -1
  620. package/dist/ve/mod.d.ts +3 -2
  621. package/dist/ve/rif.d.ts +2 -3
  622. package/dist/ve/rif.js +13 -26
  623. package/dist/ve/rif.js.map +1 -1
  624. package/dist/vn/mod.d.ts +3 -2
  625. package/dist/vn/mst.d.ts +2 -3
  626. package/dist/vn/mst.js +1 -12
  627. package/dist/vn/mst.js.map +1 -1
  628. package/dist/za/idnr.d.ts +2 -3
  629. package/dist/za/idnr.js +4 -16
  630. package/dist/za/idnr.js.map +1 -1
  631. package/dist/za/mod.d.ts +3 -2
  632. package/package.json +34 -21
  633. package/src/_checksums/mod1110.ts +1 -1
  634. package/src/_checksums/mod112.ts +7 -6
  635. package/src/_util/generate.ts +38 -0
  636. package/src/ad/nrt.ts +19 -7
  637. package/src/ae/eid.ts +7 -3
  638. package/src/ai/tin.ts +7 -3
  639. package/src/al/nipt.ts +7 -3
  640. package/src/am/tin.ts +7 -3
  641. package/src/ar/cbu.ts +9 -5
  642. package/src/ar/cuit.ts +22 -10
  643. package/src/ar/dni.ts +7 -3
  644. package/src/at/businessid.ts +7 -3
  645. package/src/at/tin.ts +7 -3
  646. package/src/at/uid.ts +7 -3
  647. package/src/at/vnr.ts +62 -12
  648. package/src/au/abn.ts +7 -3
  649. package/src/au/acn.ts +7 -3
  650. package/src/au/tfn.ts +7 -3
  651. package/src/az/voen.ts +9 -3
  652. package/src/ba/jmbg.ts +9 -7
  653. package/src/bd/nid.ts +11 -7
  654. package/src/be/bis.ts +8 -4
  655. package/src/be/nn.ts +7 -3
  656. package/src/be/vat.ts +7 -3
  657. package/src/bg/egn.ts +19 -10
  658. package/src/bg/pnf.ts +7 -3
  659. package/src/bg/vat.ts +8 -3
  660. package/src/bh/cpr.ts +17 -4
  661. package/src/bic.ts +26 -20
  662. package/src/br/cnpj.ts +7 -3
  663. package/src/br/cpf.ts +7 -3
  664. package/src/by/unp.ts +19 -9
  665. package/src/bz/tin.ts +19 -4
  666. package/src/ca/bn.ts +7 -3
  667. package/src/ca/sin.ts +7 -3
  668. package/src/ch/ssn.ts +7 -3
  669. package/src/ch/uid.ts +7 -3
  670. package/src/ch/vat.ts +9 -5
  671. package/src/cl/rut.ts +11 -5
  672. package/src/cn/ric.ts +11 -7
  673. package/src/cn/uscc.ts +27 -11
  674. package/src/co/nit.ts +14 -6
  675. package/src/cr/cpf.ts +11 -6
  676. package/src/creditcard.ts +10 -6
  677. package/src/cu/ni.ts +28 -7
  678. package/src/cy/vat.ts +7 -3
  679. package/src/cz/dic.ts +9 -4
  680. package/src/cz/ico.ts +7 -3
  681. package/src/cz/rc.ts +61 -29
  682. package/src/de/handelsreg.ts +21 -6
  683. package/src/de/idnr.ts +10 -3
  684. package/src/de/stnr.ts +11 -3
  685. package/src/de/svnr.ts +14 -5
  686. package/src/de/vat.ts +7 -3
  687. package/src/dk/cpr.ts +23 -8
  688. package/src/dk/cvr.ts +7 -3
  689. package/src/dk/vat.ts +8 -3
  690. package/src/do/rnc.ts +9 -5
  691. package/src/ec/ruc.ts +9 -5
  692. package/src/ee/ik.ts +21 -10
  693. package/src/ee/registrikood.ts +12 -7
  694. package/src/ee/vat.ts +7 -3
  695. package/src/eg/tn.ts +7 -3
  696. package/src/es/cif.ts +10 -7
  697. package/src/es/dni.ts +7 -3
  698. package/src/es/nie.ts +18 -9
  699. package/src/es/nss.ts +7 -3
  700. package/src/es/vat.ts +13 -5
  701. package/src/eu/vat.ts +55 -6
  702. package/src/fi/hetu.ts +26 -8
  703. package/src/fi/vat.ts +8 -3
  704. package/src/fi/ytunnus.ts +7 -3
  705. package/src/fr/nif.ts +7 -3
  706. package/src/fr/nir.ts +9 -7
  707. package/src/fr/siren.ts +7 -3
  708. package/src/fr/siret.ts +7 -3
  709. package/src/fr/tva.ts +7 -3
  710. package/src/gb/nino.ts +18 -13
  711. package/src/gb/sedol.ts +21 -15
  712. package/src/gb/utr.ts +7 -3
  713. package/src/gb/vat.ts +7 -3
  714. package/src/ge/pin.ts +7 -3
  715. package/src/gh/tin.ts +11 -6
  716. package/src/gr/amka.ts +7 -3
  717. package/src/gr/vat.ts +7 -3
  718. package/src/gt/nit.ts +13 -6
  719. package/src/hk/hkid.ts +9 -4
  720. package/src/hr/vat.ts +7 -3
  721. package/src/hu/vat.ts +8 -3
  722. package/src/iban.ts +7 -3
  723. package/src/id/npwp.ts +7 -3
  724. package/src/ie/pps.ts +7 -3
  725. package/src/ie/vat.ts +7 -3
  726. package/src/il/idnr.ts +7 -3
  727. package/src/in/aadhaar.ts +7 -3
  728. package/src/in/gstin.ts +10 -4
  729. package/src/in/pan.ts +15 -6
  730. package/src/index.ts +6 -0
  731. package/src/iq/nid.ts +7 -3
  732. package/src/ir/nid.ts +7 -3
  733. package/src/is/kennitala.ts +7 -3
  734. package/src/is/vsk.ts +7 -3
  735. package/src/isin.ts +17 -7
  736. package/src/it/codicefiscale.ts +49 -7
  737. package/src/it/iva.ts +7 -3
  738. package/src/jp/cn.ts +7 -3
  739. package/src/jp/mynumber.ts +7 -3
  740. package/src/kr/brn.ts +7 -3
  741. package/src/kr/rrn.ts +27 -8
  742. package/src/kw/civil.ts +31 -14
  743. package/src/kz/iin.ts +9 -8
  744. package/src/lei.ts +7 -3
  745. package/src/li/peid.ts +7 -3
  746. package/src/lk/nic.ts +31 -8
  747. package/src/lt/asmens.ts +8 -4
  748. package/src/lt/vat.ts +8 -3
  749. package/src/lu/vat.ts +8 -3
  750. package/src/luhn.ts +10 -3
  751. package/src/lv/vat.ts +53 -23
  752. package/src/ma/ice.ts +7 -3
  753. package/src/mc/tva.ts +9 -5
  754. package/src/md/idno.ts +7 -3
  755. package/src/me/pib.ts +7 -3
  756. package/src/mk/edb.ts +7 -3
  757. package/src/mt/vat.ts +8 -3
  758. package/src/mu/brn.ts +7 -3
  759. package/src/mx/clabe.ts +7 -3
  760. package/src/mx/curp.ts +47 -10
  761. package/src/mx/rfc.ts +42 -7
  762. package/src/my/nric.ts +33 -8
  763. package/src/ng/nin.ts +7 -3
  764. package/src/ni/ruc.ts +7 -3
  765. package/src/nl/bsn.ts +7 -3
  766. package/src/nl/kvk.ts +7 -3
  767. package/src/nl/vat.ts +18 -69
  768. package/src/no/fodselsnummer.ts +12 -7
  769. package/src/no/mva.ts +9 -5
  770. package/src/no/orgnr.ts +7 -3
  771. package/src/nz/ird.ts +12 -8
  772. package/src/pa/ruc.ts +39 -11
  773. package/src/patterns.ts +184 -46
  774. package/src/pe/ruc.ts +13 -10
  775. package/src/ph/philid.ts +7 -3
  776. package/src/pk/cnic.ts +9 -3
  777. package/src/pl/nip.ts +7 -3
  778. package/src/pl/pesel.ts +9 -7
  779. package/src/pl/regon.ts +7 -3
  780. package/src/pt/cc.ts +13 -7
  781. package/src/pt/vat.ts +8 -3
  782. package/src/ro/cnp.ts +16 -8
  783. package/src/ro/vat.ts +8 -3
  784. package/src/rs/pib.ts +7 -3
  785. package/src/ru/inn.ts +9 -5
  786. package/src/se/orgnr.ts +7 -3
  787. package/src/se/personnummer.ts +35 -32
  788. package/src/se/vat.ts +8 -3
  789. package/src/sg/uen.ts +44 -23
  790. package/src/si/emso.ts +37 -11
  791. package/src/si/vat.ts +8 -3
  792. package/src/sk/dic.ts +8 -4
  793. package/src/sk/ico.ts +3 -2
  794. package/src/sk/rc.ts +17 -4
  795. package/src/th/tin.ts +7 -3
  796. package/src/tr/tckimlik.ts +7 -3
  797. package/src/tr/vkn.ts +7 -3
  798. package/src/tw/ubn.ts +9 -5
  799. package/src/types.ts +69 -7
  800. package/src/ua/edrpou.ts +10 -5
  801. package/src/us/ein.ts +95 -91
  802. package/src/us/itin.ts +14 -11
  803. package/src/us/rtn.ts +32 -19
  804. package/src/us/ssn.ts +7 -3
  805. package/src/uy/rut.ts +9 -5
  806. package/src/ve/rif.ts +19 -12
  807. package/src/vn/mst.ts +7 -3
  808. package/src/za/idnr.ts +9 -7
@@ -1 +1 @@
1
- {"version":3,"file":"ruc.js","names":[],"sources":["../../src/pe/ruc.ts"],"sourcesContent":["/**\n * RUC (Registro Único de Contribuyentes).\n *\n * Peruvian tax identification number assigned by SUNAT\n * (Superintendencia Nacional de Aduanas y de\n * Administración Tributaria). The number consists of\n * 11 digits: a type prefix (10 = person, 20 = company,\n * among others), 8 identification digits, and a check\n * digit computed using a weighted modulo 11 algorithm.\n *\n * Format: XXXXXXXXXXX (11 digits, no separators).\n *\n * @see https://www.sunat.gob.pe/\n * @see https://en.wikipedia.org/wiki/Tax_identification_number#Peru\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\n/**\n * Valid type prefixes for RUC numbers.\n * 10 = natural person, 15 = non-domiciled without RUC,\n * 17 = non-domiciled, 20 = legal entity,\n * others for specific entity types.\n */\nconst VALID_PREFIXES = new Set([\"10\", \"15\", \"17\", \"20\"]);\n\nconst WEIGHTS = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];\n\nconst compact = (value: string): string =>\n clean(value, \" -.\").trim();\n\n/**\n * Compute the RUC check digit using weighted sum\n * mod 11. Weights: [5, 4, 3, 2, 7, 6, 5, 4, 3, 2].\n *\n * check = 11 - (sum % 11); if >= 10, subtract 10.\n */\nconst calcCheckDigit = (body: string): number => {\n let sum = 0;\n for (let i = 0; i < 10; i++) {\n sum += Number(body[i]) * WEIGHTS[i]!;\n }\n const remainder = 11 - (sum % 11);\n if (remainder >= 10) return remainder - 10;\n return remainder;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 11) {\n return err(\"INVALID_LENGTH\", \"RUC must be 11 digits\");\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"RUC must contain only digits\",\n );\n }\n\n const prefix = v.slice(0, 2);\n if (!VALID_PREFIXES.has(prefix)) {\n return err(\n \"INVALID_COMPONENT\",\n \"RUC has an invalid type prefix\",\n );\n }\n\n const expected = calcCheckDigit(v.slice(0, 10));\n if (Number(v[10]) !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RUC 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/** Generate a random valid Peruvian RUC. */\nconst generate = (): string => {\n const prefixes = [\"10\", \"15\", \"17\", \"20\"] as const;\n const prefix =\n prefixes[Math.floor(Math.random() * prefixes.length)]!;\n const body = prefix + randomDigits(8);\n return body + String(calcCheckDigit(body));\n};\n\n/**\n * Peruvian RUC (tax identification number).\n *\n * Examples sourced from python-stdnum test suite\n * (pe.ruc module).\n */\nconst ruc: Validator = {\n name: \"Peruvian Tax ID\",\n localName: \"Registro Único de Contribuyentes\",\n abbreviation: \"RUC\",\n aliases: [\"RUC\"] as const,\n candidatePattern: \"\\\\d{11}\",\n country: \"PE\",\n entityType: \"any\",\n compact,\n format,\n validate,\n sourceUrl: \"https://www.sunat.gob.pe/\",\n lengths: [11] as const,\n examples: [\"20131312955\", \"20100047218\"] as const,\n generate,\n};\n\nexport default ruc;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAM,iBAAiB,IAAI,IAAI;CAAC;CAAM;CAAM;CAAM;CAAK,CAAC;AAExD,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAE9C,MAAM,WAAW,UACf,MAAM,OAAO,MAAM,CAAC,MAAM;;;;;;;AAQ5B,MAAM,kBAAkB,SAAyB;CAC/C,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IACtB,QAAO,OAAO,KAAK,GAAG,GAAG,QAAQ;CAEnC,MAAM,YAAY,KAAM,MAAM;AAC9B,KAAI,aAAa,GAAI,QAAO,YAAY;AACxC,QAAO;;AAGT,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,GACf,QAAO,IAAI,kBAAkB,wBAAwB;AAGvD,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;CAGH,MAAM,SAAS,EAAE,MAAM,GAAG,EAAE;AAC5B,KAAI,CAAC,eAAe,IAAI,OAAO,CAC7B,QAAO,IACL,qBACA,iCACD;CAGH,MAAM,WAAW,eAAe,EAAE,MAAM,GAAG,GAAG,CAAC;AAC/C,KAAI,OAAO,EAAE,IAAI,KAAK,SACpB,QAAO,IACL,oBACA,iCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,MAAM,iBAAyB;CAC7B,MAAM,WAAW;EAAC;EAAM;EAAM;EAAM;EAAK;CAGzC,MAAM,OADJ,SAAS,KAAK,MAAM,KAAK,QAAQ,GAAG,SAAS,OAAO,IAChC,aAAa,EAAE;AACrC,QAAO,OAAO,OAAO,eAAe,KAAK,CAAC;;;;;;;;AAS5C,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,MAAM;CAChB,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,WAAW;CACX,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,eAAe,cAAc;CACxC;CACD"}
1
+ {"version":3,"file":"ruc.js","names":[],"sources":["../../src/pe/ruc.ts"],"sourcesContent":["/**\n * RUC (Registro Único de Contribuyentes).\n *\n * Peruvian tax identification number assigned by SUNAT\n * (Superintendencia Nacional de Aduanas y de\n * Administración Tributaria). The number consists of\n * 11 digits: a type prefix (10 = person, 20 = company,\n * among others), 8 identification digits, and a check\n * digit computed using a weighted modulo 11 algorithm.\n *\n * Format: XXXXXXXXXXX (11 digits, no separators).\n *\n * @see https://www.sunat.gob.pe/\n * @see https://en.wikipedia.org/wiki/Tax_identification_number#Peru\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomPick } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\n/**\n * Valid type prefixes for RUC numbers.\n * 10 = natural person, 15 = non-domiciled without RUC,\n * 17 = non-domiciled, 20 = legal entity,\n * others for specific entity types.\n */\nconst VALID_PREFIXES = new Set([\"10\", \"15\", \"17\", \"20\"]);\n\nconst WEIGHTS = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2] as const;\nconst GENERATE_PREFIXES = [\"10\", \"15\", \"17\", \"20\"] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -.\").trim();\n\n/**\n * Compute the RUC check digit using weighted sum\n * mod 11. Weights: [5, 4, 3, 2, 7, 6, 5, 4, 3, 2].\n *\n * check = 11 - (sum % 11); if >= 10, subtract 10.\n */\nconst calcCheckDigit = (body: string): number => {\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n sum += Number(body[i]) * weight;\n }\n const remainder = 11 - (sum % 11);\n if (remainder >= 10) return remainder - 10;\n return remainder;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 11) {\n return err(\"INVALID_LENGTH\", \"RUC must be 11 digits\");\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"RUC must contain only digits\",\n );\n }\n\n const prefix = v.slice(0, 2);\n if (!VALID_PREFIXES.has(prefix)) {\n return err(\n \"INVALID_COMPONENT\",\n \"RUC has an invalid type prefix\",\n );\n }\n\n const expected = calcCheckDigit(v.slice(0, 10));\n if (Number(v[10]) !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RUC 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/** Generate a random valid Peruvian RUC. */\nconst generate = (): string => {\n const prefix = randomPick(GENERATE_PREFIXES);\n const body = prefix + randomDigits(8);\n return body + String(calcCheckDigit(body));\n};\n\n/**\n * Peruvian RUC (tax identification number).\n *\n * Examples sourced from python-stdnum test suite\n * (pe.ruc module).\n */\nconst ruc: CountryValidator<\"PE\"> = {\n name: \"Peruvian Tax ID\",\n localName: \"Registro Único de Contribuyentes\",\n abbreviation: \"RUC\",\n aliases: [\"RUC\"] as const,\n candidatePattern: \"\\\\d{11}\",\n scope: \"country\",\n country: \"PE\",\n entityType: \"any\",\n compact,\n format,\n validate,\n sourceUrl: \"https://www.sunat.gob.pe/\",\n lengths: [11] as const,\n examples: [\"20131312955\", \"20100047218\"] as const,\n generate,\n};\n\nexport default ruc;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;AAgCA,MAAM,iBAAiB,IAAI,IAAI;CAAC;CAAM;CAAM;CAAM;AAAI,CAAC;AAEvD,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAC7C,MAAM,oBAAoB;CAAC;CAAM;CAAM;CAAM;AAAI;AAEjD,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,EAAE,KAAK;;;;;;;AAQ3B,MAAM,kBAAkB,SAAyB;CAC/C,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GACxC,OAAO,OAAO,KAAK,EAAE,IAAI;CAE3B,MAAM,YAAY,KAAM,MAAM;CAC9B,IAAI,aAAa,IAAI,OAAO,YAAY;CACxC,OAAO;AACT;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,IACf,OAAO,IAAI,kBAAkB,uBAAuB;CAGtD,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAGF,MAAM,SAAS,EAAE,MAAM,GAAG,CAAC;CAC3B,IAAI,CAAC,eAAe,IAAI,MAAM,GAC5B,OAAO,IACL,qBACA,gCACF;CAGF,MAAM,WAAW,eAAe,EAAE,MAAM,GAAG,EAAE,CAAC;CAC9C,IAAI,OAAO,EAAE,GAAG,MAAM,UACpB,OAAO,IACL,oBACA,gCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,iBAAyB;CAE7B,MAAM,OADS,WAAW,iBACR,IAAI,aAAa,CAAC;CACpC,OAAO,OAAO,OAAO,eAAe,IAAI,CAAC;AAC3C;;;;;;;AAQA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,KAAK;CACf,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,WAAW;CACX,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,eAAe,aAAa;CACvC;AACF"}
package/dist/ph/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import philid from "./philid.js";
3
2
 
4
3
  //#region src/ph/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { philid };
6
+ }
6
7
  //#endregion
7
8
  export { mod_d_exports, philid };
8
9
  //# sourceMappingURL=mod.d.ts.map
@@ -1,13 +1,25 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ph/philid.d.ts
4
4
  /** Generate a random valid PhilID. */
5
5
  declare const generate: () => string;
6
+ /**
7
+ * PhilID (Philippine Identification System Number,
8
+ * PhilSys Card Number, PCN).
9
+ *
10
+ * 12-digit personal identifier issued under the
11
+ * Philippine Identification System (PhilSys).
12
+ * Formatted as XXXX-XXXXXXX-X. No check digit
13
+ * algorithm is publicly documented.
14
+ *
15
+ * @see https://en.wikipedia.org/wiki/Philippine_national_identity_card
16
+ * @see https://philsys.gov.ph/
17
+ */
6
18
  declare const compact: (value: string) => string;
7
19
  declare const validate: (value: string) => ValidateResult;
8
20
  declare const format: (value: string) => string;
9
21
  /** Philippine Identification System Number. */
10
- declare const philid: Validator;
22
+ declare const philid: CountryValidator<"PH">;
11
23
  //#endregion
12
24
  export { compact, philid as default, format, generate, validate };
13
25
  //# sourceMappingURL=philid.d.ts.map
package/dist/ph/philid.js CHANGED
@@ -3,18 +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/ph/philid.ts
6
- /**
7
- * PhilID (Philippine Identification System Number,
8
- * PhilSys Card Number, PCN).
9
- *
10
- * 12-digit personal identifier issued under the
11
- * Philippine Identification System (PhilSys).
12
- * Formatted as XXXX-XXXXXXX-X. No check digit
13
- * algorithm is publicly documented.
14
- *
15
- * @see https://en.wikipedia.org/wiki/Philippine_national_identity_card
16
- * @see https://philsys.gov.ph/
17
- */
18
6
  /** Generate a random valid PhilID. */
19
7
  const generate = () => randomDigits(12);
20
8
  const compact = (value) => clean(value, " -");
@@ -43,6 +31,7 @@ const philid = {
43
31
  "Philippine ID"
44
32
  ],
45
33
  candidatePattern: "\\d{4}-\\d{4}-\\d{4}-\\d{4}",
34
+ scope: "country",
46
35
  country: "PH",
47
36
  entityType: "person",
48
37
  description: "12-digit personal identifier issued under the Philippine Identification System",
@@ -1 +1 @@
1
- {"version":3,"file":"philid.js","names":[],"sources":["../../src/ph/philid.ts"],"sourcesContent":["/** Generate a random valid PhilID. */\nconst generate = (): string => randomDigits(12);\n\n/**\n * PhilID (Philippine Identification System Number,\n * PhilSys Card Number, PCN).\n *\n * 12-digit personal identifier issued under the\n * Philippine Identification System (PhilSys).\n * Formatted as XXXX-XXXXXXX-X. No check digit\n * algorithm is publicly documented.\n *\n * @see https://en.wikipedia.org/wiki/Philippine_national_identity_card\n * @see https://philsys.gov.ph/\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 !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"PhilID must be exactly 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"PhilID must contain only digits\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 12) {\n return `${v.slice(0, 4)}-${v.slice(4, 11)}-${v.slice(11)}`;\n }\n return v;\n};\n\n/** Philippine Identification System Number. */\nconst philid: Validator = {\n name: \"Philippine Identification System Number\",\n localName: \"PhilSys Card Number\",\n abbreviation: \"PhilID\",\n aliases: [\"PhilID\", \"PhilSys\", \"Philippine ID\"] as const,\n candidatePattern: \"\\\\d{4}-\\\\d{4}-\\\\d{4}-\\\\d{4}\",\n country: \"PH\",\n entityType: \"person\",\n description:\n \"12-digit personal identifier issued under\" +\n \" the Philippine Identification System\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/\" +\n \"Philippine_national_identity_card\",\n lengths: [12] as const,\n examples: [\"123456789012\", \"000011112222\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default philid;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;AACA,MAAM,iBAAyB,aAAa,GAAG;AAsB/C,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,mCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,kCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG;AAE1D,QAAO;;;AAIT,MAAM,SAAoB;CACxB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAU;EAAW;EAAgB;CAC/C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,aACE;CAEF,WACE;CAEF,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,gBAAgB,eAAe;CAC1C;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"philid.js","names":[],"sources":["../../src/ph/philid.ts"],"sourcesContent":["/** Generate a random valid PhilID. */\nconst generate = (): string => randomDigits(12);\n\n/**\n * PhilID (Philippine Identification System Number,\n * PhilSys Card Number, PCN).\n *\n * 12-digit personal identifier issued under the\n * Philippine Identification System (PhilSys).\n * Formatted as XXXX-XXXXXXX-X. No check digit\n * algorithm is publicly documented.\n *\n * @see https://en.wikipedia.org/wiki/Philippine_national_identity_card\n * @see https://philsys.gov.ph/\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 !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"PhilID must be exactly 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"PhilID must contain only digits\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 12) {\n return `${v.slice(0, 4)}-${v.slice(4, 11)}-${v.slice(11)}`;\n }\n return v;\n};\n\n/** Philippine Identification System Number. */\nconst philid: CountryValidator<\"PH\"> = {\n name: \"Philippine Identification System Number\",\n localName: \"PhilSys Card Number\",\n abbreviation: \"PhilID\",\n aliases: [\"PhilID\", \"PhilSys\", \"Philippine ID\"] as const,\n candidatePattern: \"\\\\d{4}-\\\\d{4}-\\\\d{4}-\\\\d{4}\",\n scope: \"country\",\n country: \"PH\",\n entityType: \"person\",\n description:\n \"12-digit personal identifier issued under\" +\n \" the Philippine Identification System\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/\" +\n \"Philippine_national_identity_card\",\n lengths: [12] as const,\n examples: [\"123456789012\", \"000011112222\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default philid;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AACA,MAAM,iBAAyB,aAAa,EAAE;AAyB9C,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,kCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,iCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;CAEzD,OAAO;AACT;;AAGA,MAAM,SAAiC;CACrC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAU;EAAW;CAAe;CAC9C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aACE;CAEF,WACE;CAEF,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,gBAAgB,cAAc;CACzC;CACA;CACA;CACA;AACF"}
package/dist/pk/cnic.d.ts CHANGED
@@ -1,13 +1,25 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/pk/cnic.d.ts
4
4
  /** Generate a random valid Pakistan CNIC. */
5
5
  declare const generate: () => string;
6
+ /**
7
+ * CNIC (Computerized National Identity Card, Pakistan).
8
+ *
9
+ * 13 digits: PPPPP-DDDDDDD-G where P is a province/
10
+ * district code (5 digits), D is a sequential number
11
+ * (7 digits), and G is a gender digit (odd = male,
12
+ * even = female, including 0). No checksum; structural
13
+ * validation.
14
+ *
15
+ * @see https://www.geo.tv/latest/157233-secret-behind-every-digit-of-the-cnic-number
16
+ * @see https://en.wikipedia.org/wiki/CNIC_(Pakistan)
17
+ */
6
18
  declare const compact: (value: string) => string;
7
19
  declare const validate: (value: string) => ValidateResult;
8
20
  declare const format: (value: string) => string;
9
21
  /** Pakistan Computerized National Identity Card. */
10
- declare const cnic: Validator;
22
+ declare const cnic: CountryValidator<"PK">;
11
23
  //#endregion
12
24
  export { compact, cnic as default, format, generate, validate };
13
25
  //# sourceMappingURL=cnic.d.ts.map
package/dist/pk/cnic.js CHANGED
@@ -3,18 +3,6 @@ import { randomDigits, randomInt } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/pk/cnic.ts
6
- /**
7
- * CNIC (Computerized National Identity Card, Pakistan).
8
- *
9
- * 13 digits: PPPPP-DDDDDDD-G where P is a province/
10
- * district code (5 digits), D is a sequential number
11
- * (7 digits), and G is a gender digit (odd = male,
12
- * even = female, including 0). No checksum; structural
13
- * validation.
14
- *
15
- * @see https://www.geo.tv/latest/157233-secret-behind-every-digit-of-the-cnic-number
16
- * @see https://en.wikipedia.org/wiki/CNIC_(Pakistan)
17
- */
18
6
  /** Generate a random valid Pakistan CNIC. */
19
7
  const generate = () => {
20
8
  return `${String(randomInt(1, 7))}${randomDigits(4)}${randomDigits(7)}${String(randomInt(1, 9))}`;
@@ -52,6 +40,7 @@ const cnic = {
52
40
  abbreviation: "CNIC",
53
41
  aliases: ["CNIC", "شناختی کارڈ"],
54
42
  candidatePattern: "\\d{5}-?\\d{7}-?\\d",
43
+ scope: "country",
55
44
  country: "PK",
56
45
  entityType: "person",
57
46
  lengths: [13],
@@ -1 +1 @@
1
- {"version":3,"file":"cnic.js","names":[],"sources":["../../src/pk/cnic.ts"],"sourcesContent":["/** Generate a random valid Pakistan CNIC. */\nconst generate = (): string => {\n const province = String(randomInt(1, 7));\n const district = randomDigits(4);\n const serial = randomDigits(7);\n const gender = String(randomInt(1, 9));\n return `${province}${district}${serial}${gender}`;\n};\n\n/**\n * CNIC (Computerized National Identity Card, Pakistan).\n *\n * 13 digits: PPPPP-DDDDDDD-G where P is a province/\n * district code (5 digits), D is a sequential number\n * (7 digits), and G is a gender digit (odd = male,\n * even = female, including 0). No checksum; structural\n * validation.\n *\n * @see https://www.geo.tv/latest/157233-secret-behind-every-digit-of-the-cnic-number\n * @see https://en.wikipedia.org/wiki/CNIC_(Pakistan)\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\n/** Valid province IDs (first digit). */\nconst VALID_PROVINCES = new Set([\n \"1\",\n \"2\",\n \"3\",\n \"4\",\n \"5\",\n \"6\",\n \"7\",\n]);\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 13) {\n return err(\"INVALID_LENGTH\", \"CNIC must be 13 digits\");\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CNIC must contain only digits\",\n );\n }\n // First digit must be a valid province code\n if (!VALID_PROVINCES.has(v[0]!)) {\n return err(\n \"INVALID_COMPONENT\",\n \"CNIC province code is invalid\",\n );\n }\n // Last digit indicates gender: odd = male,\n // even = female. Digit 0 is rejected per\n // python-stdnum convention; NADRA does not\n // publish whether 0 is a valid gender code.\n // @see https://www.geo.tv/latest/157233\n if (v[12] === \"0\") {\n return err(\n \"INVALID_COMPONENT\",\n \"CNIC gender digit must not be 0\",\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, 5)}-${v.slice(5, 12)}-${v.slice(12)}`;\n};\n\n/** Pakistan Computerized National Identity Card. */\nconst cnic: Validator = {\n name: \"Computerized National Identity Card\",\n localName: \"Computerized National Identity Card\",\n abbreviation: \"CNIC\",\n aliases: [\"CNIC\", \"شناختی کارڈ\"] as const,\n candidatePattern: \"\\\\d{5}-?\\\\d{7}-?\\\\d\",\n country: \"PK\",\n entityType: \"person\",\n lengths: [13],\n examples: [\"3520112345671\", \"4210112345672\"],\n description:\n \"13-digit identity card number issued by NADRA\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/CNIC_(Pakistan)\",\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cnic;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;AACA,MAAM,iBAAyB;AAK7B,QAAO,GAJU,OAAO,UAAU,GAAG,EAAE,CAAC,GACvB,aAAa,EAAE,GACjB,aAAa,EAAE,GACf,OAAO,UAAU,GAAG,EAAE,CAAC;;AAwBxC,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;;AAGpB,MAAM,kBAAkB,IAAI,IAAI;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IAAI,kBAAkB,yBAAyB;AAExD,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,gCACD;AAGH,KAAI,CAAC,gBAAgB,IAAI,EAAE,GAAI,CAC7B,QAAO,IACL,qBACA,gCACD;AAOH,KAAI,EAAE,QAAQ,IACZ,QAAO,IACL,qBACA,kCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG;;;AAI1D,MAAM,OAAkB;CACtB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,QAAQ,cAAc;CAChC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,iBAAiB,gBAAgB;CAC5C,aACE;CACF,WACE;CACF;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"cnic.js","names":[],"sources":["../../src/pk/cnic.ts"],"sourcesContent":["/** Generate a random valid Pakistan CNIC. */\nconst generate = (): string => {\n const province = String(randomInt(1, 7));\n const district = randomDigits(4);\n const serial = randomDigits(7);\n const gender = String(randomInt(1, 9));\n return `${province}${district}${serial}${gender}`;\n};\n\n/**\n * CNIC (Computerized National Identity Card, Pakistan).\n *\n * 13 digits: PPPPP-DDDDDDD-G where P is a province/\n * district code (5 digits), D is a sequential number\n * (7 digits), and G is a gender digit (odd = male,\n * even = female, including 0). No checksum; structural\n * validation.\n *\n * @see https://www.geo.tv/latest/157233-secret-behind-every-digit-of-the-cnic-number\n * @see https://en.wikipedia.org/wiki/CNIC_(Pakistan)\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\n/** Valid province IDs (first digit). */\nconst VALID_PROVINCES = new Set([\n \"1\",\n \"2\",\n \"3\",\n \"4\",\n \"5\",\n \"6\",\n \"7\",\n]);\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 13) {\n return err(\"INVALID_LENGTH\", \"CNIC must be 13 digits\");\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CNIC must contain only digits\",\n );\n }\n // First digit must be a valid province code\n // SAFETY: v.length === 13 above guarantees v[0] exists.\n // eslint-disable-next-line no-non-null-assertion\n if (!VALID_PROVINCES.has(v[0]!)) {\n return err(\n \"INVALID_COMPONENT\",\n \"CNIC province code is invalid\",\n );\n }\n // Last digit indicates gender: odd = male,\n // even = female. Digit 0 is rejected per\n // python-stdnum convention; NADRA does not\n // publish whether 0 is a valid gender code.\n // @see https://www.geo.tv/latest/157233\n if (v[12] === \"0\") {\n return err(\n \"INVALID_COMPONENT\",\n \"CNIC gender digit must not be 0\",\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, 5)}-${v.slice(5, 12)}-${v.slice(12)}`;\n};\n\n/** Pakistan Computerized National Identity Card. */\nconst cnic: CountryValidator<\"PK\"> = {\n name: \"Computerized National Identity Card\",\n localName: \"Computerized National Identity Card\",\n abbreviation: \"CNIC\",\n aliases: [\"CNIC\", \"شناختی کارڈ\"] as const,\n candidatePattern: \"\\\\d{5}-?\\\\d{7}-?\\\\d\",\n scope: \"country\",\n country: \"PK\",\n entityType: \"person\",\n lengths: [13],\n examples: [\"3520112345671\", \"4210112345672\"],\n description:\n \"13-digit identity card number issued by NADRA\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/CNIC_(Pakistan)\",\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cnic;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AACA,MAAM,iBAAyB;CAK7B,OAAO,GAJU,OAAO,UAAU,GAAG,CAAC,CAIrB,IAHA,aAAa,CAGF,IAFb,aAAa,CAES,IADtB,OAAO,UAAU,GAAG,CAAC,CACU;AAChD;AAyBA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;;AAGnB,MAAM,kBAAkB,IAAI,IAAI;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IAAI,kBAAkB,wBAAwB;CAEvD,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,+BACF;CAKF,IAAI,CAAC,gBAAgB,IAAI,EAAE,EAAG,GAC5B,OAAO,IACL,qBACA,+BACF;CAOF,IAAI,EAAE,QAAQ,KACZ,OAAO,IACL,qBACA,iCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;AACzD;;AAGA,MAAM,OAA+B;CACnC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,QAAQ,aAAa;CAC/B,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,iBAAiB,eAAe;CAC3C,aACE;CACF,WACE;CACF;CACA;CACA;CACA;AACF"}
package/dist/pk/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import cnic from "./cnic.js";
3
2
 
4
3
  //#region src/pk/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { cnic };
6
+ }
6
7
  //#endregion
7
8
  export { cnic, mod_d_exports };
8
9
  //# sourceMappingURL=mod.d.ts.map
package/dist/pl/mod.d.ts CHANGED
@@ -1,10 +1,11 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import nip from "./nip.js";
3
2
  import pesel from "./pesel.js";
4
3
  import regon from "./regon.js";
5
4
 
6
5
  //#region src/pl/mod.d.ts
7
-
6
+ declare namespace mod_d_exports {
7
+ export { nip, pesel, regon };
8
+ }
8
9
  //#endregion
9
10
  export { mod_d_exports, nip, pesel, regon };
10
11
  //# sourceMappingURL=mod.d.ts.map
package/dist/pl/nip.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/pl/nip.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
@@ -12,7 +11,7 @@ declare const format: (value: string) => string;
12
11
  */
13
12
  declare const generate: () => string;
14
13
  /** Polish VAT Number. */
15
- declare const nip: Validator;
14
+ declare const nip: CountryValidator<"PL">;
16
15
  //#endregion
17
16
  export { compact, nip as default, format, generate, validate };
18
17
  //# sourceMappingURL=nip.d.ts.map
package/dist/pl/nip.js CHANGED
@@ -1,18 +1,9 @@
1
+ import { weightedSum } from "../_checksums/weighted-sum.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits } from "../_util/generate.js";
3
4
  import { err } from "../_util/result.js";
4
5
  import { isdigits } from "../_util/strings.js";
5
- import { weightedSum } from "../_checksums/weighted-sum.js";
6
6
  //#region src/pl/nip.ts
7
- /**
8
- * NIP (Numer Identyfikacji Podatkowej).
9
- *
10
- * Polish VAT number. 10 digits with a weighted
11
- * checksum. The last digit is the check digit.
12
- *
13
- * @see https://www.biznes.gov.pl/en/portal/004124
14
- * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/poland-tin.pdf
15
- */
16
7
  const WEIGHTS = [
17
8
  6,
18
9
  5,
@@ -62,6 +53,7 @@ const nip = {
62
53
  abbreviation: "NIP",
63
54
  aliases: ["NIP", "numer identyfikacji podatkowej"],
64
55
  candidatePattern: "\\d{3}-?\\d{3}-?\\d{2}-?\\d{2}",
56
+ scope: "country",
65
57
  country: "PL",
66
58
  entityType: "company",
67
59
  sourceUrl: "https://www.biznes.gov.pl/en/portal/004124",
@@ -1 +1 @@
1
- {"version":3,"file":"nip.js","names":[],"sources":["../../src/pl/nip.ts"],"sourcesContent":["/**\n * NIP (Numer Identyfikacji Podatkowej).\n *\n * Polish VAT number. 10 digits with a weighted\n * checksum. The last digit is the check digit.\n *\n * @see https://www.biznes.gov.pl/en/portal/004124\n * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/poland-tin.pdf\n */\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst WEIGHTS = [6, 5, 7, 2, 3, 4, 5, 6, 7] as const;\n\nconst compact = (value: string): string => {\n const v = clean(value, \" -\");\n if (v.startsWith(\"PL\") || v.startsWith(\"pl\")) {\n return v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"NIP must be exactly 10 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"NIP must contain only digits\",\n );\n }\n const sum = weightedSum(v.slice(0, 9), WEIGHTS, 11);\n // If remainder is 10, no valid check digit exists\n if (sum >= 10 || sum !== Number(v[9])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"NIP check digit does not match\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `PL${compact(value)}`;\n\nconst MAX_GENERATE_ATTEMPTS = 100;\n\n/**\n * Generate a random valid NIP. Retries if the\n * weighted sum mod 11 yields 10 (no valid check\n * digit for that payload).\n */\nconst generate = (): string => {\n for (let i = 0; i < MAX_GENERATE_ATTEMPTS; i++) {\n const payload = randomDigits(9);\n const sum = weightedSum(payload, WEIGHTS, 11);\n if (sum < 10) {\n return `${payload}${String(sum)}`;\n }\n }\n throw new Error(\"Failed to generate valid NIP\");\n};\n\n/** Polish VAT Number. */\nconst nip: Validator = {\n name: \"Polish VAT Number\",\n localName: \"Numer Identyfikacji Podatkowej\",\n abbreviation: \"NIP\",\n aliases: [\n \"NIP\",\n \"numer identyfikacji podatkowej\",\n ] as const,\n candidatePattern: \"\\\\d{3}-?\\\\d{3}-?\\\\d{2}-?\\\\d{2}\",\n country: \"PL\",\n entityType: \"company\",\n sourceUrl: \"https://www.biznes.gov.pl/en/portal/004124\",\n examples: [\"2234567895\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nip;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAE3C,MAAM,WAAW,UAA0B;CACzC,MAAM,IAAI,MAAM,OAAO,KAAK;AAC5B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,QAAO,EAAE,MAAM,EAAE;AAEnB,QAAO;;AAGT,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,gCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;CAEH,MAAM,MAAM,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,SAAS,GAAG;AAEnD,KAAI,OAAO,MAAM,QAAQ,OAAO,EAAE,GAAG,CACnC,QAAO,IACL,oBACA,iCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UACd,KAAK,QAAQ,MAAM;AAErB,MAAM,wBAAwB;;;;;;AAO9B,MAAM,iBAAyB;AAC7B,MAAK,IAAI,IAAI,GAAG,IAAI,uBAAuB,KAAK;EAC9C,MAAM,UAAU,aAAa,EAAE;EAC/B,MAAM,MAAM,YAAY,SAAS,SAAS,GAAG;AAC7C,MAAI,MAAM,GACR,QAAO,GAAG,UAAU,OAAO,IAAI;;AAGnC,OAAM,IAAI,MAAM,+BAA+B;;;AAIjD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CACP,OACA,iCACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,aAAa;CACxB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"nip.js","names":[],"sources":["../../src/pl/nip.ts"],"sourcesContent":["/**\n * NIP (Numer Identyfikacji Podatkowej).\n *\n * Polish VAT number. 10 digits with a weighted\n * checksum. The last digit is the check digit.\n *\n * @see https://www.biznes.gov.pl/en/portal/004124\n * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/poland-tin.pdf\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [6, 5, 7, 2, 3, 4, 5, 6, 7] as const;\n\nconst compact = (value: string): string => {\n const v = clean(value, \" -\");\n if (v.startsWith(\"PL\") || v.startsWith(\"pl\")) {\n return v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"NIP must be exactly 10 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"NIP must contain only digits\",\n );\n }\n const sum = weightedSum(v.slice(0, 9), WEIGHTS, 11);\n // If remainder is 10, no valid check digit exists\n if (sum >= 10 || sum !== Number(v[9])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"NIP check digit does not match\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `PL${compact(value)}`;\n\nconst MAX_GENERATE_ATTEMPTS = 100;\n\n/**\n * Generate a random valid NIP. Retries if the\n * weighted sum mod 11 yields 10 (no valid check\n * digit for that payload).\n */\nconst generate = (): string => {\n for (let i = 0; i < MAX_GENERATE_ATTEMPTS; i++) {\n const payload = randomDigits(9);\n const sum = weightedSum(payload, WEIGHTS, 11);\n if (sum < 10) {\n return `${payload}${String(sum)}`;\n }\n }\n throw new Error(\"Failed to generate valid NIP\");\n};\n\n/** Polish VAT Number. */\nconst nip: CountryValidator<\"PL\"> = {\n name: \"Polish VAT Number\",\n localName: \"Numer Identyfikacji Podatkowej\",\n abbreviation: \"NIP\",\n aliases: [\n \"NIP\",\n \"numer identyfikacji podatkowej\",\n ] as const,\n candidatePattern: \"\\\\d{3}-?\\\\d{3}-?\\\\d{2}-?\\\\d{2}\",\n scope: \"country\",\n country: \"PL\",\n entityType: \"company\",\n sourceUrl: \"https://www.biznes.gov.pl/en/portal/004124\",\n examples: [\"2234567895\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nip;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;AAqBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAE1C,MAAM,WAAW,UAA0B;CACzC,MAAM,IAAI,MAAM,OAAO,IAAI;CAC3B,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,OAAO,EAAE,MAAM,CAAC;CAElB,OAAO;AACT;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,+BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAEF,MAAM,MAAM,YAAY,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,EAAE;CAElD,IAAI,OAAO,MAAM,QAAQ,OAAO,EAAE,EAAE,GAClC,OAAO,IACL,oBACA,gCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UACd,KAAK,QAAQ,KAAK;AAEpB,MAAM,wBAAwB;;;;;;AAO9B,MAAM,iBAAyB;CAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,uBAAuB,KAAK;EAC9C,MAAM,UAAU,aAAa,CAAC;EAC9B,MAAM,MAAM,YAAY,SAAS,SAAS,EAAE;EAC5C,IAAI,MAAM,IACR,OAAO,GAAG,UAAU,OAAO,GAAG;CAElC;CACA,MAAM,IAAI,MAAM,8BAA8B;AAChD;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CACP,OACA,gCACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,YAAY;CACvB;CACA;CACA;CACA;AACF"}
@@ -1,7 +1,6 @@
1
- import { ParsedPersonId, ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ParsedPersonId, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/pl/pesel.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
@@ -13,7 +12,7 @@ declare const parse: (value: string) => ParsedPersonId | null;
13
12
  /** Generate a random valid Polish PESEL. */
14
13
  declare const generate: () => string;
15
14
  /** Polish National Identification Number. */
16
- declare const pesel: Validator;
15
+ declare const pesel: CountryValidator<"PL", ParsedPersonId>;
17
16
  //#endregion
18
17
  export { compact, pesel as default, format, generate, parse, validate };
19
18
  //# sourceMappingURL=pesel.d.ts.map
package/dist/pl/pesel.js CHANGED
@@ -1,21 +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 { randomDigits, 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/pl/pesel.ts
8
- /**
9
- * PESEL (Powszechny Elektroniczny System
10
- * Ewidencji Ludności).
11
- *
12
- * Polish national identification number.
13
- * 11 digits encoding date of birth, serial
14
- * number, gender, and a check digit.
15
- *
16
- * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/poland-tin.pdf
17
- * @see https://www.gov.pl/web/cyfryzacja/numer-pesel
18
- */
19
8
  const WEIGHTS = [
20
9
  1,
21
10
  3,
@@ -94,12 +83,14 @@ const pesel = {
94
83
  abbreviation: "PESEL",
95
84
  aliases: ["PESEL"],
96
85
  candidatePattern: "\\d{11}",
86
+ scope: "country",
97
87
  country: "PL",
98
88
  entityType: "person",
99
89
  sourceUrl: "https://www.gov.pl/web/cyfryzacja/numer-pesel",
100
90
  examples: ["02070803628"],
101
91
  compact,
102
92
  format,
93
+ parse,
103
94
  validate,
104
95
  generate
105
96
  };
@@ -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 = {\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 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,QAAmB;CACvB,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;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,14 +1,13 @@
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
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid 9-digit Polish REGON. */
9
8
  declare const generate: () => string;
10
9
  /** Polish Statistical Identification Number. */
11
- declare const regon: Validator;
10
+ declare const regon: CountryValidator<"PL">;
12
11
  //#endregion
13
12
  export { compact, regon as default, format, generate, validate };
14
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,14 +1,13 @@
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
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid Portuguese CC number. */
9
8
  declare const generate: () => string;
10
9
  /** Portuguese Identity Card number. */
11
- declare const cc: Validator;
10
+ declare const cc: CountryValidator<"PT">;
12
11
  //#endregion
13
12
  export { compact, cc as default, format, generate, validate };
14
13
  //# sourceMappingURL=cc.d.ts.map
package/dist/pt/cc.js CHANGED
@@ -1,24 +1,17 @@
1
1
  import { clean } from "../_util/clean.js";
2
- import { randomDigits, randomInt } from "../_util/generate.js";
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();
17
8
  const calcCheckDigit = (value) => {
18
9
  let sum = 0;
19
10
  for (let i = value.length - 1; i >= 0; i--) {
11
+ const ch = value[i];
12
+ if (ch === void 0) continue;
20
13
  const pos = value.length - 1 - i;
21
- let n = ALPHABET.indexOf(value[i]);
14
+ let n = ALPHABET.indexOf(ch);
22
15
  if (pos % 2 === 0) {
23
16
  n *= 2;
24
17
  if (n > 9) n = Math.floor(n / 10) + n % 10;
@@ -44,8 +37,8 @@ const format = (value) => {
44
37
  /** Generate a random valid Portuguese CC number. */
45
38
  const generate = () => {
46
39
  const digits = randomDigits(9);
47
- const v0 = ALPHABET[randomInt(0, 35)];
48
- const v1 = ALPHABET[randomInt(0, 35)];
40
+ const v0 = randomChar(ALPHABET);
41
+ const v1 = randomChar(ALPHABET);
49
42
  const body = digits + v0 + v1;
50
43
  return body + calcCheckDigit(body);
51
44
  };
@@ -60,6 +53,7 @@ const cc = {
60
53
  "número de identificação civil"
61
54
  ],
62
55
  candidatePattern: "\\d{8}\\s?\\d\\s?[A-Z]{2}\\d",
56
+ scope: "country",
63
57
  country: "PT",
64
58
  entityType: "person",
65
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 { randomDigits, randomInt } 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 pos = value.length - 1 - i;\n let n = ALPHABET.indexOf(value[i]!);\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 = ALPHABET[randomInt(0, 35)]!;\n const v1 = ALPHABET[randomInt(0, 35)]!;\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,MAAM,MAAM,SAAS,IAAI;EAC/B,IAAI,IAAI,SAAS,QAAQ,MAAM,GAAI;AACnC,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,SAAS,UAAU,GAAG,GAAG;CACpC,MAAM,KAAK,SAAS,UAAU,GAAG,GAAG;CACpC,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/mod.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import cc from "./cc.js";
3
2
  import vat from "./vat.js";
4
3
 
5
4
  //#region src/pt/mod.d.ts
6
-
5
+ declare namespace mod_d_exports {
6
+ export { cc, vat };
7
+ }
7
8
  //#endregion
8
9
  export { cc, mod_d_exports, vat };
9
10
  //# sourceMappingURL=mod.d.ts.map
package/dist/pt/vat.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/pt/vat.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid Portuguese NIF. */
9
8
  declare const generate: () => string;
10
9
  /** Portuguese VAT Number. */
11
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"PT">;
12
11
  //#endregion
13
12
  export { compact, vat as default, format, generate, validate };
14
13
  //# sourceMappingURL=vat.d.ts.map