@stll/stdnum 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1130) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +323 -0
  3. package/dist/_checksums/luhn.d.ts +12 -0
  4. package/dist/_checksums/luhn.js +26 -0
  5. package/dist/_checksums/luhn.js.map +1 -0
  6. package/dist/_checksums/mod1110.d.ts +12 -0
  7. package/dist/_checksums/mod1110.js +25 -0
  8. package/dist/_checksums/mod1110.js.map +1 -0
  9. package/dist/_checksums/mod112.d.ts +24 -0
  10. package/dist/_checksums/mod112.js +53 -0
  11. package/dist/_checksums/mod112.js.map +1 -0
  12. package/dist/_checksums/mod97.d.ts +23 -0
  13. package/dist/_checksums/mod97.js +28 -0
  14. package/dist/_checksums/mod97.js.map +1 -0
  15. package/dist/_checksums/verhoeff.d.ts +22 -0
  16. package/dist/_checksums/verhoeff.js +271 -0
  17. package/dist/_checksums/verhoeff.js.map +1 -0
  18. package/dist/_checksums/weighted-sum.d.ts +13 -0
  19. package/dist/_checksums/weighted-sum.js +22 -0
  20. package/dist/_checksums/weighted-sum.js.map +1 -0
  21. package/dist/_util/arabic.d.ts +19 -0
  22. package/dist/_util/arabic.js +41 -0
  23. package/dist/_util/arabic.js.map +1 -0
  24. package/dist/_util/clean.d.ts +13 -0
  25. package/dist/_util/clean.js +71 -0
  26. package/dist/_util/clean.js.map +1 -0
  27. package/dist/_util/date.d.ts +12 -0
  28. package/dist/_util/date.js +19 -0
  29. package/dist/_util/date.js.map +1 -0
  30. package/dist/_util/generate.d.ts +16 -0
  31. package/dist/_util/generate.js +21 -0
  32. package/dist/_util/generate.js.map +1 -0
  33. package/dist/_util/result.d.ts +8 -0
  34. package/dist/_util/result.js +13 -0
  35. package/dist/_util/result.js.map +1 -0
  36. package/dist/_util/strings.d.ts +21 -0
  37. package/dist/_util/strings.js +28 -0
  38. package/dist/_util/strings.js.map +1 -0
  39. package/dist/_virtual/_rolldown/runtime.js +13 -0
  40. package/dist/ad/mod.d.ts +8 -0
  41. package/dist/ad/mod.js +8 -0
  42. package/dist/ad/mod.js.map +1 -0
  43. package/dist/ad/nrt.d.ts +13 -0
  44. package/dist/ad/nrt.js +69 -0
  45. package/dist/ad/nrt.js.map +1 -0
  46. package/dist/ae/eid.d.ts +17 -0
  47. package/dist/ae/eid.js +79 -0
  48. package/dist/ae/eid.js.map +1 -0
  49. package/dist/ae/mod.d.ts +8 -0
  50. package/dist/ae/mod.js +8 -0
  51. package/dist/ae/mod.js.map +1 -0
  52. package/dist/ai/mod.d.ts +8 -0
  53. package/dist/ai/mod.js +8 -0
  54. package/dist/ai/mod.js.map +1 -0
  55. package/dist/ai/tin.d.ts +19 -0
  56. package/dist/ai/tin.js +72 -0
  57. package/dist/ai/tin.js.map +1 -0
  58. package/dist/al/mod.d.ts +8 -0
  59. package/dist/al/mod.js +8 -0
  60. package/dist/al/mod.js.map +1 -0
  61. package/dist/al/nipt.d.ts +13 -0
  62. package/dist/al/nipt.js +56 -0
  63. package/dist/al/nipt.js.map +1 -0
  64. package/dist/am/mod.d.ts +8 -0
  65. package/dist/am/mod.js +8 -0
  66. package/dist/am/mod.js.map +1 -0
  67. package/dist/am/tin.d.ts +13 -0
  68. package/dist/am/tin.js +53 -0
  69. package/dist/am/tin.js.map +1 -0
  70. package/dist/ar/cbu.d.ts +14 -0
  71. package/dist/ar/cbu.js +88 -0
  72. package/dist/ar/cbu.js.map +1 -0
  73. package/dist/ar/cuit.d.ts +19 -0
  74. package/dist/ar/cuit.js +123 -0
  75. package/dist/ar/cuit.js.map +1 -0
  76. package/dist/ar/dni.d.ts +13 -0
  77. package/dist/ar/dni.js +57 -0
  78. package/dist/ar/dni.js.map +1 -0
  79. package/dist/ar/mod.d.ts +10 -0
  80. package/dist/ar/mod.js +14 -0
  81. package/dist/ar/mod.js.map +1 -0
  82. package/dist/at/businessid.d.ts +13 -0
  83. package/dist/at/businessid.js +56 -0
  84. package/dist/at/businessid.js.map +1 -0
  85. package/dist/at/mod.d.ts +11 -0
  86. package/dist/at/mod.js +16 -0
  87. package/dist/at/mod.js.map +1 -0
  88. package/dist/at/tin.d.ts +14 -0
  89. package/dist/at/tin.js +70 -0
  90. package/dist/at/tin.js.map +1 -0
  91. package/dist/at/uid.d.ts +14 -0
  92. package/dist/at/uid.js +64 -0
  93. package/dist/at/uid.js.map +1 -0
  94. package/dist/at/vnr.d.ts +12 -0
  95. package/dist/at/vnr.js +79 -0
  96. package/dist/at/vnr.js.map +1 -0
  97. package/dist/au/abn.d.ts +14 -0
  98. package/dist/au/abn.js +77 -0
  99. package/dist/au/abn.js.map +1 -0
  100. package/dist/au/acn.d.ts +14 -0
  101. package/dist/au/acn.js +70 -0
  102. package/dist/au/acn.js.map +1 -0
  103. package/dist/au/mod.d.ts +10 -0
  104. package/dist/au/mod.js +14 -0
  105. package/dist/au/mod.js.map +1 -0
  106. package/dist/au/tfn.d.ts +14 -0
  107. package/dist/au/tfn.js +71 -0
  108. package/dist/au/tfn.js.map +1 -0
  109. package/dist/az/mod.d.ts +8 -0
  110. package/dist/az/mod.js +8 -0
  111. package/dist/az/mod.js.map +1 -0
  112. package/dist/az/voen.d.ts +21 -0
  113. package/dist/az/voen.js +100 -0
  114. package/dist/az/voen.js.map +1 -0
  115. package/dist/ba/jmbg.d.ts +15 -0
  116. package/dist/ba/jmbg.js +97 -0
  117. package/dist/ba/jmbg.js.map +1 -0
  118. package/dist/ba/mod.d.ts +8 -0
  119. package/dist/ba/mod.js +8 -0
  120. package/dist/ba/mod.js.map +1 -0
  121. package/dist/bd/mod.d.ts +8 -0
  122. package/dist/bd/mod.js +8 -0
  123. package/dist/bd/mod.js.map +1 -0
  124. package/dist/bd/nid.d.ts +13 -0
  125. package/dist/bd/nid.js +116 -0
  126. package/dist/bd/nid.js.map +1 -0
  127. package/dist/be/bis.d.ts +14 -0
  128. package/dist/be/bis.js +65 -0
  129. package/dist/be/bis.js.map +1 -0
  130. package/dist/be/mod.d.ts +10 -0
  131. package/dist/be/mod.js +14 -0
  132. package/dist/be/mod.js.map +1 -0
  133. package/dist/be/nn.d.ts +21 -0
  134. package/dist/be/nn.js +84 -0
  135. package/dist/be/nn.js.map +1 -0
  136. package/dist/be/vat.d.ts +14 -0
  137. package/dist/be/vat.js +70 -0
  138. package/dist/be/vat.js.map +1 -0
  139. package/dist/bg/egn.d.ts +19 -0
  140. package/dist/bg/egn.js +122 -0
  141. package/dist/bg/egn.js.map +1 -0
  142. package/dist/bg/mod.d.ts +10 -0
  143. package/dist/bg/mod.js +14 -0
  144. package/dist/bg/mod.js.map +1 -0
  145. package/dist/bg/pnf.d.ts +14 -0
  146. package/dist/bg/pnf.js +70 -0
  147. package/dist/bg/pnf.js.map +1 -0
  148. package/dist/bg/vat.d.ts +14 -0
  149. package/dist/bg/vat.js +153 -0
  150. package/dist/bg/vat.js.map +1 -0
  151. package/dist/bh/cpr.d.ts +12 -0
  152. package/dist/bh/cpr.js +58 -0
  153. package/dist/bh/cpr.js.map +1 -0
  154. package/dist/bh/mod.d.ts +8 -0
  155. package/dist/bh/mod.js +8 -0
  156. package/dist/bh/mod.js.map +1 -0
  157. package/dist/bic.d.ts +13 -0
  158. package/dist/bic.js +72 -0
  159. package/dist/bic.js.map +1 -0
  160. package/dist/br/cnpj.d.ts +21 -0
  161. package/dist/br/cnpj.js +132 -0
  162. package/dist/br/cnpj.js.map +1 -0
  163. package/dist/br/cpf.d.ts +14 -0
  164. package/dist/br/cpf.js +83 -0
  165. package/dist/br/cpf.js.map +1 -0
  166. package/dist/br/mod.d.ts +9 -0
  167. package/dist/br/mod.js +12 -0
  168. package/dist/br/mod.js.map +1 -0
  169. package/dist/by/mod.d.ts +8 -0
  170. package/dist/by/mod.js +8 -0
  171. package/dist/by/mod.js.map +1 -0
  172. package/dist/by/unp.d.ts +14 -0
  173. package/dist/by/unp.js +114 -0
  174. package/dist/by/unp.js.map +1 -0
  175. package/dist/bz/mod.d.ts +8 -0
  176. package/dist/bz/mod.js +8 -0
  177. package/dist/bz/mod.js.map +1 -0
  178. package/dist/bz/tin.d.ts +16 -0
  179. package/dist/bz/tin.js +85 -0
  180. package/dist/bz/tin.js.map +1 -0
  181. package/dist/ca/bn.d.ts +14 -0
  182. package/dist/ca/bn.js +73 -0
  183. package/dist/ca/bn.js.map +1 -0
  184. package/dist/ca/mod.d.ts +9 -0
  185. package/dist/ca/mod.js +12 -0
  186. package/dist/ca/mod.js.map +1 -0
  187. package/dist/ca/sin.d.ts +14 -0
  188. package/dist/ca/sin.js +62 -0
  189. package/dist/ca/sin.js.map +1 -0
  190. package/dist/ch/mod.d.ts +10 -0
  191. package/dist/ch/mod.js +14 -0
  192. package/dist/ch/mod.js.map +1 -0
  193. package/dist/ch/ssn.d.ts +14 -0
  194. package/dist/ch/ssn.js +67 -0
  195. package/dist/ch/ssn.js.map +1 -0
  196. package/dist/ch/uid.d.ts +14 -0
  197. package/dist/ch/uid.js +81 -0
  198. package/dist/ch/uid.js.map +1 -0
  199. package/dist/ch/vat.d.ts +14 -0
  200. package/dist/ch/vat.js +70 -0
  201. package/dist/ch/vat.js.map +1 -0
  202. package/dist/cl/mod.d.ts +8 -0
  203. package/dist/cl/mod.js +8 -0
  204. package/dist/cl/mod.js.map +1 -0
  205. package/dist/cl/rut.d.ts +19 -0
  206. package/dist/cl/rut.js +95 -0
  207. package/dist/cl/rut.js.map +1 -0
  208. package/dist/cn/mod.d.ts +9 -0
  209. package/dist/cn/mod.js +12 -0
  210. package/dist/cn/mod.js.map +1 -0
  211. package/dist/cn/ric.d.ts +19 -0
  212. package/dist/cn/ric.js +108 -0
  213. package/dist/cn/ric.js.map +1 -0
  214. package/dist/cn/uscc.d.ts +14 -0
  215. package/dist/cn/uscc.js +88 -0
  216. package/dist/cn/uscc.js.map +1 -0
  217. package/dist/co/mod.d.ts +8 -0
  218. package/dist/co/mod.js +8 -0
  219. package/dist/co/mod.js.map +1 -0
  220. package/dist/co/nit.d.ts +14 -0
  221. package/dist/co/nit.js +109 -0
  222. package/dist/co/nit.js.map +1 -0
  223. package/dist/cr/cpf.d.ts +21 -0
  224. package/dist/cr/cpf.js +79 -0
  225. package/dist/cr/cpf.js.map +1 -0
  226. package/dist/cr/mod.d.ts +8 -0
  227. package/dist/cr/mod.js +8 -0
  228. package/dist/cr/mod.js.map +1 -0
  229. package/dist/creditcard.d.ts +25 -0
  230. package/dist/creditcard.js +121 -0
  231. package/dist/creditcard.js.map +1 -0
  232. package/dist/cu/mod.d.ts +8 -0
  233. package/dist/cu/mod.js +8 -0
  234. package/dist/cu/mod.js.map +1 -0
  235. package/dist/cu/ni.d.ts +21 -0
  236. package/dist/cu/ni.js +90 -0
  237. package/dist/cu/ni.js.map +1 -0
  238. package/dist/cy/mod.d.ts +8 -0
  239. package/dist/cy/mod.js +8 -0
  240. package/dist/cy/mod.js.map +1 -0
  241. package/dist/cy/vat.d.ts +14 -0
  242. package/dist/cy/vat.js +88 -0
  243. package/dist/cy/vat.js.map +1 -0
  244. package/dist/cz/dic.d.ts +14 -0
  245. package/dist/cz/dic.js +97 -0
  246. package/dist/cz/dic.js.map +1 -0
  247. package/dist/cz/ico.d.ts +14 -0
  248. package/dist/cz/ico.js +70 -0
  249. package/dist/cz/ico.js.map +1 -0
  250. package/dist/cz/mod.d.ts +10 -0
  251. package/dist/cz/mod.js +14 -0
  252. package/dist/cz/mod.js.map +1 -0
  253. package/dist/cz/rc.d.ts +22 -0
  254. package/dist/cz/rc.js +116 -0
  255. package/dist/cz/rc.js.map +1 -0
  256. package/dist/de/handelsreg.d.ts +17 -0
  257. package/dist/de/handelsreg.js +86 -0
  258. package/dist/de/handelsreg.js.map +1 -0
  259. package/dist/de/idnr.d.ts +14 -0
  260. package/dist/de/idnr.js +102 -0
  261. package/dist/de/idnr.js.map +1 -0
  262. package/dist/de/mod.d.ts +12 -0
  263. package/dist/de/mod.js +18 -0
  264. package/dist/de/mod.js.map +1 -0
  265. package/dist/de/stnr.d.ts +22 -0
  266. package/dist/de/stnr.js +144 -0
  267. package/dist/de/stnr.js.map +1 -0
  268. package/dist/de/svnr.d.ts +14 -0
  269. package/dist/de/svnr.js +108 -0
  270. package/dist/de/svnr.js.map +1 -0
  271. package/dist/de/vat.d.ts +14 -0
  272. package/dist/de/vat.js +65 -0
  273. package/dist/de/vat.js.map +1 -0
  274. package/dist/dk/cpr.d.ts +17 -0
  275. package/dist/dk/cpr.js +81 -0
  276. package/dist/dk/cpr.js.map +1 -0
  277. package/dist/dk/cvr.d.ts +14 -0
  278. package/dist/dk/cvr.js +70 -0
  279. package/dist/dk/cvr.js.map +1 -0
  280. package/dist/dk/mod.d.ts +10 -0
  281. package/dist/dk/mod.js +14 -0
  282. package/dist/dk/mod.js.map +1 -0
  283. package/dist/dk/vat.d.ts +14 -0
  284. package/dist/dk/vat.js +72 -0
  285. package/dist/dk/vat.js.map +1 -0
  286. package/dist/do/mod.d.ts +8 -0
  287. package/dist/do/mod.js +8 -0
  288. package/dist/do/mod.js.map +1 -0
  289. package/dist/do/rnc.d.ts +18 -0
  290. package/dist/do/rnc.js +95 -0
  291. package/dist/do/rnc.js.map +1 -0
  292. package/dist/ec/mod.d.ts +8 -0
  293. package/dist/ec/mod.js +8 -0
  294. package/dist/ec/mod.js.map +1 -0
  295. package/dist/ec/ruc.d.ts +14 -0
  296. package/dist/ec/ruc.js +150 -0
  297. package/dist/ec/ruc.js.map +1 -0
  298. package/dist/ee/ik.d.ts +24 -0
  299. package/dist/ee/ik.js +131 -0
  300. package/dist/ee/ik.js.map +1 -0
  301. package/dist/ee/mod.d.ts +10 -0
  302. package/dist/ee/mod.js +14 -0
  303. package/dist/ee/mod.js.map +1 -0
  304. package/dist/ee/registrikood.d.ts +14 -0
  305. package/dist/ee/registrikood.js +63 -0
  306. package/dist/ee/registrikood.js.map +1 -0
  307. package/dist/ee/vat.d.ts +14 -0
  308. package/dist/ee/vat.js +69 -0
  309. package/dist/ee/vat.js.map +1 -0
  310. package/dist/eg/mod.d.ts +8 -0
  311. package/dist/eg/mod.js +8 -0
  312. package/dist/eg/mod.js.map +1 -0
  313. package/dist/eg/tn.d.ts +13 -0
  314. package/dist/eg/tn.js +81 -0
  315. package/dist/eg/tn.js.map +1 -0
  316. package/dist/es/cif.d.ts +14 -0
  317. package/dist/es/cif.js +66 -0
  318. package/dist/es/cif.js.map +1 -0
  319. package/dist/es/dni.d.ts +15 -0
  320. package/dist/es/dni.js +58 -0
  321. package/dist/es/dni.js.map +1 -0
  322. package/dist/es/mod.d.ts +12 -0
  323. package/dist/es/mod.js +18 -0
  324. package/dist/es/mod.js.map +1 -0
  325. package/dist/es/nie.d.ts +14 -0
  326. package/dist/es/nie.js +78 -0
  327. package/dist/es/nie.js.map +1 -0
  328. package/dist/es/nss.d.ts +14 -0
  329. package/dist/es/nss.js +72 -0
  330. package/dist/es/nss.js.map +1 -0
  331. package/dist/es/vat.d.ts +15 -0
  332. package/dist/es/vat.js +104 -0
  333. package/dist/es/vat.js.map +1 -0
  334. package/dist/eu/mod.d.ts +8 -0
  335. package/dist/eu/mod.js +8 -0
  336. package/dist/eu/mod.js.map +1 -0
  337. package/dist/eu/vat.d.ts +20 -0
  338. package/dist/eu/vat.js +145 -0
  339. package/dist/eu/vat.js.map +1 -0
  340. package/dist/fi/hetu.d.ts +17 -0
  341. package/dist/fi/hetu.js +107 -0
  342. package/dist/fi/hetu.js.map +1 -0
  343. package/dist/fi/mod.d.ts +10 -0
  344. package/dist/fi/mod.js +14 -0
  345. package/dist/fi/mod.js.map +1 -0
  346. package/dist/fi/vat.d.ts +14 -0
  347. package/dist/fi/vat.js +68 -0
  348. package/dist/fi/vat.js.map +1 -0
  349. package/dist/fi/ytunnus.d.ts +14 -0
  350. package/dist/fi/ytunnus.js +71 -0
  351. package/dist/fi/ytunnus.js.map +1 -0
  352. package/dist/fr/mod.d.ts +12 -0
  353. package/dist/fr/mod.js +18 -0
  354. package/dist/fr/mod.js.map +1 -0
  355. package/dist/fr/nif.d.ts +14 -0
  356. package/dist/fr/nif.js +64 -0
  357. package/dist/fr/nif.js.map +1 -0
  358. package/dist/fr/nir.d.ts +15 -0
  359. package/dist/fr/nir.js +106 -0
  360. package/dist/fr/nir.js.map +1 -0
  361. package/dist/fr/siren.d.ts +14 -0
  362. package/dist/fr/siren.js +56 -0
  363. package/dist/fr/siren.js.map +1 -0
  364. package/dist/fr/siret.d.ts +14 -0
  365. package/dist/fr/siret.js +73 -0
  366. package/dist/fr/siret.js.map +1 -0
  367. package/dist/fr/tva.d.ts +14 -0
  368. package/dist/fr/tva.js +80 -0
  369. package/dist/fr/tva.js.map +1 -0
  370. package/dist/gb/mod.d.ts +11 -0
  371. package/dist/gb/mod.js +16 -0
  372. package/dist/gb/mod.js.map +1 -0
  373. package/dist/gb/nino.d.ts +13 -0
  374. package/dist/gb/nino.js +103 -0
  375. package/dist/gb/nino.js.map +1 -0
  376. package/dist/gb/sedol.d.ts +15 -0
  377. package/dist/gb/sedol.js +85 -0
  378. package/dist/gb/sedol.js.map +1 -0
  379. package/dist/gb/utr.d.ts +14 -0
  380. package/dist/gb/utr.js +69 -0
  381. package/dist/gb/utr.js.map +1 -0
  382. package/dist/gb/vat.d.ts +14 -0
  383. package/dist/gb/vat.js +102 -0
  384. package/dist/gb/vat.js.map +1 -0
  385. package/dist/ge/mod.d.ts +8 -0
  386. package/dist/ge/mod.js +8 -0
  387. package/dist/ge/mod.js.map +1 -0
  388. package/dist/ge/pin.d.ts +13 -0
  389. package/dist/ge/pin.js +51 -0
  390. package/dist/ge/pin.js.map +1 -0
  391. package/dist/gh/mod.d.ts +8 -0
  392. package/dist/gh/mod.js +8 -0
  393. package/dist/gh/mod.js.map +1 -0
  394. package/dist/gh/tin.d.ts +14 -0
  395. package/dist/gh/tin.js +80 -0
  396. package/dist/gh/tin.js.map +1 -0
  397. package/dist/gr/amka.d.ts +14 -0
  398. package/dist/gr/amka.js +71 -0
  399. package/dist/gr/amka.js.map +1 -0
  400. package/dist/gr/mod.d.ts +9 -0
  401. package/dist/gr/mod.js +12 -0
  402. package/dist/gr/mod.js.map +1 -0
  403. package/dist/gr/vat.d.ts +14 -0
  404. package/dist/gr/vat.js +66 -0
  405. package/dist/gr/vat.js.map +1 -0
  406. package/dist/gt/mod.d.ts +8 -0
  407. package/dist/gt/mod.js +8 -0
  408. package/dist/gt/mod.js.map +1 -0
  409. package/dist/gt/nit.d.ts +21 -0
  410. package/dist/gt/nit.js +98 -0
  411. package/dist/gt/nit.js.map +1 -0
  412. package/dist/hk/hkid.d.ts +15 -0
  413. package/dist/hk/hkid.js +92 -0
  414. package/dist/hk/hkid.js.map +1 -0
  415. package/dist/hk/mod.d.ts +8 -0
  416. package/dist/hk/mod.js +8 -0
  417. package/dist/hk/mod.js.map +1 -0
  418. package/dist/hr/mod.d.ts +8 -0
  419. package/dist/hr/mod.js +8 -0
  420. package/dist/hr/mod.js.map +1 -0
  421. package/dist/hr/vat.d.ts +14 -0
  422. package/dist/hr/vat.js +55 -0
  423. package/dist/hr/vat.js.map +1 -0
  424. package/dist/hu/mod.d.ts +8 -0
  425. package/dist/hu/mod.js +8 -0
  426. package/dist/hu/mod.js.map +1 -0
  427. package/dist/hu/vat.d.ts +14 -0
  428. package/dist/hu/vat.js +68 -0
  429. package/dist/hu/vat.js.map +1 -0
  430. package/dist/iban.d.ts +16 -0
  431. package/dist/iban.js +282 -0
  432. package/dist/iban.js.map +1 -0
  433. package/dist/id/mod.d.ts +8 -0
  434. package/dist/id/mod.js +8 -0
  435. package/dist/id/mod.js.map +1 -0
  436. package/dist/id/npwp.d.ts +14 -0
  437. package/dist/id/npwp.js +133 -0
  438. package/dist/id/npwp.js.map +1 -0
  439. package/dist/ie/mod.d.ts +9 -0
  440. package/dist/ie/mod.js +12 -0
  441. package/dist/ie/mod.js.map +1 -0
  442. package/dist/ie/pps.d.ts +14 -0
  443. package/dist/ie/pps.js +69 -0
  444. package/dist/ie/pps.js.map +1 -0
  445. package/dist/ie/vat.d.ts +14 -0
  446. package/dist/ie/vat.js +83 -0
  447. package/dist/ie/vat.js.map +1 -0
  448. package/dist/il/idnr.d.ts +14 -0
  449. package/dist/il/idnr.js +61 -0
  450. package/dist/il/idnr.js.map +1 -0
  451. package/dist/il/mod.d.ts +8 -0
  452. package/dist/il/mod.js +8 -0
  453. package/dist/il/mod.js.map +1 -0
  454. package/dist/in/aadhaar.d.ts +14 -0
  455. package/dist/in/aadhaar.js +61 -0
  456. package/dist/in/aadhaar.js.map +1 -0
  457. package/dist/in/gstin.d.ts +14 -0
  458. package/dist/in/gstin.js +130 -0
  459. package/dist/in/gstin.js.map +1 -0
  460. package/dist/in/mod.d.ts +10 -0
  461. package/dist/in/mod.js +14 -0
  462. package/dist/in/mod.js.map +1 -0
  463. package/dist/in/pan.d.ts +13 -0
  464. package/dist/in/pan.js +58 -0
  465. package/dist/in/pan.js.map +1 -0
  466. package/dist/index.d.ts +105 -0
  467. package/dist/index.js +104 -0
  468. package/dist/iq/mod.d.ts +8 -0
  469. package/dist/iq/mod.js +8 -0
  470. package/dist/iq/mod.js.map +1 -0
  471. package/dist/iq/nid.d.ts +14 -0
  472. package/dist/iq/nid.js +56 -0
  473. package/dist/iq/nid.js.map +1 -0
  474. package/dist/ir/mod.d.ts +8 -0
  475. package/dist/ir/mod.js +8 -0
  476. package/dist/ir/mod.js.map +1 -0
  477. package/dist/ir/nid.d.ts +18 -0
  478. package/dist/ir/nid.js +90 -0
  479. package/dist/ir/nid.js.map +1 -0
  480. package/dist/is/kennitala.d.ts +14 -0
  481. package/dist/is/kennitala.js +92 -0
  482. package/dist/is/kennitala.js.map +1 -0
  483. package/dist/is/mod.d.ts +9 -0
  484. package/dist/is/mod.js +12 -0
  485. package/dist/is/mod.js.map +1 -0
  486. package/dist/is/vsk.d.ts +13 -0
  487. package/dist/is/vsk.js +47 -0
  488. package/dist/is/vsk.js.map +1 -0
  489. package/dist/isin.d.ts +14 -0
  490. package/dist/isin.js +85 -0
  491. package/dist/isin.js.map +1 -0
  492. package/dist/it/codicefiscale.d.ts +18 -0
  493. package/dist/it/codicefiscale.js +214 -0
  494. package/dist/it/codicefiscale.js.map +1 -0
  495. package/dist/it/iva.d.ts +14 -0
  496. package/dist/it/iva.js +71 -0
  497. package/dist/it/iva.js.map +1 -0
  498. package/dist/it/mod.d.ts +9 -0
  499. package/dist/it/mod.js +12 -0
  500. package/dist/it/mod.js.map +1 -0
  501. package/dist/jp/cn.d.ts +14 -0
  502. package/dist/jp/cn.js +68 -0
  503. package/dist/jp/cn.js.map +1 -0
  504. package/dist/jp/mod.d.ts +9 -0
  505. package/dist/jp/mod.js +12 -0
  506. package/dist/jp/mod.js.map +1 -0
  507. package/dist/jp/mynumber.d.ts +14 -0
  508. package/dist/jp/mynumber.js +86 -0
  509. package/dist/jp/mynumber.js.map +1 -0
  510. package/dist/kr/brn.d.ts +13 -0
  511. package/dist/kr/brn.js +67 -0
  512. package/dist/kr/brn.js.map +1 -0
  513. package/dist/kr/mod.d.ts +9 -0
  514. package/dist/kr/mod.js +12 -0
  515. package/dist/kr/mod.js.map +1 -0
  516. package/dist/kr/rrn.d.ts +22 -0
  517. package/dist/kr/rrn.js +133 -0
  518. package/dist/kr/rrn.js.map +1 -0
  519. package/dist/kw/civil.d.ts +18 -0
  520. package/dist/kw/civil.js +99 -0
  521. package/dist/kw/civil.js.map +1 -0
  522. package/dist/kw/mod.d.ts +8 -0
  523. package/dist/kw/mod.js +8 -0
  524. package/dist/kw/mod.js.map +1 -0
  525. package/dist/kz/iin.d.ts +23 -0
  526. package/dist/kz/iin.js +150 -0
  527. package/dist/kz/iin.js.map +1 -0
  528. package/dist/kz/mod.d.ts +8 -0
  529. package/dist/kz/mod.js +8 -0
  530. package/dist/kz/mod.js.map +1 -0
  531. package/dist/lei.d.ts +14 -0
  532. package/dist/lei.js +68 -0
  533. package/dist/lei.js.map +1 -0
  534. package/dist/li/mod.d.ts +8 -0
  535. package/dist/li/mod.js +8 -0
  536. package/dist/li/mod.js.map +1 -0
  537. package/dist/li/peid.d.ts +13 -0
  538. package/dist/li/peid.js +61 -0
  539. package/dist/li/peid.js.map +1 -0
  540. package/dist/lk/mod.d.ts +8 -0
  541. package/dist/lk/mod.js +8 -0
  542. package/dist/lk/mod.js.map +1 -0
  543. package/dist/lk/nic.d.ts +17 -0
  544. package/dist/lk/nic.js +139 -0
  545. package/dist/lk/nic.js.map +1 -0
  546. package/dist/lt/asmens.d.ts +14 -0
  547. package/dist/lt/asmens.js +81 -0
  548. package/dist/lt/asmens.js.map +1 -0
  549. package/dist/lt/mod.d.ts +9 -0
  550. package/dist/lt/mod.js +12 -0
  551. package/dist/lt/mod.js.map +1 -0
  552. package/dist/lt/vat.d.ts +14 -0
  553. package/dist/lt/vat.js +72 -0
  554. package/dist/lt/vat.js.map +1 -0
  555. package/dist/lu/mod.d.ts +8 -0
  556. package/dist/lu/mod.js +8 -0
  557. package/dist/lu/mod.js.map +1 -0
  558. package/dist/lu/vat.d.ts +14 -0
  559. package/dist/lu/vat.js +56 -0
  560. package/dist/lu/vat.js.map +1 -0
  561. package/dist/luhn.d.ts +17 -0
  562. package/dist/luhn.js +51 -0
  563. package/dist/luhn.js.map +1 -0
  564. package/dist/lv/mod.d.ts +8 -0
  565. package/dist/lv/mod.js +8 -0
  566. package/dist/lv/mod.js.map +1 -0
  567. package/dist/lv/vat.d.ts +14 -0
  568. package/dist/lv/vat.js +104 -0
  569. package/dist/lv/vat.js.map +1 -0
  570. package/dist/ma/ice.d.ts +14 -0
  571. package/dist/ma/ice.js +57 -0
  572. package/dist/ma/ice.js.map +1 -0
  573. package/dist/ma/mod.d.ts +8 -0
  574. package/dist/ma/mod.js +8 -0
  575. package/dist/ma/mod.js.map +1 -0
  576. package/dist/mc/mod.d.ts +8 -0
  577. package/dist/mc/mod.js +8 -0
  578. package/dist/mc/mod.js.map +1 -0
  579. package/dist/mc/tva.d.ts +14 -0
  580. package/dist/mc/tva.js +53 -0
  581. package/dist/mc/tva.js.map +1 -0
  582. package/dist/md/idno.d.ts +12 -0
  583. package/dist/md/idno.js +71 -0
  584. package/dist/md/idno.js.map +1 -0
  585. package/dist/md/mod.d.ts +8 -0
  586. package/dist/md/mod.js +8 -0
  587. package/dist/md/mod.js.map +1 -0
  588. package/dist/me/mod.d.ts +8 -0
  589. package/dist/me/mod.js +8 -0
  590. package/dist/me/mod.js.map +1 -0
  591. package/dist/me/pib.d.ts +14 -0
  592. package/dist/me/pib.js +63 -0
  593. package/dist/me/pib.js.map +1 -0
  594. package/dist/mk/edb.d.ts +14 -0
  595. package/dist/mk/edb.js +77 -0
  596. package/dist/mk/edb.js.map +1 -0
  597. package/dist/mk/mod.d.ts +8 -0
  598. package/dist/mk/mod.js +8 -0
  599. package/dist/mk/mod.js.map +1 -0
  600. package/dist/mt/mod.d.ts +8 -0
  601. package/dist/mt/mod.js +8 -0
  602. package/dist/mt/mod.js.map +1 -0
  603. package/dist/mt/vat.d.ts +14 -0
  604. package/dist/mt/vat.js +69 -0
  605. package/dist/mt/vat.js.map +1 -0
  606. package/dist/mu/brn.d.ts +13 -0
  607. package/dist/mu/brn.js +68 -0
  608. package/dist/mu/brn.js.map +1 -0
  609. package/dist/mu/mod.d.ts +8 -0
  610. package/dist/mu/mod.js +8 -0
  611. package/dist/mu/mod.js.map +1 -0
  612. package/dist/mx/clabe.d.ts +18 -0
  613. package/dist/mx/clabe.js +87 -0
  614. package/dist/mx/clabe.js.map +1 -0
  615. package/dist/mx/curp.d.ts +21 -0
  616. package/dist/mx/curp.js +140 -0
  617. package/dist/mx/curp.js.map +1 -0
  618. package/dist/mx/mod.d.ts +10 -0
  619. package/dist/mx/mod.js +14 -0
  620. package/dist/mx/mod.js.map +1 -0
  621. package/dist/mx/rfc.d.ts +16 -0
  622. package/dist/mx/rfc.js +92 -0
  623. package/dist/mx/rfc.js.map +1 -0
  624. package/dist/my/mod.d.ts +8 -0
  625. package/dist/my/mod.js +8 -0
  626. package/dist/my/mod.js.map +1 -0
  627. package/dist/my/nric.d.ts +17 -0
  628. package/dist/my/nric.js +186 -0
  629. package/dist/my/nric.js.map +1 -0
  630. package/dist/ng/mod.d.ts +8 -0
  631. package/dist/ng/mod.js +8 -0
  632. package/dist/ng/mod.js.map +1 -0
  633. package/dist/ng/nin.d.ts +13 -0
  634. package/dist/ng/nin.js +54 -0
  635. package/dist/ng/nin.js.map +1 -0
  636. package/dist/ni/mod.d.ts +8 -0
  637. package/dist/ni/mod.js +8 -0
  638. package/dist/ni/mod.js.map +1 -0
  639. package/dist/ni/ruc.d.ts +23 -0
  640. package/dist/ni/ruc.js +113 -0
  641. package/dist/ni/ruc.js.map +1 -0
  642. package/dist/nl/bsn.d.ts +14 -0
  643. package/dist/nl/bsn.js +70 -0
  644. package/dist/nl/bsn.js.map +1 -0
  645. package/dist/nl/kvk.d.ts +13 -0
  646. package/dist/nl/kvk.js +45 -0
  647. package/dist/nl/kvk.js.map +1 -0
  648. package/dist/nl/mod.d.ts +10 -0
  649. package/dist/nl/mod.js +14 -0
  650. package/dist/nl/mod.js.map +1 -0
  651. package/dist/nl/vat.d.ts +14 -0
  652. package/dist/nl/vat.js +94 -0
  653. package/dist/nl/vat.js.map +1 -0
  654. package/dist/no/fodselsnummer.d.ts +20 -0
  655. package/dist/no/fodselsnummer.js +134 -0
  656. package/dist/no/fodselsnummer.js.map +1 -0
  657. package/dist/no/mod.d.ts +10 -0
  658. package/dist/no/mod.js +14 -0
  659. package/dist/no/mod.js.map +1 -0
  660. package/dist/no/mva.d.ts +14 -0
  661. package/dist/no/mva.js +54 -0
  662. package/dist/no/mva.js.map +1 -0
  663. package/dist/no/orgnr.d.ts +14 -0
  664. package/dist/no/orgnr.js +66 -0
  665. package/dist/no/orgnr.js.map +1 -0
  666. package/dist/nz/ird.d.ts +14 -0
  667. package/dist/nz/ird.js +105 -0
  668. package/dist/nz/ird.js.map +1 -0
  669. package/dist/nz/mod.d.ts +8 -0
  670. package/dist/nz/mod.js +8 -0
  671. package/dist/nz/mod.js.map +1 -0
  672. package/dist/pa/mod.d.ts +8 -0
  673. package/dist/pa/mod.js +8 -0
  674. package/dist/pa/mod.js.map +1 -0
  675. package/dist/pa/ruc.d.ts +23 -0
  676. package/dist/pa/ruc.js +200 -0
  677. package/dist/pa/ruc.js.map +1 -0
  678. package/dist/patterns.d.ts +45 -0
  679. package/dist/patterns.js +123 -0
  680. package/dist/patterns.js.map +1 -0
  681. package/dist/pe/mod.d.ts +8 -0
  682. package/dist/pe/mod.js +8 -0
  683. package/dist/pe/mod.js.map +1 -0
  684. package/dist/pe/ruc.d.ts +19 -0
  685. package/dist/pe/ruc.js +109 -0
  686. package/dist/pe/ruc.js.map +1 -0
  687. package/dist/ph/mod.d.ts +8 -0
  688. package/dist/ph/mod.js +8 -0
  689. package/dist/ph/mod.js.map +1 -0
  690. package/dist/ph/philid.d.ts +13 -0
  691. package/dist/ph/philid.js +60 -0
  692. package/dist/ph/philid.js.map +1 -0
  693. package/dist/pk/cnic.d.ts +13 -0
  694. package/dist/pk/cnic.js +69 -0
  695. package/dist/pk/cnic.js.map +1 -0
  696. package/dist/pk/mod.d.ts +8 -0
  697. package/dist/pk/mod.js +8 -0
  698. package/dist/pk/mod.js.map +1 -0
  699. package/dist/pl/mod.d.ts +10 -0
  700. package/dist/pl/mod.js +14 -0
  701. package/dist/pl/mod.js.map +1 -0
  702. package/dist/pl/nip.d.ts +18 -0
  703. package/dist/pl/nip.js +77 -0
  704. package/dist/pl/nip.js.map +1 -0
  705. package/dist/pl/pesel.d.ts +19 -0
  706. package/dist/pl/pesel.js +109 -0
  707. package/dist/pl/pesel.js.map +1 -0
  708. package/dist/pl/regon.d.ts +14 -0
  709. package/dist/pl/regon.js +85 -0
  710. package/dist/pl/regon.js.map +1 -0
  711. package/dist/pt/cc.d.ts +14 -0
  712. package/dist/pt/cc.js +77 -0
  713. package/dist/pt/cc.js.map +1 -0
  714. package/dist/pt/mod.d.ts +9 -0
  715. package/dist/pt/mod.js +12 -0
  716. package/dist/pt/mod.js.map +1 -0
  717. package/dist/pt/vat.d.ts +14 -0
  718. package/dist/pt/vat.js +73 -0
  719. package/dist/pt/vat.js.map +1 -0
  720. package/dist/ro/cnp.d.ts +19 -0
  721. package/dist/ro/cnp.js +176 -0
  722. package/dist/ro/cnp.js.map +1 -0
  723. package/dist/ro/mod.d.ts +9 -0
  724. package/dist/ro/mod.js +12 -0
  725. package/dist/ro/mod.js.map +1 -0
  726. package/dist/ro/vat.d.ts +14 -0
  727. package/dist/ro/vat.js +76 -0
  728. package/dist/ro/vat.js.map +1 -0
  729. package/dist/rs/mod.d.ts +8 -0
  730. package/dist/rs/mod.js +8 -0
  731. package/dist/rs/mod.js.map +1 -0
  732. package/dist/rs/pib.d.ts +14 -0
  733. package/dist/rs/pib.js +60 -0
  734. package/dist/rs/pib.js.map +1 -0
  735. package/dist/ru/inn.d.ts +14 -0
  736. package/dist/ru/inn.js +103 -0
  737. package/dist/ru/inn.js.map +1 -0
  738. package/dist/ru/mod.d.ts +8 -0
  739. package/dist/ru/mod.js +8 -0
  740. package/dist/ru/mod.js.map +1 -0
  741. package/dist/se/mod.d.ts +10 -0
  742. package/dist/se/mod.js +14 -0
  743. package/dist/se/mod.js.map +1 -0
  744. package/dist/se/orgnr.d.ts +14 -0
  745. package/dist/se/orgnr.js +59 -0
  746. package/dist/se/orgnr.js.map +1 -0
  747. package/dist/se/personnummer.d.ts +23 -0
  748. package/dist/se/personnummer.js +122 -0
  749. package/dist/se/personnummer.js.map +1 -0
  750. package/dist/se/vat.d.ts +14 -0
  751. package/dist/se/vat.js +63 -0
  752. package/dist/se/vat.js.map +1 -0
  753. package/dist/sg/mod.d.ts +8 -0
  754. package/dist/sg/mod.js +8 -0
  755. package/dist/sg/mod.js.map +1 -0
  756. package/dist/sg/uen.d.ts +14 -0
  757. package/dist/sg/uen.js +207 -0
  758. package/dist/sg/uen.js.map +1 -0
  759. package/dist/si/emso.d.ts +19 -0
  760. package/dist/si/emso.js +108 -0
  761. package/dist/si/emso.js.map +1 -0
  762. package/dist/si/mod.d.ts +9 -0
  763. package/dist/si/mod.js +12 -0
  764. package/dist/si/mod.js.map +1 -0
  765. package/dist/si/vat.d.ts +14 -0
  766. package/dist/si/vat.js +74 -0
  767. package/dist/si/vat.js.map +1 -0
  768. package/dist/sk/dic.d.ts +14 -0
  769. package/dist/sk/dic.js +66 -0
  770. package/dist/sk/dic.js.map +1 -0
  771. package/dist/sk/ico.d.ts +10 -0
  772. package/dist/sk/ico.js +30 -0
  773. package/dist/sk/ico.js.map +1 -0
  774. package/dist/sk/mod.d.ts +10 -0
  775. package/dist/sk/mod.js +14 -0
  776. package/dist/sk/mod.js.map +1 -0
  777. package/dist/sk/rc.d.ts +10 -0
  778. package/dist/sk/rc.js +30 -0
  779. package/dist/sk/rc.js.map +1 -0
  780. package/dist/th/mod.d.ts +8 -0
  781. package/dist/th/mod.js +8 -0
  782. package/dist/th/mod.js.map +1 -0
  783. package/dist/th/tin.d.ts +14 -0
  784. package/dist/th/tin.js +63 -0
  785. package/dist/th/tin.js.map +1 -0
  786. package/dist/tr/mod.d.ts +9 -0
  787. package/dist/tr/mod.js +12 -0
  788. package/dist/tr/mod.js.map +1 -0
  789. package/dist/tr/tckimlik.d.ts +15 -0
  790. package/dist/tr/tckimlik.js +79 -0
  791. package/dist/tr/tckimlik.js.map +1 -0
  792. package/dist/tr/vkn.d.ts +15 -0
  793. package/dist/tr/vkn.js +79 -0
  794. package/dist/tr/vkn.js.map +1 -0
  795. package/dist/tw/mod.d.ts +8 -0
  796. package/dist/tw/mod.js +8 -0
  797. package/dist/tw/mod.js.map +1 -0
  798. package/dist/tw/ubn.d.ts +14 -0
  799. package/dist/tw/ubn.js +86 -0
  800. package/dist/tw/ubn.js.map +1 -0
  801. package/dist/types.d.ts +95 -0
  802. package/dist/types.js +1 -0
  803. package/dist/ua/edrpou.d.ts +14 -0
  804. package/dist/ua/edrpou.js +103 -0
  805. package/dist/ua/edrpou.js.map +1 -0
  806. package/dist/ua/mod.d.ts +8 -0
  807. package/dist/ua/mod.js +8 -0
  808. package/dist/ua/mod.js.map +1 -0
  809. package/dist/us/ein.d.ts +13 -0
  810. package/dist/us/ein.js +234 -0
  811. package/dist/us/ein.js.map +1 -0
  812. package/dist/us/itin.d.ts +15 -0
  813. package/dist/us/itin.js +69 -0
  814. package/dist/us/itin.js.map +1 -0
  815. package/dist/us/mod.d.ts +11 -0
  816. package/dist/us/mod.js +16 -0
  817. package/dist/us/mod.js.map +1 -0
  818. package/dist/us/rtn.d.ts +14 -0
  819. package/dist/us/rtn.js +91 -0
  820. package/dist/us/rtn.js.map +1 -0
  821. package/dist/us/ssn.d.ts +13 -0
  822. package/dist/us/ssn.js +77 -0
  823. package/dist/us/ssn.js.map +1 -0
  824. package/dist/uy/mod.d.ts +8 -0
  825. package/dist/uy/mod.js +8 -0
  826. package/dist/uy/mod.js.map +1 -0
  827. package/dist/uy/rut.d.ts +18 -0
  828. package/dist/uy/rut.js +105 -0
  829. package/dist/uy/rut.js.map +1 -0
  830. package/dist/ve/mod.d.ts +8 -0
  831. package/dist/ve/mod.js +8 -0
  832. package/dist/ve/mod.js.map +1 -0
  833. package/dist/ve/rif.d.ts +18 -0
  834. package/dist/ve/rif.js +109 -0
  835. package/dist/ve/rif.js.map +1 -0
  836. package/dist/vn/mod.d.ts +8 -0
  837. package/dist/vn/mod.js +8 -0
  838. package/dist/vn/mod.js.map +1 -0
  839. package/dist/vn/mst.d.ts +14 -0
  840. package/dist/vn/mst.js +82 -0
  841. package/dist/vn/mst.js.map +1 -0
  842. package/dist/za/idnr.d.ts +19 -0
  843. package/dist/za/idnr.js +110 -0
  844. package/dist/za/idnr.js.map +1 -0
  845. package/dist/za/mod.d.ts +8 -0
  846. package/dist/za/mod.js +8 -0
  847. package/dist/za/mod.js.map +1 -0
  848. package/package.json +936 -0
  849. package/src/_checksums/luhn.ts +24 -0
  850. package/src/_checksums/mod1110.ts +24 -0
  851. package/src/_checksums/mod112.ts +40 -0
  852. package/src/_checksums/mod97.ts +28 -0
  853. package/src/_checksums/verhoeff.ts +71 -0
  854. package/src/_checksums/weighted-sum.ts +23 -0
  855. package/src/_util/arabic.ts +48 -0
  856. package/src/_util/clean.ts +86 -0
  857. package/src/_util/date.ts +23 -0
  858. package/src/_util/generate.ts +24 -0
  859. package/src/_util/result.ts +10 -0
  860. package/src/_util/strings.ts +32 -0
  861. package/src/ad/mod.ts +1 -0
  862. package/src/ad/nrt.ts +111 -0
  863. package/src/ae/eid.ts +106 -0
  864. package/src/ae/mod.ts +1 -0
  865. package/src/ai/mod.ts +1 -0
  866. package/src/ai/tin.ts +98 -0
  867. package/src/al/mod.ts +1 -0
  868. package/src/al/nipt.ts +78 -0
  869. package/src/am/mod.ts +1 -0
  870. package/src/am/tin.ts +73 -0
  871. package/src/ar/cbu.ts +106 -0
  872. package/src/ar/cuit.ts +137 -0
  873. package/src/ar/dni.ts +79 -0
  874. package/src/ar/mod.ts +3 -0
  875. package/src/at/businessid.ts +74 -0
  876. package/src/at/mod.ts +4 -0
  877. package/src/at/tin.ts +90 -0
  878. package/src/at/uid.ts +92 -0
  879. package/src/at/vnr.ts +111 -0
  880. package/src/au/abn.ts +85 -0
  881. package/src/au/acn.ts +86 -0
  882. package/src/au/mod.ts +3 -0
  883. package/src/au/tfn.ts +85 -0
  884. package/src/az/mod.ts +1 -0
  885. package/src/az/voen.ts +125 -0
  886. package/src/ba/jmbg.ts +128 -0
  887. package/src/ba/mod.ts +1 -0
  888. package/src/bd/mod.ts +1 -0
  889. package/src/bd/nid.ts +139 -0
  890. package/src/be/bis.ts +105 -0
  891. package/src/be/mod.ts +3 -0
  892. package/src/be/nn.ts +125 -0
  893. package/src/be/vat.ts +107 -0
  894. package/src/bg/egn.ts +155 -0
  895. package/src/bg/mod.ts +3 -0
  896. package/src/bg/pnf.ts +86 -0
  897. package/src/bg/vat.ts +155 -0
  898. package/src/bh/cpr.ts +81 -0
  899. package/src/bh/mod.ts +1 -0
  900. package/src/bic.ts +99 -0
  901. package/src/br/cnpj.ts +152 -0
  902. package/src/br/cpf.ts +114 -0
  903. package/src/br/mod.ts +2 -0
  904. package/src/by/mod.ts +1 -0
  905. package/src/by/unp.ts +153 -0
  906. package/src/bz/mod.ts +1 -0
  907. package/src/bz/tin.ts +107 -0
  908. package/src/ca/bn.ts +107 -0
  909. package/src/ca/mod.ts +2 -0
  910. package/src/ca/sin.ts +91 -0
  911. package/src/ch/mod.ts +3 -0
  912. package/src/ch/ssn.ts +95 -0
  913. package/src/ch/uid.ts +108 -0
  914. package/src/ch/vat.ts +85 -0
  915. package/src/cl/mod.ts +1 -0
  916. package/src/cl/rut.ts +118 -0
  917. package/src/cn/mod.ts +2 -0
  918. package/src/cn/ric.ts +180 -0
  919. package/src/cn/uscc.ts +111 -0
  920. package/src/co/mod.ts +1 -0
  921. package/src/co/nit.ts +108 -0
  922. package/src/cr/cpf.ts +111 -0
  923. package/src/cr/mod.ts +1 -0
  924. package/src/creditcard.ts +190 -0
  925. package/src/cu/mod.ts +1 -0
  926. package/src/cu/ni.ts +125 -0
  927. package/src/cy/mod.ts +1 -0
  928. package/src/cy/vat.ts +130 -0
  929. package/src/cz/dic.ts +135 -0
  930. package/src/cz/ico.ts +82 -0
  931. package/src/cz/mod.ts +3 -0
  932. package/src/cz/rc.ts +190 -0
  933. package/src/de/handelsreg.ts +107 -0
  934. package/src/de/idnr.ts +140 -0
  935. package/src/de/mod.ts +5 -0
  936. package/src/de/stnr.ts +214 -0
  937. package/src/de/svnr.ts +162 -0
  938. package/src/de/vat.ts +98 -0
  939. package/src/dk/cpr.ts +122 -0
  940. package/src/dk/cvr.ts +87 -0
  941. package/src/dk/mod.ts +3 -0
  942. package/src/dk/vat.ts +91 -0
  943. package/src/do/mod.ts +1 -0
  944. package/src/do/rnc.ts +126 -0
  945. package/src/ec/mod.ts +1 -0
  946. package/src/ec/ruc.ts +195 -0
  947. package/src/ee/ik.ts +156 -0
  948. package/src/ee/mod.ts +3 -0
  949. package/src/ee/registrikood.ts +81 -0
  950. package/src/ee/vat.ts +85 -0
  951. package/src/eg/mod.ts +1 -0
  952. package/src/eg/tn.ts +103 -0
  953. package/src/es/cif.ts +105 -0
  954. package/src/es/dni.ts +90 -0
  955. package/src/es/mod.ts +5 -0
  956. package/src/es/nie.ts +102 -0
  957. package/src/es/nss.ts +109 -0
  958. package/src/es/vat.ts +178 -0
  959. package/src/eu/mod.ts +1 -0
  960. package/src/eu/vat.ts +171 -0
  961. package/src/fi/hetu.ts +182 -0
  962. package/src/fi/mod.ts +3 -0
  963. package/src/fi/vat.ts +82 -0
  964. package/src/fi/ytunnus.ts +83 -0
  965. package/src/fr/mod.ts +5 -0
  966. package/src/fr/nif.ts +93 -0
  967. package/src/fr/nir.ts +195 -0
  968. package/src/fr/siren.ts +79 -0
  969. package/src/fr/siret.ts +122 -0
  970. package/src/fr/tva.ts +146 -0
  971. package/src/gb/mod.ts +4 -0
  972. package/src/gb/nino.ts +153 -0
  973. package/src/gb/sedol.ts +137 -0
  974. package/src/gb/utr.ts +81 -0
  975. package/src/gb/vat.ts +158 -0
  976. package/src/ge/mod.ts +1 -0
  977. package/src/ge/pin.ts +71 -0
  978. package/src/gh/mod.ts +1 -0
  979. package/src/gh/tin.ts +100 -0
  980. package/src/gr/amka.ts +104 -0
  981. package/src/gr/mod.ts +2 -0
  982. package/src/gr/vat.ts +96 -0
  983. package/src/gt/mod.ts +1 -0
  984. package/src/gt/nit.ts +116 -0
  985. package/src/hk/hkid.ts +131 -0
  986. package/src/hk/mod.ts +1 -0
  987. package/src/hr/mod.ts +1 -0
  988. package/src/hr/vat.ts +79 -0
  989. package/src/hu/mod.ts +1 -0
  990. package/src/hu/vat.ts +82 -0
  991. package/src/iban.ts +340 -0
  992. package/src/id/mod.ts +1 -0
  993. package/src/id/npwp.ts +187 -0
  994. package/src/ie/mod.ts +2 -0
  995. package/src/ie/pps.ts +105 -0
  996. package/src/ie/vat.ts +138 -0
  997. package/src/il/idnr.ts +87 -0
  998. package/src/il/mod.ts +1 -0
  999. package/src/in/aadhaar.ts +96 -0
  1000. package/src/in/gstin.ts +169 -0
  1001. package/src/in/mod.ts +3 -0
  1002. package/src/in/pan.ts +88 -0
  1003. package/src/index.ts +116 -0
  1004. package/src/iq/mod.ts +1 -0
  1005. package/src/iq/nid.ts +71 -0
  1006. package/src/ir/mod.ts +1 -0
  1007. package/src/ir/nid.ts +120 -0
  1008. package/src/is/kennitala.ts +125 -0
  1009. package/src/is/mod.ts +2 -0
  1010. package/src/is/vsk.ts +63 -0
  1011. package/src/isin.ts +114 -0
  1012. package/src/it/codicefiscale.ts +290 -0
  1013. package/src/it/iva.ts +115 -0
  1014. package/src/it/mod.ts +2 -0
  1015. package/src/jp/cn.ts +91 -0
  1016. package/src/jp/mod.ts +2 -0
  1017. package/src/jp/mynumber.ts +103 -0
  1018. package/src/kr/brn.ts +101 -0
  1019. package/src/kr/mod.ts +2 -0
  1020. package/src/kr/rrn.ts +170 -0
  1021. package/src/kw/civil.ts +144 -0
  1022. package/src/kw/mod.ts +1 -0
  1023. package/src/kz/iin.ts +183 -0
  1024. package/src/kz/mod.ts +1 -0
  1025. package/src/lei.ts +98 -0
  1026. package/src/li/mod.ts +1 -0
  1027. package/src/li/peid.ts +66 -0
  1028. package/src/lk/mod.ts +1 -0
  1029. package/src/lk/nic.ts +210 -0
  1030. package/src/lt/asmens.ts +120 -0
  1031. package/src/lt/mod.ts +2 -0
  1032. package/src/lt/vat.ts +109 -0
  1033. package/src/lu/mod.ts +1 -0
  1034. package/src/lu/vat.ts +80 -0
  1035. package/src/luhn.ts +72 -0
  1036. package/src/lv/mod.ts +1 -0
  1037. package/src/lv/vat.ts +139 -0
  1038. package/src/ma/ice.ts +79 -0
  1039. package/src/ma/mod.ts +1 -0
  1040. package/src/mc/mod.ts +1 -0
  1041. package/src/mc/tva.ts +74 -0
  1042. package/src/md/idno.ts +86 -0
  1043. package/src/md/mod.ts +1 -0
  1044. package/src/me/mod.ts +1 -0
  1045. package/src/me/pib.ts +79 -0
  1046. package/src/mk/edb.ts +91 -0
  1047. package/src/mk/mod.ts +1 -0
  1048. package/src/mt/mod.ts +1 -0
  1049. package/src/mt/vat.ts +88 -0
  1050. package/src/mu/brn.ts +102 -0
  1051. package/src/mu/mod.ts +1 -0
  1052. package/src/mx/clabe.ts +111 -0
  1053. package/src/mx/curp.ts +210 -0
  1054. package/src/mx/mod.ts +3 -0
  1055. package/src/mx/rfc.ts +144 -0
  1056. package/src/my/mod.ts +1 -0
  1057. package/src/my/nric.ts +235 -0
  1058. package/src/ng/mod.ts +1 -0
  1059. package/src/ng/nin.ts +72 -0
  1060. package/src/ni/mod.ts +1 -0
  1061. package/src/ni/ruc.ts +176 -0
  1062. package/src/nl/bsn.ts +87 -0
  1063. package/src/nl/kvk.ts +59 -0
  1064. package/src/nl/mod.ts +3 -0
  1065. package/src/nl/vat.ts +146 -0
  1066. package/src/no/fodselsnummer.ts +192 -0
  1067. package/src/no/mod.ts +3 -0
  1068. package/src/no/mva.ts +73 -0
  1069. package/src/no/orgnr.ts +79 -0
  1070. package/src/nz/ird.ts +128 -0
  1071. package/src/nz/mod.ts +1 -0
  1072. package/src/pa/mod.ts +1 -0
  1073. package/src/pa/ruc.ts +359 -0
  1074. package/src/patterns.ts +252 -0
  1075. package/src/pe/mod.ts +1 -0
  1076. package/src/pe/ruc.ts +121 -0
  1077. package/src/ph/mod.ts +1 -0
  1078. package/src/ph/philid.ts +76 -0
  1079. package/src/pk/cnic.ts +103 -0
  1080. package/src/pk/mod.ts +1 -0
  1081. package/src/pl/mod.ts +3 -0
  1082. package/src/pl/nip.ts +96 -0
  1083. package/src/pl/pesel.ts +153 -0
  1084. package/src/pl/regon.ts +98 -0
  1085. package/src/pt/cc.ts +106 -0
  1086. package/src/pt/mod.ts +2 -0
  1087. package/src/pt/vat.ts +93 -0
  1088. package/src/ro/cnp.ts +171 -0
  1089. package/src/ro/mod.ts +2 -0
  1090. package/src/ro/vat.ts +94 -0
  1091. package/src/rs/mod.ts +1 -0
  1092. package/src/rs/pib.ts +83 -0
  1093. package/src/ru/inn.ts +109 -0
  1094. package/src/ru/mod.ts +1 -0
  1095. package/src/se/mod.ts +3 -0
  1096. package/src/se/orgnr.ts +81 -0
  1097. package/src/se/personnummer.ts +180 -0
  1098. package/src/se/vat.ts +92 -0
  1099. package/src/sg/mod.ts +1 -0
  1100. package/src/sg/uen.ts +267 -0
  1101. package/src/si/emso.ts +152 -0
  1102. package/src/si/mod.ts +2 -0
  1103. package/src/si/vat.ts +108 -0
  1104. package/src/sk/dic.ts +106 -0
  1105. package/src/sk/ico.ts +39 -0
  1106. package/src/sk/mod.ts +3 -0
  1107. package/src/sk/rc.ts +31 -0
  1108. package/src/th/mod.ts +1 -0
  1109. package/src/th/tin.ts +102 -0
  1110. package/src/tr/mod.ts +2 -0
  1111. package/src/tr/tckimlik.ts +111 -0
  1112. package/src/tr/vkn.ts +97 -0
  1113. package/src/tw/mod.ts +1 -0
  1114. package/src/tw/ubn.ts +108 -0
  1115. package/src/types.ts +200 -0
  1116. package/src/ua/edrpou.ts +103 -0
  1117. package/src/ua/mod.ts +1 -0
  1118. package/src/us/ein.ts +257 -0
  1119. package/src/us/itin.ts +126 -0
  1120. package/src/us/mod.ts +4 -0
  1121. package/src/us/rtn.ts +126 -0
  1122. package/src/us/ssn.ts +117 -0
  1123. package/src/uy/mod.ts +1 -0
  1124. package/src/uy/rut.ts +146 -0
  1125. package/src/ve/mod.ts +1 -0
  1126. package/src/ve/rif.ts +140 -0
  1127. package/src/vn/mod.ts +1 -0
  1128. package/src/vn/mst.ts +128 -0
  1129. package/src/za/idnr.ts +157 -0
  1130. package/src/za/mod.ts +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruc.js","names":[],"sources":["../../src/pa/ruc.ts"],"sourcesContent":["/**\n * RUC (Registro Único de Contribuyente, Panama\n * tax number).\n *\n * The RUC identifies taxpayers in Panama. It comes\n * in several formats depending on entity type\n * (natural person, legal entity, foreigner, etc.)\n * and is always accompanied by a two-digit check\n * code called the \"dígito verificador\" (DV).\n *\n * The DV is computed by encoding the hyphen-separated\n * RUC into a 20-position numeric buffer, then applying\n * a double weighted-sum mod 11 algorithm. The encoding\n * and legacy-format handling follow the official ANIP/DGI\n * specification.\n *\n * @see https://dgi.mef.gob.pa/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\n/**\n * Legacy cross-reference table: maps two-digit codes\n * at positions 5–6 of old-format juridical RUCs.\n */\nconst LEGACY_MAP: Record<string, string> = {\n \"00\": \"00\",\n \"10\": \"01\",\n \"11\": \"02\",\n \"12\": \"03\",\n \"13\": \"04\",\n \"14\": \"05\",\n \"15\": \"06\",\n \"16\": \"07\",\n \"17\": \"08\",\n \"18\": \"09\",\n \"19\": \"01\",\n \"20\": \"02\",\n \"21\": \"03\",\n \"22\": \"04\",\n \"23\": \"07\",\n \"24\": \"08\",\n \"25\": \"09\",\n \"26\": \"02\",\n \"27\": \"03\",\n \"28\": \"04\",\n \"29\": \"05\",\n \"30\": \"06\",\n \"31\": \"07\",\n \"32\": \"08\",\n \"33\": \"09\",\n \"34\": \"01\",\n \"35\": \"02\",\n \"36\": \"03\",\n \"37\": \"04\",\n \"38\": \"05\",\n \"39\": \"06\",\n \"40\": \"07\",\n \"41\": \"08\",\n \"42\": \"09\",\n \"43\": \"01\",\n \"44\": \"02\",\n \"45\": \"03\",\n \"46\": \"04\",\n \"47\": \"05\",\n \"48\": \"06\",\n \"49\": \"07\",\n};\n\n/** Prepend n leading zeros. */\nconst z = (n: number): string => \"0\".repeat(Math.max(0, n));\n\n/**\n * Compute a single DV digit via weighted sum mod 11.\n * Weights start at 2 and increment, applied\n * right-to-left. For old-format juridical RUCs,\n * weight 12 is skipped (jumps from 11 to 13).\n */\nconst digitDV = (\n buf: string,\n isOldFormat: boolean,\n): number => {\n let weight = 2;\n let sum = 0;\n for (let i = buf.length - 1; i >= 0; i--) {\n if (isOldFormat && weight === 12) {\n weight += 1; // skip 12, continue from 13\n }\n sum += weight * (buf.charCodeAt(i) - 48);\n weight += 1;\n }\n const r = sum % 11;\n return r > 1 ? 11 - r : 0;\n};\n\n/**\n * Encode the RUC segments into a numeric buffer\n * according to entity type, then compute the two\n * DV digits.\n *\n * Returns the two-digit DV string, or null if the\n * format is unrecognized.\n */\nconst computeDV = (\n segments: readonly string[],\n raw: string,\n): string | null => {\n const len = segments.length;\n\n if (\n len < 3 ||\n len > 4 ||\n (len === 4 && segments[1] !== \"NT\")\n ) {\n return null;\n }\n\n let buf: string;\n let isOld = false;\n\n const s0 = segments[0]!;\n const s1 = segments[1]!;\n const s2 = segments[2]!;\n\n if (raw[0] === \"E\") {\n // Foreign person (E-xxx-xxx)\n buf =\n z(4 - s1.length) +\n \"0000005\" +\n \"00\" +\n \"50\" +\n z(3 - s1.length) +\n s1 +\n z(5 - s2.length) +\n s2;\n } else if (s1 === \"NT\") {\n // NT designation (xxNT-xxx-xxx)\n const s3 = segments[3]!;\n const prefix = s0.slice(0, -2);\n buf =\n z(4 - s1.length) +\n \"0000005\" +\n z(4 - prefix.length) +\n prefix +\n \"43\" +\n z(3 - s2.length) +\n s2 +\n z(5 - s3.length) +\n s3;\n } else if (s0.endsWith(\"AV\")) {\n // AV suffix\n const prefix = s0.slice(0, -2);\n buf =\n z(4 - s1.length) +\n \"0000005\" +\n z(4 - prefix.length) +\n prefix +\n \"15\" +\n z(3 - s1.length) +\n s1 +\n z(5 - s2.length) +\n s2;\n } else if (s0.endsWith(\"PI\")) {\n // PI suffix\n const prefix = s0.slice(0, -2);\n buf =\n z(4 - s1.length) +\n \"0000005\" +\n z(4 - prefix.length) +\n prefix +\n \"79\" +\n z(3 - s1.length) +\n s1 +\n z(5 - s2.length) +\n s2;\n } else if (s0 === \"PE\") {\n // PE prefix (foreign-born)\n buf =\n z(4 - s1.length) +\n \"0000005\" +\n \"00\" +\n \"75\" +\n z(3 - s1.length) +\n s1 +\n z(5 - s2.length) +\n s2;\n } else if (raw[0] === \"N\") {\n // N prefix (naturalized citizen)\n buf =\n z(4 - s1.length) +\n \"0000005\" +\n \"00\" +\n \"40\" +\n z(3 - s1.length) +\n s1 +\n z(5 - s2.length) +\n s2;\n } else if (s0.length >= 1 && s0.length <= 2) {\n // Natural person (province 1–2 digits)\n buf =\n z(4 - s1.length) +\n \"0000005\" +\n z(2 - s0.length) +\n s0 +\n \"00\" +\n z(3 - s1.length) +\n s1 +\n z(5 - s2.length) +\n s2;\n } else {\n // Juridical (company)\n buf =\n z(10 - s0.length) +\n s0 +\n z(4 - s1.length) +\n s1 +\n z(6 - s2.length) +\n s2;\n isOld =\n buf[3] === \"0\" && buf[4] === \"0\" && buf[5]! < \"5\";\n }\n\n // Apply legacy cross-reference for old format\n if (isOld) {\n const key = buf.slice(5, 7);\n const mapped = LEGACY_MAP[key] ?? key;\n buf = buf.slice(0, 5) + mapped + buf.slice(7);\n }\n\n const dv1 = digitDV(buf, isOld);\n const dv2 = digitDV(\n buf + String.fromCharCode(48 + dv1),\n isOld,\n );\n\n return `${dv1}${dv2}`;\n};\n\n/**\n * Compact: normalize Unicode, collapse whitespace,\n * strip colons around DV, and uppercase. Keeps\n * hyphens (structural separators) and a single\n * space before \"DV\".\n */\nconst compact = (value: string): string => {\n let v = clean(value, \"\").trim().toUpperCase();\n // Normalize DV portion: \" DV: 49\" -> \" DV49\"\n v = v.replace(/\\s*DV[:\\s]*(\\d{2})$/, \" DV$1\");\n // Collapse any remaining internal whitespace\n v = v.replace(/\\s+/g, \" \");\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n // Extract the DV portion: \"...DV49\", \"...DV:49\",\n // or \"... DV 49\"\n const dvMatch = v.match(/^(.+?)-?\\s*DV[:\\s]*(\\d{2})$/);\n\n if (!dvMatch) {\n return err(\n \"INVALID_FORMAT\",\n \"Panama RUC must include DV \" +\n \"(dígito verificador)\",\n );\n }\n\n const rucPart = dvMatch[1]!;\n const dvPart = dvMatch[2]!;\n\n // The RUC part should be hyphen-separated segments\n const segments = rucPart.replace(/-+$/, \"\").split(\"-\");\n\n if (segments.length < 3 || segments.length > 4) {\n return err(\n \"INVALID_FORMAT\",\n \"Panama RUC must have 3–4 \" +\n \"hyphen-separated segments\",\n );\n }\n\n if (segments.some((s) => s.length === 0)) {\n return err(\n \"INVALID_FORMAT\",\n \"Panama RUC segments must not be empty\",\n );\n }\n\n const computed = computeDV(segments, rucPart);\n if (computed === null) {\n return err(\n \"INVALID_FORMAT\",\n \"Unrecognized Panama RUC format\",\n );\n }\n\n if (computed !== dvPart) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Panama RUC dígito verificador \" + \"does not match\",\n );\n }\n\n const compactForm = segments.join(\"-\") + \" DV\" + dvPart;\n return { valid: true, compact: compactForm };\n};\n\n/**\n * Format: display as segments with \" DV XX\".\n */\nconst format = (value: string): string => {\n const v = compact(value);\n const dvMatch = v.match(/^(.+?)-?\\s*DV[:\\s]*(\\d{2})$/);\n if (!dvMatch) return v;\n\n const rucPart = dvMatch[1]!.replace(/-+$/, \"\");\n const dvPart = dvMatch[2]!;\n const segments = rucPart.split(\"-\");\n return `${segments.join(\"-\")} DV ${dvPart}`;\n};\n\n/** Generate a random valid Panama RUC (natural person). */\nconst generate = (): string => {\n const province = String(randomInt(1, 13));\n const volume = String(randomInt(1, 9999));\n const folio = String(randomInt(1, 99999));\n const segments = [province, volume, folio];\n const dv = computeDV(segments, segments.join(\"-\"))!;\n return `${segments.join(\"-\")} DV${dv}`;\n};\n\n/** Panama tax identification number. */\nconst ruc: Validator = {\n name: \"Tax Identification Number\",\n localName: \"Registro Único de Contribuyente\",\n abbreviation: \"RUC\",\n aliases: [\"RUC\"] as const,\n candidatePattern: \"\\\\d{1,2}-?\\\\d{1,4}-?\\\\d{1,6}\",\n country: \"PA\",\n entityType: \"any\",\n description: \"Tax identifier issued by Panama's DGI\",\n sourceUrl: \"https://dgi.mef.gob.pa/\",\n examples: [\n \"1-184-921 DV49\",\n \"2588017-1-831938 DV20\",\n ] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default ruc;\nexport { compact, format, validate, generate };\n"],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { CountryCode, Validator } from "./types.js";
2
+
3
+ //#region src/patterns.d.ts
4
+
5
+ type ValidatorPattern = {
6
+ /** The validator this pattern was derived from. */
7
+ validator: Validator;
8
+ /** Loose regex matching candidates in text. */
9
+ regex: RegExp;
10
+ };
11
+ /**
12
+ * Derive a loose candidate-matching regex from
13
+ * a validator. The regex finds potential matches;
14
+ * use `validate()` to confirm.
15
+ *
16
+ * Handles both digit-only (IČO, NIP) and
17
+ * alphanumeric (IBAN, BIC, ISIN, LEI) validators.
18
+ */
19
+ declare const toRegex: (v: Validator) => RegExp;
20
+ /**
21
+ * All discovered validators, lazily populated.
22
+ * Import * from "../src" would pull everything;
23
+ * instead, callers pass validators explicitly.
24
+ */
25
+ /**
26
+ * Build patterns for a list of validators.
27
+ */
28
+ declare const toPatterns: (validators: readonly Validator[]) => ValidatorPattern[];
29
+ /**
30
+ * Filter validators by country code and build
31
+ * patterns.
32
+ */
33
+ declare const byCountry: (country: CountryCode, validators: readonly Validator[]) => ValidatorPattern[];
34
+ /**
35
+ * Filter validators by entity type and build
36
+ * patterns.
37
+ */
38
+ declare const byEntityType: (entityType: "person" | "company" | "any", validators: readonly Validator[]) => ValidatorPattern[];
39
+ /**
40
+ * Build patterns for ALL provided validators.
41
+ */
42
+ declare const allPatterns: (validators: readonly Validator[]) => ValidatorPattern[];
43
+ //#endregion
44
+ export { ValidatorPattern, allPatterns, byCountry, byEntityType, toPatterns, toRegex };
45
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1,123 @@
1
+ //#region src/patterns.ts
2
+ /** Separator chars that compact() strips. */
3
+ const SEP = "[\\s\\-./]?";
4
+ /**
5
+ * Infer compact lengths from metadata or examples.
6
+ */
7
+ const inferLengths = (v) => {
8
+ if (v.lengths && v.lengths.length > 0) return [...v.lengths];
9
+ if (v.examples && v.examples.length > 0) {
10
+ const lens = /* @__PURE__ */ new Set();
11
+ for (const ex of v.examples) lens.add(v.compact(ex).length);
12
+ return [...lens];
13
+ }
14
+ return [];
15
+ };
16
+ /**
17
+ * Derive the display grouping from format().
18
+ * Returns an array of group sizes, e.g.,
19
+ * "25 123 891" → [2, 3, 3].
20
+ */
21
+ const inferGroups = (v) => {
22
+ if (!v.examples || v.examples.length === 0) return null;
23
+ const compact = v.compact(v.examples[0]);
24
+ const formatted = v.format(compact);
25
+ if (formatted === compact) return null;
26
+ const parts = formatted.split(/[^a-zA-Z0-9]+/);
27
+ if (parts.length <= 1) return null;
28
+ const isAlphanumeric = parts.some((p) => /[a-zA-Z]/.test(p) && /\d/.test(p));
29
+ const groups = parts.filter((p) => p.length > 0 && (isAlphanumeric || /\d/.test(p))).map((p) => p.length);
30
+ return groups.length > 1 ? groups : null;
31
+ };
32
+ /**
33
+ * Detect if this validator uses a known prefix
34
+ * (e.g., "CZ" for DIČ, "CHE" for Swiss UID).
35
+ */
36
+ const inferPrefix = (v) => {
37
+ if (!v.examples || v.examples.length === 0) return null;
38
+ const compact = v.compact(v.examples[0]);
39
+ const compactMatch = compact.match(/^([A-Z]+)\d/);
40
+ if (compactMatch && v.examples.length > 1) {
41
+ const pfx = compactMatch[1];
42
+ if (v.examples.every((ex) => v.compact(ex).startsWith(pfx))) return pfx;
43
+ } else if (compactMatch && v.examples.length === 1) return compactMatch[1];
44
+ const fmtMatch = v.format(compact).match(/^([A-Z]+)[\s\-./]?\d/);
45
+ if (fmtMatch && !compact.startsWith(fmtMatch[1])) return fmtMatch[1];
46
+ return null;
47
+ };
48
+ /**
49
+ * Determine the character class needed for the
50
+ * compact form: `\d` if all digits, `[A-Z0-9]`
51
+ * if alphanumeric, etc.
52
+ */
53
+ const inferCharClass = (v) => {
54
+ if (!v.examples || v.examples.length === 0) return "\\d";
55
+ let hasLetter = false;
56
+ let hasDigit = false;
57
+ for (const ex of v.examples) {
58
+ const c = v.compact(ex);
59
+ for (const ch of c) {
60
+ if (/[a-zA-Z]/.test(ch)) hasLetter = true;
61
+ if (/\d/.test(ch)) hasDigit = true;
62
+ }
63
+ }
64
+ if (hasLetter && hasDigit) return "[A-Z0-9]";
65
+ if (hasLetter) return "[A-Z]";
66
+ return "\\d";
67
+ };
68
+ /**
69
+ * Build a group regex from group sizes + char class.
70
+ * [2, 3, 3] with \d → /\d{2}[\s\-.]?\d{3}[\s\-.]?\d{3}/
71
+ */
72
+ const groupsToPattern = (groups, cc) => groups.map((g) => `${cc}{${g}}`).join(SEP);
73
+ /**
74
+ * Derive a loose candidate-matching regex from
75
+ * a validator. The regex finds potential matches;
76
+ * use `validate()` to confirm.
77
+ *
78
+ * Handles both digit-only (IČO, NIP) and
79
+ * alphanumeric (IBAN, BIC, ISIN, LEI) validators.
80
+ */
81
+ const toRegex = (v) => {
82
+ const prefix = inferPrefix(v);
83
+ const groups = inferGroups(v);
84
+ const lengths = inferLengths(v);
85
+ const cc = inferCharClass(v);
86
+ let pattern;
87
+ if (groups && lengths.length <= 1) pattern = groupsToPattern(groups, cc);
88
+ else if (lengths.length === 1) pattern = `${cc}{${lengths[0]}}`;
89
+ else if (lengths.length > 1) pattern = `${cc}{${Math.min(...lengths)},${Math.max(...lengths)}}`;
90
+ else pattern = `${cc}{6,20}`;
91
+ if (prefix) pattern = `${prefix}${SEP}${pattern}`;
92
+ return new RegExp(`(?<!\\w)${pattern}(?!\\w)`, "g");
93
+ };
94
+ /**
95
+ * All discovered validators, lazily populated.
96
+ * Import * from "../src" would pull everything;
97
+ * instead, callers pass validators explicitly.
98
+ */
99
+ /**
100
+ * Build patterns for a list of validators.
101
+ */
102
+ const toPatterns = (validators) => validators.map((v) => ({
103
+ validator: v,
104
+ regex: toRegex(v)
105
+ }));
106
+ /**
107
+ * Filter validators by country code and build
108
+ * patterns.
109
+ */
110
+ const byCountry = (country, validators) => toPatterns(validators.filter((v) => v.country === country));
111
+ /**
112
+ * Filter validators by entity type and build
113
+ * patterns.
114
+ */
115
+ const byEntityType = (entityType, validators) => toPatterns(validators.filter((v) => entityType === "any" || v.entityType === entityType || v.entityType === "any"));
116
+ /**
117
+ * Build patterns for ALL provided validators.
118
+ */
119
+ const allPatterns = (validators) => toPatterns(validators);
120
+ //#endregion
121
+ export { allPatterns, byCountry, byEntityType, toPatterns, toRegex };
122
+
123
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","names":[],"sources":["../src/patterns.ts"],"sourcesContent":["/**\n * Derive candidate-matching regex patterns from\n * validators. These patterns find CANDIDATES in\n * text — use `validate()` to confirm each match.\n *\n * Designed for integration with regex-set or\n * similar multi-pattern scanning engines.\n *\n * @example\n * ```ts\n * import {\n * toRegex, byCountry, byEntityType,\n * } from \"@stll/stdnum/patterns\";\n * import { cz } from \"@stll/stdnum\";\n *\n * // Single validator\n * toRegex(cz.ico);\n * // → /(?<!\\w)\\d{8}(?!\\w)/g\n *\n * // All Czech validators\n * byCountry(\"CZ\");\n * // → [{ validator: cz.ico, regex }, ...]\n *\n * // All company identifiers\n * byEntityType(\"company\");\n * // → [{ validator, regex }, ...]\n * ```\n */\n\nimport type { CountryCode, Validator } from \"./types\";\n\n// ─── Pattern type ─────────────────────────────\n\nexport type ValidatorPattern = {\n /** The validator this pattern was derived from. */\n validator: Validator;\n /** Loose regex matching candidates in text. */\n regex: RegExp;\n};\n\n// ─── Regex derivation ─────────────────────────\n\n/** Separator chars that compact() strips. */\nconst SEP = \"[\\\\s\\\\-./]?\";\n\n/**\n * Infer compact lengths from metadata or examples.\n */\nconst inferLengths = (v: Validator): number[] => {\n if (v.lengths && v.lengths.length > 0) {\n return [...v.lengths];\n }\n if (v.examples && v.examples.length > 0) {\n const lens = new Set<number>();\n for (const ex of v.examples) {\n lens.add(v.compact(ex).length);\n }\n return [...lens];\n }\n return [];\n};\n\n/**\n * Derive the display grouping from format().\n * Returns an array of group sizes, e.g.,\n * \"25 123 891\" → [2, 3, 3].\n */\nconst inferGroups = (v: Validator): number[] | null => {\n if (!v.examples || v.examples.length === 0) {\n return null;\n }\n const compact = v.compact(v.examples[0]!);\n const formatted = v.format(compact);\n if (formatted === compact) return null;\n\n // Split on non-alphanumeric separators\n const parts = formatted.split(/[^a-zA-Z0-9]+/);\n if (parts.length <= 1) return null;\n\n // For digit-only validators, skip letter-only\n // tokens (prefix like \"CHE\"). For alphanumeric\n // validators (IBAN, ISIN), keep all groups.\n const isAlphanumeric = parts.some(\n (p) => /[a-zA-Z]/.test(p) && /\\d/.test(p),\n );\n const groups = parts\n .filter(\n (p) =>\n p.length > 0 && (isAlphanumeric || /\\d/.test(p)),\n )\n .map((p) => p.length);\n\n return groups.length > 1 ? groups : null;\n};\n\n/**\n * Detect if this validator uses a known prefix\n * (e.g., \"CZ\" for DIČ, \"CHE\" for Swiss UID).\n */\nconst inferPrefix = (v: Validator): string | null => {\n if (!v.examples || v.examples.length === 0) {\n return null;\n }\n const compact = v.compact(v.examples[0]!);\n // Prefix already present in compact form.\n // But only if ALL examples share the same prefix\n // (e.g., \"CHE\" for Swiss UID). If examples have\n // different prefixes (IBAN: GB/DE/FR), there's\n // no fixed prefix — it's part of the value.\n const compactMatch = compact.match(/^([A-Z]+)\\d/);\n if (compactMatch && v.examples!.length > 1) {\n const pfx = compactMatch[1]!;\n const allSame = v.examples!.every((ex) =>\n v.compact(ex).startsWith(pfx),\n );\n if (allSame) return pfx;\n } else if (compactMatch && v.examples!.length === 1) {\n return compactMatch[1]!;\n }\n // Prefix added only by format()\n // (e.g., \"DE\" for de.vat, \"CZ\" for cz.dic)\n const formatted = v.format(compact);\n const fmtMatch = formatted.match(/^([A-Z]+)[\\s\\-./]?\\d/);\n if (fmtMatch && !compact.startsWith(fmtMatch[1]!)) {\n return fmtMatch[1]!;\n }\n return null;\n};\n\n/**\n * Determine the character class needed for the\n * compact form: `\\d` if all digits, `[A-Z0-9]`\n * if alphanumeric, etc.\n */\nconst inferCharClass = (v: Validator): string => {\n if (!v.examples || v.examples.length === 0) {\n return \"\\\\d\";\n }\n let hasLetter = false;\n let hasDigit = false;\n for (const ex of v.examples) {\n const c = v.compact(ex);\n for (const ch of c) {\n if (/[a-zA-Z]/.test(ch)) hasLetter = true;\n if (/\\d/.test(ch)) hasDigit = true;\n }\n }\n if (hasLetter && hasDigit) return \"[A-Z0-9]\";\n if (hasLetter) return \"[A-Z]\";\n return \"\\\\d\";\n};\n\n/**\n * Build a group regex from group sizes + char class.\n * [2, 3, 3] with \\d → /\\d{2}[\\s\\-.]?\\d{3}[\\s\\-.]?\\d{3}/\n */\nconst groupsToPattern = (\n groups: number[],\n cc: string,\n): string => groups.map((g) => `${cc}{${g}}`).join(SEP);\n\n/**\n * Derive a loose candidate-matching regex from\n * a validator. The regex finds potential matches;\n * use `validate()` to confirm.\n *\n * Handles both digit-only (IČO, NIP) and\n * alphanumeric (IBAN, BIC, ISIN, LEI) validators.\n */\nexport const toRegex = (v: Validator): RegExp => {\n const prefix = inferPrefix(v);\n const groups = inferGroups(v);\n const lengths = inferLengths(v);\n const cc = inferCharClass(v);\n\n let pattern: string;\n\n if (groups && lengths.length <= 1) {\n pattern = groupsToPattern(groups, cc);\n } else if (lengths.length === 1) {\n pattern = `${cc}{${lengths[0]}}`;\n } else if (lengths.length > 1) {\n const min = Math.min(...lengths);\n const max = Math.max(...lengths);\n pattern = `${cc}{${min},${max}}`;\n } else {\n pattern = `${cc}{6,20}`;\n }\n\n if (prefix) {\n pattern = `${prefix}${SEP}${pattern}`;\n }\n\n // Word boundary to avoid matching inside\n // larger numbers\n return new RegExp(`(?<!\\\\w)${pattern}(?!\\\\w)`, \"g\");\n};\n\n// ─── Grouped collections ──────────────────────\n\n/**\n * All discovered validators, lazily populated.\n * Import * from \"../src\" would pull everything;\n * instead, callers pass validators explicitly.\n */\n\n/**\n * Build patterns for a list of validators.\n */\nexport const toPatterns = (\n validators: readonly Validator[],\n): ValidatorPattern[] =>\n validators.map((v) => ({\n validator: v,\n regex: toRegex(v),\n }));\n\n/**\n * Filter validators by country code and build\n * patterns.\n */\nexport const byCountry = (\n country: CountryCode,\n validators: readonly Validator[],\n): ValidatorPattern[] =>\n toPatterns(\n validators.filter((v) => v.country === country),\n );\n\n/**\n * Filter validators by entity type and build\n * patterns.\n */\nexport const byEntityType = (\n entityType: \"person\" | \"company\" | \"any\",\n validators: readonly Validator[],\n): ValidatorPattern[] =>\n toPatterns(\n validators.filter(\n (v) =>\n entityType === \"any\" ||\n v.entityType === entityType ||\n v.entityType === \"any\",\n ),\n );\n\n/**\n * Build patterns for ALL provided validators.\n */\nexport const allPatterns = (\n validators: readonly Validator[],\n): ValidatorPattern[] => toPatterns(validators);\n"],"mappings":";;AA2CA,MAAM,MAAM;;;;AAKZ,MAAM,gBAAgB,MAA2B;AAC/C,KAAI,EAAE,WAAW,EAAE,QAAQ,SAAS,EAClC,QAAO,CAAC,GAAG,EAAE,QAAQ;AAEvB,KAAI,EAAE,YAAY,EAAE,SAAS,SAAS,GAAG;EACvC,MAAM,uBAAO,IAAI,KAAa;AAC9B,OAAK,MAAM,MAAM,EAAE,SACjB,MAAK,IAAI,EAAE,QAAQ,GAAG,CAAC,OAAO;AAEhC,SAAO,CAAC,GAAG,KAAK;;AAElB,QAAO,EAAE;;;;;;;AAQX,MAAM,eAAe,MAAkC;AACrD,KAAI,CAAC,EAAE,YAAY,EAAE,SAAS,WAAW,EACvC,QAAO;CAET,MAAM,UAAU,EAAE,QAAQ,EAAE,SAAS,GAAI;CACzC,MAAM,YAAY,EAAE,OAAO,QAAQ;AACnC,KAAI,cAAc,QAAS,QAAO;CAGlC,MAAM,QAAQ,UAAU,MAAM,gBAAgB;AAC9C,KAAI,MAAM,UAAU,EAAG,QAAO;CAK9B,MAAM,iBAAiB,MAAM,MAC1B,MAAM,WAAW,KAAK,EAAE,IAAI,KAAK,KAAK,EAAE,CAC1C;CACD,MAAM,SAAS,MACZ,QACE,MACC,EAAE,SAAS,MAAM,kBAAkB,KAAK,KAAK,EAAE,EAClD,CACA,KAAK,MAAM,EAAE,OAAO;AAEvB,QAAO,OAAO,SAAS,IAAI,SAAS;;;;;;AAOtC,MAAM,eAAe,MAAgC;AACnD,KAAI,CAAC,EAAE,YAAY,EAAE,SAAS,WAAW,EACvC,QAAO;CAET,MAAM,UAAU,EAAE,QAAQ,EAAE,SAAS,GAAI;CAMzC,MAAM,eAAe,QAAQ,MAAM,cAAc;AACjD,KAAI,gBAAgB,EAAE,SAAU,SAAS,GAAG;EAC1C,MAAM,MAAM,aAAa;AAIzB,MAHgB,EAAE,SAAU,OAAO,OACjC,EAAE,QAAQ,GAAG,CAAC,WAAW,IAAI,CAC9B,CACY,QAAO;YACX,gBAAgB,EAAE,SAAU,WAAW,EAChD,QAAO,aAAa;CAKtB,MAAM,WADY,EAAE,OAAO,QAAQ,CACR,MAAM,uBAAuB;AACxD,KAAI,YAAY,CAAC,QAAQ,WAAW,SAAS,GAAI,CAC/C,QAAO,SAAS;AAElB,QAAO;;;;;;;AAQT,MAAM,kBAAkB,MAAyB;AAC/C,KAAI,CAAC,EAAE,YAAY,EAAE,SAAS,WAAW,EACvC,QAAO;CAET,IAAI,YAAY;CAChB,IAAI,WAAW;AACf,MAAK,MAAM,MAAM,EAAE,UAAU;EAC3B,MAAM,IAAI,EAAE,QAAQ,GAAG;AACvB,OAAK,MAAM,MAAM,GAAG;AAClB,OAAI,WAAW,KAAK,GAAG,CAAE,aAAY;AACrC,OAAI,KAAK,KAAK,GAAG,CAAE,YAAW;;;AAGlC,KAAI,aAAa,SAAU,QAAO;AAClC,KAAI,UAAW,QAAO;AACtB,QAAO;;;;;;AAOT,MAAM,mBACJ,QACA,OACW,OAAO,KAAK,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,KAAK,IAAI;;;;;;;;;AAUvD,MAAa,WAAW,MAAyB;CAC/C,MAAM,SAAS,YAAY,EAAE;CAC7B,MAAM,SAAS,YAAY,EAAE;CAC7B,MAAM,UAAU,aAAa,EAAE;CAC/B,MAAM,KAAK,eAAe,EAAE;CAE5B,IAAI;AAEJ,KAAI,UAAU,QAAQ,UAAU,EAC9B,WAAU,gBAAgB,QAAQ,GAAG;UAC5B,QAAQ,WAAW,EAC5B,WAAU,GAAG,GAAG,GAAG,QAAQ,GAAG;UACrB,QAAQ,SAAS,EAG1B,WAAU,GAAG,GAAG,GAFJ,KAAK,IAAI,GAAG,QAAQ,CAET,GADX,KAAK,IAAI,GAAG,QAAQ,CACF;KAE9B,WAAU,GAAG,GAAG;AAGlB,KAAI,OACF,WAAU,GAAG,SAAS,MAAM;AAK9B,QAAO,IAAI,OAAO,WAAW,QAAQ,UAAU,IAAI;;;;;;;;;;AAcrD,MAAa,cACX,eAEA,WAAW,KAAK,OAAO;CACrB,WAAW;CACX,OAAO,QAAQ,EAAE;CAClB,EAAE;;;;;AAML,MAAa,aACX,SACA,eAEA,WACE,WAAW,QAAQ,MAAM,EAAE,YAAY,QAAQ,CAChD;;;;;AAMH,MAAa,gBACX,YACA,eAEA,WACE,WAAW,QACR,MACC,eAAe,SACf,EAAE,eAAe,cACjB,EAAE,eAAe,MACpB,CACF;;;;AAKH,MAAa,eACX,eACuB,WAAW,WAAW"}
@@ -0,0 +1,8 @@
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
+ import ruc from "./ruc.js";
3
+
4
+ //#region src/pe/mod.d.ts
5
+
6
+ //#endregion
7
+ export { mod_d_exports, ruc };
8
+ //# sourceMappingURL=mod.d.ts.map
package/dist/pe/mod.js ADDED
@@ -0,0 +1,8 @@
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
+ import ruc from "./ruc.js";
3
+ //#region src/pe/mod.ts
4
+ var pe_exports = /* @__PURE__ */ __exportAll({ ruc: () => ruc });
5
+ //#endregion
6
+ export { pe_exports, ruc };
7
+
8
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","names":[],"sources":["../../src/pe/mod.ts"],"sourcesContent":["export { default as ruc } from \"./ruc\";\n"],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import { ValidateResult, Validator } from "../types.js";
2
+
3
+ //#region src/pe/ruc.d.ts
4
+
5
+ declare const compact: (value: string) => string;
6
+ declare const validate: (value: string) => ValidateResult;
7
+ declare const format: (value: string) => string;
8
+ /** Generate a random valid Peruvian RUC. */
9
+ declare const generate: () => string;
10
+ /**
11
+ * Peruvian RUC (tax identification number).
12
+ *
13
+ * Examples sourced from python-stdnum test suite
14
+ * (pe.ruc module).
15
+ */
16
+ declare const ruc: Validator;
17
+ //#endregion
18
+ export { compact, ruc as default, format, generate, validate };
19
+ //# sourceMappingURL=ruc.d.ts.map
package/dist/pe/ruc.js ADDED
@@ -0,0 +1,109 @@
1
+ import { clean } from "../_util/clean.js";
2
+ import { randomDigits } from "../_util/generate.js";
3
+ import { err } from "../_util/result.js";
4
+ import { isdigits } from "../_util/strings.js";
5
+ //#region src/pe/ruc.ts
6
+ /**
7
+ * RUC (Registro Único de Contribuyentes).
8
+ *
9
+ * Peruvian tax identification number assigned by SUNAT
10
+ * (Superintendencia Nacional de Aduanas y de
11
+ * Administración Tributaria). The number consists of
12
+ * 11 digits: a type prefix (10 = person, 20 = company,
13
+ * among others), 8 identification digits, and a check
14
+ * digit computed using a weighted modulo 11 algorithm.
15
+ *
16
+ * Format: XXXXXXXXXXX (11 digits, no separators).
17
+ *
18
+ * @see https://www.sunat.gob.pe/
19
+ * @see https://en.wikipedia.org/wiki/Tax_identification_number#Peru
20
+ */
21
+ /**
22
+ * Valid type prefixes for RUC numbers.
23
+ * 10 = natural person, 15 = non-domiciled without RUC,
24
+ * 17 = non-domiciled, 20 = legal entity,
25
+ * others for specific entity types.
26
+ */
27
+ const VALID_PREFIXES = new Set([
28
+ "10",
29
+ "15",
30
+ "17",
31
+ "20"
32
+ ]);
33
+ const WEIGHTS = [
34
+ 5,
35
+ 4,
36
+ 3,
37
+ 2,
38
+ 7,
39
+ 6,
40
+ 5,
41
+ 4,
42
+ 3,
43
+ 2
44
+ ];
45
+ const compact = (value) => clean(value, " -.").trim();
46
+ /**
47
+ * Compute the RUC check digit using weighted sum
48
+ * mod 11. Weights: [5, 4, 3, 2, 7, 6, 5, 4, 3, 2].
49
+ *
50
+ * check = 11 - (sum % 11); if >= 10, subtract 10.
51
+ */
52
+ const calcCheckDigit = (body) => {
53
+ let sum = 0;
54
+ for (let i = 0; i < 10; i++) sum += Number(body[i]) * WEIGHTS[i];
55
+ const remainder = 11 - sum % 11;
56
+ if (remainder >= 10) return remainder - 10;
57
+ return remainder;
58
+ };
59
+ const validate = (value) => {
60
+ const v = compact(value);
61
+ if (v.length !== 11) return err("INVALID_LENGTH", "RUC must be 11 digits");
62
+ if (!isdigits(v)) return err("INVALID_FORMAT", "RUC must contain only digits");
63
+ const prefix = v.slice(0, 2);
64
+ if (!VALID_PREFIXES.has(prefix)) return err("INVALID_COMPONENT", "RUC has an invalid type prefix");
65
+ const expected = calcCheckDigit(v.slice(0, 10));
66
+ if (Number(v[10]) !== expected) return err("INVALID_CHECKSUM", "RUC check digit does not match");
67
+ return {
68
+ valid: true,
69
+ compact: v
70
+ };
71
+ };
72
+ const format = (value) => compact(value);
73
+ /** Generate a random valid Peruvian RUC. */
74
+ const generate = () => {
75
+ const prefixes = [
76
+ "10",
77
+ "15",
78
+ "17",
79
+ "20"
80
+ ];
81
+ const body = prefixes[Math.floor(Math.random() * prefixes.length)] + randomDigits(8);
82
+ return body + String(calcCheckDigit(body));
83
+ };
84
+ /**
85
+ * Peruvian RUC (tax identification number).
86
+ *
87
+ * Examples sourced from python-stdnum test suite
88
+ * (pe.ruc module).
89
+ */
90
+ const ruc = {
91
+ name: "Peruvian Tax ID",
92
+ localName: "Registro Único de Contribuyentes",
93
+ abbreviation: "RUC",
94
+ aliases: ["RUC"],
95
+ candidatePattern: "\\d{11}",
96
+ country: "PE",
97
+ entityType: "any",
98
+ compact,
99
+ format,
100
+ validate,
101
+ sourceUrl: "https://www.sunat.gob.pe/",
102
+ lengths: [11],
103
+ examples: ["20131312955", "20100047218"],
104
+ generate
105
+ };
106
+ //#endregion
107
+ export { compact, ruc as default, format, generate, validate };
108
+
109
+ //# sourceMappingURL=ruc.js.map
@@ -0,0 +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"}
@@ -0,0 +1,8 @@
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
+ import philid from "./philid.js";
3
+
4
+ //#region src/ph/mod.d.ts
5
+
6
+ //#endregion
7
+ export { mod_d_exports, philid };
8
+ //# sourceMappingURL=mod.d.ts.map
package/dist/ph/mod.js ADDED
@@ -0,0 +1,8 @@
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
+ import philid from "./philid.js";
3
+ //#region src/ph/mod.ts
4
+ var ph_exports = /* @__PURE__ */ __exportAll({ philid: () => philid });
5
+ //#endregion
6
+ export { ph_exports, philid };
7
+
8
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","names":[],"sources":["../../src/ph/mod.ts"],"sourcesContent":["export { default as philid } from \"./philid\";\n"],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { ValidateResult, Validator } from "../types.js";
2
+
3
+ //#region src/ph/philid.d.ts
4
+ /** Generate a random valid PhilID. */
5
+ declare const generate: () => string;
6
+ declare const compact: (value: string) => string;
7
+ declare const validate: (value: string) => ValidateResult;
8
+ declare const format: (value: string) => string;
9
+ /** Philippine Identification System Number. */
10
+ declare const philid: Validator;
11
+ //#endregion
12
+ export { compact, philid as default, format, generate, validate };
13
+ //# sourceMappingURL=philid.d.ts.map
@@ -0,0 +1,60 @@
1
+ import { clean } from "../_util/clean.js";
2
+ import { randomDigits } from "../_util/generate.js";
3
+ import { err } from "../_util/result.js";
4
+ import { isdigits } from "../_util/strings.js";
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
+ /** Generate a random valid PhilID. */
19
+ const generate = () => randomDigits(12);
20
+ const compact = (value) => clean(value, " -");
21
+ const validate = (value) => {
22
+ const v = compact(value);
23
+ if (v.length !== 12) return err("INVALID_LENGTH", "PhilID must be exactly 12 digits");
24
+ if (!isdigits(v)) return err("INVALID_FORMAT", "PhilID must contain only digits");
25
+ return {
26
+ valid: true,
27
+ compact: v
28
+ };
29
+ };
30
+ const format = (value) => {
31
+ const v = compact(value);
32
+ if (v.length === 12) return `${v.slice(0, 4)}-${v.slice(4, 11)}-${v.slice(11)}`;
33
+ return v;
34
+ };
35
+ /** Philippine Identification System Number. */
36
+ const philid = {
37
+ name: "Philippine Identification System Number",
38
+ localName: "PhilSys Card Number",
39
+ abbreviation: "PhilID",
40
+ aliases: [
41
+ "PhilID",
42
+ "PhilSys",
43
+ "Philippine ID"
44
+ ],
45
+ candidatePattern: "\\d{4}-\\d{4}-\\d{4}-\\d{4}",
46
+ country: "PH",
47
+ entityType: "person",
48
+ description: "12-digit personal identifier issued under the Philippine Identification System",
49
+ sourceUrl: "https://en.wikipedia.org/wiki/Philippine_national_identity_card",
50
+ lengths: [12],
51
+ examples: ["123456789012", "000011112222"],
52
+ compact,
53
+ format,
54
+ validate,
55
+ generate
56
+ };
57
+ //#endregion
58
+ export { compact, philid as default, format, generate, validate };
59
+
60
+ //# sourceMappingURL=philid.js.map
@@ -0,0 +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"}
@@ -0,0 +1,13 @@
1
+ import { ValidateResult, Validator } from "../types.js";
2
+
3
+ //#region src/pk/cnic.d.ts
4
+ /** Generate a random valid Pakistan CNIC. */
5
+ declare const generate: () => string;
6
+ declare const compact: (value: string) => string;
7
+ declare const validate: (value: string) => ValidateResult;
8
+ declare const format: (value: string) => string;
9
+ /** Pakistan Computerized National Identity Card. */
10
+ declare const cnic: Validator;
11
+ //#endregion
12
+ export { compact, cnic as default, format, generate, validate };
13
+ //# sourceMappingURL=cnic.d.ts.map
@@ -0,0 +1,69 @@
1
+ import { clean } from "../_util/clean.js";
2
+ import { randomDigits, randomInt } from "../_util/generate.js";
3
+ import { err } from "../_util/result.js";
4
+ import { isdigits } from "../_util/strings.js";
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
+ /** Generate a random valid Pakistan CNIC. */
19
+ const generate = () => {
20
+ return `${String(randomInt(1, 7))}${randomDigits(4)}${randomDigits(7)}${String(randomInt(1, 9))}`;
21
+ };
22
+ const compact = (value) => clean(value, " -");
23
+ /** Valid province IDs (first digit). */
24
+ const VALID_PROVINCES = new Set([
25
+ "1",
26
+ "2",
27
+ "3",
28
+ "4",
29
+ "5",
30
+ "6",
31
+ "7"
32
+ ]);
33
+ const validate = (value) => {
34
+ const v = compact(value);
35
+ if (v.length !== 13) return err("INVALID_LENGTH", "CNIC must be 13 digits");
36
+ if (!isdigits(v)) return err("INVALID_FORMAT", "CNIC must contain only digits");
37
+ if (!VALID_PROVINCES.has(v[0])) return err("INVALID_COMPONENT", "CNIC province code is invalid");
38
+ if (v[12] === "0") return err("INVALID_COMPONENT", "CNIC gender digit must not be 0");
39
+ return {
40
+ valid: true,
41
+ compact: v
42
+ };
43
+ };
44
+ const format = (value) => {
45
+ const v = compact(value);
46
+ return `${v.slice(0, 5)}-${v.slice(5, 12)}-${v.slice(12)}`;
47
+ };
48
+ /** Pakistan Computerized National Identity Card. */
49
+ const cnic = {
50
+ name: "Computerized National Identity Card",
51
+ localName: "Computerized National Identity Card",
52
+ abbreviation: "CNIC",
53
+ aliases: ["CNIC", "شناختی کارڈ"],
54
+ candidatePattern: "\\d{5}-?\\d{7}-?\\d",
55
+ country: "PK",
56
+ entityType: "person",
57
+ lengths: [13],
58
+ examples: ["3520112345671", "4210112345672"],
59
+ description: "13-digit identity card number issued by NADRA",
60
+ sourceUrl: "https://en.wikipedia.org/wiki/CNIC_(Pakistan)",
61
+ compact,
62
+ format,
63
+ validate,
64
+ generate
65
+ };
66
+ //#endregion
67
+ export { compact, cnic as default, format, generate, validate };
68
+
69
+ //# sourceMappingURL=cnic.js.map
@@ -0,0 +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"}
@@ -0,0 +1,8 @@
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
+ import cnic from "./cnic.js";
3
+
4
+ //#region src/pk/mod.d.ts
5
+
6
+ //#endregion
7
+ export { cnic, mod_d_exports };
8
+ //# sourceMappingURL=mod.d.ts.map
package/dist/pk/mod.js ADDED
@@ -0,0 +1,8 @@
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
+ import cnic from "./cnic.js";
3
+ //#region src/pk/mod.ts
4
+ var pk_exports = /* @__PURE__ */ __exportAll({ cnic: () => cnic });
5
+ //#endregion
6
+ export { cnic, pk_exports };
7
+
8
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","names":[],"sources":["../../src/pk/mod.ts"],"sourcesContent":["export { default as cnic } from \"./cnic\";\n"],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
+ import nip from "./nip.js";
3
+ import pesel from "./pesel.js";
4
+ import regon from "./regon.js";
5
+
6
+ //#region src/pl/mod.d.ts
7
+
8
+ //#endregion
9
+ export { mod_d_exports, nip, pesel, regon };
10
+ //# sourceMappingURL=mod.d.ts.map
package/dist/pl/mod.js ADDED
@@ -0,0 +1,14 @@
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
+ import nip from "./nip.js";
3
+ import pesel from "./pesel.js";
4
+ import regon from "./regon.js";
5
+ //#region src/pl/mod.ts
6
+ var pl_exports = /* @__PURE__ */ __exportAll({
7
+ nip: () => nip,
8
+ pesel: () => pesel,
9
+ regon: () => regon
10
+ });
11
+ //#endregion
12
+ export { nip, pesel, pl_exports, regon };
13
+
14
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","names":[],"sources":["../../src/pl/mod.ts"],"sourcesContent":["export { default as nip } from \"./nip\";\nexport { default as pesel } from \"./pesel\";\nexport { default as regon } from \"./regon\";\n"],"mappings":""}