@stll/stdnum 0.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (808) hide show
  1. package/LICENSE +1 -5
  2. package/README.md +28 -4
  3. package/dist/_checksums/luhn.js.map +1 -1
  4. package/dist/_checksums/mod1110.js +1 -1
  5. package/dist/_checksums/mod1110.js.map +1 -1
  6. package/dist/_checksums/mod112.js +5 -5
  7. package/dist/_checksums/mod112.js.map +1 -1
  8. package/dist/_checksums/mod97.js.map +1 -1
  9. package/dist/_checksums/verhoeff.js.map +1 -1
  10. package/dist/_checksums/weighted-sum.js.map +1 -1
  11. package/dist/_util/arabic.js.map +1 -1
  12. package/dist/_util/clean.js.map +1 -1
  13. package/dist/_util/date.js.map +1 -1
  14. package/dist/_util/generate.d.ts +13 -1
  15. package/dist/_util/generate.js +23 -1
  16. package/dist/_util/generate.js.map +1 -1
  17. package/dist/_util/result.js.map +1 -1
  18. package/dist/_util/strings.js.map +1 -1
  19. package/dist/ad/mod.d.ts +3 -2
  20. package/dist/ad/nrt.d.ts +16 -2
  21. package/dist/ad/nrt.js +4 -16
  22. package/dist/ad/nrt.js.map +1 -1
  23. package/dist/ae/eid.d.ts +2 -3
  24. package/dist/ae/eid.js +2 -12
  25. package/dist/ae/eid.js.map +1 -1
  26. package/dist/ae/mod.d.ts +3 -2
  27. package/dist/ai/mod.d.ts +3 -2
  28. package/dist/ai/tin.d.ts +20 -2
  29. package/dist/ai/tin.js +1 -18
  30. package/dist/ai/tin.js.map +1 -1
  31. package/dist/al/mod.d.ts +3 -2
  32. package/dist/al/nipt.d.ts +13 -2
  33. package/dist/al/nipt.js +1 -11
  34. package/dist/al/nipt.js.map +1 -1
  35. package/dist/am/mod.d.ts +3 -2
  36. package/dist/am/tin.d.ts +16 -2
  37. package/dist/am/tin.js +1 -14
  38. package/dist/am/tin.js.map +1 -1
  39. package/dist/ar/cbu.d.ts +2 -3
  40. package/dist/ar/cbu.js +2 -10
  41. package/dist/ar/cbu.js.map +1 -1
  42. package/dist/ar/cuit.d.ts +2 -3
  43. package/dist/ar/cuit.js +13 -29
  44. package/dist/ar/cuit.js.map +1 -1
  45. package/dist/ar/dni.d.ts +11 -2
  46. package/dist/ar/dni.js +1 -9
  47. package/dist/ar/dni.js.map +1 -1
  48. package/dist/ar/mod.d.ts +3 -2
  49. package/dist/at/businessid.d.ts +10 -2
  50. package/dist/at/businessid.js +1 -8
  51. package/dist/at/businessid.js.map +1 -1
  52. package/dist/at/mod.d.ts +3 -2
  53. package/dist/at/tin.d.ts +2 -3
  54. package/dist/at/tin.js +1 -11
  55. package/dist/at/tin.js.map +1 -1
  56. package/dist/at/uid.d.ts +2 -3
  57. package/dist/at/uid.js +2 -10
  58. package/dist/at/uid.js.map +1 -1
  59. package/dist/at/vnr.d.ts +5 -4
  60. package/dist/at/vnr.js +23 -16
  61. package/dist/at/vnr.js.map +1 -1
  62. package/dist/au/abn.d.ts +2 -3
  63. package/dist/au/abn.js +1 -10
  64. package/dist/au/abn.js.map +1 -1
  65. package/dist/au/acn.d.ts +2 -3
  66. package/dist/au/acn.js +1 -10
  67. package/dist/au/acn.js.map +1 -1
  68. package/dist/au/mod.d.ts +3 -2
  69. package/dist/au/tfn.d.ts +2 -3
  70. package/dist/au/tfn.js +1 -10
  71. package/dist/au/tfn.js.map +1 -1
  72. package/dist/az/mod.d.ts +3 -2
  73. package/dist/az/voen.d.ts +2 -3
  74. package/dist/az/voen.js +1 -14
  75. package/dist/az/voen.js.map +1 -1
  76. package/dist/ba/jmbg.d.ts +2 -3
  77. package/dist/ba/jmbg.js +4 -11
  78. package/dist/ba/jmbg.js.map +1 -1
  79. package/dist/ba/mod.d.ts +3 -2
  80. package/dist/bd/mod.d.ts +3 -2
  81. package/dist/bd/nid.d.ts +23 -2
  82. package/dist/bd/nid.js +11 -32
  83. package/dist/bd/nid.js.map +1 -1
  84. package/dist/be/bis.d.ts +2 -3
  85. package/dist/be/bis.js +1 -11
  86. package/dist/be/bis.js.map +1 -1
  87. package/dist/be/mod.d.ts +3 -2
  88. package/dist/be/nn.d.ts +2 -3
  89. package/dist/be/nn.js +1 -11
  90. package/dist/be/nn.js.map +1 -1
  91. package/dist/be/vat.d.ts +2 -3
  92. package/dist/be/vat.js +1 -9
  93. package/dist/be/vat.js.map +1 -1
  94. package/dist/bg/egn.d.ts +2 -3
  95. package/dist/bg/egn.js +5 -13
  96. package/dist/bg/egn.js.map +1 -1
  97. package/dist/bg/mod.d.ts +3 -2
  98. package/dist/bg/pnf.d.ts +2 -3
  99. package/dist/bg/pnf.js +1 -8
  100. package/dist/bg/pnf.js.map +1 -1
  101. package/dist/bg/vat.d.ts +2 -3
  102. package/dist/bg/vat.js +3 -9
  103. package/dist/bg/vat.js.map +1 -1
  104. package/dist/bh/cpr.d.ts +5 -4
  105. package/dist/bh/cpr.js +9 -19
  106. package/dist/bh/cpr.js.map +1 -1
  107. package/dist/bh/mod.d.ts +3 -2
  108. package/dist/bic.d.ts +13 -2
  109. package/dist/bic.js +14 -26
  110. package/dist/bic.js.map +1 -1
  111. package/dist/br/cnpj.d.ts +2 -3
  112. package/dist/br/cnpj.js +1 -20
  113. package/dist/br/cnpj.js.map +1 -1
  114. package/dist/br/cpf.d.ts +2 -3
  115. package/dist/br/cpf.js +1 -14
  116. package/dist/br/cpf.js.map +1 -1
  117. package/dist/br/mod.d.ts +3 -2
  118. package/dist/by/mod.d.ts +3 -2
  119. package/dist/by/unp.d.ts +2 -3
  120. package/dist/by/unp.js +9 -17
  121. package/dist/by/unp.js.map +1 -1
  122. package/dist/bz/mod.d.ts +3 -2
  123. package/dist/bz/tin.d.ts +5 -4
  124. package/dist/bz/tin.js +10 -27
  125. package/dist/bz/tin.js.map +1 -1
  126. package/dist/ca/bn.d.ts +2 -3
  127. package/dist/ca/bn.js +2 -10
  128. package/dist/ca/bn.js.map +1 -1
  129. package/dist/ca/mod.d.ts +3 -2
  130. package/dist/ca/sin.d.ts +2 -3
  131. package/dist/ca/sin.js +2 -10
  132. package/dist/ca/sin.js.map +1 -1
  133. package/dist/ch/mod.d.ts +3 -2
  134. package/dist/ch/ssn.d.ts +2 -3
  135. package/dist/ch/ssn.js +1 -9
  136. package/dist/ch/ssn.js.map +1 -1
  137. package/dist/ch/uid.d.ts +2 -3
  138. package/dist/ch/uid.js +1 -9
  139. package/dist/ch/uid.js.map +1 -1
  140. package/dist/ch/vat.d.ts +2 -3
  141. package/dist/ch/vat.js +1 -9
  142. package/dist/ch/vat.js.map +1 -1
  143. package/dist/cl/mod.d.ts +3 -2
  144. package/dist/cl/rut.d.ts +2 -3
  145. package/dist/cl/rut.js +2 -15
  146. package/dist/cl/rut.js.map +1 -1
  147. package/dist/cn/mod.d.ts +3 -2
  148. package/dist/cn/ric.d.ts +2 -3
  149. package/dist/cn/ric.js +4 -14
  150. package/dist/cn/ric.js.map +1 -1
  151. package/dist/cn/uscc.d.ts +2 -3
  152. package/dist/cn/uscc.js +8 -16
  153. package/dist/cn/uscc.js.map +1 -1
  154. package/dist/co/mod.d.ts +3 -2
  155. package/dist/co/nit.d.ts +2 -3
  156. package/dist/co/nit.js +6 -13
  157. package/dist/co/nit.js.map +1 -1
  158. package/dist/cr/cpf.d.ts +18 -2
  159. package/dist/cr/cpf.js +5 -19
  160. package/dist/cr/cpf.js.map +1 -1
  161. package/dist/cr/mod.d.ts +3 -2
  162. package/dist/creditcard.d.ts +2 -3
  163. package/dist/creditcard.js +5 -14
  164. package/dist/creditcard.js.map +1 -1
  165. package/dist/cu/mod.d.ts +3 -2
  166. package/dist/cu/ni.d.ts +5 -4
  167. package/dist/cu/ni.js +13 -18
  168. package/dist/cu/ni.js.map +1 -1
  169. package/dist/cy/mod.d.ts +3 -2
  170. package/dist/cy/vat.d.ts +2 -3
  171. package/dist/cy/vat.js +1 -8
  172. package/dist/cy/vat.js.map +1 -1
  173. package/dist/cz/dic.d.ts +2 -3
  174. package/dist/cz/dic.js +7 -13
  175. package/dist/cz/dic.js.map +1 -1
  176. package/dist/cz/ico.d.ts +2 -3
  177. package/dist/cz/ico.js +2 -10
  178. package/dist/cz/ico.js.map +1 -1
  179. package/dist/cz/mod.d.ts +3 -2
  180. package/dist/cz/rc.d.ts +2 -3
  181. package/dist/cz/rc.js +22 -21
  182. package/dist/cz/rc.js.map +1 -1
  183. package/dist/de/handelsreg.d.ts +19 -2
  184. package/dist/de/handelsreg.js +10 -26
  185. package/dist/de/handelsreg.js.map +1 -1
  186. package/dist/de/idnr.d.ts +2 -3
  187. package/dist/de/idnr.js +2 -12
  188. package/dist/de/idnr.js.map +1 -1
  189. package/dist/de/mod.d.ts +3 -2
  190. package/dist/de/stnr.d.ts +17 -3
  191. package/dist/de/stnr.js +1 -15
  192. package/dist/de/stnr.js.map +1 -1
  193. package/dist/de/svnr.d.ts +2 -3
  194. package/dist/de/svnr.js +4 -13
  195. package/dist/de/svnr.js.map +1 -1
  196. package/dist/de/vat.d.ts +2 -3
  197. package/dist/de/vat.js +2 -11
  198. package/dist/de/vat.js.map +1 -1
  199. package/dist/dk/cpr.d.ts +5 -4
  200. package/dist/dk/cpr.js +14 -12
  201. package/dist/dk/cpr.js.map +1 -1
  202. package/dist/dk/cvr.d.ts +2 -3
  203. package/dist/dk/cvr.js +2 -15
  204. package/dist/dk/cvr.js.map +1 -1
  205. package/dist/dk/mod.d.ts +3 -2
  206. package/dist/dk/vat.d.ts +2 -3
  207. package/dist/dk/vat.js +3 -13
  208. package/dist/dk/vat.js.map +1 -1
  209. package/dist/do/mod.d.ts +3 -2
  210. package/dist/do/rnc.d.ts +2 -3
  211. package/dist/do/rnc.js +3 -17
  212. package/dist/do/rnc.js.map +1 -1
  213. package/dist/ec/mod.d.ts +3 -2
  214. package/dist/ec/ruc.d.ts +2 -3
  215. package/dist/ec/ruc.js +2 -19
  216. package/dist/ec/ruc.js.map +1 -1
  217. package/dist/ee/ik.d.ts +2 -3
  218. package/dist/ee/ik.js +6 -15
  219. package/dist/ee/ik.js.map +1 -1
  220. package/dist/ee/mod.d.ts +3 -2
  221. package/dist/ee/registrikood.d.ts +2 -3
  222. package/dist/ee/registrikood.js +9 -15
  223. package/dist/ee/registrikood.js.map +1 -1
  224. package/dist/ee/vat.d.ts +2 -3
  225. package/dist/ee/vat.js +2 -10
  226. package/dist/ee/vat.js.map +1 -1
  227. package/dist/eg/mod.d.ts +3 -2
  228. package/dist/eg/tn.d.ts +11 -2
  229. package/dist/eg/tn.js +1 -9
  230. package/dist/eg/tn.js.map +1 -1
  231. package/dist/es/cif.d.ts +2 -3
  232. package/dist/es/cif.js +3 -12
  233. package/dist/es/cif.js.map +1 -1
  234. package/dist/es/dni.d.ts +2 -3
  235. package/dist/es/dni.js +1 -9
  236. package/dist/es/dni.js.map +1 -1
  237. package/dist/es/mod.d.ts +3 -2
  238. package/dist/es/nie.d.ts +2 -3
  239. package/dist/es/nie.js +14 -22
  240. package/dist/es/nie.js.map +1 -1
  241. package/dist/es/nss.d.ts +2 -3
  242. package/dist/es/nss.js +1 -16
  243. package/dist/es/nss.js.map +1 -1
  244. package/dist/es/vat.d.ts +2 -3
  245. package/dist/es/vat.js +5 -10
  246. package/dist/es/vat.js.map +1 -1
  247. package/dist/eu/mod.d.ts +3 -2
  248. package/dist/eu/vat.d.ts +5 -4
  249. package/dist/eu/vat.js +44 -2
  250. package/dist/eu/vat.js.map +1 -1
  251. package/dist/fi/hetu.d.ts +5 -4
  252. package/dist/fi/hetu.js +19 -12
  253. package/dist/fi/hetu.js.map +1 -1
  254. package/dist/fi/mod.d.ts +3 -2
  255. package/dist/fi/vat.d.ts +2 -3
  256. package/dist/fi/vat.js +3 -10
  257. package/dist/fi/vat.js.map +1 -1
  258. package/dist/fi/ytunnus.d.ts +2 -3
  259. package/dist/fi/ytunnus.js +2 -10
  260. package/dist/fi/ytunnus.js.map +1 -1
  261. package/dist/fr/mod.d.ts +3 -2
  262. package/dist/fr/nif.d.ts +2 -3
  263. package/dist/fr/nif.js +1 -9
  264. package/dist/fr/nif.js.map +1 -1
  265. package/dist/fr/nir.d.ts +2 -3
  266. package/dist/fr/nir.js +3 -14
  267. package/dist/fr/nir.js.map +1 -1
  268. package/dist/fr/siren.d.ts +2 -3
  269. package/dist/fr/siren.js +2 -10
  270. package/dist/fr/siren.js.map +1 -1
  271. package/dist/fr/siret.d.ts +2 -3
  272. package/dist/fr/siret.js +2 -11
  273. package/dist/fr/siret.js.map +1 -1
  274. package/dist/fr/tva.d.ts +2 -3
  275. package/dist/fr/tva.js +2 -12
  276. package/dist/fr/tva.js.map +1 -1
  277. package/dist/gb/mod.d.ts +3 -2
  278. package/dist/gb/nino.d.ts +12 -2
  279. package/dist/gb/nino.js +8 -17
  280. package/dist/gb/nino.js.map +1 -1
  281. package/dist/gb/sedol.d.ts +2 -3
  282. package/dist/gb/sedol.js +9 -18
  283. package/dist/gb/sedol.js.map +1 -1
  284. package/dist/gb/utr.d.ts +2 -3
  285. package/dist/gb/utr.js +2 -10
  286. package/dist/gb/utr.js.map +1 -1
  287. package/dist/gb/vat.d.ts +2 -3
  288. package/dist/gb/vat.js +2 -11
  289. package/dist/gb/vat.js.map +1 -1
  290. package/dist/ge/mod.d.ts +3 -2
  291. package/dist/ge/pin.d.ts +14 -2
  292. package/dist/ge/pin.js +1 -12
  293. package/dist/ge/pin.js.map +1 -1
  294. package/dist/gh/mod.d.ts +3 -2
  295. package/dist/gh/tin.d.ts +2 -3
  296. package/dist/gh/tin.js +10 -24
  297. package/dist/gh/tin.js.map +1 -1
  298. package/dist/gr/amka.d.ts +2 -3
  299. package/dist/gr/amka.js +3 -11
  300. package/dist/gr/amka.js.map +1 -1
  301. package/dist/gr/mod.d.ts +3 -2
  302. package/dist/gr/vat.d.ts +2 -3
  303. package/dist/gr/vat.js +1 -10
  304. package/dist/gr/vat.js.map +1 -1
  305. package/dist/gt/mod.d.ts +3 -2
  306. package/dist/gt/nit.d.ts +2 -3
  307. package/dist/gt/nit.js +6 -14
  308. package/dist/gt/nit.js.map +1 -1
  309. package/dist/hk/hkid.d.ts +2 -3
  310. package/dist/hk/hkid.js +2 -10
  311. package/dist/hk/hkid.js.map +1 -1
  312. package/dist/hk/mod.d.ts +3 -2
  313. package/dist/hr/mod.d.ts +3 -2
  314. package/dist/hr/vat.d.ts +2 -3
  315. package/dist/hr/vat.js +2 -9
  316. package/dist/hr/vat.js.map +1 -1
  317. package/dist/hu/mod.d.ts +3 -2
  318. package/dist/hu/vat.d.ts +2 -3
  319. package/dist/hu/vat.js +3 -10
  320. package/dist/hu/vat.js.map +1 -1
  321. package/dist/iban.d.ts +2 -3
  322. package/dist/iban.js +2 -8
  323. package/dist/iban.js.map +1 -1
  324. package/dist/id/mod.d.ts +3 -2
  325. package/dist/id/npwp.d.ts +2 -3
  326. package/dist/id/npwp.js +3 -13
  327. package/dist/id/npwp.js.map +1 -1
  328. package/dist/ie/mod.d.ts +3 -2
  329. package/dist/ie/pps.d.ts +2 -3
  330. package/dist/ie/pps.js +1 -10
  331. package/dist/ie/pps.js.map +1 -1
  332. package/dist/ie/vat.d.ts +2 -3
  333. package/dist/ie/vat.js +1 -9
  334. package/dist/ie/vat.js.map +1 -1
  335. package/dist/il/idnr.d.ts +2 -3
  336. package/dist/il/idnr.js +2 -9
  337. package/dist/il/idnr.js.map +1 -1
  338. package/dist/il/mod.d.ts +3 -2
  339. package/dist/in/aadhaar.d.ts +2 -3
  340. package/dist/in/aadhaar.js +2 -12
  341. package/dist/in/aadhaar.js.map +1 -1
  342. package/dist/in/gstin.d.ts +2 -3
  343. package/dist/in/gstin.js +4 -11
  344. package/dist/in/gstin.js.map +1 -1
  345. package/dist/in/mod.d.ts +3 -2
  346. package/dist/in/pan.d.ts +15 -2
  347. package/dist/in/pan.js +3 -15
  348. package/dist/in/pan.js.map +1 -1
  349. package/dist/index.d.ts +2 -2
  350. package/dist/index.js +6 -6
  351. package/dist/iq/mod.d.ts +3 -2
  352. package/dist/iq/nid.d.ts +16 -2
  353. package/dist/iq/nid.js +2 -15
  354. package/dist/iq/nid.js.map +1 -1
  355. package/dist/ir/mod.d.ts +3 -2
  356. package/dist/ir/nid.d.ts +2 -3
  357. package/dist/ir/nid.js +2 -24
  358. package/dist/ir/nid.js.map +1 -1
  359. package/dist/is/kennitala.d.ts +2 -3
  360. package/dist/is/kennitala.js +2 -13
  361. package/dist/is/kennitala.js.map +1 -1
  362. package/dist/is/mod.d.ts +3 -2
  363. package/dist/is/vsk.d.ts +9 -2
  364. package/dist/is/vsk.js +1 -7
  365. package/dist/is/vsk.js.map +1 -1
  366. package/dist/isin.d.ts +2 -3
  367. package/dist/isin.js +11 -21
  368. package/dist/isin.js.map +1 -1
  369. package/dist/it/codicefiscale.d.ts +5 -4
  370. package/dist/it/codicefiscale.js +27 -23
  371. package/dist/it/codicefiscale.js.map +1 -1
  372. package/dist/it/iva.d.ts +2 -3
  373. package/dist/it/iva.js +2 -9
  374. package/dist/it/iva.js.map +1 -1
  375. package/dist/it/mod.d.ts +3 -2
  376. package/dist/jp/cn.d.ts +2 -3
  377. package/dist/jp/cn.js +1 -9
  378. package/dist/jp/cn.js.map +1 -1
  379. package/dist/jp/mod.d.ts +3 -2
  380. package/dist/jp/mynumber.d.ts +2 -3
  381. package/dist/jp/mynumber.js +1 -10
  382. package/dist/jp/mynumber.js.map +1 -1
  383. package/dist/kr/brn.d.ts +11 -2
  384. package/dist/kr/brn.js +1 -9
  385. package/dist/kr/brn.js.map +1 -1
  386. package/dist/kr/mod.d.ts +3 -2
  387. package/dist/kr/rrn.d.ts +5 -4
  388. package/dist/kr/rrn.js +15 -13
  389. package/dist/kr/rrn.js.map +1 -1
  390. package/dist/kw/civil.d.ts +6 -5
  391. package/dist/kw/civil.js +20 -17
  392. package/dist/kw/civil.js.map +1 -1
  393. package/dist/kw/mod.d.ts +3 -2
  394. package/dist/kz/iin.d.ts +2 -3
  395. package/dist/kz/iin.js +4 -18
  396. package/dist/kz/iin.js.map +1 -1
  397. package/dist/kz/mod.d.ts +3 -2
  398. package/dist/lei.d.ts +2 -3
  399. package/dist/lei.js +2 -11
  400. package/dist/lei.js.map +1 -1
  401. package/dist/li/mod.d.ts +3 -2
  402. package/dist/li/peid.d.ts +11 -2
  403. package/dist/li/peid.js +1 -9
  404. package/dist/li/peid.js.map +1 -1
  405. package/dist/lk/mod.d.ts +3 -2
  406. package/dist/lk/nic.d.ts +5 -4
  407. package/dist/lk/nic.js +16 -16
  408. package/dist/lk/nic.js.map +1 -1
  409. package/dist/lt/asmens.d.ts +2 -3
  410. package/dist/lt/asmens.js +2 -1
  411. package/dist/lt/asmens.js.map +1 -1
  412. package/dist/lt/mod.d.ts +3 -2
  413. package/dist/lt/vat.d.ts +2 -3
  414. package/dist/lt/vat.js +2 -10
  415. package/dist/lt/vat.js.map +1 -1
  416. package/dist/lu/mod.d.ts +3 -2
  417. package/dist/lu/vat.d.ts +2 -3
  418. package/dist/lu/vat.js +2 -8
  419. package/dist/lu/vat.js.map +1 -1
  420. package/dist/luhn.d.ts +2 -3
  421. package/dist/luhn.js +9 -9
  422. package/dist/luhn.js.map +1 -1
  423. package/dist/lv/mod.d.ts +3 -2
  424. package/dist/lv/vat.d.ts +2 -3
  425. package/dist/lv/vat.js +19 -18
  426. package/dist/lv/vat.js.map +1 -1
  427. package/dist/ma/ice.d.ts +2 -3
  428. package/dist/ma/ice.js +2 -11
  429. package/dist/ma/ice.js.map +1 -1
  430. package/dist/ma/mod.d.ts +3 -2
  431. package/dist/mc/mod.d.ts +3 -2
  432. package/dist/mc/tva.d.ts +2 -3
  433. package/dist/mc/tva.js +1 -0
  434. package/dist/mc/tva.js.map +1 -1
  435. package/dist/md/idno.d.ts +2 -3
  436. package/dist/md/idno.js +1 -10
  437. package/dist/md/idno.js.map +1 -1
  438. package/dist/md/mod.d.ts +3 -2
  439. package/dist/me/mod.d.ts +3 -2
  440. package/dist/me/pib.d.ts +2 -3
  441. package/dist/me/pib.js +2 -10
  442. package/dist/me/pib.js.map +1 -1
  443. package/dist/mk/edb.d.ts +2 -3
  444. package/dist/mk/edb.js +2 -11
  445. package/dist/mk/edb.js.map +1 -1
  446. package/dist/mk/mod.d.ts +3 -2
  447. package/dist/mt/mod.d.ts +3 -2
  448. package/dist/mt/vat.d.ts +2 -3
  449. package/dist/mt/vat.js +3 -10
  450. package/dist/mt/vat.js.map +1 -1
  451. package/dist/mu/brn.d.ts +23 -2
  452. package/dist/mu/brn.js +1 -21
  453. package/dist/mu/brn.js.map +1 -1
  454. package/dist/mu/mod.d.ts +3 -2
  455. package/dist/mx/clabe.d.ts +2 -3
  456. package/dist/mx/clabe.js +1 -14
  457. package/dist/mx/clabe.js.map +1 -1
  458. package/dist/mx/curp.d.ts +5 -4
  459. package/dist/mx/curp.js +27 -19
  460. package/dist/mx/curp.js.map +1 -1
  461. package/dist/mx/mod.d.ts +3 -2
  462. package/dist/mx/rfc.d.ts +5 -4
  463. package/dist/mx/rfc.js +23 -20
  464. package/dist/mx/rfc.js.map +1 -1
  465. package/dist/my/mod.d.ts +3 -2
  466. package/dist/my/nric.d.ts +5 -4
  467. package/dist/my/nric.js +18 -16
  468. package/dist/my/nric.js.map +1 -1
  469. package/dist/ng/mod.d.ts +3 -2
  470. package/dist/ng/nin.d.ts +13 -2
  471. package/dist/ng/nin.js +1 -11
  472. package/dist/ng/nin.js.map +1 -1
  473. package/dist/ni/mod.d.ts +3 -2
  474. package/dist/ni/ruc.d.ts +2 -3
  475. package/dist/ni/ruc.js +1 -23
  476. package/dist/ni/ruc.js.map +1 -1
  477. package/dist/nl/bsn.d.ts +2 -3
  478. package/dist/nl/bsn.js +2 -10
  479. package/dist/nl/bsn.js.map +1 -1
  480. package/dist/nl/kvk.d.ts +9 -2
  481. package/dist/nl/kvk.js +1 -7
  482. package/dist/nl/kvk.js.map +1 -1
  483. package/dist/nl/mod.d.ts +3 -2
  484. package/dist/nl/vat.d.ts +2 -3
  485. package/dist/nl/vat.js +4 -50
  486. package/dist/nl/vat.js.map +1 -1
  487. package/dist/no/fodselsnummer.d.ts +2 -3
  488. package/dist/no/fodselsnummer.js +3 -10
  489. package/dist/no/fodselsnummer.js.map +1 -1
  490. package/dist/no/mod.d.ts +3 -2
  491. package/dist/no/mva.d.ts +2 -3
  492. package/dist/no/mva.js +1 -8
  493. package/dist/no/mva.js.map +1 -1
  494. package/dist/no/orgnr.d.ts +2 -3
  495. package/dist/no/orgnr.js +2 -8
  496. package/dist/no/orgnr.js.map +1 -1
  497. package/dist/nz/ird.d.ts +2 -3
  498. package/dist/nz/ird.js +4 -13
  499. package/dist/nz/ird.js.map +1 -1
  500. package/dist/nz/mod.d.ts +3 -2
  501. package/dist/pa/mod.d.ts +3 -2
  502. package/dist/pa/ruc.d.ts +2 -3
  503. package/dist/pa/ruc.js +4 -19
  504. package/dist/pa/ruc.js.map +1 -1
  505. package/dist/patterns.d.ts +8 -10
  506. package/dist/patterns.js +83 -28
  507. package/dist/patterns.js.map +1 -1
  508. package/dist/pe/mod.d.ts +3 -2
  509. package/dist/pe/ruc.d.ts +2 -3
  510. package/dist/pe/ruc.js +10 -24
  511. package/dist/pe/ruc.js.map +1 -1
  512. package/dist/ph/mod.d.ts +3 -2
  513. package/dist/ph/philid.d.ts +14 -2
  514. package/dist/ph/philid.js +1 -12
  515. package/dist/ph/philid.js.map +1 -1
  516. package/dist/pk/cnic.d.ts +14 -2
  517. package/dist/pk/cnic.js +1 -12
  518. package/dist/pk/cnic.js.map +1 -1
  519. package/dist/pk/mod.d.ts +3 -2
  520. package/dist/pl/mod.d.ts +3 -2
  521. package/dist/pl/nip.d.ts +2 -3
  522. package/dist/pl/nip.js +2 -10
  523. package/dist/pl/nip.js.map +1 -1
  524. package/dist/pl/pesel.d.ts +2 -3
  525. package/dist/pl/pesel.js +4 -13
  526. package/dist/pl/pesel.js.map +1 -1
  527. package/dist/pl/regon.d.ts +2 -3
  528. package/dist/pl/regon.js +2 -11
  529. package/dist/pl/regon.js.map +1 -1
  530. package/dist/pt/cc.d.ts +2 -3
  531. package/dist/pt/cc.js +7 -13
  532. package/dist/pt/cc.js.map +1 -1
  533. package/dist/pt/mod.d.ts +3 -2
  534. package/dist/pt/vat.d.ts +2 -3
  535. package/dist/pt/vat.js +3 -11
  536. package/dist/pt/vat.js.map +1 -1
  537. package/dist/ro/cnp.d.ts +2 -3
  538. package/dist/ro/cnp.js +5 -14
  539. package/dist/ro/cnp.js.map +1 -1
  540. package/dist/ro/mod.d.ts +3 -2
  541. package/dist/ro/vat.d.ts +2 -3
  542. package/dist/ro/vat.js +13 -11
  543. package/dist/ro/vat.js.map +1 -1
  544. package/dist/rs/mod.d.ts +3 -2
  545. package/dist/rs/pib.d.ts +2 -3
  546. package/dist/rs/pib.js +1 -9
  547. package/dist/rs/pib.js.map +1 -1
  548. package/dist/ru/inn.d.ts +2 -3
  549. package/dist/ru/inn.js +2 -12
  550. package/dist/ru/inn.js.map +1 -1
  551. package/dist/ru/mod.d.ts +3 -2
  552. package/dist/se/mod.d.ts +3 -2
  553. package/dist/se/orgnr.d.ts +2 -3
  554. package/dist/se/orgnr.js +2 -9
  555. package/dist/se/orgnr.js.map +1 -1
  556. package/dist/se/personnummer.d.ts +2 -3
  557. package/dist/se/personnummer.js +8 -15
  558. package/dist/se/personnummer.js.map +1 -1
  559. package/dist/se/vat.d.ts +2 -3
  560. package/dist/se/vat.js +3 -10
  561. package/dist/se/vat.js.map +1 -1
  562. package/dist/sg/mod.d.ts +3 -2
  563. package/dist/sg/uen.d.ts +2 -3
  564. package/dist/sg/uen.js +47 -70
  565. package/dist/sg/uen.js.map +1 -1
  566. package/dist/si/emso.d.ts +2 -3
  567. package/dist/si/emso.js +12 -14
  568. package/dist/si/emso.js.map +1 -1
  569. package/dist/si/mod.d.ts +3 -2
  570. package/dist/si/vat.d.ts +2 -3
  571. package/dist/si/vat.js +3 -12
  572. package/dist/si/vat.js.map +1 -1
  573. package/dist/sk/dic.d.ts +2 -3
  574. package/dist/sk/dic.js +1 -0
  575. package/dist/sk/dic.js.map +1 -1
  576. package/dist/sk/ico.d.ts +2 -3
  577. package/dist/sk/ico.js +1 -0
  578. package/dist/sk/ico.js.map +1 -1
  579. package/dist/sk/mod.d.ts +3 -2
  580. package/dist/sk/rc.d.ts +4 -5
  581. package/dist/sk/rc.js +6 -2
  582. package/dist/sk/rc.js.map +1 -1
  583. package/dist/th/mod.d.ts +3 -2
  584. package/dist/th/tin.d.ts +2 -3
  585. package/dist/th/tin.js +1 -11
  586. package/dist/th/tin.js.map +1 -1
  587. package/dist/tr/mod.d.ts +3 -2
  588. package/dist/tr/tckimlik.d.ts +2 -3
  589. package/dist/tr/tckimlik.js +1 -20
  590. package/dist/tr/tckimlik.js.map +1 -1
  591. package/dist/tr/vkn.d.ts +2 -3
  592. package/dist/tr/vkn.js +1 -20
  593. package/dist/tr/vkn.js.map +1 -1
  594. package/dist/tw/mod.d.ts +3 -2
  595. package/dist/tw/ubn.d.ts +2 -3
  596. package/dist/tw/ubn.js +2 -12
  597. package/dist/tw/ubn.js.map +1 -1
  598. package/dist/types.d.ts +56 -21
  599. package/dist/ua/edrpou.d.ts +2 -3
  600. package/dist/ua/edrpou.js +5 -12
  601. package/dist/ua/edrpou.js.map +1 -1
  602. package/dist/ua/mod.d.ts +3 -2
  603. package/dist/us/ein.d.ts +12 -2
  604. package/dist/us/ein.js +88 -97
  605. package/dist/us/ein.js.map +1 -1
  606. package/dist/us/itin.d.ts +13 -2
  607. package/dist/us/itin.js +4 -15
  608. package/dist/us/itin.js.map +1 -1
  609. package/dist/us/mod.d.ts +3 -2
  610. package/dist/us/rtn.d.ts +2 -3
  611. package/dist/us/rtn.js +11 -23
  612. package/dist/us/rtn.js.map +1 -1
  613. package/dist/us/ssn.d.ts +13 -2
  614. package/dist/us/ssn.js +1 -11
  615. package/dist/us/ssn.js.map +1 -1
  616. package/dist/uy/mod.d.ts +3 -2
  617. package/dist/uy/rut.d.ts +2 -3
  618. package/dist/uy/rut.js +2 -15
  619. package/dist/uy/rut.js.map +1 -1
  620. package/dist/ve/mod.d.ts +3 -2
  621. package/dist/ve/rif.d.ts +2 -3
  622. package/dist/ve/rif.js +13 -26
  623. package/dist/ve/rif.js.map +1 -1
  624. package/dist/vn/mod.d.ts +3 -2
  625. package/dist/vn/mst.d.ts +2 -3
  626. package/dist/vn/mst.js +1 -12
  627. package/dist/vn/mst.js.map +1 -1
  628. package/dist/za/idnr.d.ts +2 -3
  629. package/dist/za/idnr.js +4 -16
  630. package/dist/za/idnr.js.map +1 -1
  631. package/dist/za/mod.d.ts +3 -2
  632. package/package.json +34 -21
  633. package/src/_checksums/mod1110.ts +1 -1
  634. package/src/_checksums/mod112.ts +7 -6
  635. package/src/_util/generate.ts +38 -0
  636. package/src/ad/nrt.ts +19 -7
  637. package/src/ae/eid.ts +7 -3
  638. package/src/ai/tin.ts +7 -3
  639. package/src/al/nipt.ts +7 -3
  640. package/src/am/tin.ts +7 -3
  641. package/src/ar/cbu.ts +9 -5
  642. package/src/ar/cuit.ts +22 -10
  643. package/src/ar/dni.ts +7 -3
  644. package/src/at/businessid.ts +7 -3
  645. package/src/at/tin.ts +7 -3
  646. package/src/at/uid.ts +7 -3
  647. package/src/at/vnr.ts +62 -12
  648. package/src/au/abn.ts +7 -3
  649. package/src/au/acn.ts +7 -3
  650. package/src/au/tfn.ts +7 -3
  651. package/src/az/voen.ts +9 -3
  652. package/src/ba/jmbg.ts +9 -7
  653. package/src/bd/nid.ts +11 -7
  654. package/src/be/bis.ts +8 -4
  655. package/src/be/nn.ts +7 -3
  656. package/src/be/vat.ts +7 -3
  657. package/src/bg/egn.ts +19 -10
  658. package/src/bg/pnf.ts +7 -3
  659. package/src/bg/vat.ts +8 -3
  660. package/src/bh/cpr.ts +17 -4
  661. package/src/bic.ts +26 -20
  662. package/src/br/cnpj.ts +7 -3
  663. package/src/br/cpf.ts +7 -3
  664. package/src/by/unp.ts +19 -9
  665. package/src/bz/tin.ts +19 -4
  666. package/src/ca/bn.ts +7 -3
  667. package/src/ca/sin.ts +7 -3
  668. package/src/ch/ssn.ts +7 -3
  669. package/src/ch/uid.ts +7 -3
  670. package/src/ch/vat.ts +9 -5
  671. package/src/cl/rut.ts +11 -5
  672. package/src/cn/ric.ts +11 -7
  673. package/src/cn/uscc.ts +27 -11
  674. package/src/co/nit.ts +14 -6
  675. package/src/cr/cpf.ts +11 -6
  676. package/src/creditcard.ts +10 -6
  677. package/src/cu/ni.ts +28 -7
  678. package/src/cy/vat.ts +7 -3
  679. package/src/cz/dic.ts +9 -4
  680. package/src/cz/ico.ts +7 -3
  681. package/src/cz/rc.ts +61 -29
  682. package/src/de/handelsreg.ts +21 -6
  683. package/src/de/idnr.ts +10 -3
  684. package/src/de/stnr.ts +11 -3
  685. package/src/de/svnr.ts +14 -5
  686. package/src/de/vat.ts +7 -3
  687. package/src/dk/cpr.ts +23 -8
  688. package/src/dk/cvr.ts +7 -3
  689. package/src/dk/vat.ts +8 -3
  690. package/src/do/rnc.ts +9 -5
  691. package/src/ec/ruc.ts +9 -5
  692. package/src/ee/ik.ts +21 -10
  693. package/src/ee/registrikood.ts +12 -7
  694. package/src/ee/vat.ts +7 -3
  695. package/src/eg/tn.ts +7 -3
  696. package/src/es/cif.ts +10 -7
  697. package/src/es/dni.ts +7 -3
  698. package/src/es/nie.ts +18 -9
  699. package/src/es/nss.ts +7 -3
  700. package/src/es/vat.ts +13 -5
  701. package/src/eu/vat.ts +55 -6
  702. package/src/fi/hetu.ts +26 -8
  703. package/src/fi/vat.ts +8 -3
  704. package/src/fi/ytunnus.ts +7 -3
  705. package/src/fr/nif.ts +7 -3
  706. package/src/fr/nir.ts +9 -7
  707. package/src/fr/siren.ts +7 -3
  708. package/src/fr/siret.ts +7 -3
  709. package/src/fr/tva.ts +7 -3
  710. package/src/gb/nino.ts +18 -13
  711. package/src/gb/sedol.ts +21 -15
  712. package/src/gb/utr.ts +7 -3
  713. package/src/gb/vat.ts +7 -3
  714. package/src/ge/pin.ts +7 -3
  715. package/src/gh/tin.ts +11 -6
  716. package/src/gr/amka.ts +7 -3
  717. package/src/gr/vat.ts +7 -3
  718. package/src/gt/nit.ts +13 -6
  719. package/src/hk/hkid.ts +9 -4
  720. package/src/hr/vat.ts +7 -3
  721. package/src/hu/vat.ts +8 -3
  722. package/src/iban.ts +7 -3
  723. package/src/id/npwp.ts +7 -3
  724. package/src/ie/pps.ts +7 -3
  725. package/src/ie/vat.ts +7 -3
  726. package/src/il/idnr.ts +7 -3
  727. package/src/in/aadhaar.ts +7 -3
  728. package/src/in/gstin.ts +10 -4
  729. package/src/in/pan.ts +15 -6
  730. package/src/index.ts +6 -0
  731. package/src/iq/nid.ts +7 -3
  732. package/src/ir/nid.ts +7 -3
  733. package/src/is/kennitala.ts +7 -3
  734. package/src/is/vsk.ts +7 -3
  735. package/src/isin.ts +17 -7
  736. package/src/it/codicefiscale.ts +49 -7
  737. package/src/it/iva.ts +7 -3
  738. package/src/jp/cn.ts +7 -3
  739. package/src/jp/mynumber.ts +7 -3
  740. package/src/kr/brn.ts +7 -3
  741. package/src/kr/rrn.ts +27 -8
  742. package/src/kw/civil.ts +31 -14
  743. package/src/kz/iin.ts +9 -8
  744. package/src/lei.ts +7 -3
  745. package/src/li/peid.ts +7 -3
  746. package/src/lk/nic.ts +31 -8
  747. package/src/lt/asmens.ts +8 -4
  748. package/src/lt/vat.ts +8 -3
  749. package/src/lu/vat.ts +8 -3
  750. package/src/luhn.ts +10 -3
  751. package/src/lv/vat.ts +53 -23
  752. package/src/ma/ice.ts +7 -3
  753. package/src/mc/tva.ts +9 -5
  754. package/src/md/idno.ts +7 -3
  755. package/src/me/pib.ts +7 -3
  756. package/src/mk/edb.ts +7 -3
  757. package/src/mt/vat.ts +8 -3
  758. package/src/mu/brn.ts +7 -3
  759. package/src/mx/clabe.ts +7 -3
  760. package/src/mx/curp.ts +47 -10
  761. package/src/mx/rfc.ts +42 -7
  762. package/src/my/nric.ts +33 -8
  763. package/src/ng/nin.ts +7 -3
  764. package/src/ni/ruc.ts +7 -3
  765. package/src/nl/bsn.ts +7 -3
  766. package/src/nl/kvk.ts +7 -3
  767. package/src/nl/vat.ts +18 -69
  768. package/src/no/fodselsnummer.ts +12 -7
  769. package/src/no/mva.ts +9 -5
  770. package/src/no/orgnr.ts +7 -3
  771. package/src/nz/ird.ts +12 -8
  772. package/src/pa/ruc.ts +39 -11
  773. package/src/patterns.ts +184 -46
  774. package/src/pe/ruc.ts +13 -10
  775. package/src/ph/philid.ts +7 -3
  776. package/src/pk/cnic.ts +9 -3
  777. package/src/pl/nip.ts +7 -3
  778. package/src/pl/pesel.ts +9 -7
  779. package/src/pl/regon.ts +7 -3
  780. package/src/pt/cc.ts +13 -7
  781. package/src/pt/vat.ts +8 -3
  782. package/src/ro/cnp.ts +16 -8
  783. package/src/ro/vat.ts +8 -3
  784. package/src/rs/pib.ts +7 -3
  785. package/src/ru/inn.ts +9 -5
  786. package/src/se/orgnr.ts +7 -3
  787. package/src/se/personnummer.ts +35 -32
  788. package/src/se/vat.ts +8 -3
  789. package/src/sg/uen.ts +44 -23
  790. package/src/si/emso.ts +37 -11
  791. package/src/si/vat.ts +8 -3
  792. package/src/sk/dic.ts +8 -4
  793. package/src/sk/ico.ts +3 -2
  794. package/src/sk/rc.ts +17 -4
  795. package/src/th/tin.ts +7 -3
  796. package/src/tr/tckimlik.ts +7 -3
  797. package/src/tr/vkn.ts +7 -3
  798. package/src/tw/ubn.ts +9 -5
  799. package/src/types.ts +69 -7
  800. package/src/ua/edrpou.ts +10 -5
  801. package/src/us/ein.ts +95 -91
  802. package/src/us/itin.ts +14 -11
  803. package/src/us/rtn.ts +32 -19
  804. package/src/us/ssn.ts +7 -3
  805. package/src/uy/rut.ts +9 -5
  806. package/src/ve/rif.ts +19 -12
  807. package/src/vn/mst.ts +7 -3
  808. package/src/za/idnr.ts +9 -7
@@ -1 +1 @@
1
- {"version":3,"file":"rut.js","names":[],"sources":["../../src/cl/rut.ts"],"sourcesContent":["/**\n * RUT (Rol Único Tributario).\n *\n * Chilean tax identification number assigned by the SII\n * (Servicio de Impuestos Internos). The number consists\n * of 7 or 8 digits followed by a check digit (0-9 or K),\n * computed using a modulo 11 algorithm with weights\n * [2, 3, 4, 5, 6, 7] cycling right-to-left.\n *\n * Format: XX.XXX.XXX-C (7-8 digits + check digit).\n *\n * @see https://www.sii.cl/\n * @see https://en.wikipedia.org/wiki/Rol_%C3%9Anico_Tributario\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst RUT_RE = /^\\d{7,8}[\\dK]$/;\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -.\").trim().toUpperCase();\n if (v.startsWith(\"CL\")) v = v.slice(2);\n return v;\n};\n\n/**\n * Compute the RUT check digit using mod 11 with\n * weights [2, 3, 4, 5, 6, 7] cycling right-to-left.\n *\n * remainder = 11 - (weighted sum % 11)\n * 11 -> \"0\", 10 -> \"K\", else the digit as string.\n */\nconst calcCheckDigit = (body: string): string => {\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n for (let i = body.length - 1, w = 0; i >= 0; i--, w++) {\n sum += Number(body[i]) * weights[w % 6]!;\n }\n const remainder = 11 - (sum % 11);\n if (remainder === 11) return \"0\";\n if (remainder === 10) return \"K\";\n return String(remainder);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 8 && v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"RUT must be 8 or 9 characters\",\n );\n }\n\n if (!RUT_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"RUT must contain only digits and optionally K\",\n );\n }\n\n const body = v.slice(0, -1);\n const expected = calcCheckDigit(body);\n if (v.at(-1) !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RUT check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const check = v.at(-1);\n const body = v.slice(0, -1);\n return (\n `${body.slice(0, -6)}.${body.slice(-6, -3)}` +\n `.${body.slice(-3)}-${check}`\n );\n};\n\n/** Generate a random valid Chilean RUT. */\nconst generate = (): string => {\n const body = randomDigits(8);\n return body + calcCheckDigit(body);\n};\n\n/**\n * Chilean RUT (tax identification number).\n *\n * Examples sourced from python-stdnum test suite\n * (cl.rut module).\n */\nconst rut: Validator = {\n name: \"Chilean Tax ID\",\n localName: \"Rol Único Tributario\",\n abbreviation: \"RUT\",\n aliases: [\"RUT\", \"Rol Único Tributario\"] as const,\n candidatePattern: \"\\\\d{1,2}\\\\.?\\\\d{3}\\\\.?\\\\d{3}-?[\\\\dkK]\",\n country: \"CL\",\n entityType: \"any\",\n compact,\n format,\n validate,\n sourceUrl: \"https://www.sii.cl/\",\n lengths: [8, 9] as const,\n examples: [\"760864285\", \"125319092\"] as const,\n generate,\n};\n\nexport default rut;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqBA,MAAM,SAAS;AAEf,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa;AAChD,KAAI,EAAE,WAAW,KAAK,CAAE,KAAI,EAAE,MAAM,EAAE;AACtC,QAAO;;;;;;;;;AAUT,MAAM,kBAAkB,SAAyB;CAC/C,MAAM,UAAU;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAE;CAClC,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,IAChD,QAAO,OAAO,KAAK,GAAG,GAAG,QAAQ,IAAI;CAEvC,MAAM,YAAY,KAAM,MAAM;AAC9B,KAAI,cAAc,GAAI,QAAO;AAC7B,KAAI,cAAc,GAAI,QAAO;AAC7B,QAAO,OAAO,UAAU;;AAG1B,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EACjC,QAAO,IACL,kBACA,gCACD;AAGH,KAAI,CAAC,OAAO,KAAK,EAAE,CACjB,QAAO,IACL,kBACA,gDACD;CAIH,MAAM,WAAW,eADJ,EAAE,MAAM,GAAG,GAAG,CACU;AACrC,KAAI,EAAE,GAAG,GAAG,KAAK,SACf,QAAO,IACL,oBACA,iCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;CACxB,MAAM,QAAQ,EAAE,GAAG,GAAG;CACtB,MAAM,OAAO,EAAE,MAAM,GAAG,GAAG;AAC3B,QACE,GAAG,KAAK,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,CAAA,GACtC,KAAK,MAAM,GAAG,CAAC,GAAG;;;AAK1B,MAAM,iBAAyB;CAC7B,MAAM,OAAO,aAAa,EAAE;AAC5B,QAAO,OAAO,eAAe,KAAK;;;;;;;;AASpC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,uBAAuB;CACxC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,WAAW;CACX,SAAS,CAAC,GAAG,EAAE;CACf,UAAU,CAAC,aAAa,YAAY;CACpC;CACD"}
1
+ {"version":3,"file":"rut.js","names":[],"sources":["../../src/cl/rut.ts"],"sourcesContent":["/**\n * RUT (Rol Único Tributario).\n *\n * Chilean tax identification number assigned by the SII\n * (Servicio de Impuestos Internos). The number consists\n * of 7 or 8 digits followed by a check digit (0-9 or K),\n * computed using a modulo 11 algorithm with weights\n * [2, 3, 4, 5, 6, 7] cycling right-to-left.\n *\n * Format: XX.XXX.XXX-C (7-8 digits + check digit).\n *\n * @see https://www.sii.cl/\n * @see https://en.wikipedia.org/wiki/Rol_%C3%9Anico_Tributario\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nconst RUT_RE = /^\\d{7,8}[\\dK]$/;\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -.\").trim().toUpperCase();\n if (v.startsWith(\"CL\")) v = v.slice(2);\n return v;\n};\n\n/**\n * Compute the RUT check digit using mod 11 with\n * weights [2, 3, 4, 5, 6, 7] cycling right-to-left.\n *\n * remainder = 11 - (weighted sum % 11)\n * 11 -> \"0\", 10 -> \"K\", else the digit as string.\n */\nconst calcCheckDigit = (body: string): string => {\n const weights = [2, 3, 4, 5, 6, 7] as const;\n let sum = 0;\n for (let i = body.length - 1, w = 0; i >= 0; i--, w++) {\n // SAFETY: w % weights.length is a valid index.\n // eslint-disable-next-line no-non-null-assertion\n sum += Number(body[i]) * weights[w % weights.length]!;\n }\n const remainder = 11 - (sum % 11);\n if (remainder === 11) return \"0\";\n if (remainder === 10) return \"K\";\n return String(remainder);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 8 && v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"RUT must be 8 or 9 characters\",\n );\n }\n\n if (!RUT_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"RUT must contain only digits and optionally K\",\n );\n }\n\n const body = v.slice(0, -1);\n const expected = calcCheckDigit(body);\n if (v.at(-1) !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RUT check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const check = v.at(-1);\n const body = v.slice(0, -1);\n return (\n `${body.slice(0, -6)}.${body.slice(-6, -3)}` +\n `.${body.slice(-3)}-${check}`\n );\n};\n\n/** Generate a random valid Chilean RUT. */\nconst generate = (): string => {\n const body = randomDigits(8);\n return body + calcCheckDigit(body);\n};\n\n/**\n * Chilean RUT (tax identification number).\n *\n * Examples sourced from python-stdnum test suite\n * (cl.rut module).\n */\nconst rut: CountryValidator<\"CL\"> = {\n name: \"Chilean Tax ID\",\n localName: \"Rol Único Tributario\",\n abbreviation: \"RUT\",\n aliases: [\"RUT\", \"Rol Único Tributario\"] as const,\n candidatePattern: \"\\\\d{1,2}\\\\.?\\\\d{3}\\\\.?\\\\d{3}-?[\\\\dkK]\",\n scope: \"country\",\n country: \"CL\",\n entityType: \"any\",\n compact,\n format,\n validate,\n sourceUrl: \"https://www.sii.cl/\",\n lengths: [8, 9] as const,\n examples: [\"760864285\", \"125319092\"] as const,\n generate,\n};\n\nexport default rut;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;AAwBA,MAAM,SAAS;AAEf,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY;CAC/C,IAAI,EAAE,WAAW,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC;CACrC,OAAO;AACT;;;;;;;;AASA,MAAM,kBAAkB,SAAyB;CAC/C,MAAM,UAAU;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CACjC,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,KAGhD,OAAO,OAAO,KAAK,EAAE,IAAI,QAAQ,IAAI,QAAQ;CAE/C,MAAM,YAAY,KAAM,MAAM;CAC9B,IAAI,cAAc,IAAI,OAAO;CAC7B,IAAI,cAAc,IAAI,OAAO;CAC7B,OAAO,OAAO,SAAS;AACzB;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,OAAO,IACL,kBACA,+BACF;CAGF,IAAI,CAAC,OAAO,KAAK,CAAC,GAChB,OAAO,IACL,kBACA,+CACF;CAIF,MAAM,WAAW,eADJ,EAAE,MAAM,GAAG,EACW,CAAC;CACpC,IAAI,EAAE,GAAG,EAAE,MAAM,UACf,OAAO,IACL,oBACA,gCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,MAAM,QAAQ,EAAE,GAAG,EAAE;CACrB,MAAM,OAAO,EAAE,MAAM,GAAG,EAAE;CAC1B,OACE,GAAG,KAAK,MAAM,GAAG,EAAE,EAAE,GAAG,KAAK,MAAM,IAAI,EAAE,EAAA,GACrC,KAAK,MAAM,EAAE,EAAE,GAAG;AAE1B;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,OAAO,aAAa,CAAC;CAC3B,OAAO,OAAO,eAAe,IAAI;AACnC;;;;;;;AAQA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,sBAAsB;CACvC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,WAAW;CACX,SAAS,CAAC,GAAG,CAAC;CACd,UAAU,CAAC,aAAa,WAAW;CACnC;AACF"}
package/dist/cn/mod.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import ric from "./ric.js";
3
2
  import uscc from "./uscc.js";
4
3
 
5
4
  //#region src/cn/mod.d.ts
6
-
5
+ declare namespace mod_d_exports {
6
+ export { ric, uscc };
7
+ }
7
8
  //#endregion
8
9
  export { mod_d_exports, ric, uscc };
9
10
  //# sourceMappingURL=mod.d.ts.map
package/dist/cn/ric.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { ParsedPersonId, ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ParsedPersonId, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/cn/ric.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
@@ -13,7 +12,7 @@ declare const parse: (value: string) => ParsedPersonId | null;
13
12
  /** Generate a random valid 18-digit RIC. */
14
13
  declare const generate: () => string;
15
14
  /** Chinese Resident Identity Card number. */
16
- declare const ric: Validator;
15
+ declare const ric: CountryValidator<"CN", ParsedPersonId>;
17
16
  //#endregion
18
17
  export { compact, ric as default, format, generate, parse, validate };
19
18
  //# sourceMappingURL=ric.d.ts.map
package/dist/cn/ric.js CHANGED
@@ -1,22 +1,10 @@
1
+ import { mod112checkChar, mod112validate } from "../_checksums/mod112.js";
1
2
  import { clean } from "../_util/clean.js";
3
+ import { isValidDate } from "../_util/date.js";
2
4
  import { randomInt } from "../_util/generate.js";
3
5
  import { err } from "../_util/result.js";
4
6
  import { isdigits } from "../_util/strings.js";
5
- import { isValidDate } from "../_util/date.js";
6
- import { mod112checkChar, mod112validate } from "../_checksums/mod112.js";
7
7
  //#region src/cn/ric.ts
8
- /**
9
- * RIC (Resident Identity Card number, 居民身份证号码).
10
- *
11
- * Chinese national identifier. 18 characters:
12
- * 6 (area code) + 8 (YYYYMMDD birth) + 3 (sequence,
13
- * odd = male) + 1 (check, 0-9 or X).
14
- *
15
- * Also accepts the legacy 15-digit format (no check
16
- * digit, 2-digit year).
17
- *
18
- * @see https://en.wikipedia.org/wiki/Resident_Identity_Card
19
- */
20
8
  const compact = (value) => clean(value, " -").toUpperCase();
21
9
  const validate = (value) => {
22
10
  const v = compact(value);
@@ -91,6 +79,7 @@ const ric = {
91
79
  "RIC"
92
80
  ],
93
81
  candidatePattern: "\\d{17}[\\dX]",
82
+ scope: "country",
94
83
  country: "CN",
95
84
  entityType: "person",
96
85
  description: "18-character national ID encoding area, birth date, gender, and check digit",
@@ -99,6 +88,7 @@ const ric = {
99
88
  examples: ["11010519491231002X", "440524188001010014"],
100
89
  compact,
101
90
  format,
91
+ parse,
102
92
  validate,
103
93
  generate
104
94
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ric.js","names":[],"sources":["../../src/cn/ric.ts"],"sourcesContent":["/**\n * RIC (Resident Identity Card number, 居民身份证号码).\n *\n * Chinese national identifier. 18 characters:\n * 6 (area code) + 8 (YYYYMMDD birth) + 3 (sequence,\n * odd = male) + 1 (check, 0-9 or X).\n *\n * Also accepts the legacy 15-digit format (no check\n * digit, 2-digit year).\n *\n * @see https://en.wikipedia.org/wiki/Resident_Identity_Card\n */\n\nimport {\n mod112checkChar,\n mod112validate,\n} from \"#checksums/mod112\";\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type {\n ParsedPersonId,\n ValidateResult,\n Validator,\n} from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 15 && v.length !== 18) {\n return err(\n \"INVALID_LENGTH\",\n \"RIC must be 15 or 18 characters\",\n );\n }\n\n if (v.length === 15) {\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"15-digit RIC must contain only digits\",\n );\n }\n // Validate date: digits 6-11 are YYMMDD\n const year = 1900 + Number(v.slice(6, 8));\n const month = Number(v.slice(8, 10));\n const day = Number(v.slice(10, 12));\n if (!isValidDate(year, month, day)) {\n return err(\n \"INVALID_COMPONENT\",\n \"RIC contains an invalid birth date\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // 18-character format\n if (!isdigits(v.slice(0, 17))) {\n return err(\n \"INVALID_FORMAT\",\n \"RIC must contain only digits (plus check char)\",\n );\n }\n const lastChar = v[17]!;\n if (!isdigits(lastChar) && lastChar !== \"X\") {\n return err(\n \"INVALID_FORMAT\",\n \"RIC check character must be 0-9 or X\",\n );\n }\n\n // Validate date: digits 6-13 are YYYYMMDD\n const year = Number(v.slice(6, 10));\n const month = Number(v.slice(10, 12));\n const day = Number(v.slice(12, 14));\n if (!isValidDate(year, month, day)) {\n return err(\n \"INVALID_COMPONENT\",\n \"RIC contains an invalid birth date\",\n );\n }\n\n if (!mod112validate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RIC check character does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/**\n * Extract birth date and gender from an RIC number.\n * Returns null if the value is not valid.\n */\nconst parse = (value: string): ParsedPersonId | null => {\n const result = validate(value);\n if (!result.valid) return null;\n\n const v = result.compact;\n\n let year: number;\n let month: number;\n let day: number;\n let seq: number;\n\n if (v.length === 15) {\n year = 1900 + Number(v.slice(6, 8));\n month = Number(v.slice(8, 10));\n day = Number(v.slice(10, 12));\n seq = Number(v.slice(12, 15));\n } else {\n year = Number(v.slice(6, 10));\n month = Number(v.slice(10, 12));\n day = Number(v.slice(12, 14));\n seq = Number(v.slice(14, 17));\n }\n\n const gender = seq % 2 === 1 ? \"male\" : \"female\";\n\n return {\n birthDate: new Date(year, month - 1, day),\n gender,\n };\n};\n\n/** Generate a random valid 18-digit RIC. */\nconst generate = (): string => {\n // Use a simple area code prefix\n const area = String(randomInt(110000, 659999));\n const year = randomInt(1950, 2005);\n const month = randomInt(1, 12);\n const day = randomInt(1, 28);\n const seqNum = randomInt(1, 999);\n const seq = String(seqNum).padStart(3, \"0\");\n\n const yStr = String(year);\n const mStr = String(month).padStart(2, \"0\");\n const dStr = String(day).padStart(2, \"0\");\n\n const payload = `${area}${yStr}${mStr}${dStr}${seq}`;\n const check = mod112checkChar(payload);\n return `${payload}${check}`;\n};\n\n/** Chinese Resident Identity Card number. */\nconst ric: Validator = {\n name: \"Chinese Resident Identity Card\",\n localName: \"居民身份证号码\",\n abbreviation: \"RIC\",\n aliases: [\"身份证\", \"居民身份证号码\", \"RIC\"] as const,\n candidatePattern: \"\\\\d{17}[\\\\dX]\",\n country: \"CN\",\n entityType: \"person\",\n description:\n \"18-character national ID encoding area, birth date, gender, and check digit\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/Resident_Identity_Card\",\n lengths: [15, 18] as const,\n examples: [\n \"11010519491231002X\",\n \"440524188001010014\",\n ] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default ric;\nexport { compact, format, generate, parse, validate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA6BA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,CAAC,aAAa;AAElC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,MAAM,EAAE,WAAW,GAClC,QAAO,IACL,kBACA,kCACD;AAGH,KAAI,EAAE,WAAW,IAAI;AACnB,MAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,wCACD;AAMH,MAAI,CAAC,YAHQ,OAAO,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,EAC3B,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,EACxB,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,CACD,CAChC,QAAO,IACL,qBACA,qCACD;AAEH,SAAO;GAAE,OAAO;GAAM,SAAS;GAAG;;AAIpC,KAAI,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC,CAC3B,QAAO,IACL,kBACA,iDACD;CAEH,MAAM,WAAW,EAAE;AACnB,KAAI,CAAC,SAAS,SAAS,IAAI,aAAa,IACtC,QAAO,IACL,kBACA,uCACD;AAOH,KAAI,CAAC,YAHQ,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,EACrB,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,EACzB,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,CACD,CAChC,QAAO,IACL,qBACA,qCACD;AAGH,KAAI,CAAC,eAAe,EAAE,CACpB,QAAO,IACL,oBACA,qCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;;;;AAMxD,MAAM,SAAS,UAAyC;CACtD,MAAM,SAAS,SAAS,MAAM;AAC9B,KAAI,CAAC,OAAO,MAAO,QAAO;CAE1B,MAAM,IAAI,OAAO;CAEjB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AAEJ,KAAI,EAAE,WAAW,IAAI;AACnB,SAAO,OAAO,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;AACnC,UAAQ,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;AAC9B,QAAM,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;AAC7B,QAAM,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;QACxB;AACL,SAAO,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;AAC7B,UAAQ,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;AAC/B,QAAM,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;AAC7B,QAAM,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;;CAG/B,MAAM,SAAS,MAAM,MAAM,IAAI,SAAS;AAExC,QAAO;EACL,WAAW,IAAI,KAAK,MAAM,QAAQ,GAAG,IAAI;EACzC;EACD;;;AAIH,MAAM,iBAAyB;CAE7B,MAAM,OAAO,OAAO,UAAU,MAAQ,OAAO,CAAC;CAC9C,MAAM,OAAO,UAAU,MAAM,KAAK;CAClC,MAAM,QAAQ,UAAU,GAAG,GAAG;CAC9B,MAAM,MAAM,UAAU,GAAG,GAAG;CAC5B,MAAM,SAAS,UAAU,GAAG,IAAI;CAChC,MAAM,MAAM,OAAO,OAAO,CAAC,SAAS,GAAG,IAAI;CAM3C,MAAM,UAAU,GAAG,OAJN,OAAO,KAAK,GACZ,OAAO,MAAM,CAAC,SAAS,GAAG,IAAI,GAC9B,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,GAEM;AAE/C,QAAO,GAAG,UADI,gBAAgB,QAAQ;;;AAKxC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAO;EAAW;EAAM;CAClC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,aACE;CACF,WACE;CACF,SAAS,CAAC,IAAI,GAAG;CACjB,UAAU,CACR,sBACA,qBACD;CACD;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"ric.js","names":[],"sources":["../../src/cn/ric.ts"],"sourcesContent":["/**\n * RIC (Resident Identity Card number, 居民身份证号码).\n *\n * Chinese national identifier. 18 characters:\n * 6 (area code) + 8 (YYYYMMDD birth) + 3 (sequence,\n * odd = male) + 1 (check, 0-9 or X).\n *\n * Also accepts the legacy 15-digit format (no check\n * digit, 2-digit year).\n *\n * @see https://en.wikipedia.org/wiki/Resident_Identity_Card\n */\n\nimport type {\n ParsedPersonId,\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n mod112checkChar,\n mod112validate,\n} from \"#checksums/mod112\";\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 15 && v.length !== 18) {\n return err(\n \"INVALID_LENGTH\",\n \"RIC must be 15 or 18 characters\",\n );\n }\n\n if (v.length === 15) {\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"15-digit RIC must contain only digits\",\n );\n }\n // Validate date: digits 6-11 are YYMMDD\n const year = 1900 + Number(v.slice(6, 8));\n const month = Number(v.slice(8, 10));\n const day = Number(v.slice(10, 12));\n if (!isValidDate(year, month, day)) {\n return err(\n \"INVALID_COMPONENT\",\n \"RIC contains an invalid birth date\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // 18-character format\n if (!isdigits(v.slice(0, 17))) {\n return err(\n \"INVALID_FORMAT\",\n \"RIC must contain only digits (plus check char)\",\n );\n }\n // SAFETY: 18-character branch guarantees v[17] exists.\n // eslint-disable-next-line no-non-null-assertion\n const lastChar = v[17]!;\n if (!isdigits(lastChar) && lastChar !== \"X\") {\n return err(\n \"INVALID_FORMAT\",\n \"RIC check character must be 0-9 or X\",\n );\n }\n\n // Validate date: digits 6-13 are YYYYMMDD\n const year = Number(v.slice(6, 10));\n const month = Number(v.slice(10, 12));\n const day = Number(v.slice(12, 14));\n if (!isValidDate(year, month, day)) {\n return err(\n \"INVALID_COMPONENT\",\n \"RIC contains an invalid birth date\",\n );\n }\n\n if (!mod112validate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RIC check character does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/**\n * Extract birth date and gender from an RIC number.\n * Returns null if the value is not valid.\n */\nconst parse = (value: string): ParsedPersonId | null => {\n const result = validate(value);\n if (!result.valid) return null;\n\n const v = result.compact;\n\n let year: number;\n let month: number;\n let day: number;\n let seq: number;\n\n if (v.length === 15) {\n year = 1900 + Number(v.slice(6, 8));\n month = Number(v.slice(8, 10));\n day = Number(v.slice(10, 12));\n seq = Number(v.slice(12, 15));\n } else {\n year = Number(v.slice(6, 10));\n month = Number(v.slice(10, 12));\n day = Number(v.slice(12, 14));\n seq = Number(v.slice(14, 17));\n }\n\n const gender = seq % 2 === 1 ? \"male\" : \"female\";\n\n return {\n birthDate: new Date(year, month - 1, day),\n gender,\n };\n};\n\n/** Generate a random valid 18-digit RIC. */\nconst generate = (): string => {\n // Use a simple area code prefix\n const area = String(randomInt(110000, 659999));\n const year = randomInt(1950, 2005);\n const month = randomInt(1, 12);\n const day = randomInt(1, 28);\n const seqNum = randomInt(1, 999);\n const seq = String(seqNum).padStart(3, \"0\");\n\n const yStr = String(year);\n const mStr = String(month).padStart(2, \"0\");\n const dStr = String(day).padStart(2, \"0\");\n\n const payload = `${area}${yStr}${mStr}${dStr}${seq}`;\n const check = mod112checkChar(payload);\n return `${payload}${check}`;\n};\n\n/** Chinese Resident Identity Card number. */\nconst ric: CountryValidator<\"CN\", ParsedPersonId> = {\n name: \"Chinese Resident Identity Card\",\n localName: \"居民身份证号码\",\n abbreviation: \"RIC\",\n aliases: [\"身份证\", \"居民身份证号码\", \"RIC\"] as const,\n candidatePattern: \"\\\\d{17}[\\\\dX]\",\n scope: \"country\",\n country: \"CN\",\n entityType: \"person\",\n description:\n \"18-character national ID encoding area, birth date, gender, and check digit\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/Resident_Identity_Card\",\n lengths: [15, 18] as const,\n examples: [\n \"11010519491231002X\",\n \"440524188001010014\",\n ] as const,\n compact,\n format,\n parse,\n validate,\n generate,\n};\n\nexport default ric;\nexport { compact, format, generate, parse, validate };\n"],"mappings":";;;;;;;AA6BA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,EAAE,YAAY;AAEjC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,MAAM,EAAE,WAAW,IAClC,OAAO,IACL,kBACA,iCACF;CAGF,IAAI,EAAE,WAAW,IAAI;EACnB,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,uCACF;EAMF,IAAI,CAAC,YAHQ,OAAO,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,GAC1B,OAAO,EAAE,MAAM,GAAG,EAAE,CAEP,GADf,OAAO,EAAE,MAAM,IAAI,EAAE,CACD,CAAC,GAC/B,OAAO,IACL,qBACA,oCACF;EAEF,OAAO;GAAE,OAAO;GAAM,SAAS;EAAE;CACnC;CAGA,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,GAC1B,OAAO,IACL,kBACA,gDACF;CAIF,MAAM,WAAW,EAAE;CACnB,IAAI,CAAC,SAAS,QAAQ,KAAK,aAAa,KACtC,OAAO,IACL,kBACA,sCACF;CAOF,IAAI,CAAC,YAHQ,OAAO,EAAE,MAAM,GAAG,EAAE,CAGb,GAFN,OAAO,EAAE,MAAM,IAAI,EAAE,CAER,GADf,OAAO,EAAE,MAAM,IAAI,EAAE,CACD,CAAC,GAC/B,OAAO,IACL,qBACA,oCACF;CAGF,IAAI,CAAC,eAAe,CAAC,GACnB,OAAO,IACL,oBACA,oCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;;;;AAMvD,MAAM,SAAS,UAAyC;CACtD,MAAM,SAAS,SAAS,KAAK;CAC7B,IAAI,CAAC,OAAO,OAAO,OAAO;CAE1B,MAAM,IAAI,OAAO;CAEjB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,IAAI,EAAE,WAAW,IAAI;EACnB,OAAO,OAAO,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;EAClC,QAAQ,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;EAC7B,MAAM,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;EAC5B,MAAM,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;CAC9B,OAAO;EACL,OAAO,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;EAC5B,QAAQ,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;EAC9B,MAAM,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;EAC5B,MAAM,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;CAC9B;CAEA,MAAM,SAAS,MAAM,MAAM,IAAI,SAAS;CAExC,OAAO;EACL,WAAW,IAAI,KAAK,MAAM,QAAQ,GAAG,GAAG;EACxC;CACF;AACF;;AAGA,MAAM,iBAAyB;CAE7B,MAAM,OAAO,OAAO,UAAU,MAAQ,MAAM,CAAC;CAC7C,MAAM,OAAO,UAAU,MAAM,IAAI;CACjC,MAAM,QAAQ,UAAU,GAAG,EAAE;CAC7B,MAAM,MAAM,UAAU,GAAG,EAAE;CAC3B,MAAM,SAAS,UAAU,GAAG,GAAG;CAC/B,MAAM,MAAM,OAAO,MAAM,EAAE,SAAS,GAAG,GAAG;CAM1C,MAAM,UAAU,GAAG,OAJN,OAAO,IAIS,IAHhB,OAAO,KAAK,EAAE,SAAS,GAAG,GAGH,IAFvB,OAAO,GAAG,EAAE,SAAS,GAAG,GAEM,IAAI;CAE/C,OAAO,GAAG,UADI,gBAAgB,OACN;AAC1B;;AAGA,MAAM,MAA8C;CAClD,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAO;EAAW;CAAK;CACjC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aACE;CACF,WACE;CACF,SAAS,CAAC,IAAI,EAAE;CAChB,UAAU,CACR,sBACA,oBACF;CACA;CACA;CACA;CACA;CACA;AACF"}
package/dist/cn/uscc.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/cn/uscc.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid USCC. */
9
8
  declare const generate: () => string;
10
9
  /** Chinese Unified Social Credit Code. */
11
- declare const uscc: Validator;
10
+ declare const uscc: CountryValidator<"CN">;
12
11
  //#endregion
13
12
  export { compact, uscc as default, format, generate, validate };
14
13
  //# sourceMappingURL=uscc.d.ts.map
package/dist/cn/uscc.js CHANGED
@@ -1,18 +1,8 @@
1
1
  import { clean } from "../_util/clean.js";
2
- import { randomDigits, randomInt } from "../_util/generate.js";
2
+ import { randomChar, randomDigits, randomInt } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/cn/uscc.ts
6
- /**
7
- * USCC (Unified Social Credit Code, 统一社会信用代码).
8
- *
9
- * 18 alphanumeric characters (excluding I, O, Z, S, V):
10
- * 1 (registering authority) + 1 (entity type) +
11
- * 6 (region code, digits only) + 9 (organisation code) +
12
- * 1 (mod 31 check character).
13
- *
14
- * @see https://zh.wikipedia.org/wiki/统一社会信用代码
15
- */
16
6
  const ALPHABET = "0123456789ABCDEFGHJKLMNPQRTUWXY";
17
7
  const WEIGHTS = [
18
8
  1,
@@ -36,16 +26,17 @@ const WEIGHTS = [
36
26
  const compact = (value) => clean(value, " -").toUpperCase();
37
27
  const calcCheckChar = (value) => {
38
28
  let total = 0;
39
- for (let i = 0; i < 17; i++) {
40
- const idx = ALPHABET.indexOf(value[i]);
41
- total += idx * WEIGHTS[i];
29
+ for (const [i, weight] of WEIGHTS.entries()) {
30
+ const ch = value[i];
31
+ if (ch === void 0) continue;
32
+ total += ALPHABET.indexOf(ch) * weight;
42
33
  }
43
34
  return ALPHABET[(31 - total % 31) % 31];
44
35
  };
45
36
  const validate = (value) => {
46
37
  const v = compact(value);
47
38
  if (v.length !== 18) return err("INVALID_LENGTH", "USCC must be 18 characters");
48
- for (let i = 0; i < 18; i++) if (!ALPHABET.includes(v[i])) return err("INVALID_FORMAT", "USCC contains invalid character");
39
+ for (const ch of v) if (!ALPHABET.includes(ch)) return err("INVALID_FORMAT", "USCC contains invalid character");
49
40
  if (!isdigits(v.slice(2, 8))) return err("INVALID_FORMAT", "USCC region code (positions 3-8) must be digits");
50
41
  if (v[17] !== calcCheckChar(v)) return err("INVALID_CHECKSUM", "USCC check character does not match");
51
42
  return {
@@ -60,7 +51,7 @@ const generate = () => {
60
51
  const etype = ALPHABET[randomInt(1, 9)];
61
52
  const region = randomDigits(6);
62
53
  let org = "";
63
- for (let i = 0; i < 9; i++) org += ALPHABET[randomInt(0, 30)];
54
+ for (let i = 0; i < 9; i++) org += randomChar(ALPHABET);
64
55
  const payload = reg + etype + region + org;
65
56
  return payload + calcCheckChar(payload);
66
57
  };
@@ -71,6 +62,7 @@ const uscc = {
71
62
  abbreviation: "USCC",
72
63
  aliases: ["统一社会信用代码", "USCC"],
73
64
  candidatePattern: "[0-9A-HJ-NP-RTUW-Y]{2}\\d{6}[0-9A-HJ-NP-RTUW-Y]{10}",
65
+ scope: "country",
74
66
  country: "CN",
75
67
  entityType: "company",
76
68
  description: "18-character tax/registration code for Chinese entities",
@@ -1 +1 @@
1
- {"version":3,"file":"uscc.js","names":[],"sources":["../../src/cn/uscc.ts"],"sourcesContent":["/**\n * USCC (Unified Social Credit Code, 统一社会信用代码).\n *\n * 18 alphanumeric characters (excluding I, O, Z, S, V):\n * 1 (registering authority) + 1 (entity type) +\n * 6 (region code, digits only) + 9 (organisation code) +\n * 1 (mod 31 check character).\n *\n * @see https://zh.wikipedia.org/wiki/统一社会信用代码\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 ALPHABET = \"0123456789ABCDEFGHJKLMNPQRTUWXY\";\n\nconst WEIGHTS = [\n 1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10,\n 30, 28,\n] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst calcCheckChar = (value: string): string => {\n let total = 0;\n for (let i = 0; i < 17; i++) {\n const idx = ALPHABET.indexOf(value[i]!);\n total += idx * WEIGHTS[i]!;\n }\n return ALPHABET[(31 - (total % 31)) % 31]!;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 18) {\n return err(\n \"INVALID_LENGTH\",\n \"USCC must be 18 characters\",\n );\n }\n\n for (let i = 0; i < 18; i++) {\n if (!ALPHABET.includes(v[i]!)) {\n return err(\n \"INVALID_FORMAT\",\n \"USCC contains invalid character\",\n );\n }\n }\n\n if (!isdigits(v.slice(2, 8))) {\n return err(\n \"INVALID_FORMAT\",\n \"USCC region code (positions 3-8) must be digits\",\n );\n }\n\n if (v[17] !== calcCheckChar(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"USCC check character 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 USCC. */\nconst generate = (): string => {\n const reg = ALPHABET[randomInt(1, 9)]!;\n const etype = ALPHABET[randomInt(1, 9)]!;\n const region = randomDigits(6);\n let org = \"\";\n for (let i = 0; i < 9; i++)\n org += ALPHABET[randomInt(0, ALPHABET.length - 1)]!;\n const payload = reg + etype + region + org;\n return payload + calcCheckChar(payload);\n};\n\n/** Chinese Unified Social Credit Code. */\nconst uscc: Validator = {\n name: \"Unified Social Credit Code\",\n localName: \"统一社会信用代码\",\n abbreviation: \"USCC\",\n aliases: [\"统一社会信用代码\", \"USCC\"] as const,\n candidatePattern:\n \"[0-9A-HJ-NP-RTUW-Y]{2}\\\\d{6}[0-9A-HJ-NP-RTUW-Y]{10}\",\n country: \"CN\",\n entityType: \"company\",\n description:\n \"18-character tax/registration code for Chinese entities\",\n sourceUrl:\n \"https://zh.wikipedia.org/wiki/统一社会信用代码\",\n lengths: [18] as const,\n examples: [\"91110000600037341L\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default uscc;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,WAAW;AAEjB,MAAM,UAAU;CACd;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAG;CAAI;CACpD;CAAI;CACL;AAED,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,CAAC,aAAa;AAElC,MAAM,iBAAiB,UAA0B;CAC/C,IAAI,QAAQ;AACZ,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;EAC3B,MAAM,MAAM,SAAS,QAAQ,MAAM,GAAI;AACvC,WAAS,MAAM,QAAQ;;AAEzB,QAAO,UAAU,KAAM,QAAQ,MAAO;;AAGxC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,6BACD;AAGH,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IACtB,KAAI,CAAC,SAAS,SAAS,EAAE,GAAI,CAC3B,QAAO,IACL,kBACA,kCACD;AAIL,KAAI,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,CAC1B,QAAO,IACL,kBACA,kDACD;AAGH,KAAI,EAAE,QAAQ,cAAc,EAAE,CAC5B,QAAO,IACL,oBACA,sCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,MAAM,iBAAyB;CAC7B,MAAM,MAAM,SAAS,UAAU,GAAG,EAAE;CACpC,MAAM,QAAQ,SAAS,UAAU,GAAG,EAAE;CACtC,MAAM,SAAS,aAAa,EAAE;CAC9B,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,QAAO,SAAS,UAAU,GAAG,GAAoB;CACnD,MAAM,UAAU,MAAM,QAAQ,SAAS;AACvC,QAAO,UAAU,cAAc,QAAQ;;;AAIzC,MAAM,OAAkB;CACtB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,YAAY,OAAO;CAC7B,kBACE;CACF,SAAS;CACT,YAAY;CACZ,aACE;CACF,WACE;CACF,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,qBAAqB;CAChC;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"uscc.js","names":[],"sources":["../../src/cn/uscc.ts"],"sourcesContent":["/**\n * USCC (Unified Social Credit Code, 统一社会信用代码).\n *\n * 18 alphanumeric characters (excluding I, O, Z, S, V):\n * 1 (registering authority) + 1 (entity type) +\n * 6 (region code, digits only) + 9 (organisation code) +\n * 1 (mod 31 check character).\n *\n * @see https://zh.wikipedia.org/wiki/统一社会信用代码\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport {\n randomChar,\n randomDigits,\n randomInt,\n} from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst ALPHABET = \"0123456789ABCDEFGHJKLMNPQRTUWXY\";\n\nconst WEIGHTS = [\n 1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10,\n 30, 28,\n] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst calcCheckChar = (value: string): string => {\n let total = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n const ch = value[i];\n if (ch === undefined) continue;\n total += ALPHABET.indexOf(ch) * weight;\n }\n // SAFETY: (31 - total % 31) % 31 is in 0..30 and\n // ALPHABET has 31 characters.\n // eslint-disable-next-line no-non-null-assertion\n return ALPHABET[(31 - (total % 31)) % 31]!;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 18) {\n return err(\n \"INVALID_LENGTH\",\n \"USCC must be 18 characters\",\n );\n }\n\n for (const ch of v) {\n if (!ALPHABET.includes(ch)) {\n return err(\n \"INVALID_FORMAT\",\n \"USCC contains invalid character\",\n );\n }\n }\n\n if (!isdigits(v.slice(2, 8))) {\n return err(\n \"INVALID_FORMAT\",\n \"USCC region code (positions 3-8) must be digits\",\n );\n }\n\n if (v[17] !== calcCheckChar(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"USCC check character 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 USCC. */\nconst generate = (): string => {\n // SAFETY: indices 1..9 are within ALPHABET (31 chars).\n // eslint-disable-next-line no-non-null-assertion\n const reg = ALPHABET[randomInt(1, 9)]!;\n // eslint-disable-next-line no-non-null-assertion\n const etype = ALPHABET[randomInt(1, 9)]!;\n const region = randomDigits(6);\n let org = \"\";\n for (let i = 0; i < 9; i++) {\n org += randomChar(ALPHABET);\n }\n const payload = reg + etype + region + org;\n return payload + calcCheckChar(payload);\n};\n\n/** Chinese Unified Social Credit Code. */\nconst uscc: CountryValidator<\"CN\"> = {\n name: \"Unified Social Credit Code\",\n localName: \"统一社会信用代码\",\n abbreviation: \"USCC\",\n aliases: [\"统一社会信用代码\", \"USCC\"] as const,\n candidatePattern:\n \"[0-9A-HJ-NP-RTUW-Y]{2}\\\\d{6}[0-9A-HJ-NP-RTUW-Y]{10}\",\n scope: \"country\",\n country: \"CN\",\n entityType: \"company\",\n description:\n \"18-character tax/registration code for Chinese entities\",\n sourceUrl:\n \"https://zh.wikipedia.org/wiki/统一社会信用代码\",\n lengths: [18] as const,\n examples: [\"91110000600037341L\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default uscc;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAyBA,MAAM,WAAW;AAEjB,MAAM,UAAU;CACd;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAG;CAAI;CACpD;CAAI;AACN;AAEA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,EAAE,YAAY;AAEjC,MAAM,iBAAiB,UAA0B;CAC/C,IAAI,QAAQ;CACZ,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GAAG;EAC3C,MAAM,KAAK,MAAM;EACjB,IAAI,OAAO,KAAA,GAAW;EACtB,SAAS,SAAS,QAAQ,EAAE,IAAI;CAClC;CAIA,OAAO,UAAU,KAAM,QAAQ,MAAO;AACxC;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,4BACF;CAGF,KAAK,MAAM,MAAM,GACf,IAAI,CAAC,SAAS,SAAS,EAAE,GACvB,OAAO,IACL,kBACA,iCACF;CAIJ,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,GACzB,OAAO,IACL,kBACA,iDACF;CAGF,IAAI,EAAE,QAAQ,cAAc,CAAC,GAC3B,OAAO,IACL,oBACA,qCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,iBAAyB;CAG7B,MAAM,MAAM,SAAS,UAAU,GAAG,CAAC;CAEnC,MAAM,QAAQ,SAAS,UAAU,GAAG,CAAC;CACrC,MAAM,SAAS,aAAa,CAAC;CAC7B,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,OAAO,WAAW,QAAQ;CAE5B,MAAM,UAAU,MAAM,QAAQ,SAAS;CACvC,OAAO,UAAU,cAAc,OAAO;AACxC;;AAGA,MAAM,OAA+B;CACnC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,YAAY,MAAM;CAC5B,kBACE;CACF,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aACE;CACF,WACE;CACF,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,oBAAoB;CAC/B;CACA;CACA;CACA;AACF"}
package/dist/co/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import nit from "./nit.js";
3
2
 
4
3
  //#region src/co/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { nit };
6
+ }
6
7
  //#endregion
7
8
  export { mod_d_exports, nit };
8
9
  //# sourceMappingURL=mod.d.ts.map
package/dist/co/nit.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/co/nit.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid NIT (10 digits). */
9
8
  declare const generate: () => string;
10
9
  /** Colombian tax identification number. */
11
- declare const nit: Validator;
10
+ declare const nit: CountryValidator<"CO">;
12
11
  //#endregion
13
12
  export { compact, nit as default, format, generate, validate };
14
13
  //# sourceMappingURL=nit.d.ts.map
package/dist/co/nit.js CHANGED
@@ -3,17 +3,6 @@ import { randomDigits } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/co/nit.ts
6
- /**
7
- * NIT (Número de Identificación Tributaria).
8
- *
9
- * Colombian tax identification number, also known as
10
- * RUT (Registro Unico Tributario). The last digit is
11
- * a check digit computed via a weighted sum mod 11
12
- * with weights [3,7,13,17,19,23,29,37,41,43,47,53,
13
- * 59,67,71] applied right-to-left.
14
- *
15
- * @see https://es.wikipedia.org/wiki/Número_de_identificación_tributaria
16
- */
17
6
  const WEIGHTS = [
18
7
  3,
19
8
  7,
@@ -49,14 +38,17 @@ const compact = (value) => clean(value, " -.,");
49
38
  const calcCheckDigit = (body) => {
50
39
  let sum = 0;
51
40
  const len = body.length;
52
- for (let i = 0; i < len; i++) sum += Number(body[len - 1 - i]) * WEIGHTS[i];
41
+ for (const [i, weight] of WEIGHTS.entries()) {
42
+ if (i >= len) break;
43
+ sum += Number(body[len - 1 - i]) * weight;
44
+ }
53
45
  return CHECK_DIGITS[sum % 11];
54
46
  };
55
47
  const validate = (value) => {
56
48
  const v = compact(value);
57
49
  if (v.length < 8 || v.length > 16) return err("INVALID_LENGTH", "NIT must be between 8 and 16 digits");
58
50
  if (!isdigits(v)) return err("INVALID_FORMAT", "NIT must contain only digits");
59
- if (calcCheckDigit(v.slice(0, -1)) !== Number(v[v.length - 1])) return err("INVALID_CHECKSUM", "NIT check digit does not match");
51
+ if (calcCheckDigit(v.slice(0, -1)) !== Number(v.at(-1))) return err("INVALID_CHECKSUM", "NIT check digit does not match");
60
52
  return {
61
53
  valid: true,
62
54
  compact: v
@@ -82,6 +74,7 @@ const nit = {
82
74
  abbreviation: "NIT",
83
75
  aliases: ["NIT", "Número de Identificación Tributaria"],
84
76
  candidatePattern: "\\d{9,10}-?\\d",
77
+ scope: "country",
85
78
  country: "CO",
86
79
  entityType: "any",
87
80
  description: "Tax identifier issued by the DIAN",
@@ -1 +1 @@
1
- {"version":3,"file":"nit.js","names":[],"sources":["../../src/co/nit.ts"],"sourcesContent":["/**\n * NIT (Número de Identificación Tributaria).\n *\n * Colombian tax identification number, also known as\n * RUT (Registro Unico Tributario). The last digit is\n * a check digit computed via a weighted sum mod 11\n * with weights [3,7,13,17,19,23,29,37,41,43,47,53,\n * 59,67,71] applied right-to-left.\n *\n * @see https://es.wikipedia.org/wiki/Número_de_identificación_tributaria\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst WEIGHTS = [\n 3, 7, 13, 17, 19, 23, 29, 37, 41, 43, 47, 53, 59, 67, 71,\n] as const;\n\n/** Lookup table: remainder -> check digit. */\nconst CHECK_DIGITS = [0, 1, 9, 8, 7, 6, 5, 4, 3, 2, 1];\n\nconst compact = (value: string): string =>\n clean(value, \" -.,\");\n\nconst calcCheckDigit = (body: string): number => {\n let sum = 0;\n const len = body.length;\n for (let i = 0; i < len; i++) {\n sum += Number(body[len - 1 - i]) * WEIGHTS[i]!;\n }\n return CHECK_DIGITS[sum % 11]!;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length < 8 || v.length > 16) {\n return err(\n \"INVALID_LENGTH\",\n \"NIT must be between 8 and 16 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"NIT must contain only digits\",\n );\n }\n\n const body = v.slice(0, -1);\n const check = calcCheckDigit(body);\n if (check !== Number(v[v.length - 1])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"NIT check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const body = v.slice(0, -1);\n const checkChar = v.slice(-1);\n const groups: string[] = [];\n for (let i = body.length; i > 0; i -= 3) {\n groups.unshift(body.slice(Math.max(0, i - 3), i));\n }\n return `${groups.join(\".\")}-${checkChar}`;\n};\n\n/** Generate a random valid NIT (10 digits). */\nconst generate = (): string => {\n const body = randomDigits(9);\n const check = calcCheckDigit(body);\n return `${body}${check}`;\n};\n\n/** Colombian tax identification number. */\nconst nit: Validator = {\n name: \"Número de Identificación Tributaria\",\n localName: \"Número de Identificación Tributaria\",\n abbreviation: \"NIT\",\n aliases: [\n \"NIT\",\n \"Número de Identificación Tributaria\",\n ] as const,\n candidatePattern: \"\\\\d{9,10}-?\\\\d\",\n country: \"CO\",\n entityType: \"any\",\n description: \"Tax identifier issued by the DIAN\",\n sourceUrl:\n \"https://es.wikipedia.org/wiki/N%C3%BAmero_de_identificaci%C3%B3n_tributaria\",\n lengths: [8, 9, 10, 11, 12, 13, 14, 15, 16] as const,\n examples: [\"2131234321\", \"8001234565\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nit;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,MAAM,UAAU;CACd;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CACvD;;AAGD,MAAM,eAAe;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAEtD,MAAM,WAAW,UACf,MAAM,OAAO,OAAO;AAEtB,MAAM,kBAAkB,SAAyB;CAC/C,IAAI,MAAM;CACV,MAAM,MAAM,KAAK;AACjB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IACvB,QAAO,OAAO,KAAK,MAAM,IAAI,GAAG,GAAG,QAAQ;AAE7C,QAAO,aAAa,MAAM;;AAG5B,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,SAAS,KAAK,EAAE,SAAS,GAC7B,QAAO,IACL,kBACA,sCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;AAKH,KADc,eADD,EAAE,MAAM,GAAG,GAAG,CACO,KACpB,OAAO,EAAE,EAAE,SAAS,GAAG,CACnC,QAAO,IACL,oBACA,iCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;CACxB,MAAM,OAAO,EAAE,MAAM,GAAG,GAAG;CAC3B,MAAM,YAAY,EAAE,MAAM,GAAG;CAC7B,MAAM,SAAmB,EAAE;AAC3B,MAAK,IAAI,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK,EACpC,QAAO,QAAQ,KAAK,MAAM,KAAK,IAAI,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC;AAEnD,QAAO,GAAG,OAAO,KAAK,IAAI,CAAC,GAAG;;;AAIhC,MAAM,iBAAyB;CAC7B,MAAM,OAAO,aAAa,EAAE;AAE5B,QAAO,GAAG,OADI,eAAe,KAAK;;;AAKpC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CACP,OACA,sCACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,aAAa;CACb,WACE;CACF,SAAS;EAAC;EAAG;EAAG;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAG;CAC3C,UAAU,CAAC,cAAc,aAAa;CACtC;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"nit.js","names":[],"sources":["../../src/co/nit.ts"],"sourcesContent":["/**\n * NIT (Número de Identificación Tributaria).\n *\n * Colombian tax identification number, also known as\n * RUT (Registro Unico Tributario). The last digit is\n * a check digit computed via a weighted sum mod 11\n * with weights [3,7,13,17,19,23,29,37,41,43,47,53,\n * 59,67,71] applied right-to-left.\n *\n * @see https://es.wikipedia.org/wiki/Número_de_identificación_tributaria\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [\n 3, 7, 13, 17, 19, 23, 29, 37, 41, 43, 47, 53, 59, 67, 71,\n] as const;\n\n/** Lookup table: remainder -> check digit. */\nconst CHECK_DIGITS = [0, 1, 9, 8, 7, 6, 5, 4, 3, 2, 1];\n\nconst compact = (value: string): string =>\n clean(value, \" -.,\");\n\nconst calcCheckDigit = (body: string): number => {\n let sum = 0;\n const len = body.length;\n for (const [i, weight] of WEIGHTS.entries()) {\n if (i >= len) break;\n sum += Number(body[len - 1 - i]) * weight;\n }\n // SAFETY: sum % 11 is in 0..10 and CHECK_DIGITS has\n // 11 entries.\n // eslint-disable-next-line no-non-null-assertion\n return CHECK_DIGITS[sum % 11]!;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length < 8 || v.length > 16) {\n return err(\n \"INVALID_LENGTH\",\n \"NIT must be between 8 and 16 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"NIT must contain only digits\",\n );\n }\n\n const body = v.slice(0, -1);\n const check = calcCheckDigit(body);\n if (check !== Number(v.at(-1))) {\n return err(\n \"INVALID_CHECKSUM\",\n \"NIT check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n const body = v.slice(0, -1);\n const checkChar = v.slice(-1);\n const groups: string[] = [];\n for (let i = body.length; i > 0; i -= 3) {\n groups.unshift(body.slice(Math.max(0, i - 3), i));\n }\n return `${groups.join(\".\")}-${checkChar}`;\n};\n\n/** Generate a random valid NIT (10 digits). */\nconst generate = (): string => {\n const body = randomDigits(9);\n const check = calcCheckDigit(body);\n return `${body}${check}`;\n};\n\n/** Colombian tax identification number. */\nconst nit: CountryValidator<\"CO\"> = {\n name: \"Número de Identificación Tributaria\",\n localName: \"Número de Identificación Tributaria\",\n abbreviation: \"NIT\",\n aliases: [\n \"NIT\",\n \"Número de Identificación Tributaria\",\n ] as const,\n candidatePattern: \"\\\\d{9,10}-?\\\\d\",\n scope: \"country\",\n country: \"CO\",\n entityType: \"any\",\n description: \"Tax identifier issued by the DIAN\",\n sourceUrl:\n \"https://es.wikipedia.org/wiki/N%C3%BAmero_de_identificaci%C3%B3n_tributaria\",\n lengths: [8, 9, 10, 11, 12, 13, 14, 15, 16] as const,\n examples: [\"2131234321\", \"8001234565\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nit;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;AAsBA,MAAM,UAAU;CACd;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;AACxD;;AAGA,MAAM,eAAe;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAErD,MAAM,WAAW,UACf,MAAM,OAAO,MAAM;AAErB,MAAM,kBAAkB,SAAyB;CAC/C,IAAI,MAAM;CACV,MAAM,MAAM,KAAK;CACjB,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GAAG;EAC3C,IAAI,KAAK,KAAK;EACd,OAAO,OAAO,KAAK,MAAM,IAAI,EAAE,IAAI;CACrC;CAIA,OAAO,aAAa,MAAM;AAC5B;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,SAAS,KAAK,EAAE,SAAS,IAC7B,OAAO,IACL,kBACA,qCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAKF,IADc,eADD,EAAE,MAAM,GAAG,EACQ,CACxB,MAAM,OAAO,EAAE,GAAG,EAAE,CAAC,GAC3B,OAAO,IACL,oBACA,gCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,MAAM,OAAO,EAAE,MAAM,GAAG,EAAE;CAC1B,MAAM,YAAY,EAAE,MAAM,EAAE;CAC5B,MAAM,SAAmB,CAAC;CAC1B,KAAK,IAAI,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK,GACpC,OAAO,QAAQ,KAAK,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;CAElD,OAAO,GAAG,OAAO,KAAK,GAAG,EAAE,GAAG;AAChC;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,OAAO,aAAa,CAAC;CAE3B,OAAO,GAAG,OADI,eAAe,IACR;AACvB;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CACP,OACA,qCACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aAAa;CACb,WACE;CACF,SAAS;EAAC;EAAG;EAAG;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAAE;CAC1C,UAAU,CAAC,cAAc,YAAY;CACrC;CACA;CACA;CACA;AACF"}
package/dist/cr/cpf.d.ts CHANGED
@@ -1,8 +1,24 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/cr/cpf.d.ts
4
4
  /** Generate a random valid Costa Rican CPF. */
5
5
  declare const generate: () => string;
6
+ /**
7
+ * CPF (Cédula de Persona Física, Costa Rican
8
+ * physical person ID number).
9
+ *
10
+ * 10 digits: 0P-TTTT-AAAA where:
11
+ * - 0 = fixed leading zero
12
+ * - P = province digit
13
+ * - TTTT = volume (tomo), zero-padded
14
+ * - AAAA = entry (asiento), zero-padded
15
+ *
16
+ * No check digit; validation is by format only.
17
+ *
18
+ * Ported from python-stdnum cr.cpf module.
19
+ *
20
+ * @see https://www.tse.go.cr/
21
+ */
6
22
  /**
7
23
  * Compact: strip spaces, pad hyphen-separated parts
8
24
  * (2-4-4), join, and prepend '0' if 9 digits.
@@ -15,7 +31,7 @@ declare const format: (value: string) => string;
15
31
  *
16
32
  * Examples sourced from python-stdnum test suite.
17
33
  */
18
- declare const cpf: Validator;
34
+ declare const cpf: CountryValidator<"CR">;
19
35
  //#endregion
20
36
  export { compact, cpf as default, format, generate, validate };
21
37
  //# sourceMappingURL=cpf.d.ts.map
package/dist/cr/cpf.js CHANGED
@@ -2,22 +2,6 @@ import { clean } from "../_util/clean.js";
2
2
  import { randomDigits, randomInt } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  //#region src/cr/cpf.ts
5
- /**
6
- * CPF (Cédula de Persona Física, Costa Rican
7
- * physical person ID number).
8
- *
9
- * 10 digits: 0P-TTTT-AAAA where:
10
- * - 0 = fixed leading zero
11
- * - P = province digit
12
- * - TTTT = volume (tomo), zero-padded
13
- * - AAAA = entry (asiento), zero-padded
14
- *
15
- * No check digit; validation is by format only.
16
- *
17
- * Ported from python-stdnum cr.cpf module.
18
- *
19
- * @see https://www.tse.go.cr/
20
- */
21
5
  /** Generate a random valid Costa Rican CPF. */
22
6
  const generate = () => {
23
7
  return `0${String(randomInt(1, 9))}${randomDigits(4)}${randomDigits(4)}`;
@@ -30,9 +14,10 @@ const compact = (value) => {
30
14
  let number = clean(value, " ").trim().toUpperCase();
31
15
  const parts = number.split("-");
32
16
  if (parts.length === 3) {
33
- const p0 = parts[0].padStart(2, "0");
34
- const p1 = parts[1].padStart(4, "0");
35
- const p2 = parts[2].padStart(4, "0");
17
+ const [raw0, raw1, raw2] = parts;
18
+ const p0 = (raw0 ?? "").padStart(2, "0");
19
+ const p1 = (raw1 ?? "").padStart(4, "0");
20
+ const p2 = (raw2 ?? "").padStart(4, "0");
36
21
  number = p0 + p1 + p2;
37
22
  } else number = number.replaceAll("-", "");
38
23
  if (number.length === 9) number = "0" + number;
@@ -63,6 +48,7 @@ const cpf = {
63
48
  abbreviation: "CPF",
64
49
  aliases: ["CPF", "cédula de persona física"],
65
50
  candidatePattern: "\\d{9,12}",
51
+ scope: "country",
66
52
  country: "CR",
67
53
  entityType: "person",
68
54
  lengths: [10],
@@ -1 +1 @@
1
- {"version":3,"file":"cpf.js","names":[],"sources":["../../src/cr/cpf.ts"],"sourcesContent":["/** Generate a random valid Costa Rican CPF. */\nconst generate = (): string => {\n const province = String(randomInt(1, 9));\n const volume = randomDigits(4);\n const entry = randomDigits(4);\n return `0${province}${volume}${entry}`;\n};\n\n/**\n * CPF (Cédula de Persona Física, Costa Rican\n * physical person ID number).\n *\n * 10 digits: 0P-TTTT-AAAA where:\n * - 0 = fixed leading zero\n * - P = province digit\n * - TTTT = volume (tomo), zero-padded\n * - AAAA = entry (asiento), zero-padded\n *\n * No check digit; validation is by format only.\n *\n * Ported from python-stdnum cr.cpf module.\n *\n * @see https://www.tse.go.cr/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\n/**\n * Compact: strip spaces, pad hyphen-separated parts\n * (2-4-4), join, and prepend '0' if 9 digits.\n */\nconst compact = (value: string): string => {\n let number = clean(value, \" \").trim().toUpperCase();\n\n const parts = number.split(\"-\");\n if (parts.length === 3) {\n const p0 = parts[0]!.padStart(2, \"0\");\n const p1 = parts[1]!.padStart(4, \"0\");\n const p2 = parts[2]!.padStart(4, \"0\");\n number = p0 + p1 + p2;\n } else {\n number = number.replaceAll(\"-\", \"\");\n }\n\n if (number.length === 9) {\n number = \"0\" + number;\n }\n\n return number;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Costa Rican CPF must be 10 digits\",\n );\n }\n\n if (!/^\\d{10}$/.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Costa Rican CPF must contain only digits\",\n );\n }\n\n if (v[0] !== \"0\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Costa Rican CPF must start with 0\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 2)}-${v.slice(2, 6)}-${v.slice(6, 10)}`;\n};\n\n/**\n * Costa Rican physical person ID number (CPF).\n *\n * Examples sourced from python-stdnum test suite.\n */\nconst cpf: Validator = {\n name: \"Costa Rican Physical Person ID\",\n localName: \"Cédula de Persona Física\",\n abbreviation: \"CPF\",\n aliases: [\"CPF\", \"cédula de persona física\"] as const,\n candidatePattern: \"\\\\d{9,12}\",\n country: \"CR\",\n entityType: \"person\",\n lengths: [10] as const,\n examples: [\"0304550175\", \"0109130259\"] as const,\n compact,\n format,\n validate,\n sourceUrl: \"https://www.tse.go.cr/\",\n generate,\n};\n\nexport default cpf;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA,MAAM,iBAAyB;AAI7B,QAAO,IAHU,OAAO,UAAU,GAAG,EAAE,CAAC,GACzB,aAAa,EAAE,GAChB,aAAa,EAAE;;;;;;AA+B/B,MAAM,WAAW,UAA0B;CACzC,IAAI,SAAS,MAAM,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa;CAEnD,MAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,KAAI,MAAM,WAAW,GAAG;EACtB,MAAM,KAAK,MAAM,GAAI,SAAS,GAAG,IAAI;EACrC,MAAM,KAAK,MAAM,GAAI,SAAS,GAAG,IAAI;EACrC,MAAM,KAAK,MAAM,GAAI,SAAS,GAAG,IAAI;AACrC,WAAS,KAAK,KAAK;OAEnB,UAAS,OAAO,WAAW,KAAK,GAAG;AAGrC,KAAI,OAAO,WAAW,EACpB,UAAS,MAAM;AAGjB,QAAO;;AAGT,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,oCACD;AAGH,KAAI,CAAC,WAAW,KAAK,EAAE,CACrB,QAAO,IACL,kBACA,2CACD;AAGH,KAAI,EAAE,OAAO,IACX,QAAO,IACL,qBACA,oCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG;;;;;;;AAQ5D,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,2BAA2B;CAC5C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,cAAc,aAAa;CACtC;CACA;CACA;CACA,WAAW;CACX;CACD"}
1
+ {"version":3,"file":"cpf.js","names":[],"sources":["../../src/cr/cpf.ts"],"sourcesContent":["/** Generate a random valid Costa Rican CPF. */\nconst generate = (): string => {\n const province = String(randomInt(1, 9));\n const volume = randomDigits(4);\n const entry = randomDigits(4);\n return `0${province}${volume}${entry}`;\n};\n\n/**\n * CPF (Cédula de Persona Física, Costa Rican\n * physical person ID number).\n *\n * 10 digits: 0P-TTTT-AAAA where:\n * - 0 = fixed leading zero\n * - P = province digit\n * - TTTT = volume (tomo), zero-padded\n * - AAAA = entry (asiento), zero-padded\n *\n * No check digit; validation is by format only.\n *\n * Ported from python-stdnum cr.cpf module.\n *\n * @see https://www.tse.go.cr/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\n/**\n * Compact: strip spaces, pad hyphen-separated parts\n * (2-4-4), join, and prepend '0' if 9 digits.\n */\nconst compact = (value: string): string => {\n let number = clean(value, \" \").trim().toUpperCase();\n\n const parts = number.split(\"-\");\n if (parts.length === 3) {\n const [raw0, raw1, raw2] = parts;\n const p0 = (raw0 ?? \"\").padStart(2, \"0\");\n const p1 = (raw1 ?? \"\").padStart(4, \"0\");\n const p2 = (raw2 ?? \"\").padStart(4, \"0\");\n number = p0 + p1 + p2;\n } else {\n number = number.replaceAll(\"-\", \"\");\n }\n\n if (number.length === 9) {\n number = \"0\" + number;\n }\n\n return number;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Costa Rican CPF must be 10 digits\",\n );\n }\n\n if (!/^\\d{10}$/.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Costa Rican CPF must contain only digits\",\n );\n }\n\n if (v[0] !== \"0\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Costa Rican CPF must start with 0\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 2)}-${v.slice(2, 6)}-${v.slice(6, 10)}`;\n};\n\n/**\n * Costa Rican physical person ID number (CPF).\n *\n * Examples sourced from python-stdnum test suite.\n */\nconst cpf: CountryValidator<\"CR\"> = {\n name: \"Costa Rican Physical Person ID\",\n localName: \"Cédula de Persona Física\",\n abbreviation: \"CPF\",\n aliases: [\"CPF\", \"cédula de persona física\"] as const,\n candidatePattern: \"\\\\d{9,12}\",\n scope: \"country\",\n country: \"CR\",\n entityType: \"person\",\n lengths: [10] as const,\n examples: [\"0304550175\", \"0109130259\"] as const,\n compact,\n format,\n validate,\n sourceUrl: \"https://www.tse.go.cr/\",\n generate,\n};\n\nexport default cpf;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AACA,MAAM,iBAAyB;CAI7B,OAAO,IAHU,OAAO,UAAU,GAAG,CAAC,CAGpB,IAFH,aAAa,CAED,IADb,aAAa,CACQ;AACrC;;;;;AAgCA,MAAM,WAAW,UAA0B;CACzC,IAAI,SAAS,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,YAAY;CAElD,MAAM,QAAQ,OAAO,MAAM,GAAG;CAC9B,IAAI,MAAM,WAAW,GAAG;EACtB,MAAM,CAAC,MAAM,MAAM,QAAQ;EAC3B,MAAM,MAAM,QAAQ,IAAI,SAAS,GAAG,GAAG;EACvC,MAAM,MAAM,QAAQ,IAAI,SAAS,GAAG,GAAG;EACvC,MAAM,MAAM,QAAQ,IAAI,SAAS,GAAG,GAAG;EACvC,SAAS,KAAK,KAAK;CACrB,OACE,SAAS,OAAO,WAAW,KAAK,EAAE;CAGpC,IAAI,OAAO,WAAW,GACpB,SAAS,MAAM;CAGjB,OAAO;AACT;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,mCACF;CAGF,IAAI,CAAC,WAAW,KAAK,CAAC,GACpB,OAAO,IACL,kBACA,0CACF;CAGF,IAAI,EAAE,OAAO,KACX,OAAO,IACL,qBACA,mCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE;AAC3D;;;;;;AAOA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,0BAA0B;CAC3C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,cAAc,YAAY;CACrC;CACA;CACA;CACA,WAAW;CACX;AACF"}
package/dist/cr/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import cpf from "./cpf.js";
3
2
 
4
3
  //#region src/cr/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { cpf };
6
+ }
6
7
  //#endregion
7
8
  export { cpf, mod_d_exports };
8
9
  //# sourceMappingURL=mod.d.ts.map
@@ -1,7 +1,6 @@
1
- import { ValidateResult, Validator } from "./types.js";
1
+ import { GlobalValidator, ValidateResult } from "./types.js";
2
2
 
3
3
  //#region src/creditcard.d.ts
4
-
5
4
  /**
6
5
  * Card network identifiers returned by
7
6
  * {@link detectNetwork}.
@@ -19,7 +18,7 @@ declare const format: (value: string) => string;
19
18
  */
20
19
  declare const detectNetwork: (value: string) => CardNetwork | null;
21
20
  /** Credit Card Number (Luhn). */
22
- declare const creditCard: Validator;
21
+ declare const creditCard: GlobalValidator;
23
22
  //#endregion
24
23
  export { type CardNetwork, compact, creditCard as default, detectNetwork, format, validate };
25
24
  //# sourceMappingURL=creditcard.d.ts.map
@@ -1,19 +1,9 @@
1
+ import { luhnChecksum, luhnValidate } from "./_checksums/luhn.js";
1
2
  import { clean } from "./_util/clean.js";
2
3
  import { randomDigits, randomInt } from "./_util/generate.js";
3
4
  import { err } from "./_util/result.js";
4
- import { luhnChecksum, luhnValidate } from "./_checksums/luhn.js";
5
5
  import { isdigits } from "./_util/strings.js";
6
6
  //#region src/creditcard.ts
7
- /**
8
- * Credit card number validation (Luhn algorithm).
9
- *
10
- * Validates card numbers using the Luhn checksum
11
- * (ISO/IEC 7812-1). Supports Visa, Mastercard,
12
- * Amex, Discover, and other networks (13-19
13
- * digits).
14
- *
15
- * @see https://www.iso.org/standard/70484.html
16
- */
17
7
  const compact = (value) => clean(value, " -.");
18
8
  const validate = (value) => {
19
9
  const v = compact(value);
@@ -32,7 +22,7 @@ const format = (value) => {
32
22
  for (let i = 0; i < v.length; i += 4) groups.push(v.slice(i, i + 4));
33
23
  return groups.join(" ");
34
24
  };
35
- const MAESTRO_PREFIXES = [
25
+ const MAESTRO_PREFIXES = new Set([
36
26
  5018,
37
27
  5020,
38
28
  5038,
@@ -42,7 +32,7 @@ const MAESTRO_PREFIXES = [
42
32
  6761,
43
33
  6762,
44
34
  6763
45
- ];
35
+ ]);
46
36
  /**
47
37
  * Detect the card network from the BIN/IIN prefix.
48
38
  *
@@ -63,7 +53,7 @@ const detectNetwork = (value) => {
63
53
  if (d3 >= 300 && d3 <= 305) return "diners";
64
54
  if (d4 >= 3528 && d4 <= 3589) return "jcb";
65
55
  if (v[0] === "4") return "visa";
66
- if (MAESTRO_PREFIXES.includes(d4)) return "maestro";
56
+ if (MAESTRO_PREFIXES.has(d4)) return "maestro";
67
57
  if (d2 >= 51 && d2 <= 55) return "mastercard";
68
58
  if (d4 >= 2221 && d4 <= 2720) return "mastercard";
69
59
  if (d4 === 6011) return "discover";
@@ -97,6 +87,7 @@ const generate = () => {
97
87
  };
98
88
  /** Credit Card Number (Luhn). */
99
89
  const creditCard = {
90
+ scope: "global",
100
91
  name: "Credit Card Number",
101
92
  localName: "Credit Card Number",
102
93
  abbreviation: "CC",
@@ -1 +1 @@
1
- {"version":3,"file":"creditcard.js","names":[],"sources":["../src/creditcard.ts"],"sourcesContent":["/**\n * Credit card number validation (Luhn algorithm).\n *\n * Validates card numbers using the Luhn checksum\n * (ISO/IEC 7812-1). Supports Visa, Mastercard,\n * Amex, Discover, and other networks (13-19\n * digits).\n *\n * @see https://www.iso.org/standard/70484.html\n */\n\nimport {\n luhnChecksum,\n luhnValidate,\n} from \"#checksums/luhn\";\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\n/**\n * Card network identifiers returned by\n * {@link detectNetwork}.\n */\ntype CardNetwork =\n | \"visa\"\n | \"mastercard\"\n | \"amex\"\n | \"discover\"\n | \"diners\"\n | \"jcb\"\n | \"unionpay\"\n | \"maestro\";\n\nconst compact = (value: string): string =>\n clean(value, \" -.\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length < 13 || v.length > 19) {\n return err(\n \"INVALID_LENGTH\",\n \"Credit card number must be 13-19 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Credit card number must contain only digits\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Credit card number fails Luhn check\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n // Amex: 4-6-5 grouping\n if (v.length === 15 && v[0] === \"3\") {\n return `${v.slice(0, 4)} ${v.slice(4, 10)} ${v.slice(10)}`;\n }\n // Standard: groups of 4\n const groups: string[] = [];\n for (let i = 0; i < v.length; i += 4) {\n groups.push(v.slice(i, i + 4));\n }\n return groups.join(\" \");\n};\n\nconst MAESTRO_PREFIXES: readonly number[] = [\n 5018, 5020, 5038, 5893, 6304, 6759, 6761, 6762, 6763,\n];\n\n/**\n * Detect the card network from the BIN/IIN prefix.\n *\n * Accepts both formatted (\"4111 1111 1111 1111\")\n * and compact (\"4111111111111111\") inputs.\n * Returns null for unrecognized prefixes.\n */\nconst detectNetwork = (\n value: string,\n): CardNetwork | null => {\n const v = compact(value);\n if (v.length === 0) return null;\n if (!isdigits(v)) return null;\n\n const d2 = Number(v.slice(0, 2));\n const d3 = Number(v.slice(0, 3));\n const d4 = Number(v.slice(0, 4));\n const d6 = Number(v.slice(0, 6));\n\n // Amex: 34, 37\n if (d2 === 34 || d2 === 37) return \"amex\";\n\n // Diners Club: 300-305, 36, 38\n if (d2 === 36 || d2 === 38) return \"diners\";\n if (d3 >= 300 && d3 <= 305) return \"diners\";\n\n // JCB: 3528-3589\n if (d4 >= 3528 && d4 <= 3589) return \"jcb\";\n\n // Visa: starts with 4\n if (v[0] === \"4\") return \"visa\";\n\n // Maestro (check before Mastercard; some share\n // the 50xx prefix space)\n if (MAESTRO_PREFIXES.includes(d4)) return \"maestro\";\n\n // Mastercard: 51-55 or 2221-2720\n if (d2 >= 51 && d2 <= 55) return \"mastercard\";\n if (d4 >= 2221 && d4 <= 2720) return \"mastercard\";\n\n // Discover: 6011, 622126-622925, 644-649, 65\n if (d4 === 6011) return \"discover\";\n if (d6 >= 622126 && d6 <= 622925) return \"discover\";\n if (d3 >= 644 && d3 <= 649) return \"discover\";\n if (d2 === 65) return \"discover\";\n\n // UnionPay: starts with 62 (excluding Discover\n // ranges already matched above)\n if (d2 === 62) return \"unionpay\";\n\n return null;\n};\n\n/**\n * Visa/Mastercard IIN prefixes. Each entry is\n * [prefix, totalLength].\n */\nconst CARD_PREFIXES = [\n [\"4\", 16], // Visa\n [\"51\", 16], // Mastercard\n [\"52\", 16], // Mastercard\n [\"53\", 16], // Mastercard\n [\"54\", 16], // Mastercard\n [\"55\", 16], // Mastercard\n] as const;\n\n/**\n * Generate a random valid Visa or Mastercard\n * number (16 digits, Luhn-valid).\n */\nconst generate = (): string => {\n const idx = randomInt(0, CARD_PREFIXES.length - 1);\n const [prefix, length] = CARD_PREFIXES[\n idx\n ] as (typeof CARD_PREFIXES)[number];\n const remaining = length - prefix.length - 1;\n const payload = `${prefix}${randomDigits(remaining)}`;\n const partial = `${payload}0`;\n const remainder = luhnChecksum(partial);\n const check = (10 - remainder) % 10;\n return `${payload}${String(check)}`;\n};\n\n/** Credit Card Number (Luhn). */\nconst creditCard: Validator = {\n name: \"Credit Card Number\",\n localName: \"Credit Card Number\",\n abbreviation: \"CC\",\n aliases: [\n \"credit card\",\n \"card number\",\n \"kreditní karta\",\n \"Kreditkarte\",\n ] as const,\n candidatePattern: \"(?:\\\\d[\\\\s-]?){13,19}\",\n entityType: \"any\",\n sourceUrl: \"https://www.iso.org/standard/70484.html\",\n examples: [\n \"4111111111111111\",\n \"5500000000000004\",\n ] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default creditCard;\nexport { compact, detectNetwork, format, validate };\nexport type { CardNetwork };\n"],"mappings":";;;;;;;;;;;;;;;;AAoCA,MAAM,WAAW,UACf,MAAM,OAAO,MAAM;AAErB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,SAAS,MAAM,EAAE,SAAS,GAC9B,QAAO,IACL,kBACA,0CACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,8CACD;AAEH,KAAI,CAAC,aAAa,EAAE,CAClB,QAAO,IACL,oBACA,sCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,MAAM,EAAE,OAAO,IAC9B,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG;CAG1D,MAAM,SAAmB,EAAE;AAC3B,MAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,EACjC,QAAO,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC;AAEhC,QAAO,OAAO,KAAK,IAAI;;AAGzB,MAAM,mBAAsC;CAC1C;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACjD;;;;;;;;AASD,MAAM,iBACJ,UACuB;CACvB,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EAAG,QAAO;AAC3B,KAAI,CAAC,SAAS,EAAE,CAAE,QAAO;CAEzB,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAChC,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAChC,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAChC,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;AAGhC,KAAI,OAAO,MAAM,OAAO,GAAI,QAAO;AAGnC,KAAI,OAAO,MAAM,OAAO,GAAI,QAAO;AACnC,KAAI,MAAM,OAAO,MAAM,IAAK,QAAO;AAGnC,KAAI,MAAM,QAAQ,MAAM,KAAM,QAAO;AAGrC,KAAI,EAAE,OAAO,IAAK,QAAO;AAIzB,KAAI,iBAAiB,SAAS,GAAG,CAAE,QAAO;AAG1C,KAAI,MAAM,MAAM,MAAM,GAAI,QAAO;AACjC,KAAI,MAAM,QAAQ,MAAM,KAAM,QAAO;AAGrC,KAAI,OAAO,KAAM,QAAO;AACxB,KAAI,MAAM,UAAU,MAAM,OAAQ,QAAO;AACzC,KAAI,MAAM,OAAO,MAAM,IAAK,QAAO;AACnC,KAAI,OAAO,GAAI,QAAO;AAItB,KAAI,OAAO,GAAI,QAAO;AAEtB,QAAO;;;;;;AAOT,MAAM,gBAAgB;CACpB,CAAC,KAAK,GAAG;CACT,CAAC,MAAM,GAAG;CACV,CAAC,MAAM,GAAG;CACV,CAAC,MAAM,GAAG;CACV,CAAC,MAAM,GAAG;CACV,CAAC,MAAM,GAAG;CACX;;;;;AAMD,MAAM,iBAAyB;CAE7B,MAAM,CAAC,QAAQ,UAAU,cADb,UAAU,GAAG,cAAc,SAAS,EAAE;CAKlD,MAAM,UAAU,GAAG,SAAS,aADV,SAAS,OAAO,SAAS,EACQ;CAGnD,MAAM,SAAS,KADG,aADF,GAAG,QAAQ,GACY,IACN;AACjC,QAAO,GAAG,UAAU,OAAO,MAAM;;;AAInC,MAAM,aAAwB;CAC5B,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACA;EACD;CACD,kBAAkB;CAClB,YAAY;CACZ,WAAW;CACX,UAAU,CACR,oBACA,mBACD;CACD;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"creditcard.js","names":[],"sources":["../src/creditcard.ts"],"sourcesContent":["/**\n * Credit card number validation (Luhn algorithm).\n *\n * Validates card numbers using the Luhn checksum\n * (ISO/IEC 7812-1). Supports Visa, Mastercard,\n * Amex, Discover, and other networks (13-19\n * digits).\n *\n * @see https://www.iso.org/standard/70484.html\n */\n\nimport type {\n ValidateResult,\n GlobalValidator,\n} from \"./types\";\n\nimport {\n luhnChecksum,\n luhnValidate,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\n/**\n * Card network identifiers returned by\n * {@link detectNetwork}.\n */\ntype CardNetwork =\n | \"visa\"\n | \"mastercard\"\n | \"amex\"\n | \"discover\"\n | \"diners\"\n | \"jcb\"\n | \"unionpay\"\n | \"maestro\";\n\nconst compact = (value: string): string =>\n clean(value, \" -.\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length < 13 || v.length > 19) {\n return err(\n \"INVALID_LENGTH\",\n \"Credit card number must be 13-19 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Credit card number must contain only digits\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Credit card number fails Luhn check\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n // Amex: 4-6-5 grouping\n if (v.length === 15 && v[0] === \"3\") {\n return `${v.slice(0, 4)} ${v.slice(4, 10)} ${v.slice(10)}`;\n }\n // Standard: groups of 4\n const groups: string[] = [];\n for (let i = 0; i < v.length; i += 4) {\n groups.push(v.slice(i, i + 4));\n }\n return groups.join(\" \");\n};\n\nconst MAESTRO_PREFIXES = new Set([\n 5018, 5020, 5038, 5893, 6304, 6759, 6761, 6762, 6763,\n]);\n\n/**\n * Detect the card network from the BIN/IIN prefix.\n *\n * Accepts both formatted (\"4111 1111 1111 1111\")\n * and compact (\"4111111111111111\") inputs.\n * Returns null for unrecognized prefixes.\n */\nconst detectNetwork = (\n value: string,\n): CardNetwork | null => {\n const v = compact(value);\n if (v.length === 0) return null;\n if (!isdigits(v)) return null;\n\n const d2 = Number(v.slice(0, 2));\n const d3 = Number(v.slice(0, 3));\n const d4 = Number(v.slice(0, 4));\n const d6 = Number(v.slice(0, 6));\n\n // Amex: 34, 37\n if (d2 === 34 || d2 === 37) return \"amex\";\n\n // Diners Club: 300-305, 36, 38\n if (d2 === 36 || d2 === 38) return \"diners\";\n if (d3 >= 300 && d3 <= 305) return \"diners\";\n\n // JCB: 3528-3589\n if (d4 >= 3528 && d4 <= 3589) return \"jcb\";\n\n // Visa: starts with 4\n if (v[0] === \"4\") return \"visa\";\n\n // Maestro (check before Mastercard; some share\n // the 50xx prefix space)\n if (MAESTRO_PREFIXES.has(d4)) return \"maestro\";\n\n // Mastercard: 51-55 or 2221-2720\n if (d2 >= 51 && d2 <= 55) return \"mastercard\";\n if (d4 >= 2221 && d4 <= 2720) return \"mastercard\";\n\n // Discover: 6011, 622126-622925, 644-649, 65\n if (d4 === 6011) return \"discover\";\n if (d6 >= 622126 && d6 <= 622925) return \"discover\";\n if (d3 >= 644 && d3 <= 649) return \"discover\";\n if (d2 === 65) return \"discover\";\n\n // UnionPay: starts with 62 (excluding Discover\n // ranges already matched above)\n if (d2 === 62) return \"unionpay\";\n\n return null;\n};\n\n/**\n * Visa/Mastercard IIN prefixes. Each entry is\n * [prefix, totalLength].\n */\nconst CARD_PREFIXES = [\n [\"4\", 16], // Visa\n [\"51\", 16], // Mastercard\n [\"52\", 16], // Mastercard\n [\"53\", 16], // Mastercard\n [\"54\", 16], // Mastercard\n [\"55\", 16], // Mastercard\n] as const;\n\n/**\n * Generate a random valid Visa or Mastercard\n * number (16 digits, Luhn-valid).\n */\nconst generate = (): string => {\n const idx = randomInt(0, CARD_PREFIXES.length - 1);\n const [prefix, length] = CARD_PREFIXES[\n idx\n ] as (typeof CARD_PREFIXES)[number];\n const remaining = length - prefix.length - 1;\n const payload = `${prefix}${randomDigits(remaining)}`;\n const partial = `${payload}0`;\n const remainder = luhnChecksum(partial);\n const check = (10 - remainder) % 10;\n return `${payload}${String(check)}`;\n};\n\n/** Credit Card Number (Luhn). */\nconst creditCard: GlobalValidator = {\n scope: \"global\",\n name: \"Credit Card Number\",\n localName: \"Credit Card Number\",\n abbreviation: \"CC\",\n aliases: [\n \"credit card\",\n \"card number\",\n \"kreditní karta\",\n \"Kreditkarte\",\n ] as const,\n candidatePattern: \"(?:\\\\d[\\\\s-]?){13,19}\",\n entityType: \"any\",\n sourceUrl: \"https://www.iso.org/standard/70484.html\",\n examples: [\n \"4111111111111111\",\n \"5500000000000004\",\n ] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default creditCard;\nexport { compact, detectNetwork, format, validate };\nexport type { CardNetwork };\n"],"mappings":";;;;;;AAuCA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,SAAS,MAAM,EAAE,SAAS,IAC9B,OAAO,IACL,kBACA,yCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,6CACF;CAEF,IAAI,CAAC,aAAa,CAAC,GACjB,OAAO,IACL,oBACA,qCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,MAAM,EAAE,OAAO,KAC9B,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;CAGzD,MAAM,SAAmB,CAAC;CAC1B,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,GACjC,OAAO,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAE/B,OAAO,OAAO,KAAK,GAAG;AACxB;AAEA,MAAM,mBAAmB,IAAI,IAAI;CAC/B;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;AAClD,CAAC;;;;;;;;AASD,MAAM,iBACJ,UACuB;CACvB,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GAAG,OAAO;CAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO;CAEzB,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAC/B,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAC/B,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAC/B,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAG/B,IAAI,OAAO,MAAM,OAAO,IAAI,OAAO;CAGnC,IAAI,OAAO,MAAM,OAAO,IAAI,OAAO;CACnC,IAAI,MAAM,OAAO,MAAM,KAAK,OAAO;CAGnC,IAAI,MAAM,QAAQ,MAAM,MAAM,OAAO;CAGrC,IAAI,EAAE,OAAO,KAAK,OAAO;CAIzB,IAAI,iBAAiB,IAAI,EAAE,GAAG,OAAO;CAGrC,IAAI,MAAM,MAAM,MAAM,IAAI,OAAO;CACjC,IAAI,MAAM,QAAQ,MAAM,MAAM,OAAO;CAGrC,IAAI,OAAO,MAAM,OAAO;CACxB,IAAI,MAAM,UAAU,MAAM,QAAQ,OAAO;CACzC,IAAI,MAAM,OAAO,MAAM,KAAK,OAAO;CACnC,IAAI,OAAO,IAAI,OAAO;CAItB,IAAI,OAAO,IAAI,OAAO;CAEtB,OAAO;AACT;;;;;AAMA,MAAM,gBAAgB;CACpB,CAAC,KAAK,EAAE;CACR,CAAC,MAAM,EAAE;CACT,CAAC,MAAM,EAAE;CACT,CAAC,MAAM,EAAE;CACT,CAAC,MAAM,EAAE;CACT,CAAC,MAAM,EAAE;AACX;;;;;AAMA,MAAM,iBAAyB;CAE7B,MAAM,CAAC,QAAQ,UAAU,cADb,UAAU,GAAG,cAAc,SAAS,CAE5C;CAGJ,MAAM,UAAU,GAAG,SAAS,aADV,SAAS,OAAO,SAAS,CACO;CAGlD,MAAM,SAAS,KADG,aAAa,GADZ,QAAQ,EAEC,KAAK;CACjC,OAAO,GAAG,UAAU,OAAO,KAAK;AAClC;;AAGA,MAAM,aAA8B;CAClC,OAAO;CACP,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACA;CACF;CACA,kBAAkB;CAClB,YAAY;CACZ,WAAW;CACX,UAAU,CACR,oBACA,kBACF;CACA;CACA;CACA;CACA;AACF"}
package/dist/cu/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import ni from "./ni.js";
3
2
 
4
3
  //#region src/cu/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { ni };
6
+ }
6
7
  //#endregion
7
8
  export { mod_d_exports, ni };
8
9
  //# sourceMappingURL=mod.d.ts.map