@stll/stdnum 1.0.0 → 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 (704) hide show
  1. package/dist/_checksums/luhn.js.map +1 -1
  2. package/dist/_checksums/mod1110.js +1 -1
  3. package/dist/_checksums/mod1110.js.map +1 -1
  4. package/dist/_checksums/mod112.js.map +1 -1
  5. package/dist/_checksums/mod97.js.map +1 -1
  6. package/dist/_checksums/verhoeff.js.map +1 -1
  7. package/dist/_checksums/weighted-sum.js.map +1 -1
  8. package/dist/_util/arabic.js.map +1 -1
  9. package/dist/_util/clean.js.map +1 -1
  10. package/dist/_util/date.js.map +1 -1
  11. package/dist/_util/generate.js.map +1 -1
  12. package/dist/_util/result.js.map +1 -1
  13. package/dist/_util/strings.js.map +1 -1
  14. package/dist/ad/nrt.d.ts +16 -2
  15. package/dist/ad/nrt.js +1 -14
  16. package/dist/ad/nrt.js.map +1 -1
  17. package/dist/ae/eid.d.ts +2 -2
  18. package/dist/ae/eid.js +2 -12
  19. package/dist/ae/eid.js.map +1 -1
  20. package/dist/ai/tin.d.ts +20 -2
  21. package/dist/ai/tin.js +1 -18
  22. package/dist/ai/tin.js.map +1 -1
  23. package/dist/al/nipt.d.ts +13 -2
  24. package/dist/al/nipt.js +1 -11
  25. package/dist/al/nipt.js.map +1 -1
  26. package/dist/am/tin.d.ts +16 -2
  27. package/dist/am/tin.js +1 -14
  28. package/dist/am/tin.js.map +1 -1
  29. package/dist/ar/cbu.d.ts +2 -2
  30. package/dist/ar/cbu.js +1 -9
  31. package/dist/ar/cbu.js.map +1 -1
  32. package/dist/ar/cuit.d.ts +2 -2
  33. package/dist/ar/cuit.js +1 -17
  34. package/dist/ar/cuit.js.map +1 -1
  35. package/dist/ar/dni.d.ts +11 -2
  36. package/dist/ar/dni.js +1 -9
  37. package/dist/ar/dni.js.map +1 -1
  38. package/dist/at/businessid.d.ts +10 -2
  39. package/dist/at/businessid.js +1 -8
  40. package/dist/at/businessid.js.map +1 -1
  41. package/dist/at/tin.d.ts +2 -2
  42. package/dist/at/tin.js +1 -11
  43. package/dist/at/tin.js.map +1 -1
  44. package/dist/at/uid.d.ts +2 -2
  45. package/dist/at/uid.js +2 -10
  46. package/dist/at/uid.js.map +1 -1
  47. package/dist/at/vnr.d.ts +2 -2
  48. package/dist/at/vnr.js +4 -14
  49. package/dist/at/vnr.js.map +1 -1
  50. package/dist/au/abn.d.ts +2 -2
  51. package/dist/au/abn.js +1 -10
  52. package/dist/au/abn.js.map +1 -1
  53. package/dist/au/acn.d.ts +2 -2
  54. package/dist/au/acn.js +1 -10
  55. package/dist/au/acn.js.map +1 -1
  56. package/dist/au/tfn.d.ts +2 -2
  57. package/dist/au/tfn.js +1 -10
  58. package/dist/au/tfn.js.map +1 -1
  59. package/dist/az/voen.d.ts +2 -2
  60. package/dist/az/voen.js +1 -14
  61. package/dist/az/voen.js.map +1 -1
  62. package/dist/ba/jmbg.d.ts +2 -2
  63. package/dist/ba/jmbg.js +3 -11
  64. package/dist/ba/jmbg.js.map +1 -1
  65. package/dist/bd/nid.d.ts +23 -2
  66. package/dist/bd/nid.js +1 -21
  67. package/dist/bd/nid.js.map +1 -1
  68. package/dist/be/bis.d.ts +2 -2
  69. package/dist/be/bis.js +1 -11
  70. package/dist/be/bis.js.map +1 -1
  71. package/dist/be/nn.d.ts +2 -2
  72. package/dist/be/nn.js +1 -11
  73. package/dist/be/nn.js.map +1 -1
  74. package/dist/be/vat.d.ts +2 -2
  75. package/dist/be/vat.js +1 -9
  76. package/dist/be/vat.js.map +1 -1
  77. package/dist/bg/egn.d.ts +2 -2
  78. package/dist/bg/egn.js +3 -18
  79. package/dist/bg/egn.js.map +1 -1
  80. package/dist/bg/pnf.d.ts +2 -2
  81. package/dist/bg/pnf.js +1 -8
  82. package/dist/bg/pnf.js.map +1 -1
  83. package/dist/bg/vat.d.ts +2 -2
  84. package/dist/bg/vat.js +3 -9
  85. package/dist/bg/vat.js.map +1 -1
  86. package/dist/bh/cpr.d.ts +2 -2
  87. package/dist/bh/cpr.js +1 -17
  88. package/dist/bh/cpr.js.map +1 -1
  89. package/dist/bic.d.ts +13 -2
  90. package/dist/bic.js +1 -11
  91. package/dist/bic.js.map +1 -1
  92. package/dist/br/cnpj.d.ts +2 -2
  93. package/dist/br/cnpj.js +1 -20
  94. package/dist/br/cnpj.js.map +1 -1
  95. package/dist/br/cpf.d.ts +2 -2
  96. package/dist/br/cpf.js +1 -14
  97. package/dist/br/cpf.js.map +1 -1
  98. package/dist/by/unp.d.ts +2 -2
  99. package/dist/by/unp.js +3 -14
  100. package/dist/by/unp.js.map +1 -1
  101. package/dist/bz/tin.d.ts +2 -2
  102. package/dist/bz/tin.js +1 -26
  103. package/dist/bz/tin.js.map +1 -1
  104. package/dist/ca/bn.d.ts +2 -2
  105. package/dist/ca/bn.js +2 -10
  106. package/dist/ca/bn.js.map +1 -1
  107. package/dist/ca/sin.d.ts +2 -2
  108. package/dist/ca/sin.js +2 -10
  109. package/dist/ca/sin.js.map +1 -1
  110. package/dist/ch/ssn.d.ts +2 -2
  111. package/dist/ch/ssn.js +1 -9
  112. package/dist/ch/ssn.js.map +1 -1
  113. package/dist/ch/uid.d.ts +2 -2
  114. package/dist/ch/uid.js +1 -9
  115. package/dist/ch/uid.js.map +1 -1
  116. package/dist/ch/vat.d.ts +2 -2
  117. package/dist/ch/vat.js +1 -9
  118. package/dist/ch/vat.js.map +1 -1
  119. package/dist/cl/rut.d.ts +2 -2
  120. package/dist/cl/rut.js +1 -14
  121. package/dist/cl/rut.js.map +1 -1
  122. package/dist/cn/ric.d.ts +2 -2
  123. package/dist/cn/ric.js +3 -14
  124. package/dist/cn/ric.js.map +1 -1
  125. package/dist/cn/uscc.d.ts +2 -2
  126. package/dist/cn/uscc.js +1 -10
  127. package/dist/cn/uscc.js.map +1 -1
  128. package/dist/co/nit.d.ts +2 -2
  129. package/dist/co/nit.js +2 -12
  130. package/dist/co/nit.js.map +1 -1
  131. package/dist/cr/cpf.d.ts +18 -2
  132. package/dist/cr/cpf.js +1 -16
  133. package/dist/cr/cpf.js.map +1 -1
  134. package/dist/creditcard.d.ts +2 -2
  135. package/dist/creditcard.js +5 -14
  136. package/dist/creditcard.js.map +1 -1
  137. package/dist/cu/ni.d.ts +2 -2
  138. package/dist/cu/ni.js +2 -17
  139. package/dist/cu/ni.js.map +1 -1
  140. package/dist/cy/vat.d.ts +2 -2
  141. package/dist/cy/vat.js +1 -8
  142. package/dist/cy/vat.js.map +1 -1
  143. package/dist/cz/dic.d.ts +2 -2
  144. package/dist/cz/dic.js +7 -13
  145. package/dist/cz/dic.js.map +1 -1
  146. package/dist/cz/ico.d.ts +2 -2
  147. package/dist/cz/ico.js +2 -10
  148. package/dist/cz/ico.js.map +1 -1
  149. package/dist/cz/rc.d.ts +2 -2
  150. package/dist/cz/rc.js +2 -26
  151. package/dist/cz/rc.js.map +1 -1
  152. package/dist/de/handelsreg.d.ts +19 -2
  153. package/dist/de/handelsreg.js +1 -17
  154. package/dist/de/handelsreg.js.map +1 -1
  155. package/dist/de/idnr.d.ts +2 -2
  156. package/dist/de/idnr.js +2 -12
  157. package/dist/de/idnr.js.map +1 -1
  158. package/dist/de/stnr.d.ts +17 -2
  159. package/dist/de/stnr.js +1 -15
  160. package/dist/de/stnr.js.map +1 -1
  161. package/dist/de/svnr.d.ts +2 -2
  162. package/dist/de/svnr.js +2 -11
  163. package/dist/de/svnr.js.map +1 -1
  164. package/dist/de/vat.d.ts +2 -2
  165. package/dist/de/vat.js +2 -11
  166. package/dist/de/vat.js.map +1 -1
  167. package/dist/dk/cpr.d.ts +2 -2
  168. package/dist/dk/cpr.js +2 -10
  169. package/dist/dk/cpr.js.map +1 -1
  170. package/dist/dk/cvr.d.ts +2 -2
  171. package/dist/dk/cvr.js +2 -15
  172. package/dist/dk/cvr.js.map +1 -1
  173. package/dist/dk/vat.d.ts +2 -2
  174. package/dist/dk/vat.js +3 -13
  175. package/dist/dk/vat.js.map +1 -1
  176. package/dist/do/rnc.d.ts +2 -2
  177. package/dist/do/rnc.js +2 -16
  178. package/dist/do/rnc.js.map +1 -1
  179. package/dist/ec/ruc.d.ts +2 -2
  180. package/dist/ec/ruc.js +1 -18
  181. package/dist/ec/ruc.js.map +1 -1
  182. package/dist/ee/ik.d.ts +2 -2
  183. package/dist/ee/ik.js +3 -20
  184. package/dist/ee/ik.js.map +1 -1
  185. package/dist/ee/registrikood.d.ts +2 -2
  186. package/dist/ee/registrikood.js +1 -8
  187. package/dist/ee/registrikood.js.map +1 -1
  188. package/dist/ee/vat.d.ts +2 -2
  189. package/dist/ee/vat.js +2 -10
  190. package/dist/ee/vat.js.map +1 -1
  191. package/dist/eg/tn.d.ts +11 -2
  192. package/dist/eg/tn.js +1 -9
  193. package/dist/eg/tn.js.map +1 -1
  194. package/dist/es/cif.d.ts +2 -2
  195. package/dist/es/cif.js +1 -10
  196. package/dist/es/cif.js.map +1 -1
  197. package/dist/es/dni.d.ts +2 -2
  198. package/dist/es/dni.js +1 -9
  199. package/dist/es/dni.js.map +1 -1
  200. package/dist/es/nie.d.ts +2 -2
  201. package/dist/es/nie.js +1 -9
  202. package/dist/es/nie.js.map +1 -1
  203. package/dist/es/nss.d.ts +2 -2
  204. package/dist/es/nss.js +1 -16
  205. package/dist/es/nss.js.map +1 -1
  206. package/dist/es/vat.d.ts +2 -2
  207. package/dist/es/vat.js +5 -10
  208. package/dist/es/vat.js.map +1 -1
  209. package/dist/eu/vat.d.ts +2 -2
  210. package/dist/eu/vat.js +1 -0
  211. package/dist/eu/vat.js.map +1 -1
  212. package/dist/fi/hetu.d.ts +2 -2
  213. package/dist/fi/hetu.js +2 -10
  214. package/dist/fi/hetu.js.map +1 -1
  215. package/dist/fi/vat.d.ts +2 -2
  216. package/dist/fi/vat.js +3 -10
  217. package/dist/fi/vat.js.map +1 -1
  218. package/dist/fi/ytunnus.d.ts +2 -2
  219. package/dist/fi/ytunnus.js +2 -10
  220. package/dist/fi/ytunnus.js.map +1 -1
  221. package/dist/fr/nif.d.ts +2 -2
  222. package/dist/fr/nif.js +1 -9
  223. package/dist/fr/nif.js.map +1 -1
  224. package/dist/fr/nir.d.ts +2 -2
  225. package/dist/fr/nir.js +2 -14
  226. package/dist/fr/nir.js.map +1 -1
  227. package/dist/fr/siren.d.ts +2 -2
  228. package/dist/fr/siren.js +2 -10
  229. package/dist/fr/siren.js.map +1 -1
  230. package/dist/fr/siret.d.ts +2 -2
  231. package/dist/fr/siret.js +2 -11
  232. package/dist/fr/siret.js.map +1 -1
  233. package/dist/fr/tva.d.ts +2 -2
  234. package/dist/fr/tva.js +2 -12
  235. package/dist/fr/tva.js.map +1 -1
  236. package/dist/gb/nino.d.ts +12 -2
  237. package/dist/gb/nino.js +1 -10
  238. package/dist/gb/nino.js.map +1 -1
  239. package/dist/gb/sedol.d.ts +2 -2
  240. package/dist/gb/sedol.js +1 -11
  241. package/dist/gb/sedol.js.map +1 -1
  242. package/dist/gb/utr.d.ts +2 -2
  243. package/dist/gb/utr.js +2 -10
  244. package/dist/gb/utr.js.map +1 -1
  245. package/dist/gb/vat.d.ts +2 -2
  246. package/dist/gb/vat.js +2 -11
  247. package/dist/gb/vat.js.map +1 -1
  248. package/dist/ge/pin.d.ts +14 -2
  249. package/dist/ge/pin.js +1 -12
  250. package/dist/ge/pin.js.map +1 -1
  251. package/dist/gh/tin.d.ts +2 -2
  252. package/dist/gh/tin.js +1 -15
  253. package/dist/gh/tin.js.map +1 -1
  254. package/dist/gr/amka.d.ts +2 -2
  255. package/dist/gr/amka.js +3 -11
  256. package/dist/gr/amka.js.map +1 -1
  257. package/dist/gr/vat.d.ts +2 -2
  258. package/dist/gr/vat.js +1 -10
  259. package/dist/gr/vat.js.map +1 -1
  260. package/dist/gt/nit.d.ts +2 -2
  261. package/dist/gt/nit.js +1 -12
  262. package/dist/gt/nit.js.map +1 -1
  263. package/dist/hk/hkid.d.ts +2 -2
  264. package/dist/hk/hkid.js +1 -10
  265. package/dist/hk/hkid.js.map +1 -1
  266. package/dist/hr/vat.d.ts +2 -2
  267. package/dist/hr/vat.js +2 -9
  268. package/dist/hr/vat.js.map +1 -1
  269. package/dist/hu/vat.d.ts +2 -2
  270. package/dist/hu/vat.js +3 -10
  271. package/dist/hu/vat.js.map +1 -1
  272. package/dist/iban.d.ts +2 -2
  273. package/dist/iban.js +2 -8
  274. package/dist/iban.js.map +1 -1
  275. package/dist/id/npwp.d.ts +2 -2
  276. package/dist/id/npwp.js +3 -13
  277. package/dist/id/npwp.js.map +1 -1
  278. package/dist/ie/pps.d.ts +2 -2
  279. package/dist/ie/pps.js +1 -10
  280. package/dist/ie/pps.js.map +1 -1
  281. package/dist/ie/vat.d.ts +2 -2
  282. package/dist/ie/vat.js +1 -9
  283. package/dist/ie/vat.js.map +1 -1
  284. package/dist/il/idnr.d.ts +2 -2
  285. package/dist/il/idnr.js +2 -9
  286. package/dist/il/idnr.js.map +1 -1
  287. package/dist/in/aadhaar.d.ts +2 -2
  288. package/dist/in/aadhaar.js +2 -12
  289. package/dist/in/aadhaar.js.map +1 -1
  290. package/dist/in/gstin.d.ts +2 -2
  291. package/dist/in/gstin.js +1 -10
  292. package/dist/in/gstin.js.map +1 -1
  293. package/dist/in/pan.d.ts +15 -2
  294. package/dist/in/pan.js +1 -13
  295. package/dist/in/pan.js.map +1 -1
  296. package/dist/index.d.ts +2 -2
  297. package/dist/index.js +6 -6
  298. package/dist/iq/nid.d.ts +16 -2
  299. package/dist/iq/nid.js +2 -15
  300. package/dist/iq/nid.js.map +1 -1
  301. package/dist/ir/nid.d.ts +2 -2
  302. package/dist/ir/nid.js +2 -24
  303. package/dist/ir/nid.js.map +1 -1
  304. package/dist/is/kennitala.d.ts +2 -2
  305. package/dist/is/kennitala.js +2 -13
  306. package/dist/is/kennitala.js.map +1 -1
  307. package/dist/is/vsk.d.ts +9 -2
  308. package/dist/is/vsk.js +1 -7
  309. package/dist/is/vsk.js.map +1 -1
  310. package/dist/isin.d.ts +2 -2
  311. package/dist/isin.js +2 -12
  312. package/dist/isin.js.map +1 -1
  313. package/dist/it/codicefiscale.d.ts +2 -2
  314. package/dist/it/codicefiscale.js +1 -21
  315. package/dist/it/codicefiscale.js.map +1 -1
  316. package/dist/it/iva.d.ts +2 -2
  317. package/dist/it/iva.js +2 -9
  318. package/dist/it/iva.js.map +1 -1
  319. package/dist/jp/cn.d.ts +2 -2
  320. package/dist/jp/cn.js +1 -9
  321. package/dist/jp/cn.js.map +1 -1
  322. package/dist/jp/mynumber.d.ts +2 -2
  323. package/dist/jp/mynumber.js +1 -10
  324. package/dist/jp/mynumber.js.map +1 -1
  325. package/dist/kr/brn.d.ts +11 -2
  326. package/dist/kr/brn.js +1 -9
  327. package/dist/kr/brn.js.map +1 -1
  328. package/dist/kr/rrn.d.ts +2 -2
  329. package/dist/kr/rrn.js +2 -11
  330. package/dist/kr/rrn.js.map +1 -1
  331. package/dist/kw/civil.d.ts +2 -2
  332. package/dist/kw/civil.js +2 -14
  333. package/dist/kw/civil.js.map +1 -1
  334. package/dist/kz/iin.d.ts +2 -2
  335. package/dist/kz/iin.js +3 -18
  336. package/dist/kz/iin.js.map +1 -1
  337. package/dist/lei.d.ts +2 -2
  338. package/dist/lei.js +2 -11
  339. package/dist/lei.js.map +1 -1
  340. package/dist/li/peid.d.ts +11 -2
  341. package/dist/li/peid.js +1 -9
  342. package/dist/li/peid.js.map +1 -1
  343. package/dist/lk/nic.d.ts +2 -2
  344. package/dist/lk/nic.js +2 -14
  345. package/dist/lk/nic.js.map +1 -1
  346. package/dist/lt/asmens.d.ts +2 -2
  347. package/dist/lt/asmens.js +2 -1
  348. package/dist/lt/asmens.js.map +1 -1
  349. package/dist/lt/vat.d.ts +2 -2
  350. package/dist/lt/vat.js +2 -10
  351. package/dist/lt/vat.js.map +1 -1
  352. package/dist/lu/vat.d.ts +2 -2
  353. package/dist/lu/vat.js +2 -8
  354. package/dist/lu/vat.js.map +1 -1
  355. package/dist/luhn.d.ts +2 -2
  356. package/dist/luhn.js +2 -9
  357. package/dist/luhn.js.map +1 -1
  358. package/dist/lv/vat.d.ts +2 -2
  359. package/dist/lv/vat.js +2 -28
  360. package/dist/lv/vat.js.map +1 -1
  361. package/dist/ma/ice.d.ts +2 -2
  362. package/dist/ma/ice.js +2 -11
  363. package/dist/ma/ice.js.map +1 -1
  364. package/dist/mc/tva.d.ts +2 -2
  365. package/dist/mc/tva.js +1 -0
  366. package/dist/mc/tva.js.map +1 -1
  367. package/dist/md/idno.d.ts +2 -2
  368. package/dist/md/idno.js +1 -10
  369. package/dist/md/idno.js.map +1 -1
  370. package/dist/me/pib.d.ts +2 -2
  371. package/dist/me/pib.js +2 -10
  372. package/dist/me/pib.js.map +1 -1
  373. package/dist/mk/edb.d.ts +2 -2
  374. package/dist/mk/edb.js +2 -11
  375. package/dist/mk/edb.js.map +1 -1
  376. package/dist/mt/vat.d.ts +2 -2
  377. package/dist/mt/vat.js +3 -10
  378. package/dist/mt/vat.js.map +1 -1
  379. package/dist/mu/brn.d.ts +23 -2
  380. package/dist/mu/brn.js +1 -21
  381. package/dist/mu/brn.js.map +1 -1
  382. package/dist/mx/clabe.d.ts +2 -2
  383. package/dist/mx/clabe.js +1 -14
  384. package/dist/mx/clabe.js.map +1 -1
  385. package/dist/mx/curp.d.ts +2 -2
  386. package/dist/mx/curp.js +3 -17
  387. package/dist/mx/curp.js.map +1 -1
  388. package/dist/mx/rfc.d.ts +2 -2
  389. package/dist/mx/rfc.js +3 -19
  390. package/dist/mx/rfc.js.map +1 -1
  391. package/dist/my/nric.d.ts +2 -2
  392. package/dist/my/nric.js +2 -14
  393. package/dist/my/nric.js.map +1 -1
  394. package/dist/ng/nin.d.ts +13 -2
  395. package/dist/ng/nin.js +1 -11
  396. package/dist/ng/nin.js.map +1 -1
  397. package/dist/ni/ruc.d.ts +2 -2
  398. package/dist/ni/ruc.js +1 -23
  399. package/dist/ni/ruc.js.map +1 -1
  400. package/dist/nl/bsn.d.ts +2 -2
  401. package/dist/nl/bsn.js +2 -10
  402. package/dist/nl/bsn.js.map +1 -1
  403. package/dist/nl/kvk.d.ts +9 -2
  404. package/dist/nl/kvk.js +1 -7
  405. package/dist/nl/kvk.js.map +1 -1
  406. package/dist/nl/vat.d.ts +2 -2
  407. package/dist/nl/vat.js +1 -13
  408. package/dist/nl/vat.js.map +1 -1
  409. package/dist/no/fodselsnummer.d.ts +2 -2
  410. package/dist/no/fodselsnummer.js +2 -10
  411. package/dist/no/fodselsnummer.js.map +1 -1
  412. package/dist/no/mva.d.ts +2 -2
  413. package/dist/no/mva.js +1 -8
  414. package/dist/no/mva.js.map +1 -1
  415. package/dist/no/orgnr.d.ts +2 -2
  416. package/dist/no/orgnr.js +2 -8
  417. package/dist/no/orgnr.js.map +1 -1
  418. package/dist/nz/ird.d.ts +2 -2
  419. package/dist/nz/ird.js +2 -11
  420. package/dist/nz/ird.js.map +1 -1
  421. package/dist/pa/ruc.d.ts +2 -2
  422. package/dist/pa/ruc.js +1 -18
  423. package/dist/pa/ruc.js.map +1 -1
  424. package/dist/patterns.d.ts +8 -7
  425. package/dist/patterns.js +3 -5
  426. package/dist/patterns.js.map +1 -1
  427. package/dist/pe/ruc.d.ts +2 -2
  428. package/dist/pe/ruc.js +1 -15
  429. package/dist/pe/ruc.js.map +1 -1
  430. package/dist/ph/philid.d.ts +14 -2
  431. package/dist/ph/philid.js +1 -12
  432. package/dist/ph/philid.js.map +1 -1
  433. package/dist/pk/cnic.d.ts +14 -2
  434. package/dist/pk/cnic.js +1 -12
  435. package/dist/pk/cnic.js.map +1 -1
  436. package/dist/pl/nip.d.ts +2 -2
  437. package/dist/pl/nip.js +2 -10
  438. package/dist/pl/nip.js.map +1 -1
  439. package/dist/pl/pesel.d.ts +2 -2
  440. package/dist/pl/pesel.js +3 -13
  441. package/dist/pl/pesel.js.map +1 -1
  442. package/dist/pl/regon.d.ts +2 -2
  443. package/dist/pl/regon.js +2 -11
  444. package/dist/pl/regon.js.map +1 -1
  445. package/dist/pt/cc.d.ts +2 -2
  446. package/dist/pt/cc.js +1 -9
  447. package/dist/pt/cc.js.map +1 -1
  448. package/dist/pt/vat.d.ts +2 -2
  449. package/dist/pt/vat.js +3 -11
  450. package/dist/pt/vat.js.map +1 -1
  451. package/dist/ro/cnp.d.ts +2 -2
  452. package/dist/ro/cnp.js +4 -14
  453. package/dist/ro/cnp.js.map +1 -1
  454. package/dist/ro/vat.d.ts +2 -2
  455. package/dist/ro/vat.js +13 -11
  456. package/dist/ro/vat.js.map +1 -1
  457. package/dist/rs/pib.d.ts +2 -2
  458. package/dist/rs/pib.js +1 -9
  459. package/dist/rs/pib.js.map +1 -1
  460. package/dist/ru/inn.d.ts +2 -2
  461. package/dist/ru/inn.js +1 -11
  462. package/dist/ru/inn.js.map +1 -1
  463. package/dist/se/orgnr.d.ts +2 -2
  464. package/dist/se/orgnr.js +2 -9
  465. package/dist/se/orgnr.js.map +1 -1
  466. package/dist/se/personnummer.d.ts +2 -2
  467. package/dist/se/personnummer.js +7 -15
  468. package/dist/se/personnummer.js.map +1 -1
  469. package/dist/se/vat.d.ts +2 -2
  470. package/dist/se/vat.js +3 -10
  471. package/dist/se/vat.js.map +1 -1
  472. package/dist/sg/uen.d.ts +2 -2
  473. package/dist/sg/uen.js +1 -15
  474. package/dist/sg/uen.js.map +1 -1
  475. package/dist/si/emso.d.ts +2 -2
  476. package/dist/si/emso.js +3 -18
  477. package/dist/si/emso.js.map +1 -1
  478. package/dist/si/vat.d.ts +2 -2
  479. package/dist/si/vat.js +3 -12
  480. package/dist/si/vat.js.map +1 -1
  481. package/dist/sk/dic.d.ts +2 -2
  482. package/dist/sk/dic.js +1 -0
  483. package/dist/sk/dic.js.map +1 -1
  484. package/dist/sk/ico.d.ts +2 -2
  485. package/dist/sk/ico.js +1 -0
  486. package/dist/sk/ico.js.map +1 -1
  487. package/dist/sk/rc.d.ts +2 -2
  488. package/dist/sk/rc.js +1 -0
  489. package/dist/sk/rc.js.map +1 -1
  490. package/dist/th/tin.d.ts +2 -2
  491. package/dist/th/tin.js +1 -11
  492. package/dist/th/tin.js.map +1 -1
  493. package/dist/tr/tckimlik.d.ts +2 -2
  494. package/dist/tr/tckimlik.js +1 -20
  495. package/dist/tr/tckimlik.js.map +1 -1
  496. package/dist/tr/vkn.d.ts +2 -2
  497. package/dist/tr/vkn.js +1 -20
  498. package/dist/tr/vkn.js.map +1 -1
  499. package/dist/tw/ubn.d.ts +2 -2
  500. package/dist/tw/ubn.js +1 -11
  501. package/dist/tw/ubn.js.map +1 -1
  502. package/dist/types.d.ts +26 -4
  503. package/dist/ua/edrpou.d.ts +2 -2
  504. package/dist/ua/edrpou.js +1 -11
  505. package/dist/ua/edrpou.js.map +1 -1
  506. package/dist/us/ein.d.ts +12 -2
  507. package/dist/us/ein.js +1 -10
  508. package/dist/us/ein.js.map +1 -1
  509. package/dist/us/itin.d.ts +13 -2
  510. package/dist/us/itin.js +1 -11
  511. package/dist/us/itin.js.map +1 -1
  512. package/dist/us/rtn.d.ts +2 -2
  513. package/dist/us/rtn.js +3 -18
  514. package/dist/us/rtn.js.map +1 -1
  515. package/dist/us/ssn.d.ts +13 -2
  516. package/dist/us/ssn.js +1 -11
  517. package/dist/us/ssn.js.map +1 -1
  518. package/dist/uy/rut.d.ts +2 -2
  519. package/dist/uy/rut.js +1 -14
  520. package/dist/uy/rut.js.map +1 -1
  521. package/dist/ve/rif.d.ts +2 -2
  522. package/dist/ve/rif.js +2 -15
  523. package/dist/ve/rif.js.map +1 -1
  524. package/dist/vn/mst.d.ts +2 -2
  525. package/dist/vn/mst.js +1 -12
  526. package/dist/vn/mst.js.map +1 -1
  527. package/dist/za/idnr.d.ts +2 -2
  528. package/dist/za/idnr.js +3 -16
  529. package/dist/za/idnr.js.map +1 -1
  530. package/package.json +22 -12
  531. package/src/_checksums/mod1110.ts +1 -1
  532. package/src/ad/nrt.ts +7 -3
  533. package/src/ae/eid.ts +7 -3
  534. package/src/ai/tin.ts +7 -3
  535. package/src/al/nipt.ts +7 -3
  536. package/src/am/tin.ts +7 -3
  537. package/src/ar/cbu.ts +7 -3
  538. package/src/ar/cuit.ts +7 -3
  539. package/src/ar/dni.ts +7 -3
  540. package/src/at/businessid.ts +7 -3
  541. package/src/at/tin.ts +7 -3
  542. package/src/at/uid.ts +7 -3
  543. package/src/at/vnr.ts +37 -9
  544. package/src/au/abn.ts +7 -3
  545. package/src/au/acn.ts +7 -3
  546. package/src/au/tfn.ts +7 -3
  547. package/src/az/voen.ts +7 -3
  548. package/src/ba/jmbg.ts +8 -7
  549. package/src/bd/nid.ts +7 -3
  550. package/src/be/bis.ts +8 -4
  551. package/src/be/nn.ts +7 -3
  552. package/src/be/vat.ts +7 -3
  553. package/src/bg/egn.ts +8 -7
  554. package/src/bg/pnf.ts +7 -3
  555. package/src/bg/vat.ts +8 -3
  556. package/src/bh/cpr.ts +7 -3
  557. package/src/bic.ts +7 -3
  558. package/src/br/cnpj.ts +7 -3
  559. package/src/br/cpf.ts +7 -3
  560. package/src/by/unp.ts +10 -5
  561. package/src/bz/tin.ts +7 -3
  562. package/src/ca/bn.ts +7 -3
  563. package/src/ca/sin.ts +7 -3
  564. package/src/ch/ssn.ts +7 -3
  565. package/src/ch/uid.ts +7 -3
  566. package/src/ch/vat.ts +9 -5
  567. package/src/cl/rut.ts +7 -3
  568. package/src/cn/ric.ts +8 -7
  569. package/src/cn/uscc.ts +7 -3
  570. package/src/co/nit.ts +8 -4
  571. package/src/cr/cpf.ts +7 -3
  572. package/src/creditcard.ts +10 -6
  573. package/src/cu/ni.ts +8 -7
  574. package/src/cy/vat.ts +7 -3
  575. package/src/cz/dic.ts +9 -4
  576. package/src/cz/ico.ts +7 -3
  577. package/src/cz/rc.ts +8 -7
  578. package/src/de/handelsreg.ts +7 -3
  579. package/src/de/idnr.ts +7 -3
  580. package/src/de/stnr.ts +7 -3
  581. package/src/de/svnr.ts +7 -3
  582. package/src/de/vat.ts +7 -3
  583. package/src/dk/cpr.ts +8 -7
  584. package/src/dk/cvr.ts +7 -3
  585. package/src/dk/vat.ts +8 -3
  586. package/src/do/rnc.ts +7 -3
  587. package/src/ec/ruc.ts +7 -3
  588. package/src/ee/ik.ts +8 -7
  589. package/src/ee/registrikood.ts +8 -4
  590. package/src/ee/vat.ts +7 -3
  591. package/src/eg/tn.ts +7 -3
  592. package/src/es/cif.ts +8 -4
  593. package/src/es/dni.ts +7 -3
  594. package/src/es/nie.ts +8 -4
  595. package/src/es/nss.ts +7 -3
  596. package/src/es/vat.ts +13 -5
  597. package/src/eu/vat.ts +10 -6
  598. package/src/fi/hetu.ts +8 -7
  599. package/src/fi/vat.ts +8 -3
  600. package/src/fi/ytunnus.ts +7 -3
  601. package/src/fr/nif.ts +7 -3
  602. package/src/fr/nir.ts +8 -7
  603. package/src/fr/siren.ts +7 -3
  604. package/src/fr/siret.ts +7 -3
  605. package/src/fr/tva.ts +7 -3
  606. package/src/gb/nino.ts +7 -3
  607. package/src/gb/sedol.ts +7 -3
  608. package/src/gb/utr.ts +7 -3
  609. package/src/gb/vat.ts +7 -3
  610. package/src/ge/pin.ts +7 -3
  611. package/src/gh/tin.ts +7 -3
  612. package/src/gr/amka.ts +7 -3
  613. package/src/gr/vat.ts +7 -3
  614. package/src/gt/nit.ts +7 -3
  615. package/src/hk/hkid.ts +7 -3
  616. package/src/hr/vat.ts +7 -3
  617. package/src/hu/vat.ts +8 -3
  618. package/src/iban.ts +7 -3
  619. package/src/id/npwp.ts +7 -3
  620. package/src/ie/pps.ts +7 -3
  621. package/src/ie/vat.ts +7 -3
  622. package/src/il/idnr.ts +7 -3
  623. package/src/in/aadhaar.ts +7 -3
  624. package/src/in/gstin.ts +7 -3
  625. package/src/in/pan.ts +7 -3
  626. package/src/index.ts +3 -0
  627. package/src/iq/nid.ts +7 -3
  628. package/src/ir/nid.ts +7 -3
  629. package/src/is/kennitala.ts +7 -3
  630. package/src/is/vsk.ts +7 -3
  631. package/src/isin.ts +7 -3
  632. package/src/it/codicefiscale.ts +11 -7
  633. package/src/it/iva.ts +7 -3
  634. package/src/jp/cn.ts +7 -3
  635. package/src/jp/mynumber.ts +7 -3
  636. package/src/kr/brn.ts +7 -3
  637. package/src/kr/rrn.ts +8 -7
  638. package/src/kw/civil.ts +8 -7
  639. package/src/kz/iin.ts +8 -8
  640. package/src/lei.ts +7 -3
  641. package/src/li/peid.ts +7 -3
  642. package/src/lk/nic.ts +8 -7
  643. package/src/lt/asmens.ts +8 -4
  644. package/src/lt/vat.ts +8 -3
  645. package/src/lu/vat.ts +8 -3
  646. package/src/luhn.ts +7 -3
  647. package/src/lv/vat.ts +7 -3
  648. package/src/ma/ice.ts +7 -3
  649. package/src/mc/tva.ts +9 -5
  650. package/src/md/idno.ts +7 -3
  651. package/src/me/pib.ts +7 -3
  652. package/src/mk/edb.ts +7 -3
  653. package/src/mt/vat.ts +8 -3
  654. package/src/mu/brn.ts +7 -3
  655. package/src/mx/clabe.ts +7 -3
  656. package/src/mx/curp.ts +9 -8
  657. package/src/mx/rfc.ts +8 -4
  658. package/src/my/nric.ts +8 -7
  659. package/src/ng/nin.ts +7 -3
  660. package/src/ni/ruc.ts +7 -3
  661. package/src/nl/bsn.ts +7 -3
  662. package/src/nl/kvk.ts +7 -3
  663. package/src/nl/vat.ts +7 -3
  664. package/src/no/fodselsnummer.ts +11 -7
  665. package/src/no/mva.ts +9 -5
  666. package/src/no/orgnr.ts +7 -3
  667. package/src/nz/ird.ts +8 -4
  668. package/src/pa/ruc.ts +7 -3
  669. package/src/patterns.ts +49 -18
  670. package/src/pe/ruc.ts +7 -3
  671. package/src/ph/philid.ts +7 -3
  672. package/src/pk/cnic.ts +7 -3
  673. package/src/pl/nip.ts +7 -3
  674. package/src/pl/pesel.ts +8 -7
  675. package/src/pl/regon.ts +7 -3
  676. package/src/pt/cc.ts +7 -3
  677. package/src/pt/vat.ts +8 -3
  678. package/src/ro/cnp.ts +15 -8
  679. package/src/ro/vat.ts +8 -3
  680. package/src/rs/pib.ts +7 -3
  681. package/src/ru/inn.ts +7 -3
  682. package/src/se/orgnr.ts +7 -3
  683. package/src/se/personnummer.ts +35 -33
  684. package/src/se/vat.ts +8 -3
  685. package/src/sg/uen.ts +7 -3
  686. package/src/si/emso.ts +8 -7
  687. package/src/si/vat.ts +8 -3
  688. package/src/sk/dic.ts +8 -4
  689. package/src/sk/ico.ts +3 -2
  690. package/src/sk/rc.ts +6 -2
  691. package/src/th/tin.ts +7 -3
  692. package/src/tr/tckimlik.ts +7 -3
  693. package/src/tr/vkn.ts +7 -3
  694. package/src/tw/ubn.ts +7 -3
  695. package/src/types.ts +34 -3
  696. package/src/ua/edrpou.ts +7 -3
  697. package/src/us/ein.ts +7 -3
  698. package/src/us/itin.ts +7 -3
  699. package/src/us/rtn.ts +16 -8
  700. package/src/us/ssn.ts +7 -3
  701. package/src/uy/rut.ts +7 -3
  702. package/src/ve/rif.ts +8 -6
  703. package/src/vn/mst.ts +7 -3
  704. package/src/za/idnr.ts +8 -7
package/dist/is/vsk.js CHANGED
@@ -3,13 +3,6 @@ import { randomDigits, randomInt } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/is/vsk.ts
6
- /**
7
- * VSK (Virðisaukaskattur, Icelandic VAT number).
8
- *
9
- * 5 or 6 digits. Format-only validation, no checksum.
10
- *
11
- * @see https://www.rsk.is/
12
- */
13
6
  /** Generate a random valid Icelandic VSK. */
14
7
  const generate = () => {
15
8
  return randomDigits(randomInt(5, 6));
@@ -32,6 +25,7 @@ const vsk = {
32
25
  abbreviation: "VSK",
33
26
  aliases: ["VSK-númer", "virðisaukaskattur"],
34
27
  candidatePattern: "IS\\d{5,6}",
28
+ scope: "country",
35
29
  country: "IS",
36
30
  entityType: "company",
37
31
  sourceUrl: "https://www.rsk.is/",
@@ -1 +1 @@
1
- {"version":3,"file":"vsk.js","names":[],"sources":["../../src/is/vsk.ts"],"sourcesContent":["/** Generate a random valid Icelandic VSK. */\nconst generate = (): string => {\n const len = randomInt(5, 6);\n return randomDigits(len);\n};\n\n/**\n * VSK (Virðisaukaskattur, Icelandic VAT number).\n *\n * 5 or 6 digits. Format-only validation, no checksum.\n *\n * @see https://www.rsk.is/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 5 && v.length !== 6) {\n return err(\n \"INVALID_LENGTH\",\n \"Icelandic VAT must be 5 or 6 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Icelandic VAT must contain only digits\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Icelandic VAT Number. */\nconst vsk: Validator = {\n name: \"Icelandic VAT Number\",\n localName: \"Virðisaukaskattur\",\n abbreviation: \"VSK\",\n aliases: [\"VSK-númer\", \"virðisaukaskattur\"] as const,\n candidatePattern: \"IS\\\\d{5,6}\",\n country: \"IS\",\n entityType: \"company\",\n sourceUrl: \"https://www.rsk.is/\",\n examples: [\"00621\", \"123456\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vsk;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;AACA,MAAM,iBAAyB;AAE7B,QAAO,aADK,UAAU,GAAG,EAAE,CACH;;AAkB1B,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EACjC,QAAO,IACL,kBACA,sCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,yCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,aAAa,oBAAoB;CAC3C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,SAAS,SAAS;CAC7B;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"vsk.js","names":[],"sources":["../../src/is/vsk.ts"],"sourcesContent":["/** Generate a random valid Icelandic VSK. */\nconst generate = (): string => {\n const len = randomInt(5, 6);\n return randomDigits(len);\n};\n\n/**\n * VSK (Virðisaukaskattur, Icelandic VAT number).\n *\n * 5 or 6 digits. Format-only validation, no checksum.\n *\n * @see https://www.rsk.is/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 5 && v.length !== 6) {\n return err(\n \"INVALID_LENGTH\",\n \"Icelandic VAT must be 5 or 6 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Icelandic VAT must contain only digits\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Icelandic VAT Number. */\nconst vsk: CountryValidator<\"IS\"> = {\n name: \"Icelandic VAT Number\",\n localName: \"Virðisaukaskattur\",\n abbreviation: \"VSK\",\n aliases: [\"VSK-númer\", \"virðisaukaskattur\"] as const,\n candidatePattern: \"IS\\\\d{5,6}\",\n scope: \"country\",\n country: \"IS\",\n entityType: \"company\",\n sourceUrl: \"https://www.rsk.is/\",\n examples: [\"00621\", \"123456\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vsk;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AACA,MAAM,iBAAyB;CAE7B,OAAO,aADK,UAAU,GAAG,CACH,CAAC;AACzB;AAoBA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,OAAO,IACL,kBACA,qCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,wCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,aAAa,mBAAmB;CAC1C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,SAAS,QAAQ;CAC5B;CACA;CACA;CACA;AACF"}
package/dist/isin.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "./types.js";
1
+ import { GlobalValidator, ValidateResult } from "./types.js";
2
2
 
3
3
  //#region src/isin.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid ISIN. */
8
8
  declare const generate: () => string;
9
9
  /** International Securities Identification Number. */
10
- declare const isin: Validator;
10
+ declare const isin: GlobalValidator;
11
11
  //#endregion
12
12
  export { compact, isin as default, format, generate, validate };
13
13
  //# sourceMappingURL=isin.d.ts.map
package/dist/isin.js CHANGED
@@ -1,20 +1,9 @@
1
+ import { luhnChecksum } from "./_checksums/luhn.js";
1
2
  import { clean } from "./_util/clean.js";
2
3
  import { randomInt, randomPick } from "./_util/generate.js";
3
4
  import { err } from "./_util/result.js";
4
- import { luhnChecksum } from "./_checksums/luhn.js";
5
5
  import { charValue, isalnum } from "./_util/strings.js";
6
6
  //#region src/isin.ts
7
- /**
8
- * ISIN (International Securities Identification
9
- * Number).
10
- *
11
- * ISO 6166. 12-character alphanumeric code:
12
- * [A-Z]{2} (country) + [0-9A-Z]{9} (identifier) +
13
- * [0-9]{1} (check digit). Validated using the Luhn
14
- * algorithm on the alpha-numeric expansion.
15
- *
16
- * @see https://www.isin.org/
17
- */
18
7
  const ISIN_RE = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/;
19
8
  const compact = (value) => clean(value, " -").toUpperCase();
20
9
  /**
@@ -66,6 +55,7 @@ const generate = () => {
66
55
  };
67
56
  /** International Securities Identification Number. */
68
57
  const isin = {
58
+ scope: "global",
69
59
  name: "International Securities Identification Number",
70
60
  localName: "International Securities Identification Number",
71
61
  abbreviation: "ISIN",
package/dist/isin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"isin.js","names":[],"sources":["../src/isin.ts"],"sourcesContent":["/**\n * ISIN (International Securities Identification\n * Number).\n *\n * ISO 6166. 12-character alphanumeric code:\n * [A-Z]{2} (country) + [0-9A-Z]{9} (identifier) +\n * [0-9]{1} (check digit). Validated using the Luhn\n * algorithm on the alpha-numeric expansion.\n *\n * @see https://www.isin.org/\n */\n\nimport { luhnChecksum } from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomInt, randomPick } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { charValue, isalnum } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"./types\";\n\nconst ISIN_RE = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/;\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\n/**\n * Expand each character to its numeric value\n * (A=10..Z=35, digits unchanged) and concatenate.\n */\nconst expand = (value: string): string => {\n let result = \"\";\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (ch !== undefined) {\n result += String(charValue(ch));\n }\n }\n return result;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"ISIN must be exactly 12 characters\",\n );\n }\n if (!isalnum(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"ISIN must contain only letters and digits\",\n );\n }\n if (!ISIN_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"ISIN must match [A-Z]{2}[0-9A-Z]{9}[0-9]\",\n );\n }\n const expanded = expand(v);\n if (luhnChecksum(expanded) !== 0) {\n return err(\n \"INVALID_CHECKSUM\",\n \"ISIN check digit is incorrect\",\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)} ${v.slice(10)}`;\n};\n\nconst ISIN_COUNTRIES = [\n \"US\",\n \"GB\",\n \"DE\",\n \"FR\",\n \"JP\",\n] as const;\n\n/** Generate a random valid ISIN. */\nconst generate = (): string => {\n for (;;) {\n const cc = randomPick(ISIN_COUNTRIES);\n let nsin = \"\";\n for (let i = 0; i < 9; i++)\n nsin += String(randomInt(0, 9));\n const base = cc + nsin;\n for (let d = 0; d <= 9; d++) {\n const c = base + String(d);\n if (validate(c).valid) return c;\n }\n }\n};\n\n/** International Securities Identification Number. */\nconst isin: Validator = {\n name: \"International Securities Identification Number\",\n localName:\n \"International Securities Identification Number\",\n abbreviation: \"ISIN\",\n aliases: [\n \"ISIN\",\n \"International Securities Identification Number\",\n ] as const,\n candidatePattern: \"[A-Z]{2}[A-Z0-9]{9}\\\\d\",\n entityType: \"any\",\n sourceUrl: \"https://www.isin.org/\",\n examples: [\"US0378331005\", \"GB0002634946\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default isin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;AAoBA,MAAM,UAAU;AAEhB,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,CAAC,aAAa;;;;;AAMlC,MAAM,UAAU,UAA0B;CACxC,IAAI,SAAS;AACb,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,KAAK,MAAM;AACjB,MAAI,OAAO,KAAA,EACT,WAAU,OAAO,UAAU,GAAG,CAAC;;AAGnC,QAAO;;AAGT,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,qCACD;AAEH,KAAI,CAAC,QAAQ,EAAE,CACb,QAAO,IACL,kBACA,4CACD;AAEH,KAAI,CAAC,QAAQ,KAAK,EAAE,CAClB,QAAO,IACL,kBACA,2CACD;AAGH,KAAI,aADa,OAAO,EAAE,CACA,KAAK,EAC7B,QAAO,IACL,oBACA,gCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG;;AAG3E,MAAM,iBAAiB;CACrB;CACA;CACA;CACA;CACA;CACD;;AAGD,MAAM,iBAAyB;AAC7B,UAAS;EACP,MAAM,KAAK,WAAW,eAAe;EACrC,IAAI,OAAO;AACX,OAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,SAAQ,OAAO,UAAU,GAAG,EAAE,CAAC;EACjC,MAAM,OAAO,KAAK;AAClB,OAAK,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK;GAC3B,MAAM,IAAI,OAAO,OAAO,EAAE;AAC1B,OAAI,SAAS,EAAE,CAAC,MAAO,QAAO;;;;;AAMpC,MAAM,OAAkB;CACtB,MAAM;CACN,WACE;CACF,cAAc;CACd,SAAS,CACP,QACA,iDACD;CACD,kBAAkB;CAClB,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,gBAAgB,eAAe;CAC1C;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"isin.js","names":[],"sources":["../src/isin.ts"],"sourcesContent":["/**\n * ISIN (International Securities Identification\n * Number).\n *\n * ISO 6166. 12-character alphanumeric code:\n * [A-Z]{2} (country) + [0-9A-Z]{9} (identifier) +\n * [0-9]{1} (check digit). Validated using the Luhn\n * algorithm on the alpha-numeric expansion.\n *\n * @see https://www.isin.org/\n */\n\nimport type {\n ValidateResult,\n GlobalValidator,\n} from \"./types\";\n\nimport { luhnChecksum } from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomInt, randomPick } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { charValue, isalnum } from \"#util/strings\";\n\nconst ISIN_RE = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/;\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\n/**\n * Expand each character to its numeric value\n * (A=10..Z=35, digits unchanged) and concatenate.\n */\nconst expand = (value: string): string => {\n let result = \"\";\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (ch !== undefined) {\n result += String(charValue(ch));\n }\n }\n return result;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"ISIN must be exactly 12 characters\",\n );\n }\n if (!isalnum(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"ISIN must contain only letters and digits\",\n );\n }\n if (!ISIN_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"ISIN must match [A-Z]{2}[0-9A-Z]{9}[0-9]\",\n );\n }\n const expanded = expand(v);\n if (luhnChecksum(expanded) !== 0) {\n return err(\n \"INVALID_CHECKSUM\",\n \"ISIN check digit is incorrect\",\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)} ${v.slice(10)}`;\n};\n\nconst ISIN_COUNTRIES = [\n \"US\",\n \"GB\",\n \"DE\",\n \"FR\",\n \"JP\",\n] as const;\n\n/** Generate a random valid ISIN. */\nconst generate = (): string => {\n for (;;) {\n const cc = randomPick(ISIN_COUNTRIES);\n let nsin = \"\";\n for (let i = 0; i < 9; i++)\n nsin += String(randomInt(0, 9));\n const base = cc + nsin;\n for (let d = 0; d <= 9; d++) {\n const c = base + String(d);\n if (validate(c).valid) return c;\n }\n }\n};\n\n/** International Securities Identification Number. */\nconst isin: GlobalValidator = {\n scope: \"global\",\n name: \"International Securities Identification Number\",\n localName:\n \"International Securities Identification Number\",\n abbreviation: \"ISIN\",\n aliases: [\n \"ISIN\",\n \"International Securities Identification Number\",\n ] as const,\n candidatePattern: \"[A-Z]{2}[A-Z0-9]{9}\\\\d\",\n entityType: \"any\",\n sourceUrl: \"https://www.isin.org/\",\n examples: [\"US0378331005\", \"GB0002634946\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default isin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAuBA,MAAM,UAAU;AAEhB,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,EAAE,YAAY;;;;;AAMjC,MAAM,UAAU,UAA0B;CACxC,IAAI,SAAS;CACb,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,KAAK,MAAM;EACjB,IAAI,OAAO,KAAA,GACT,UAAU,OAAO,UAAU,EAAE,CAAC;CAElC;CACA,OAAO;AACT;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,oCACF;CAEF,IAAI,CAAC,QAAQ,CAAC,GACZ,OAAO,IACL,kBACA,2CACF;CAEF,IAAI,CAAC,QAAQ,KAAK,CAAC,GACjB,OAAO,IACL,kBACA,0CACF;CAGF,IAAI,aADa,OAAO,CACA,CAAC,MAAM,GAC7B,OAAO,IACL,oBACA,+BACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;AAC1E;AAEA,MAAM,iBAAiB;CACrB;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,KAAK,WAAW,cAAc;EACpC,IAAI,OAAO;EACX,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,QAAQ,OAAO,UAAU,GAAG,CAAC,CAAC;EAChC,MAAM,OAAO,KAAK;EAClB,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK;GAC3B,MAAM,IAAI,OAAO,OAAO,CAAC;GACzB,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO;EAChC;CACF;AACF;;AAGA,MAAM,OAAwB;CAC5B,OAAO;CACP,MAAM;CACN,WACE;CACF,cAAc;CACd,SAAS,CACP,QACA,gDACF;CACA,kBAAkB;CAClB,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,gBAAgB,cAAc;CACzC;CACA;CACA;CACA;AACF"}
@@ -1,4 +1,4 @@
1
- import { ParsedPersonId, ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ParsedPersonId, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/it/codicefiscale.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -13,7 +13,7 @@ declare const parse: (value: string) => ParsedPersonId | null;
13
13
  /** Generate a random valid 16-character Codice Fiscale. */
14
14
  declare const generate: () => string;
15
15
  /** Italian Tax Code. */
16
- declare const codiceFiscale: Validator<ParsedPersonId>;
16
+ declare const codiceFiscale: CountryValidator<"IT", ParsedPersonId>;
17
17
  //#endregion
18
18
  export { compact, codiceFiscale as default, format, generate, parse, validate };
19
19
  //# sourceMappingURL=codicefiscale.d.ts.map
@@ -4,27 +4,6 @@ import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  import { validate as validate$1 } from "./iva.js";
6
6
  //#region src/it/codicefiscale.ts
7
- /**
8
- * Codice Fiscale (Italian tax code).
9
- *
10
- * 16-character alphanumeric code encoding name,
11
- * birth date, gender, and birthplace. The last
12
- * character is a check letter computed using
13
- * odd/even position value tables.
14
- *
15
- * Supports omocodia: when two people share the
16
- * same code, the tax office replaces digit
17
- * positions with letters from the set LMNPQRSTUV
18
- * (L=0, M=1, N=2, P=3, Q=4, R=5, S=6, T=7,
19
- * U=8, V=9). Only these 10 letters are valid
20
- * substitutes at digit positions.
21
- *
22
- * Also accepts 11-digit numbers (delegates to
23
- * Partita IVA validation).
24
- *
25
- * @see https://www.agenziaentrate.gov.it/
26
- * @see https://it.wikipedia.org/wiki/Codice_fiscale#Omocodia
27
- */
28
7
  const ODD = {
29
8
  "0": 1,
30
9
  "1": 0,
@@ -220,6 +199,7 @@ const codiceFiscale = {
220
199
  "fiscal code"
221
200
  ],
222
201
  candidatePattern: "[A-Z]{6}\\d{2}[A-Z]\\d{2}[A-Z]\\d{3}[A-Z]",
202
+ scope: "country",
223
203
  country: "IT",
224
204
  entityType: "person",
225
205
  description: "Personal/company tax code (16-char personal, 11-digit company)",
@@ -1 +1 @@
1
- {"version":3,"file":"codicefiscale.js","names":["validateIva"],"sources":["../../src/it/codicefiscale.ts"],"sourcesContent":["/**\n * Codice Fiscale (Italian tax code).\n *\n * 16-character alphanumeric code encoding name,\n * birth date, gender, and birthplace. The last\n * character is a check letter computed using\n * odd/even position value tables.\n *\n * Supports omocodia: when two people share the\n * same code, the tax office replaces digit\n * positions with letters from the set LMNPQRSTUV\n * (L=0, M=1, N=2, P=3, Q=4, R=5, S=6, T=7,\n * U=8, V=9). Only these 10 letters are valid\n * substitutes at digit positions.\n *\n * Also accepts 11-digit numbers (delegates to\n * Partita IVA validation).\n *\n * @see https://www.agenziaentrate.gov.it/\n * @see https://it.wikipedia.org/wiki/Codice_fiscale#Omocodia\n */\n\nimport { clean } from \"#util/clean\";\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\";\nimport { validate as validateIva } from \"./iva\";\n\n// Values for odd-positioned characters (0-based\n// index 0, 2, 4, ...)\nconst ODD: Record<string, number> = {\n \"0\": 1,\n \"1\": 0,\n \"2\": 5,\n \"3\": 7,\n \"4\": 9,\n \"5\": 13,\n \"6\": 15,\n \"7\": 17,\n \"8\": 19,\n \"9\": 21,\n A: 1,\n B: 0,\n C: 5,\n D: 7,\n E: 9,\n F: 13,\n G: 15,\n H: 17,\n I: 19,\n J: 21,\n K: 2,\n L: 4,\n M: 18,\n N: 20,\n O: 11,\n P: 3,\n Q: 6,\n R: 8,\n S: 12,\n T: 14,\n U: 16,\n V: 10,\n W: 22,\n X: 25,\n Y: 24,\n Z: 23,\n};\n\n// Values for even-positioned characters (0-based\n// index 1, 3, 5, ...)\nconst EVEN: Record<string, number> = {\n \"0\": 0,\n \"1\": 1,\n \"2\": 2,\n \"3\": 3,\n \"4\": 4,\n \"5\": 5,\n \"6\": 6,\n \"7\": 7,\n \"8\": 8,\n \"9\": 9,\n A: 0,\n B: 1,\n C: 2,\n D: 3,\n E: 4,\n F: 5,\n G: 6,\n H: 7,\n I: 8,\n J: 9,\n K: 10,\n L: 11,\n M: 12,\n N: 13,\n O: 14,\n P: 15,\n Q: 16,\n R: 17,\n S: 18,\n T: 19,\n U: 20,\n V: 21,\n W: 22,\n X: 23,\n Y: 24,\n Z: 25,\n};\n\nconst CHECK_LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\n/** Omocodia letter-to-digit mapping. */\nconst OMOCODIA: Record<string, string> = {\n L: \"0\",\n M: \"1\",\n N: \"2\",\n P: \"3\",\n Q: \"4\",\n R: \"5\",\n S: \"6\",\n T: \"7\",\n U: \"8\",\n V: \"9\",\n};\n\n/** Month letter to 1-based month number. */\nconst MONTH_LETTERS: Record<string, number> = {\n A: 1,\n B: 2,\n C: 3,\n D: 4,\n E: 5,\n H: 6,\n L: 7,\n M: 8,\n P: 9,\n R: 10,\n S: 11,\n T: 12,\n};\n\nconst decodeCfDigit = (ch: string): number => {\n const mapped = OMOCODIA[ch];\n if (mapped !== undefined) return Number(mapped);\n return Number(ch);\n};\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n // 11-digit: delegate to Partita IVA\n if (v.length === 11 && isdigits(v)) {\n return validateIva(v);\n }\n\n if (v.length !== 16) {\n return err(\n \"INVALID_LENGTH\",\n \"Codice Fiscale must be 16 characters\",\n );\n }\n // Structural format: 6 letters + 2 alphanumeric\n // + 1 letter (month) + 2 alphanumeric + 1 letter\n // (municipality) + 3 alphanumeric + 1 check letter\n // The \"alphanumeric\" positions accept omocodia\n // substitution letters (LMNPQRSTUV for 0-9)\n if (\n // Omocodia: digits can be replaced with\n // LMNPQRSTUV only (not arbitrary letters)\n !/^[A-Z]{6}[0-9LMNPQRSTUV]{2}[ABCDEHLMPRST][0-9LMNPQRSTUV]{2}[A-Z][0-9LMNPQRSTUV]{3}[A-Z]$/.test(\n v,\n )\n ) {\n return err(\n \"INVALID_FORMAT\",\n \"Codice Fiscale format is invalid\",\n );\n }\n\n // Compute check letter\n let sum = 0;\n for (let i = 0; i < 15; i++) {\n const ch = v[i];\n if (ch === undefined) continue;\n if (i % 2 === 0) {\n // Odd position (1-based) = even index\n const val = ODD[ch];\n if (val === undefined) {\n return err(\n \"INVALID_FORMAT\",\n \"Codice Fiscale contains invalid char\",\n );\n }\n sum += val;\n } else {\n const val = EVEN[ch];\n if (val === undefined) {\n return err(\n \"INVALID_FORMAT\",\n \"Codice Fiscale contains invalid char\",\n );\n }\n sum += val;\n }\n }\n\n const expected = CHECK_LETTERS[sum % 26];\n if (expected !== v[15]) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Codice Fiscale check letter mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/**\n * Extract birth date and gender from a Codice Fiscale.\n * Returns null if the value is not valid or is an\n * 11-digit Partita IVA (no personal data embedded).\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 if (v.length !== 16) return null;\n\n const yy =\n decodeCfDigit(v.charAt(6)) * 10 +\n decodeCfDigit(v.charAt(7));\n const month = MONTH_LETTERS[v.charAt(8)];\n if (month === undefined) return null;\n let dd =\n decodeCfDigit(v.charAt(9)) * 10 +\n decodeCfDigit(v.charAt(10));\n\n const gender = dd > 40 ? \"female\" : \"male\";\n if (dd > 40) dd -= 40;\n\n const currentYear = new Date().getFullYear();\n let year = 2000 + yy;\n if (year > currentYear) year -= 100;\n\n return {\n birthDate: new Date(year, month - 1, dd),\n gender,\n };\n};\n\nconst LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\nconst MONTH_CODES = Object.keys(MONTH_LETTERS);\n\nconst randomLetter = (): string =>\n LETTERS.charAt(randomInt(0, LETTERS.length - 1));\n\n/** Generate a random valid 16-character Codice Fiscale. */\nconst generate = (): string => {\n let body = \"\";\n\n for (let i = 0; i < 6; i++) {\n body += randomLetter();\n }\n\n body += String(randomInt(0, 99)).padStart(2, \"0\");\n body +=\n MONTH_CODES[randomInt(0, MONTH_CODES.length - 1)] ??\n \"A\";\n\n const day =\n randomInt(1, 28) + (randomInt(0, 1) === 0 ? 0 : 40);\n body += String(day).padStart(2, \"0\");\n body += randomLetter();\n body += String(randomInt(0, 999)).padStart(3, \"0\");\n\n let sum = 0;\n for (let i = 0; i < body.length; i++) {\n const ch = body[i];\n if (ch === undefined) continue;\n sum += i % 2 === 0 ? (ODD[ch] ?? 0) : (EVEN[ch] ?? 0);\n }\n\n return `${body}${CHECK_LETTERS.charAt(sum % 26)}`;\n};\n\n/** Italian Tax Code. */\nconst codiceFiscale: Validator<ParsedPersonId> = {\n name: \"Italian Tax Code\",\n localName: \"Codice Fiscale\",\n abbreviation: \"CF\",\n aliases: [\n \"codice fiscale\",\n \"C.F.\",\n \"CF\",\n \"cod. fisc.\",\n \"fiscal code\",\n ] as const,\n candidatePattern:\n \"[A-Z]{6}\\\\d{2}[A-Z]\\\\d{2}[A-Z]\\\\d{3}[A-Z]\",\n country: \"IT\",\n entityType: \"person\",\n description:\n \"Personal/company tax code (16-char personal, 11-digit company)\",\n sourceUrl: \"https://www.agenziaentrate.gov.it/\",\n lengths: [11, 16] as const,\n examples: [\"RCCMNL83S18D969H\"] as const,\n compact,\n format,\n parse,\n validate,\n generate,\n};\n\nexport default codiceFiscale;\nexport { compact, format, generate, parse, validate };\n"],"mappings":"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"}
1
+ {"version":3,"file":"codicefiscale.js","names":["validateIva"],"sources":["../../src/it/codicefiscale.ts"],"sourcesContent":["/**\n * Codice Fiscale (Italian tax code).\n *\n * 16-character alphanumeric code encoding name,\n * birth date, gender, and birthplace. The last\n * character is a check letter computed using\n * odd/even position value tables.\n *\n * Supports omocodia: when two people share the\n * same code, the tax office replaces digit\n * positions with letters from the set LMNPQRSTUV\n * (L=0, M=1, N=2, P=3, Q=4, R=5, S=6, T=7,\n * U=8, V=9). Only these 10 letters are valid\n * substitutes at digit positions.\n *\n * Also accepts 11-digit numbers (delegates to\n * Partita IVA validation).\n *\n * @see https://www.agenziaentrate.gov.it/\n * @see https://it.wikipedia.org/wiki/Codice_fiscale#Omocodia\n */\n\nimport type {\n ParsedPersonId,\n ValidateResult,\n CountryValidator,\n} from \"../types\";\nimport { validate as validateIva } from \"./iva\";\n\nimport { clean } from \"#util/clean\";\nimport { randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\n// Values for odd-positioned characters (0-based\n// index 0, 2, 4, ...)\nconst ODD: Record<string, number> = {\n \"0\": 1,\n \"1\": 0,\n \"2\": 5,\n \"3\": 7,\n \"4\": 9,\n \"5\": 13,\n \"6\": 15,\n \"7\": 17,\n \"8\": 19,\n \"9\": 21,\n A: 1,\n B: 0,\n C: 5,\n D: 7,\n E: 9,\n F: 13,\n G: 15,\n H: 17,\n I: 19,\n J: 21,\n K: 2,\n L: 4,\n M: 18,\n N: 20,\n O: 11,\n P: 3,\n Q: 6,\n R: 8,\n S: 12,\n T: 14,\n U: 16,\n V: 10,\n W: 22,\n X: 25,\n Y: 24,\n Z: 23,\n};\n\n// Values for even-positioned characters (0-based\n// index 1, 3, 5, ...)\nconst EVEN: Record<string, number> = {\n \"0\": 0,\n \"1\": 1,\n \"2\": 2,\n \"3\": 3,\n \"4\": 4,\n \"5\": 5,\n \"6\": 6,\n \"7\": 7,\n \"8\": 8,\n \"9\": 9,\n A: 0,\n B: 1,\n C: 2,\n D: 3,\n E: 4,\n F: 5,\n G: 6,\n H: 7,\n I: 8,\n J: 9,\n K: 10,\n L: 11,\n M: 12,\n N: 13,\n O: 14,\n P: 15,\n Q: 16,\n R: 17,\n S: 18,\n T: 19,\n U: 20,\n V: 21,\n W: 22,\n X: 23,\n Y: 24,\n Z: 25,\n};\n\nconst CHECK_LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\n/** Omocodia letter-to-digit mapping. */\nconst OMOCODIA: Record<string, string> = {\n L: \"0\",\n M: \"1\",\n N: \"2\",\n P: \"3\",\n Q: \"4\",\n R: \"5\",\n S: \"6\",\n T: \"7\",\n U: \"8\",\n V: \"9\",\n};\n\n/** Month letter to 1-based month number. */\nconst MONTH_LETTERS: Record<string, number> = {\n A: 1,\n B: 2,\n C: 3,\n D: 4,\n E: 5,\n H: 6,\n L: 7,\n M: 8,\n P: 9,\n R: 10,\n S: 11,\n T: 12,\n};\n\nconst decodeCfDigit = (ch: string): number => {\n const mapped = OMOCODIA[ch];\n if (mapped !== undefined) return Number(mapped);\n return Number(ch);\n};\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n // 11-digit: delegate to Partita IVA\n if (v.length === 11 && isdigits(v)) {\n return validateIva(v);\n }\n\n if (v.length !== 16) {\n return err(\n \"INVALID_LENGTH\",\n \"Codice Fiscale must be 16 characters\",\n );\n }\n // Structural format: 6 letters + 2 alphanumeric\n // + 1 letter (month) + 2 alphanumeric + 1 letter\n // (municipality) + 3 alphanumeric + 1 check letter\n // The \"alphanumeric\" positions accept omocodia\n // substitution letters (LMNPQRSTUV for 0-9)\n if (\n // Omocodia: digits can be replaced with\n // LMNPQRSTUV only (not arbitrary letters)\n !/^[A-Z]{6}[0-9LMNPQRSTUV]{2}[ABCDEHLMPRST][0-9LMNPQRSTUV]{2}[A-Z][0-9LMNPQRSTUV]{3}[A-Z]$/.test(\n v,\n )\n ) {\n return err(\n \"INVALID_FORMAT\",\n \"Codice Fiscale format is invalid\",\n );\n }\n\n // Compute check letter\n let sum = 0;\n for (let i = 0; i < 15; i++) {\n const ch = v[i];\n if (ch === undefined) continue;\n if (i % 2 === 0) {\n // Odd position (1-based) = even index\n const val = ODD[ch];\n if (val === undefined) {\n return err(\n \"INVALID_FORMAT\",\n \"Codice Fiscale contains invalid char\",\n );\n }\n sum += val;\n } else {\n const val = EVEN[ch];\n if (val === undefined) {\n return err(\n \"INVALID_FORMAT\",\n \"Codice Fiscale contains invalid char\",\n );\n }\n sum += val;\n }\n }\n\n const expected = CHECK_LETTERS[sum % 26];\n if (expected !== v[15]) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Codice Fiscale check letter mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/**\n * Extract birth date and gender from a Codice Fiscale.\n * Returns null if the value is not valid or is an\n * 11-digit Partita IVA (no personal data embedded).\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 if (v.length !== 16) return null;\n\n const yy =\n decodeCfDigit(v.charAt(6)) * 10 +\n decodeCfDigit(v.charAt(7));\n const month = MONTH_LETTERS[v.charAt(8)];\n if (month === undefined) return null;\n let dd =\n decodeCfDigit(v.charAt(9)) * 10 +\n decodeCfDigit(v.charAt(10));\n\n const gender = dd > 40 ? \"female\" : \"male\";\n if (dd > 40) dd -= 40;\n\n const currentYear = new Date().getFullYear();\n let year = 2000 + yy;\n if (year > currentYear) year -= 100;\n\n return {\n birthDate: new Date(year, month - 1, dd),\n gender,\n };\n};\n\nconst LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\nconst MONTH_CODES = Object.keys(MONTH_LETTERS);\n\nconst randomLetter = (): string =>\n LETTERS.charAt(randomInt(0, LETTERS.length - 1));\n\n/** Generate a random valid 16-character Codice Fiscale. */\nconst generate = (): string => {\n let body = \"\";\n\n for (let i = 0; i < 6; i++) {\n body += randomLetter();\n }\n\n body += String(randomInt(0, 99)).padStart(2, \"0\");\n body +=\n MONTH_CODES[randomInt(0, MONTH_CODES.length - 1)] ??\n \"A\";\n\n const day =\n randomInt(1, 28) + (randomInt(0, 1) === 0 ? 0 : 40);\n body += String(day).padStart(2, \"0\");\n body += randomLetter();\n body += String(randomInt(0, 999)).padStart(3, \"0\");\n\n let sum = 0;\n for (let i = 0; i < body.length; i++) {\n const ch = body[i];\n if (ch === undefined) continue;\n sum += i % 2 === 0 ? (ODD[ch] ?? 0) : (EVEN[ch] ?? 0);\n }\n\n return `${body}${CHECK_LETTERS.charAt(sum % 26)}`;\n};\n\n/** Italian Tax Code. */\nconst codiceFiscale: CountryValidator<\n \"IT\",\n ParsedPersonId\n> = {\n name: \"Italian Tax Code\",\n localName: \"Codice Fiscale\",\n abbreviation: \"CF\",\n aliases: [\n \"codice fiscale\",\n \"C.F.\",\n \"CF\",\n \"cod. fisc.\",\n \"fiscal code\",\n ] as const,\n candidatePattern:\n \"[A-Z]{6}\\\\d{2}[A-Z]\\\\d{2}[A-Z]\\\\d{3}[A-Z]\",\n scope: \"country\",\n country: \"IT\",\n entityType: \"person\",\n description:\n \"Personal/company tax code (16-char personal, 11-digit company)\",\n sourceUrl: \"https://www.agenziaentrate.gov.it/\",\n lengths: [11, 16] as const,\n examples: [\"RCCMNL83S18D969H\"] as const,\n compact,\n format,\n parse,\n validate,\n generate,\n};\n\nexport default codiceFiscale;\nexport { compact, format, generate, parse, validate };\n"],"mappings":";;;;;;AAoCA,MAAM,MAA8B;CAClC,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAIA,MAAM,OAA+B;CACnC,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAEA,MAAM,gBAAgB;;AAGtB,MAAM,WAAmC;CACvC,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;;AAGA,MAAM,gBAAwC;CAC5C,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAEA,MAAM,iBAAiB,OAAuB;CAC5C,MAAM,SAAS,SAAS;CACxB,IAAI,WAAW,KAAA,GAAW,OAAO,OAAO,MAAM;CAC9C,OAAO,OAAO,EAAE;AAClB;AAEA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,EAAE,YAAY;AAEjC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAGvB,IAAI,EAAE,WAAW,MAAM,SAAS,CAAC,GAC/B,OAAOA,WAAY,CAAC;CAGtB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,sCACF;CAOF,IAGE,CAAC,2FAA2F,KAC1F,CACF,GAEA,OAAO,IACL,kBACA,kCACF;CAIF,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;EAC3B,MAAM,KAAK,EAAE;EACb,IAAI,OAAO,KAAA,GAAW;EACtB,IAAI,IAAI,MAAM,GAAG;GAEf,MAAM,MAAM,IAAI;GAChB,IAAI,QAAQ,KAAA,GACV,OAAO,IACL,kBACA,sCACF;GAEF,OAAO;EACT,OAAO;GACL,MAAM,MAAM,KAAK;GACjB,IAAI,QAAQ,KAAA,GACV,OAAO,IACL,kBACA,sCACF;GAEF,OAAO;EACT;CACF;CAGA,IADiB,cAAc,MAAM,QACpB,EAAE,KACjB,OAAO,IACL,oBACA,sCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;;;;;AAOvD,MAAM,SAAS,UAAyC;CACtD,MAAM,SAAS,SAAS,KAAK;CAC7B,IAAI,CAAC,OAAO,OAAO,OAAO;CAE1B,MAAM,IAAI,OAAO;CACjB,IAAI,EAAE,WAAW,IAAI,OAAO;CAE5B,MAAM,KACJ,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,KAC7B,cAAc,EAAE,OAAO,CAAC,CAAC;CAC3B,MAAM,QAAQ,cAAc,EAAE,OAAO,CAAC;CACtC,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,IAAI,KACF,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,KAC7B,cAAc,EAAE,OAAO,EAAE,CAAC;CAE5B,MAAM,SAAS,KAAK,KAAK,WAAW;CACpC,IAAI,KAAK,IAAI,MAAM;CAEnB,MAAM,+BAAc,IAAI,KAAK,GAAE,YAAY;CAC3C,IAAI,OAAO,MAAO;CAClB,IAAI,OAAO,aAAa,QAAQ;CAEhC,OAAO;EACL,WAAW,IAAI,KAAK,MAAM,QAAQ,GAAG,EAAE;EACvC;CACF;AACF;AAEA,MAAM,UAAU;AAChB,MAAM,cAAc,OAAO,KAAK,aAAa;AAE7C,MAAM,qBACJ,QAAQ,OAAO,UAAU,GAAG,EAAkB,CAAC;;AAGjD,MAAM,iBAAyB;CAC7B,IAAI,OAAO;CAEX,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,QAAQ,aAAa;CAGvB,QAAQ,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;CAChD,QACE,YAAY,UAAU,GAAG,YAAY,SAAS,CAAC,MAC/C;CAEF,MAAM,MACJ,UAAU,GAAG,EAAE,KAAK,UAAU,GAAG,CAAC,MAAM,IAAI,IAAI;CAClD,QAAQ,OAAO,GAAG,EAAE,SAAS,GAAG,GAAG;CACnC,QAAQ,aAAa;CACrB,QAAQ,OAAO,UAAU,GAAG,GAAG,CAAC,EAAE,SAAS,GAAG,GAAG;CAEjD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,KAAK,KAAK;EAChB,IAAI,OAAO,KAAA,GAAW;EACtB,OAAO,IAAI,MAAM,IAAK,IAAI,OAAO,IAAM,KAAK,OAAO;CACrD;CAEA,OAAO,GAAG,OAAO,cAAc,OAAO,MAAM,EAAE;AAChD;;AAGA,MAAM,gBAGF;CACF,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACA;EACA;CACF;CACA,kBACE;CACF,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aACE;CACF,WAAW;CACX,SAAS,CAAC,IAAI,EAAE;CAChB,UAAU,CAAC,kBAAkB;CAC7B;CACA;CACA;CACA;CACA;AACF"}
package/dist/it/iva.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/it/iva.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Italian Partita IVA. */
8
8
  declare const generate: () => string;
9
9
  /** Italian VAT Number. */
10
- declare const iva: Validator;
10
+ declare const iva: CountryValidator<"IT">;
11
11
  //#endregion
12
12
  export { compact, iva as default, format, generate, validate };
13
13
  //# sourceMappingURL=iva.d.ts.map
package/dist/it/iva.js CHANGED
@@ -1,17 +1,9 @@
1
+ import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits, 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/it/iva.ts
7
- /**
8
- * Partita IVA (Italian VAT number).
9
- *
10
- * 11 digits: 7-digit company ID + 3-digit
11
- * province code + Luhn check digit.
12
- *
13
- * @see https://www.agenziaentrate.gov.it/
14
- */
15
7
  const VALID_PROVINCES = new Set([
16
8
  ...Array.from({ length: 100 }, (_, i) => String(i + 1).padStart(3, "0")),
17
9
  "120",
@@ -56,6 +48,7 @@ const iva = {
56
48
  "VAT IT"
57
49
  ],
58
50
  candidatePattern: "IT\\d{11}",
51
+ scope: "country",
59
52
  country: "IT",
60
53
  entityType: "company",
61
54
  sourceUrl: "https://www.agenziaentrate.gov.it/",
@@ -1 +1 @@
1
- {"version":3,"file":"iva.js","names":[],"sources":["../../src/it/iva.ts"],"sourcesContent":["/**\n * Partita IVA (Italian VAT number).\n *\n * 11 digits: 7-digit company ID + 3-digit\n * province code + Luhn check digit.\n *\n * @see https://www.agenziaentrate.gov.it/\n */\n\nimport {\n luhnValidate,\n luhnChecksum,\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\nconst VALID_PROVINCES = new Set([\n ...Array.from({ length: 100 }, (_, i) =>\n String(i + 1).padStart(3, \"0\"),\n ),\n \"120\",\n \"121\",\n \"888\",\n \"999\",\n]);\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -\");\n if (v.startsWith(\"IT\") || v.startsWith(\"it\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"Partita IVA must be exactly 11 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Partita IVA must contain only digits\",\n );\n }\n // First 7 digits cannot all be zero\n if (/^0{7}/.test(v)) {\n return err(\n \"INVALID_COMPONENT\",\n \"Partita IVA company ID cannot be all zeros\",\n );\n }\n // Province code validation\n const province = v.slice(7, 10);\n if (!VALID_PROVINCES.has(province)) {\n return err(\n \"INVALID_COMPONENT\",\n \"Partita IVA province code is invalid\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Partita IVA fails Luhn check\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `IT${compact(value)}`;\n\n/** Generate a random valid Italian Partita IVA. */\nconst generate = (): string => {\n const company = randomDigits(7);\n const province = String(randomInt(1, 100)).padStart(\n 3,\n \"0\",\n );\n const payload = company + province;\n const cs = luhnChecksum(payload + \"0\");\n return payload + String((10 - cs) % 10);\n};\n\n/** Italian VAT Number. */\nconst iva: Validator = {\n name: \"Italian VAT Number\",\n localName: \"Partita IVA\",\n abbreviation: \"P.IVA\",\n aliases: [\n \"partita IVA\",\n \"P.IVA\",\n \"P. IVA\",\n \"VAT IT\",\n ] as const,\n candidatePattern: \"IT\\\\d{11}\",\n country: \"IT\",\n entityType: \"company\",\n sourceUrl: \"https://www.agenziaentrate.gov.it/\",\n examples: [\"00743110157\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default iva;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;AAoBA,MAAM,kBAAkB,IAAI,IAAI;CAC9B,GAAG,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,GAAG,MACjC,OAAO,IAAI,EAAE,CAAC,SAAS,GAAG,IAAI,CAC/B;CACD;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,KAAK;AAC1B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,KAAI,EAAE,MAAM,EAAE;AAEhB,QAAO;;AAGT,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,wCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,uCACD;AAGH,KAAI,QAAQ,KAAK,EAAE,CACjB,QAAO,IACL,qBACA,6CACD;CAGH,MAAM,WAAW,EAAE,MAAM,GAAG,GAAG;AAC/B,KAAI,CAAC,gBAAgB,IAAI,SAAS,CAChC,QAAO,IACL,qBACA,uCACD;AAEH,KAAI,CAAC,aAAa,EAAE,CAClB,QAAO,IACL,oBACA,+BACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UACd,KAAK,QAAQ,MAAM;;AAGrB,MAAM,iBAAyB;CAM7B,MAAM,UALU,aAAa,EAAE,GACd,OAAO,UAAU,GAAG,IAAI,CAAC,CAAC,SACzC,GACA,IACD;CAED,MAAM,KAAK,aAAa,UAAU,IAAI;AACtC,QAAO,UAAU,QAAQ,KAAK,MAAM,GAAG;;;AAIzC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,cAAc;CACzB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"iva.js","names":[],"sources":["../../src/it/iva.ts"],"sourcesContent":["/**\n * Partita IVA (Italian VAT number).\n *\n * 11 digits: 7-digit company ID + 3-digit\n * province code + Luhn check digit.\n *\n * @see https://www.agenziaentrate.gov.it/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst VALID_PROVINCES = new Set([\n ...Array.from({ length: 100 }, (_, i) =>\n String(i + 1).padStart(3, \"0\"),\n ),\n \"120\",\n \"121\",\n \"888\",\n \"999\",\n]);\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -\");\n if (v.startsWith(\"IT\") || v.startsWith(\"it\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"Partita IVA must be exactly 11 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Partita IVA must contain only digits\",\n );\n }\n // First 7 digits cannot all be zero\n if (/^0{7}/.test(v)) {\n return err(\n \"INVALID_COMPONENT\",\n \"Partita IVA company ID cannot be all zeros\",\n );\n }\n // Province code validation\n const province = v.slice(7, 10);\n if (!VALID_PROVINCES.has(province)) {\n return err(\n \"INVALID_COMPONENT\",\n \"Partita IVA province code is invalid\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Partita IVA fails Luhn check\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `IT${compact(value)}`;\n\n/** Generate a random valid Italian Partita IVA. */\nconst generate = (): string => {\n const company = randomDigits(7);\n const province = String(randomInt(1, 100)).padStart(\n 3,\n \"0\",\n );\n const payload = company + province;\n const cs = luhnChecksum(payload + \"0\");\n return payload + String((10 - cs) % 10);\n};\n\n/** Italian VAT Number. */\nconst iva: CountryValidator<\"IT\"> = {\n name: \"Italian VAT Number\",\n localName: \"Partita IVA\",\n abbreviation: \"P.IVA\",\n aliases: [\n \"partita IVA\",\n \"P.IVA\",\n \"P. IVA\",\n \"VAT IT\",\n ] as const,\n candidatePattern: \"IT\\\\d{11}\",\n scope: \"country\",\n country: \"IT\",\n entityType: \"company\",\n sourceUrl: \"https://www.agenziaentrate.gov.it/\",\n examples: [\"00743110157\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default iva;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAuBA,MAAM,kBAAkB,IAAI,IAAI;CAC9B,GAAG,MAAM,KAAK,EAAE,QAAQ,IAAI,IAAI,GAAG,MACjC,OAAO,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAC/B;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,IAAI;CACzB,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO;AACT;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,uCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,sCACF;CAGF,IAAI,QAAQ,KAAK,CAAC,GAChB,OAAO,IACL,qBACA,4CACF;CAGF,MAAM,WAAW,EAAE,MAAM,GAAG,EAAE;CAC9B,IAAI,CAAC,gBAAgB,IAAI,QAAQ,GAC/B,OAAO,IACL,qBACA,sCACF;CAEF,IAAI,CAAC,aAAa,CAAC,GACjB,OAAO,IACL,oBACA,8BACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UACd,KAAK,QAAQ,KAAK;;AAGpB,MAAM,iBAAyB;CAM7B,MAAM,UALU,aAAa,CAKP,IAJL,OAAO,UAAU,GAAG,GAAG,CAAC,EAAE,SACzC,GACA,GAE+B;CACjC,MAAM,KAAK,aAAa,UAAU,GAAG;CACrC,OAAO,UAAU,QAAQ,KAAK,MAAM,EAAE;AACxC;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,aAAa;CACxB;CACA;CACA;CACA;AACF"}
package/dist/jp/cn.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/jp/cn.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Corporate Number. */
8
8
  declare const generate: () => string;
9
9
  /** Japanese Corporate Number. */
10
- declare const cn: Validator;
10
+ declare const cn: CountryValidator<"JP">;
11
11
  //#endregion
12
12
  export { compact, cn as default, format, generate, validate };
13
13
  //# sourceMappingURL=cn.d.ts.map
package/dist/jp/cn.js CHANGED
@@ -3,15 +3,6 @@ import { randomDigits } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/jp/cn.ts
6
- /**
7
- * CN (Corporate Number, 法人番号).
8
- *
9
- * Japanese Corporate Number. 13 digits with a
10
- * check digit based on modulus 9. Assigned by the
11
- * National Tax Agency.
12
- *
13
- * @see https://en.wikipedia.org/wiki/Corporate_Number_(Japan)
14
- */
15
6
  const compact = (value) => clean(value, " -");
16
7
  /**
17
8
  * Compute the check digit for a 12-digit payload.
@@ -51,6 +42,7 @@ const cn = {
51
42
  abbreviation: "CN",
52
43
  aliases: ["法人番号", "Corporate Number"],
53
44
  candidatePattern: "\\d{13}",
45
+ scope: "country",
54
46
  country: "JP",
55
47
  entityType: "company",
56
48
  description: "13-digit corporate identifier assigned by the National Tax Agency",
package/dist/jp/cn.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cn.js","names":[],"sources":["../../src/jp/cn.ts"],"sourcesContent":["/**\n * CN (Corporate Number, 法人番号).\n *\n * Japanese Corporate Number. 13 digits with a\n * check digit based on modulus 9. Assigned by the\n * National Tax Agency.\n *\n * @see https://en.wikipedia.org/wiki/Corporate_Number_(Japan)\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\n/**\n * Compute the check digit for a 12-digit payload.\n * Weights alternate [1,2,1,2,...] from the\n * rightmost digit of the payload.\n */\nconst checkDigit = (payload: string): number => {\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n const digit = Number(payload[11 - i]);\n const weight = i % 2 === 0 ? 1 : 2;\n sum += digit * weight;\n }\n return 9 - (sum % 9);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"Corporate Number must be exactly 13 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Corporate Number must contain only digits\",\n );\n }\n const expected = checkDigit(v.slice(1));\n if (expected !== Number(v[0])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Corporate Number check digit does not match\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Corporate Number. */\nconst generate = (): string => {\n const payload = randomDigits(12);\n const check = checkDigit(payload);\n return `${String(check)}${payload}`;\n};\n\n/** Japanese Corporate Number. */\nconst cn: Validator = {\n name: \"Japanese Corporate Number\",\n localName: \"法人番号\",\n abbreviation: \"CN\",\n aliases: [\"法人番号\", \"Corporate Number\"] as const,\n candidatePattern: \"\\\\d{13}\",\n country: \"JP\",\n entityType: \"company\",\n description:\n \"13-digit corporate identifier assigned by the National Tax Agency\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/Corporate_Number_(Japan)\",\n lengths: [13] as const,\n examples: [\"5835678256246\", \"2021001052596\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cn;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;;;;;;AAOpB,MAAM,cAAc,YAA4B;CAC9C,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;EAC3B,MAAM,QAAQ,OAAO,QAAQ,KAAK,GAAG;EACrC,MAAM,SAAS,IAAI,MAAM,IAAI,IAAI;AACjC,SAAO,QAAQ;;AAEjB,QAAO,IAAK,MAAM;;AAGpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,6CACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,4CACD;AAGH,KADiB,WAAW,EAAE,MAAM,EAAE,CAAC,KACtB,OAAO,EAAE,GAAG,CAC3B,QAAO,IACL,oBACA,8CACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,GAAG;CAChC,MAAM,QAAQ,WAAW,QAAQ;AACjC,QAAO,GAAG,OAAO,MAAM,GAAG;;;AAI5B,MAAM,KAAgB;CACpB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,QAAQ,mBAAmB;CACrC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,aACE;CACF,WACE;CACF,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,iBAAiB,gBAAgB;CAC5C;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"cn.js","names":[],"sources":["../../src/jp/cn.ts"],"sourcesContent":["/**\n * CN (Corporate Number, 法人番号).\n *\n * Japanese Corporate Number. 13 digits with a\n * check digit based on modulus 9. Assigned by the\n * National Tax Agency.\n *\n * @see https://en.wikipedia.org/wiki/Corporate_Number_(Japan)\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\n/**\n * Compute the check digit for a 12-digit payload.\n * Weights alternate [1,2,1,2,...] from the\n * rightmost digit of the payload.\n */\nconst checkDigit = (payload: string): number => {\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n const digit = Number(payload[11 - i]);\n const weight = i % 2 === 0 ? 1 : 2;\n sum += digit * weight;\n }\n return 9 - (sum % 9);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"Corporate Number must be exactly 13 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Corporate Number must contain only digits\",\n );\n }\n const expected = checkDigit(v.slice(1));\n if (expected !== Number(v[0])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Corporate Number check digit does not match\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Corporate Number. */\nconst generate = (): string => {\n const payload = randomDigits(12);\n const check = checkDigit(payload);\n return `${String(check)}${payload}`;\n};\n\n/** Japanese Corporate Number. */\nconst cn: CountryValidator<\"JP\"> = {\n name: \"Japanese Corporate Number\",\n localName: \"法人番号\",\n abbreviation: \"CN\",\n aliases: [\"法人番号\", \"Corporate Number\"] as const,\n candidatePattern: \"\\\\d{13}\",\n scope: \"country\",\n country: \"JP\",\n entityType: \"company\",\n description:\n \"13-digit corporate identifier assigned by the National Tax Agency\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/Corporate_Number_(Japan)\",\n lengths: [13] as const,\n examples: [\"5835678256246\", \"2021001052596\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cn;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;AAoBA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;;;;;;AAOnB,MAAM,cAAc,YAA4B;CAC9C,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;EAC3B,MAAM,QAAQ,OAAO,QAAQ,KAAK,EAAE;EACpC,MAAM,SAAS,IAAI,MAAM,IAAI,IAAI;EACjC,OAAO,QAAQ;CACjB;CACA,OAAO,IAAK,MAAM;AACpB;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,4CACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,2CACF;CAGF,IADiB,WAAW,EAAE,MAAM,CAAC,CAC1B,MAAM,OAAO,EAAE,EAAE,GAC1B,OAAO,IACL,oBACA,6CACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,EAAE;CAC/B,MAAM,QAAQ,WAAW,OAAO;CAChC,OAAO,GAAG,OAAO,KAAK,IAAI;AAC5B;;AAGA,MAAM,KAA6B;CACjC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,QAAQ,kBAAkB;CACpC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aACE;CACF,WACE;CACF,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,iBAAiB,eAAe;CAC3C;CACA;CACA;CACA;AACF"}
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/jp/mynumber.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid My Number. */
8
8
  declare const generate: () => string;
9
9
  /** Japanese Individual Number (My Number). */
10
- declare const mynumber: Validator;
10
+ declare const mynumber: CountryValidator<"JP">;
11
11
  //#endregion
12
12
  export { compact, mynumber as default, format, generate, validate };
13
13
  //# sourceMappingURL=mynumber.d.ts.map
@@ -3,16 +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/jp/mynumber.ts
6
- /**
7
- * My Number (Individual Number, マイナンバー).
8
- *
9
- * Japanese Individual Number. 12 digits with a
10
- * mod 11 check digit. Assigned to every resident
11
- * of Japan for tax and social security purposes.
12
- * Contains no encoded personal information.
13
- *
14
- * @see https://en.wikipedia.org/wiki/Individual_Number
15
- */
16
6
  const compact = (value) => clean(value, " -");
17
7
  const WEIGHTS = [
18
8
  6,
@@ -69,6 +59,7 @@ const mynumber = {
69
59
  "個人番号"
70
60
  ],
71
61
  candidatePattern: "\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}",
62
+ scope: "country",
72
63
  country: "JP",
73
64
  entityType: "person",
74
65
  description: "12-digit personal identifier for tax and social security",
@@ -1 +1 @@
1
- {"version":3,"file":"mynumber.js","names":[],"sources":["../../src/jp/mynumber.ts"],"sourcesContent":["/**\n * My Number (Individual Number, マイナンバー).\n *\n * Japanese Individual Number. 12 digits with a\n * mod 11 check digit. Assigned to every resident\n * of Japan for tax and social security purposes.\n * Contains no encoded personal information.\n *\n * @see https://en.wikipedia.org/wiki/Individual_Number\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst WEIGHTS = [6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2];\n\n/**\n * Compute the check digit for an 11-digit payload.\n * remainder <= 1 yields 0; otherwise 11 - remainder.\n */\nconst checkDigit = (payload: string): number => {\n let sum = 0;\n for (let i = 0; i < 11; i++) {\n sum += (WEIGHTS[i] ?? 0) * Number(payload.charAt(i));\n }\n const remainder = sum % 11;\n return remainder <= 1 ? 0 : 11 - remainder;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"My Number must be exactly 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"My Number must contain only digits\",\n );\n }\n const expected = checkDigit(v.slice(0, 11));\n if (expected !== Number(v[11])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"My Number check digit does not match\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 12) {\n return `${v.slice(0, 4)} ${v.slice(4, 8)} ${v.slice(8)}`;\n }\n return v;\n};\n\n/** Generate a random valid My Number. */\nconst generate = (): string => {\n const payload = randomDigits(11);\n const check = checkDigit(payload);\n return `${payload}${String(check)}`;\n};\n\n/** Japanese Individual Number (My Number). */\nconst mynumber: Validator = {\n name: \"Japanese Individual Number\",\n localName: \"マイナンバー\",\n abbreviation: \"My Number\",\n aliases: [\n \"My Number\",\n \"マイナンバー\",\n \"個人番号\",\n ] as const,\n candidatePattern: \"\\\\d{4}[\\\\s-]?\\\\d{4}[\\\\s-]?\\\\d{4}\",\n country: \"JP\",\n entityType: \"person\",\n description:\n \"12-digit personal identifier for tax\" +\n \" and social security\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/Individual_Number\",\n lengths: [12] as const,\n examples: [\"123456789018\", \"000000000019\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default mynumber;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;;;;;AAMjD,MAAM,cAAc,YAA4B;CAC9C,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IACtB,SAAQ,QAAQ,MAAM,KAAK,OAAO,QAAQ,OAAO,EAAE,CAAC;CAEtD,MAAM,YAAY,MAAM;AACxB,QAAO,aAAa,IAAI,IAAI,KAAK;;AAGnC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,sCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,qCACD;AAGH,KADiB,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,KAC1B,OAAO,EAAE,IAAI,CAC5B,QAAO,IACL,oBACA,uCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;AAExD,QAAO;;;AAIT,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,GAAG;CAChC,MAAM,QAAQ,WAAW,QAAQ;AACjC,QAAO,GAAG,UAAU,OAAO,MAAM;;;AAInC,MAAM,WAAsB;CAC1B,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,aACE;CAEF,WACE;CACF,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,gBAAgB,eAAe;CAC1C;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"mynumber.js","names":[],"sources":["../../src/jp/mynumber.ts"],"sourcesContent":["/**\n * My Number (Individual Number, マイナンバー).\n *\n * Japanese Individual Number. 12 digits with a\n * mod 11 check digit. Assigned to every resident\n * of Japan for tax and social security purposes.\n * Contains no encoded personal information.\n *\n * @see https://en.wikipedia.org/wiki/Individual_Number\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst WEIGHTS = [6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2];\n\n/**\n * Compute the check digit for an 11-digit payload.\n * remainder <= 1 yields 0; otherwise 11 - remainder.\n */\nconst checkDigit = (payload: string): number => {\n let sum = 0;\n for (let i = 0; i < 11; i++) {\n sum += (WEIGHTS[i] ?? 0) * Number(payload.charAt(i));\n }\n const remainder = sum % 11;\n return remainder <= 1 ? 0 : 11 - remainder;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"My Number must be exactly 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"My Number must contain only digits\",\n );\n }\n const expected = checkDigit(v.slice(0, 11));\n if (expected !== Number(v[11])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"My Number check digit does not match\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 12) {\n return `${v.slice(0, 4)} ${v.slice(4, 8)} ${v.slice(8)}`;\n }\n return v;\n};\n\n/** Generate a random valid My Number. */\nconst generate = (): string => {\n const payload = randomDigits(11);\n const check = checkDigit(payload);\n return `${payload}${String(check)}`;\n};\n\n/** Japanese Individual Number (My Number). */\nconst mynumber: CountryValidator<\"JP\"> = {\n name: \"Japanese Individual Number\",\n localName: \"マイナンバー\",\n abbreviation: \"My Number\",\n aliases: [\n \"My Number\",\n \"マイナンバー\",\n \"個人番号\",\n ] as const,\n candidatePattern: \"\\\\d{4}[\\\\s-]?\\\\d{4}[\\\\s-]?\\\\d{4}\",\n scope: \"country\",\n country: \"JP\",\n entityType: \"person\",\n description:\n \"12-digit personal identifier for tax\" +\n \" and social security\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/Individual_Number\",\n lengths: [12] as const,\n examples: [\"123456789018\", \"000000000019\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default mynumber;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;AAqBA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;;;;;AAMhD,MAAM,cAAc,YAA4B;CAC9C,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KACtB,QAAQ,QAAQ,MAAM,KAAK,OAAO,QAAQ,OAAO,CAAC,CAAC;CAErD,MAAM,YAAY,MAAM;CACxB,OAAO,aAAa,IAAI,IAAI,KAAK;AACnC;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,qCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,oCACF;CAGF,IADiB,WAAW,EAAE,MAAM,GAAG,EAAE,CAC9B,MAAM,OAAO,EAAE,GAAG,GAC3B,OAAO,IACL,oBACA,sCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;CAEvD,OAAO;AACT;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,EAAE;CAC/B,MAAM,QAAQ,WAAW,OAAO;CAChC,OAAO,GAAG,UAAU,OAAO,KAAK;AAClC;;AAGA,MAAM,WAAmC;CACvC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aACE;CAEF,WACE;CACF,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,gBAAgB,cAAc;CACzC;CACA;CACA;CACA;AACF"}
package/dist/kr/brn.d.ts CHANGED
@@ -1,13 +1,22 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/kr/brn.d.ts
4
4
  /** Generate a random valid Korean BRN. */
5
5
  declare const generate: () => string;
6
+ /**
7
+ * BRN (Business Registration Number, 사업자등록번호).
8
+ *
9
+ * Korean Business Registration Number. 10 digits
10
+ * formatted as XXX-XX-XXXXX. Validated by component
11
+ * checks (tax office, business type, serial).
12
+ *
13
+ * @see https://en.wikipedia.org/wiki/Business_registration_number_(South_Korea)
14
+ */
6
15
  declare const compact: (value: string) => string;
7
16
  declare const validate: (value: string) => ValidateResult;
8
17
  declare const format: (value: string) => string;
9
18
  /** Korean Business Registration Number. */
10
- declare const brn: Validator;
19
+ declare const brn: CountryValidator<"KR">;
11
20
  //#endregion
12
21
  export { compact, brn as default, format, generate, validate };
13
22
  //# sourceMappingURL=brn.d.ts.map
package/dist/kr/brn.js CHANGED
@@ -3,15 +3,6 @@ import { randomDigits, randomInt } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/kr/brn.ts
6
- /**
7
- * BRN (Business Registration Number, 사업자등록번호).
8
- *
9
- * Korean Business Registration Number. 10 digits
10
- * formatted as XXX-XX-XXXXX. Validated by component
11
- * checks (tax office, business type, serial).
12
- *
13
- * @see https://en.wikipedia.org/wiki/Business_registration_number_(South_Korea)
14
- */
15
6
  /** Generate a random valid Korean BRN. */
16
7
  const generate = () => {
17
8
  const office = String(randomInt(101, 999));
@@ -50,6 +41,7 @@ const brn = {
50
41
  abbreviation: "BRN",
51
42
  aliases: ["사업자등록번호", "BRN"],
52
43
  candidatePattern: "\\d{3}-?\\d{2}-?\\d{5}",
44
+ scope: "country",
53
45
  country: "KR",
54
46
  entityType: "company",
55
47
  description: "10-digit business identifier issued by the National Tax Service",
@@ -1 +1 @@
1
- {"version":3,"file":"brn.js","names":[],"sources":["../../src/kr/brn.ts"],"sourcesContent":["/** Generate a random valid Korean BRN. */\nconst generate = (): string => {\n const office = String(randomInt(101, 999));\n let bizType: string;\n do {\n bizType = randomDigits(2);\n } while (bizType === \"00\");\n let serial: string;\n do {\n serial = randomDigits(4);\n } while (serial === \"0000\");\n const last = randomDigits(1);\n return `${office}${bizType}${serial}${last}`;\n};\n\n/**\n * BRN (Business Registration Number, 사업자등록번호).\n *\n * Korean Business Registration Number. 10 digits\n * formatted as XXX-XX-XXXXX. Validated by component\n * checks (tax office, business type, serial).\n *\n * @see https://en.wikipedia.org/wiki/Business_registration_number_(South_Korea)\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"BRN must be exactly 10 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"BRN must contain only digits\",\n );\n }\n // Tax office number must be >= 101\n if (v.slice(0, 3) < \"101\") {\n return err(\n \"INVALID_COMPONENT\",\n \"BRN tax office code must be >= 101\",\n );\n }\n // Business type must not be 00\n if (v.slice(3, 5) === \"00\") {\n return err(\n \"INVALID_COMPONENT\",\n \"BRN business type must not be 00\",\n );\n }\n // Serial part must not be 0000\n if (v.slice(5, 9) === \"0000\") {\n return err(\n \"INVALID_COMPONENT\",\n \"BRN serial must not be 0000\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 3)}-${v.slice(3, 5)}-${v.slice(5)}`;\n};\n\n/** Korean Business Registration Number. */\nconst brn: Validator = {\n name: \"Korean Business Registration Number\",\n localName: \"사업자등록번호\",\n abbreviation: \"BRN\",\n aliases: [\"사업자등록번호\", \"BRN\"] as const,\n candidatePattern: \"\\\\d{3}-?\\\\d{2}-?\\\\d{5}\",\n country: \"KR\",\n entityType: \"company\",\n description:\n \"10-digit business identifier issued by the National Tax Service\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/Business_registration_number_(South_Korea)\",\n lengths: [10] as const,\n examples: [\"1168200131\", \"2208162517\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default brn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AACA,MAAM,iBAAyB;CAC7B,MAAM,SAAS,OAAO,UAAU,KAAK,IAAI,CAAC;CAC1C,IAAI;AACJ;AACE,YAAU,aAAa,EAAE;QAClB,YAAY;CACrB,IAAI;AACJ;AACE,WAAS,aAAa,EAAE;QACjB,WAAW;CACpB,MAAM,OAAO,aAAa,EAAE;AAC5B,QAAO,GAAG,SAAS,UAAU,SAAS;;AAoBxC,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,gCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;AAGH,KAAI,EAAE,MAAM,GAAG,EAAE,GAAG,MAClB,QAAO,IACL,qBACA,qCACD;AAGH,KAAI,EAAE,MAAM,GAAG,EAAE,KAAK,KACpB,QAAO,IACL,qBACA,mCACD;AAGH,KAAI,EAAE,MAAM,GAAG,EAAE,KAAK,OACpB,QAAO,IACL,qBACA,8BACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;;;AAIxD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,WAAW,MAAM;CAC3B,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,aACE;CACF,WACE;CACF,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,cAAc,aAAa;CACtC;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"brn.js","names":[],"sources":["../../src/kr/brn.ts"],"sourcesContent":["/** Generate a random valid Korean BRN. */\nconst generate = (): string => {\n const office = String(randomInt(101, 999));\n let bizType: string;\n do {\n bizType = randomDigits(2);\n } while (bizType === \"00\");\n let serial: string;\n do {\n serial = randomDigits(4);\n } while (serial === \"0000\");\n const last = randomDigits(1);\n return `${office}${bizType}${serial}${last}`;\n};\n\n/**\n * BRN (Business Registration Number, 사업자등록번호).\n *\n * Korean Business Registration Number. 10 digits\n * formatted as XXX-XX-XXXXX. Validated by component\n * checks (tax office, business type, serial).\n *\n * @see https://en.wikipedia.org/wiki/Business_registration_number_(South_Korea)\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"BRN must be exactly 10 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"BRN must contain only digits\",\n );\n }\n // Tax office number must be >= 101\n if (v.slice(0, 3) < \"101\") {\n return err(\n \"INVALID_COMPONENT\",\n \"BRN tax office code must be >= 101\",\n );\n }\n // Business type must not be 00\n if (v.slice(3, 5) === \"00\") {\n return err(\n \"INVALID_COMPONENT\",\n \"BRN business type must not be 00\",\n );\n }\n // Serial part must not be 0000\n if (v.slice(5, 9) === \"0000\") {\n return err(\n \"INVALID_COMPONENT\",\n \"BRN serial must not be 0000\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 3)}-${v.slice(3, 5)}-${v.slice(5)}`;\n};\n\n/** Korean Business Registration Number. */\nconst brn: CountryValidator<\"KR\"> = {\n name: \"Korean Business Registration Number\",\n localName: \"사업자등록번호\",\n abbreviation: \"BRN\",\n aliases: [\"사업자등록번호\", \"BRN\"] as const,\n candidatePattern: \"\\\\d{3}-?\\\\d{2}-?\\\\d{5}\",\n scope: \"country\",\n country: \"KR\",\n entityType: \"company\",\n description:\n \"10-digit business identifier issued by the National Tax Service\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/Business_registration_number_(South_Korea)\",\n lengths: [10] as const,\n examples: [\"1168200131\", \"2208162517\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default brn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AACA,MAAM,iBAAyB;CAC7B,MAAM,SAAS,OAAO,UAAU,KAAK,GAAG,CAAC;CACzC,IAAI;CACJ;EACE,UAAU,aAAa,CAAC;QACjB,YAAY;CACrB,IAAI;CACJ;EACE,SAAS,aAAa,CAAC;QAChB,WAAW;CACpB,MAAM,OAAO,aAAa,CAAC;CAC3B,OAAO,GAAG,SAAS,UAAU,SAAS;AACxC;AAsBA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,+BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAGF,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,OAClB,OAAO,IACL,qBACA,oCACF;CAGF,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,MACpB,OAAO,IACL,qBACA,kCACF;CAGF,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,QACpB,OAAO,IACL,qBACA,6BACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;AACvD;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,WAAW,KAAK;CAC1B,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aACE;CACF,WACE;CACF,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,cAAc,YAAY;CACrC;CACA;CACA;CACA;AACF"}
package/dist/kr/rrn.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ParsedPersonId, ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ParsedPersonId, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/kr/rrn.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -17,7 +17,7 @@ declare const parse: (value: string) => ParsedPersonId | null;
17
17
  /** Generate a random valid Korean RRN. */
18
18
  declare const generate: () => string;
19
19
  /** Korean Resident Registration Number. */
20
- declare const rrn: Validator<ParsedPersonId>;
20
+ declare const rrn: CountryValidator<"KR", ParsedPersonId>;
21
21
  //#endregion
22
22
  export { compact, rrn as default, format, generate, parse, validate };
23
23
  //# sourceMappingURL=rrn.d.ts.map
package/dist/kr/rrn.js CHANGED
@@ -1,19 +1,9 @@
1
1
  import { clean } from "../_util/clean.js";
2
+ import { isValidDate } from "../_util/date.js";
2
3
  import { randomDigits, randomInt } from "../_util/generate.js";
3
4
  import { err } from "../_util/result.js";
4
5
  import { isdigits } from "../_util/strings.js";
5
- import { isValidDate } from "../_util/date.js";
6
6
  //#region src/kr/rrn.ts
7
- /**
8
- * RRN (Resident Registration Number, 주민등록번호).
9
- *
10
- * Korean Resident Registration Number. 13 digits
11
- * formatted as YYMMDD-GPPCCSD. Encodes date of
12
- * birth, gender/century, place of birth, community
13
- * center, serial, and a check digit.
14
- *
15
- * @see https://en.wikipedia.org/wiki/Resident_registration_number
16
- */
17
7
  const compact = (value) => clean(value, " -/");
18
8
  const CHECK_WEIGHTS = [
19
9
  2,
@@ -126,6 +116,7 @@ const rrn = {
126
116
  "Resident Registration Number"
127
117
  ],
128
118
  candidatePattern: "\\d{6}[\\s-]?\\d{7}",
119
+ scope: "country",
129
120
  country: "KR",
130
121
  entityType: "person",
131
122
  description: "13-digit personal identifier issued to all residents of South Korea",
@@ -1 +1 @@
1
- {"version":3,"file":"rrn.js","names":[],"sources":["../../src/kr/rrn.ts"],"sourcesContent":["/**\n * RRN (Resident Registration Number, 주민등록번호).\n *\n * Korean Resident Registration Number. 13 digits\n * formatted as YYMMDD-GPPCCSD. Encodes date of\n * birth, gender/century, place of birth, community\n * center, serial, and a check digit.\n *\n * @see https://en.wikipedia.org/wiki/Resident_registration_number\n */\n\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type {\n ParsedPersonId,\n ValidateResult,\n Validator,\n} from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -/\");\n\nconst CHECK_WEIGHTS = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];\n\n/**\n * Compute the check digit for the first 12 digits.\n * Formula: (11 - sum(w_i * d_i) % 11) % 10.\n */\nconst checkDigit = (digits: string): number => {\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n sum +=\n (CHECK_WEIGHTS[i] ?? 0) * Number(digits.charAt(i));\n }\n return (11 - (sum % 11)) % 10;\n};\n\n/** Century prefix derived from the 7th digit. */\nconst CENTURY_BY_GENDER: Record<string, number> = {\n \"0\": 1800,\n \"1\": 1900,\n \"2\": 1900,\n \"3\": 2000,\n \"4\": 2000,\n \"5\": 1900,\n \"6\": 1900,\n \"7\": 2000,\n \"8\": 2000,\n \"9\": 1800,\n};\n\n/**\n * Resolve birth date components from a compacted RRN.\n * Returns null if the date is invalid.\n */\nconst resolveBirthDate = (\n v: string,\n): { year: number; month: number; day: number } | null => {\n const century = CENTURY_BY_GENDER[v.charAt(6)];\n if (century === undefined) return null;\n\n const year = century + Number(v.slice(0, 2));\n const month = Number(v.slice(2, 4));\n const day = Number(v.slice(4, 6));\n\n if (!isValidDate(year, month, day)) return null;\n return { year, month, day };\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"RRN must be exactly 13 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"RRN must contain only digits\",\n );\n }\n if (resolveBirthDate(v) === null) {\n return err(\n \"INVALID_COMPONENT\",\n \"RRN contains an invalid date of birth\",\n );\n }\n const place = Number(v.slice(7, 9));\n if (place > 96) {\n return err(\n \"INVALID_COMPONENT\",\n \"RRN place-of-birth code must be <= 96\",\n );\n }\n if (checkDigit(v.slice(0, 12)) !== Number(v[12])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RRN check digit does not match\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 13) {\n return `${v.slice(0, 6)}-${v.slice(6)}`;\n }\n return v;\n};\n\n/**\n * Extract birth date and gender from an RRN.\n * Returns null if the value is not valid.\n *\n * Gender digit mapping:\n * 1, 3 = male Korean; 2, 4 = female Korean\n * 5, 7 = male foreigner; 6, 8 = female foreigner\n * 0, 9 = pre-1800 (male/female by convention)\n */\nconst parse = (value: string): ParsedPersonId | null => {\n const result = validate(value);\n if (!result.valid) return null;\n\n const v = result.compact;\n const bd = resolveBirthDate(v);\n if (bd === null) return null;\n\n const genderDigit = v.charAt(6);\n const isMale = \"13579\".includes(genderDigit);\n\n return {\n birthDate: new Date(bd.year, bd.month - 1, bd.day),\n gender: isMale ? \"male\" : \"female\",\n };\n};\n\n/** Generate a random valid Korean RRN. */\nconst generate = (): string => {\n const year = randomInt(1900, 2024);\n const month = String(randomInt(1, 12)).padStart(2, \"0\");\n const day = String(randomInt(1, 28)).padStart(2, \"0\");\n const yy = String(year % 100).padStart(2, \"0\");\n const genderDigit =\n year >= 2000\n ? String(randomInt(3, 4))\n : String(randomInt(1, 2));\n const place = String(randomInt(0, 96)).padStart(2, \"0\");\n const body = `${yy}${month}${day}${genderDigit}${place}${randomDigits(3)}`;\n return `${body}${String(checkDigit(body))}`;\n};\n\n/** Korean Resident Registration Number. */\nconst rrn: Validator<ParsedPersonId> = {\n name: \"Korean Resident Registration Number\",\n localName: \"주민등록번호\",\n abbreviation: \"RRN\",\n aliases: [\n \"RRN\",\n \"주민등록번호\",\n \"Resident Registration Number\",\n ] as const,\n candidatePattern: \"\\\\d{6}[\\\\s-]?\\\\d{7}\",\n country: \"KR\",\n entityType: \"person\",\n description:\n \"13-digit personal identifier issued to all\" +\n \" residents of South Korea\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/\" +\n \"Resident_registration_number\",\n lengths: [13] as const,\n examples: [\"9710139019902\", \"9501011000109\"] as const,\n compact,\n format,\n parse,\n validate,\n generate,\n};\n\nexport default rrn;\nexport { compact, format, generate, parse, validate };\n"],"mappings":";;;;;;;;;;;;;;;;AAuBA,MAAM,WAAW,UACf,MAAM,OAAO,MAAM;AAErB,MAAM,gBAAgB;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;;;;;AAM1D,MAAM,cAAc,WAA2B;CAC7C,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IACtB,SACG,cAAc,MAAM,KAAK,OAAO,OAAO,OAAO,EAAE,CAAC;AAEtD,SAAQ,KAAM,MAAM,MAAO;;;AAI7B,MAAM,oBAA4C;CAChD,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACN;;;;;AAMD,MAAM,oBACJ,MACwD;CACxD,MAAM,UAAU,kBAAkB,EAAE,OAAO,EAAE;AAC7C,KAAI,YAAY,KAAA,EAAW,QAAO;CAElC,MAAM,OAAO,UAAU,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAC5C,MAAM,QAAQ,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CACnC,MAAM,MAAM,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;AAEjC,KAAI,CAAC,YAAY,MAAM,OAAO,IAAI,CAAE,QAAO;AAC3C,QAAO;EAAE;EAAM;EAAO;EAAK;;AAG7B,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,gCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;AAEH,KAAI,iBAAiB,EAAE,KAAK,KAC1B,QAAO,IACL,qBACA,wCACD;AAGH,KADc,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,GACvB,GACV,QAAO,IACL,qBACA,wCACD;AAEH,KAAI,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,KAAK,OAAO,EAAE,IAAI,CAC9C,QAAO,IACL,oBACA,iCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;AAEvC,QAAO;;;;;;;;;;;AAYT,MAAM,SAAS,UAAyC;CACtD,MAAM,SAAS,SAAS,MAAM;AAC9B,KAAI,CAAC,OAAO,MAAO,QAAO;CAE1B,MAAM,IAAI,OAAO;CACjB,MAAM,KAAK,iBAAiB,EAAE;AAC9B,KAAI,OAAO,KAAM,QAAO;CAExB,MAAM,cAAc,EAAE,OAAO,EAAE;CAC/B,MAAM,SAAS,QAAQ,SAAS,YAAY;AAE5C,QAAO;EACL,WAAW,IAAI,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,GAAG,IAAI;EAClD,QAAQ,SAAS,SAAS;EAC3B;;;AAIH,MAAM,iBAAyB;CAC7B,MAAM,OAAO,UAAU,MAAM,KAAK;CAClC,MAAM,QAAQ,OAAO,UAAU,GAAG,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI;CACvD,MAAM,MAAM,OAAO,UAAU,GAAG,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI;CAOrD,MAAM,OAAO,GANF,OAAO,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,GAMzB,QAAQ,MAJ3B,QAAQ,MACJ,OAAO,UAAU,GAAG,EAAE,CAAC,GACvB,OAAO,UAAU,GAAG,EAAE,CAAC,GACf,OAAO,UAAU,GAAG,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,GACE,aAAa,EAAE;AACxE,QAAO,GAAG,OAAO,OAAO,WAAW,KAAK,CAAC;;;AAI3C,MAAM,MAAiC;CACrC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,aACE;CAEF,WACE;CAEF,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,iBAAiB,gBAAgB;CAC5C;CACA;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"rrn.js","names":[],"sources":["../../src/kr/rrn.ts"],"sourcesContent":["/**\n * RRN (Resident Registration Number, 주민등록번호).\n *\n * Korean Resident Registration Number. 13 digits\n * formatted as YYMMDD-GPPCCSD. Encodes date of\n * birth, gender/century, place of birth, community\n * center, serial, and a check digit.\n *\n * @see https://en.wikipedia.org/wiki/Resident_registration_number\n */\n\nimport type {\n ParsedPersonId,\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -/\");\n\nconst CHECK_WEIGHTS = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];\n\n/**\n * Compute the check digit for the first 12 digits.\n * Formula: (11 - sum(w_i * d_i) % 11) % 10.\n */\nconst checkDigit = (digits: string): number => {\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n sum +=\n (CHECK_WEIGHTS[i] ?? 0) * Number(digits.charAt(i));\n }\n return (11 - (sum % 11)) % 10;\n};\n\n/** Century prefix derived from the 7th digit. */\nconst CENTURY_BY_GENDER: Record<string, number> = {\n \"0\": 1800,\n \"1\": 1900,\n \"2\": 1900,\n \"3\": 2000,\n \"4\": 2000,\n \"5\": 1900,\n \"6\": 1900,\n \"7\": 2000,\n \"8\": 2000,\n \"9\": 1800,\n};\n\n/**\n * Resolve birth date components from a compacted RRN.\n * Returns null if the date is invalid.\n */\nconst resolveBirthDate = (\n v: string,\n): { year: number; month: number; day: number } | null => {\n const century = CENTURY_BY_GENDER[v.charAt(6)];\n if (century === undefined) return null;\n\n const year = century + Number(v.slice(0, 2));\n const month = Number(v.slice(2, 4));\n const day = Number(v.slice(4, 6));\n\n if (!isValidDate(year, month, day)) return null;\n return { year, month, day };\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"RRN must be exactly 13 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"RRN must contain only digits\",\n );\n }\n if (resolveBirthDate(v) === null) {\n return err(\n \"INVALID_COMPONENT\",\n \"RRN contains an invalid date of birth\",\n );\n }\n const place = Number(v.slice(7, 9));\n if (place > 96) {\n return err(\n \"INVALID_COMPONENT\",\n \"RRN place-of-birth code must be <= 96\",\n );\n }\n if (checkDigit(v.slice(0, 12)) !== Number(v[12])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RRN check digit does not match\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 13) {\n return `${v.slice(0, 6)}-${v.slice(6)}`;\n }\n return v;\n};\n\n/**\n * Extract birth date and gender from an RRN.\n * Returns null if the value is not valid.\n *\n * Gender digit mapping:\n * 1, 3 = male Korean; 2, 4 = female Korean\n * 5, 7 = male foreigner; 6, 8 = female foreigner\n * 0, 9 = pre-1800 (male/female by convention)\n */\nconst parse = (value: string): ParsedPersonId | null => {\n const result = validate(value);\n if (!result.valid) return null;\n\n const v = result.compact;\n const bd = resolveBirthDate(v);\n if (bd === null) return null;\n\n const genderDigit = v.charAt(6);\n const isMale = \"13579\".includes(genderDigit);\n\n return {\n birthDate: new Date(bd.year, bd.month - 1, bd.day),\n gender: isMale ? \"male\" : \"female\",\n };\n};\n\n/** Generate a random valid Korean RRN. */\nconst generate = (): string => {\n const year = randomInt(1900, 2024);\n const month = String(randomInt(1, 12)).padStart(2, \"0\");\n const day = String(randomInt(1, 28)).padStart(2, \"0\");\n const yy = String(year % 100).padStart(2, \"0\");\n const genderDigit =\n year >= 2000\n ? String(randomInt(3, 4))\n : String(randomInt(1, 2));\n const place = String(randomInt(0, 96)).padStart(2, \"0\");\n const body = `${yy}${month}${day}${genderDigit}${place}${randomDigits(3)}`;\n return `${body}${String(checkDigit(body))}`;\n};\n\n/** Korean Resident Registration Number. */\nconst rrn: CountryValidator<\"KR\", ParsedPersonId> = {\n name: \"Korean Resident Registration Number\",\n localName: \"주민등록번호\",\n abbreviation: \"RRN\",\n aliases: [\n \"RRN\",\n \"주민등록번호\",\n \"Resident Registration Number\",\n ] as const,\n candidatePattern: \"\\\\d{6}[\\\\s-]?\\\\d{7}\",\n scope: \"country\",\n country: \"KR\",\n entityType: \"person\",\n description:\n \"13-digit personal identifier issued to all\" +\n \" residents of South Korea\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/\" +\n \"Resident_registration_number\",\n lengths: [13] as const,\n examples: [\"9710139019902\", \"9501011000109\"] as const,\n compact,\n format,\n parse,\n validate,\n generate,\n};\n\nexport default rrn;\nexport { compact, format, generate, parse, validate };\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ParsedBirthDate, ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ParsedBirthDate, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/kw/civil.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -13,7 +13,7 @@ declare const parse: (value: string) => ParsedBirthDate | null;
13
13
  /** Generate a random valid Kuwait civil number. */
14
14
  declare const generate: () => string;
15
15
  /** Kuwait Civil Number (الرقم المدني). */
16
- declare const civil: Validator<ParsedBirthDate>;
16
+ declare const civil: CountryValidator<"KW", ParsedBirthDate>;
17
17
  //#endregion
18
18
  export { compact, civil as default, format, generate, parse, validate };
19
19
  //# sourceMappingURL=civil.d.ts.map