@stll/stdnum 0.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (808) hide show
  1. package/LICENSE +1 -5
  2. package/README.md +28 -4
  3. package/dist/_checksums/luhn.js.map +1 -1
  4. package/dist/_checksums/mod1110.js +1 -1
  5. package/dist/_checksums/mod1110.js.map +1 -1
  6. package/dist/_checksums/mod112.js +5 -5
  7. package/dist/_checksums/mod112.js.map +1 -1
  8. package/dist/_checksums/mod97.js.map +1 -1
  9. package/dist/_checksums/verhoeff.js.map +1 -1
  10. package/dist/_checksums/weighted-sum.js.map +1 -1
  11. package/dist/_util/arabic.js.map +1 -1
  12. package/dist/_util/clean.js.map +1 -1
  13. package/dist/_util/date.js.map +1 -1
  14. package/dist/_util/generate.d.ts +13 -1
  15. package/dist/_util/generate.js +23 -1
  16. package/dist/_util/generate.js.map +1 -1
  17. package/dist/_util/result.js.map +1 -1
  18. package/dist/_util/strings.js.map +1 -1
  19. package/dist/ad/mod.d.ts +3 -2
  20. package/dist/ad/nrt.d.ts +16 -2
  21. package/dist/ad/nrt.js +4 -16
  22. package/dist/ad/nrt.js.map +1 -1
  23. package/dist/ae/eid.d.ts +2 -3
  24. package/dist/ae/eid.js +2 -12
  25. package/dist/ae/eid.js.map +1 -1
  26. package/dist/ae/mod.d.ts +3 -2
  27. package/dist/ai/mod.d.ts +3 -2
  28. package/dist/ai/tin.d.ts +20 -2
  29. package/dist/ai/tin.js +1 -18
  30. package/dist/ai/tin.js.map +1 -1
  31. package/dist/al/mod.d.ts +3 -2
  32. package/dist/al/nipt.d.ts +13 -2
  33. package/dist/al/nipt.js +1 -11
  34. package/dist/al/nipt.js.map +1 -1
  35. package/dist/am/mod.d.ts +3 -2
  36. package/dist/am/tin.d.ts +16 -2
  37. package/dist/am/tin.js +1 -14
  38. package/dist/am/tin.js.map +1 -1
  39. package/dist/ar/cbu.d.ts +2 -3
  40. package/dist/ar/cbu.js +2 -10
  41. package/dist/ar/cbu.js.map +1 -1
  42. package/dist/ar/cuit.d.ts +2 -3
  43. package/dist/ar/cuit.js +13 -29
  44. package/dist/ar/cuit.js.map +1 -1
  45. package/dist/ar/dni.d.ts +11 -2
  46. package/dist/ar/dni.js +1 -9
  47. package/dist/ar/dni.js.map +1 -1
  48. package/dist/ar/mod.d.ts +3 -2
  49. package/dist/at/businessid.d.ts +10 -2
  50. package/dist/at/businessid.js +1 -8
  51. package/dist/at/businessid.js.map +1 -1
  52. package/dist/at/mod.d.ts +3 -2
  53. package/dist/at/tin.d.ts +2 -3
  54. package/dist/at/tin.js +1 -11
  55. package/dist/at/tin.js.map +1 -1
  56. package/dist/at/uid.d.ts +2 -3
  57. package/dist/at/uid.js +2 -10
  58. package/dist/at/uid.js.map +1 -1
  59. package/dist/at/vnr.d.ts +5 -4
  60. package/dist/at/vnr.js +23 -16
  61. package/dist/at/vnr.js.map +1 -1
  62. package/dist/au/abn.d.ts +2 -3
  63. package/dist/au/abn.js +1 -10
  64. package/dist/au/abn.js.map +1 -1
  65. package/dist/au/acn.d.ts +2 -3
  66. package/dist/au/acn.js +1 -10
  67. package/dist/au/acn.js.map +1 -1
  68. package/dist/au/mod.d.ts +3 -2
  69. package/dist/au/tfn.d.ts +2 -3
  70. package/dist/au/tfn.js +1 -10
  71. package/dist/au/tfn.js.map +1 -1
  72. package/dist/az/mod.d.ts +3 -2
  73. package/dist/az/voen.d.ts +2 -3
  74. package/dist/az/voen.js +1 -14
  75. package/dist/az/voen.js.map +1 -1
  76. package/dist/ba/jmbg.d.ts +2 -3
  77. package/dist/ba/jmbg.js +4 -11
  78. package/dist/ba/jmbg.js.map +1 -1
  79. package/dist/ba/mod.d.ts +3 -2
  80. package/dist/bd/mod.d.ts +3 -2
  81. package/dist/bd/nid.d.ts +23 -2
  82. package/dist/bd/nid.js +11 -32
  83. package/dist/bd/nid.js.map +1 -1
  84. package/dist/be/bis.d.ts +2 -3
  85. package/dist/be/bis.js +1 -11
  86. package/dist/be/bis.js.map +1 -1
  87. package/dist/be/mod.d.ts +3 -2
  88. package/dist/be/nn.d.ts +2 -3
  89. package/dist/be/nn.js +1 -11
  90. package/dist/be/nn.js.map +1 -1
  91. package/dist/be/vat.d.ts +2 -3
  92. package/dist/be/vat.js +1 -9
  93. package/dist/be/vat.js.map +1 -1
  94. package/dist/bg/egn.d.ts +2 -3
  95. package/dist/bg/egn.js +5 -13
  96. package/dist/bg/egn.js.map +1 -1
  97. package/dist/bg/mod.d.ts +3 -2
  98. package/dist/bg/pnf.d.ts +2 -3
  99. package/dist/bg/pnf.js +1 -8
  100. package/dist/bg/pnf.js.map +1 -1
  101. package/dist/bg/vat.d.ts +2 -3
  102. package/dist/bg/vat.js +3 -9
  103. package/dist/bg/vat.js.map +1 -1
  104. package/dist/bh/cpr.d.ts +5 -4
  105. package/dist/bh/cpr.js +9 -19
  106. package/dist/bh/cpr.js.map +1 -1
  107. package/dist/bh/mod.d.ts +3 -2
  108. package/dist/bic.d.ts +13 -2
  109. package/dist/bic.js +14 -26
  110. package/dist/bic.js.map +1 -1
  111. package/dist/br/cnpj.d.ts +2 -3
  112. package/dist/br/cnpj.js +1 -20
  113. package/dist/br/cnpj.js.map +1 -1
  114. package/dist/br/cpf.d.ts +2 -3
  115. package/dist/br/cpf.js +1 -14
  116. package/dist/br/cpf.js.map +1 -1
  117. package/dist/br/mod.d.ts +3 -2
  118. package/dist/by/mod.d.ts +3 -2
  119. package/dist/by/unp.d.ts +2 -3
  120. package/dist/by/unp.js +9 -17
  121. package/dist/by/unp.js.map +1 -1
  122. package/dist/bz/mod.d.ts +3 -2
  123. package/dist/bz/tin.d.ts +5 -4
  124. package/dist/bz/tin.js +10 -27
  125. package/dist/bz/tin.js.map +1 -1
  126. package/dist/ca/bn.d.ts +2 -3
  127. package/dist/ca/bn.js +2 -10
  128. package/dist/ca/bn.js.map +1 -1
  129. package/dist/ca/mod.d.ts +3 -2
  130. package/dist/ca/sin.d.ts +2 -3
  131. package/dist/ca/sin.js +2 -10
  132. package/dist/ca/sin.js.map +1 -1
  133. package/dist/ch/mod.d.ts +3 -2
  134. package/dist/ch/ssn.d.ts +2 -3
  135. package/dist/ch/ssn.js +1 -9
  136. package/dist/ch/ssn.js.map +1 -1
  137. package/dist/ch/uid.d.ts +2 -3
  138. package/dist/ch/uid.js +1 -9
  139. package/dist/ch/uid.js.map +1 -1
  140. package/dist/ch/vat.d.ts +2 -3
  141. package/dist/ch/vat.js +1 -9
  142. package/dist/ch/vat.js.map +1 -1
  143. package/dist/cl/mod.d.ts +3 -2
  144. package/dist/cl/rut.d.ts +2 -3
  145. package/dist/cl/rut.js +2 -15
  146. package/dist/cl/rut.js.map +1 -1
  147. package/dist/cn/mod.d.ts +3 -2
  148. package/dist/cn/ric.d.ts +2 -3
  149. package/dist/cn/ric.js +4 -14
  150. package/dist/cn/ric.js.map +1 -1
  151. package/dist/cn/uscc.d.ts +2 -3
  152. package/dist/cn/uscc.js +8 -16
  153. package/dist/cn/uscc.js.map +1 -1
  154. package/dist/co/mod.d.ts +3 -2
  155. package/dist/co/nit.d.ts +2 -3
  156. package/dist/co/nit.js +6 -13
  157. package/dist/co/nit.js.map +1 -1
  158. package/dist/cr/cpf.d.ts +18 -2
  159. package/dist/cr/cpf.js +5 -19
  160. package/dist/cr/cpf.js.map +1 -1
  161. package/dist/cr/mod.d.ts +3 -2
  162. package/dist/creditcard.d.ts +2 -3
  163. package/dist/creditcard.js +5 -14
  164. package/dist/creditcard.js.map +1 -1
  165. package/dist/cu/mod.d.ts +3 -2
  166. package/dist/cu/ni.d.ts +5 -4
  167. package/dist/cu/ni.js +13 -18
  168. package/dist/cu/ni.js.map +1 -1
  169. package/dist/cy/mod.d.ts +3 -2
  170. package/dist/cy/vat.d.ts +2 -3
  171. package/dist/cy/vat.js +1 -8
  172. package/dist/cy/vat.js.map +1 -1
  173. package/dist/cz/dic.d.ts +2 -3
  174. package/dist/cz/dic.js +7 -13
  175. package/dist/cz/dic.js.map +1 -1
  176. package/dist/cz/ico.d.ts +2 -3
  177. package/dist/cz/ico.js +2 -10
  178. package/dist/cz/ico.js.map +1 -1
  179. package/dist/cz/mod.d.ts +3 -2
  180. package/dist/cz/rc.d.ts +2 -3
  181. package/dist/cz/rc.js +22 -21
  182. package/dist/cz/rc.js.map +1 -1
  183. package/dist/de/handelsreg.d.ts +19 -2
  184. package/dist/de/handelsreg.js +10 -26
  185. package/dist/de/handelsreg.js.map +1 -1
  186. package/dist/de/idnr.d.ts +2 -3
  187. package/dist/de/idnr.js +2 -12
  188. package/dist/de/idnr.js.map +1 -1
  189. package/dist/de/mod.d.ts +3 -2
  190. package/dist/de/stnr.d.ts +17 -3
  191. package/dist/de/stnr.js +1 -15
  192. package/dist/de/stnr.js.map +1 -1
  193. package/dist/de/svnr.d.ts +2 -3
  194. package/dist/de/svnr.js +4 -13
  195. package/dist/de/svnr.js.map +1 -1
  196. package/dist/de/vat.d.ts +2 -3
  197. package/dist/de/vat.js +2 -11
  198. package/dist/de/vat.js.map +1 -1
  199. package/dist/dk/cpr.d.ts +5 -4
  200. package/dist/dk/cpr.js +14 -12
  201. package/dist/dk/cpr.js.map +1 -1
  202. package/dist/dk/cvr.d.ts +2 -3
  203. package/dist/dk/cvr.js +2 -15
  204. package/dist/dk/cvr.js.map +1 -1
  205. package/dist/dk/mod.d.ts +3 -2
  206. package/dist/dk/vat.d.ts +2 -3
  207. package/dist/dk/vat.js +3 -13
  208. package/dist/dk/vat.js.map +1 -1
  209. package/dist/do/mod.d.ts +3 -2
  210. package/dist/do/rnc.d.ts +2 -3
  211. package/dist/do/rnc.js +3 -17
  212. package/dist/do/rnc.js.map +1 -1
  213. package/dist/ec/mod.d.ts +3 -2
  214. package/dist/ec/ruc.d.ts +2 -3
  215. package/dist/ec/ruc.js +2 -19
  216. package/dist/ec/ruc.js.map +1 -1
  217. package/dist/ee/ik.d.ts +2 -3
  218. package/dist/ee/ik.js +6 -15
  219. package/dist/ee/ik.js.map +1 -1
  220. package/dist/ee/mod.d.ts +3 -2
  221. package/dist/ee/registrikood.d.ts +2 -3
  222. package/dist/ee/registrikood.js +9 -15
  223. package/dist/ee/registrikood.js.map +1 -1
  224. package/dist/ee/vat.d.ts +2 -3
  225. package/dist/ee/vat.js +2 -10
  226. package/dist/ee/vat.js.map +1 -1
  227. package/dist/eg/mod.d.ts +3 -2
  228. package/dist/eg/tn.d.ts +11 -2
  229. package/dist/eg/tn.js +1 -9
  230. package/dist/eg/tn.js.map +1 -1
  231. package/dist/es/cif.d.ts +2 -3
  232. package/dist/es/cif.js +3 -12
  233. package/dist/es/cif.js.map +1 -1
  234. package/dist/es/dni.d.ts +2 -3
  235. package/dist/es/dni.js +1 -9
  236. package/dist/es/dni.js.map +1 -1
  237. package/dist/es/mod.d.ts +3 -2
  238. package/dist/es/nie.d.ts +2 -3
  239. package/dist/es/nie.js +14 -22
  240. package/dist/es/nie.js.map +1 -1
  241. package/dist/es/nss.d.ts +2 -3
  242. package/dist/es/nss.js +1 -16
  243. package/dist/es/nss.js.map +1 -1
  244. package/dist/es/vat.d.ts +2 -3
  245. package/dist/es/vat.js +5 -10
  246. package/dist/es/vat.js.map +1 -1
  247. package/dist/eu/mod.d.ts +3 -2
  248. package/dist/eu/vat.d.ts +5 -4
  249. package/dist/eu/vat.js +44 -2
  250. package/dist/eu/vat.js.map +1 -1
  251. package/dist/fi/hetu.d.ts +5 -4
  252. package/dist/fi/hetu.js +19 -12
  253. package/dist/fi/hetu.js.map +1 -1
  254. package/dist/fi/mod.d.ts +3 -2
  255. package/dist/fi/vat.d.ts +2 -3
  256. package/dist/fi/vat.js +3 -10
  257. package/dist/fi/vat.js.map +1 -1
  258. package/dist/fi/ytunnus.d.ts +2 -3
  259. package/dist/fi/ytunnus.js +2 -10
  260. package/dist/fi/ytunnus.js.map +1 -1
  261. package/dist/fr/mod.d.ts +3 -2
  262. package/dist/fr/nif.d.ts +2 -3
  263. package/dist/fr/nif.js +1 -9
  264. package/dist/fr/nif.js.map +1 -1
  265. package/dist/fr/nir.d.ts +2 -3
  266. package/dist/fr/nir.js +3 -14
  267. package/dist/fr/nir.js.map +1 -1
  268. package/dist/fr/siren.d.ts +2 -3
  269. package/dist/fr/siren.js +2 -10
  270. package/dist/fr/siren.js.map +1 -1
  271. package/dist/fr/siret.d.ts +2 -3
  272. package/dist/fr/siret.js +2 -11
  273. package/dist/fr/siret.js.map +1 -1
  274. package/dist/fr/tva.d.ts +2 -3
  275. package/dist/fr/tva.js +2 -12
  276. package/dist/fr/tva.js.map +1 -1
  277. package/dist/gb/mod.d.ts +3 -2
  278. package/dist/gb/nino.d.ts +12 -2
  279. package/dist/gb/nino.js +8 -17
  280. package/dist/gb/nino.js.map +1 -1
  281. package/dist/gb/sedol.d.ts +2 -3
  282. package/dist/gb/sedol.js +9 -18
  283. package/dist/gb/sedol.js.map +1 -1
  284. package/dist/gb/utr.d.ts +2 -3
  285. package/dist/gb/utr.js +2 -10
  286. package/dist/gb/utr.js.map +1 -1
  287. package/dist/gb/vat.d.ts +2 -3
  288. package/dist/gb/vat.js +2 -11
  289. package/dist/gb/vat.js.map +1 -1
  290. package/dist/ge/mod.d.ts +3 -2
  291. package/dist/ge/pin.d.ts +14 -2
  292. package/dist/ge/pin.js +1 -12
  293. package/dist/ge/pin.js.map +1 -1
  294. package/dist/gh/mod.d.ts +3 -2
  295. package/dist/gh/tin.d.ts +2 -3
  296. package/dist/gh/tin.js +10 -24
  297. package/dist/gh/tin.js.map +1 -1
  298. package/dist/gr/amka.d.ts +2 -3
  299. package/dist/gr/amka.js +3 -11
  300. package/dist/gr/amka.js.map +1 -1
  301. package/dist/gr/mod.d.ts +3 -2
  302. package/dist/gr/vat.d.ts +2 -3
  303. package/dist/gr/vat.js +1 -10
  304. package/dist/gr/vat.js.map +1 -1
  305. package/dist/gt/mod.d.ts +3 -2
  306. package/dist/gt/nit.d.ts +2 -3
  307. package/dist/gt/nit.js +6 -14
  308. package/dist/gt/nit.js.map +1 -1
  309. package/dist/hk/hkid.d.ts +2 -3
  310. package/dist/hk/hkid.js +2 -10
  311. package/dist/hk/hkid.js.map +1 -1
  312. package/dist/hk/mod.d.ts +3 -2
  313. package/dist/hr/mod.d.ts +3 -2
  314. package/dist/hr/vat.d.ts +2 -3
  315. package/dist/hr/vat.js +2 -9
  316. package/dist/hr/vat.js.map +1 -1
  317. package/dist/hu/mod.d.ts +3 -2
  318. package/dist/hu/vat.d.ts +2 -3
  319. package/dist/hu/vat.js +3 -10
  320. package/dist/hu/vat.js.map +1 -1
  321. package/dist/iban.d.ts +2 -3
  322. package/dist/iban.js +2 -8
  323. package/dist/iban.js.map +1 -1
  324. package/dist/id/mod.d.ts +3 -2
  325. package/dist/id/npwp.d.ts +2 -3
  326. package/dist/id/npwp.js +3 -13
  327. package/dist/id/npwp.js.map +1 -1
  328. package/dist/ie/mod.d.ts +3 -2
  329. package/dist/ie/pps.d.ts +2 -3
  330. package/dist/ie/pps.js +1 -10
  331. package/dist/ie/pps.js.map +1 -1
  332. package/dist/ie/vat.d.ts +2 -3
  333. package/dist/ie/vat.js +1 -9
  334. package/dist/ie/vat.js.map +1 -1
  335. package/dist/il/idnr.d.ts +2 -3
  336. package/dist/il/idnr.js +2 -9
  337. package/dist/il/idnr.js.map +1 -1
  338. package/dist/il/mod.d.ts +3 -2
  339. package/dist/in/aadhaar.d.ts +2 -3
  340. package/dist/in/aadhaar.js +2 -12
  341. package/dist/in/aadhaar.js.map +1 -1
  342. package/dist/in/gstin.d.ts +2 -3
  343. package/dist/in/gstin.js +4 -11
  344. package/dist/in/gstin.js.map +1 -1
  345. package/dist/in/mod.d.ts +3 -2
  346. package/dist/in/pan.d.ts +15 -2
  347. package/dist/in/pan.js +3 -15
  348. package/dist/in/pan.js.map +1 -1
  349. package/dist/index.d.ts +2 -2
  350. package/dist/index.js +6 -6
  351. package/dist/iq/mod.d.ts +3 -2
  352. package/dist/iq/nid.d.ts +16 -2
  353. package/dist/iq/nid.js +2 -15
  354. package/dist/iq/nid.js.map +1 -1
  355. package/dist/ir/mod.d.ts +3 -2
  356. package/dist/ir/nid.d.ts +2 -3
  357. package/dist/ir/nid.js +2 -24
  358. package/dist/ir/nid.js.map +1 -1
  359. package/dist/is/kennitala.d.ts +2 -3
  360. package/dist/is/kennitala.js +2 -13
  361. package/dist/is/kennitala.js.map +1 -1
  362. package/dist/is/mod.d.ts +3 -2
  363. package/dist/is/vsk.d.ts +9 -2
  364. package/dist/is/vsk.js +1 -7
  365. package/dist/is/vsk.js.map +1 -1
  366. package/dist/isin.d.ts +2 -3
  367. package/dist/isin.js +11 -21
  368. package/dist/isin.js.map +1 -1
  369. package/dist/it/codicefiscale.d.ts +5 -4
  370. package/dist/it/codicefiscale.js +27 -23
  371. package/dist/it/codicefiscale.js.map +1 -1
  372. package/dist/it/iva.d.ts +2 -3
  373. package/dist/it/iva.js +2 -9
  374. package/dist/it/iva.js.map +1 -1
  375. package/dist/it/mod.d.ts +3 -2
  376. package/dist/jp/cn.d.ts +2 -3
  377. package/dist/jp/cn.js +1 -9
  378. package/dist/jp/cn.js.map +1 -1
  379. package/dist/jp/mod.d.ts +3 -2
  380. package/dist/jp/mynumber.d.ts +2 -3
  381. package/dist/jp/mynumber.js +1 -10
  382. package/dist/jp/mynumber.js.map +1 -1
  383. package/dist/kr/brn.d.ts +11 -2
  384. package/dist/kr/brn.js +1 -9
  385. package/dist/kr/brn.js.map +1 -1
  386. package/dist/kr/mod.d.ts +3 -2
  387. package/dist/kr/rrn.d.ts +5 -4
  388. package/dist/kr/rrn.js +15 -13
  389. package/dist/kr/rrn.js.map +1 -1
  390. package/dist/kw/civil.d.ts +6 -5
  391. package/dist/kw/civil.js +20 -17
  392. package/dist/kw/civil.js.map +1 -1
  393. package/dist/kw/mod.d.ts +3 -2
  394. package/dist/kz/iin.d.ts +2 -3
  395. package/dist/kz/iin.js +4 -18
  396. package/dist/kz/iin.js.map +1 -1
  397. package/dist/kz/mod.d.ts +3 -2
  398. package/dist/lei.d.ts +2 -3
  399. package/dist/lei.js +2 -11
  400. package/dist/lei.js.map +1 -1
  401. package/dist/li/mod.d.ts +3 -2
  402. package/dist/li/peid.d.ts +11 -2
  403. package/dist/li/peid.js +1 -9
  404. package/dist/li/peid.js.map +1 -1
  405. package/dist/lk/mod.d.ts +3 -2
  406. package/dist/lk/nic.d.ts +5 -4
  407. package/dist/lk/nic.js +16 -16
  408. package/dist/lk/nic.js.map +1 -1
  409. package/dist/lt/asmens.d.ts +2 -3
  410. package/dist/lt/asmens.js +2 -1
  411. package/dist/lt/asmens.js.map +1 -1
  412. package/dist/lt/mod.d.ts +3 -2
  413. package/dist/lt/vat.d.ts +2 -3
  414. package/dist/lt/vat.js +2 -10
  415. package/dist/lt/vat.js.map +1 -1
  416. package/dist/lu/mod.d.ts +3 -2
  417. package/dist/lu/vat.d.ts +2 -3
  418. package/dist/lu/vat.js +2 -8
  419. package/dist/lu/vat.js.map +1 -1
  420. package/dist/luhn.d.ts +2 -3
  421. package/dist/luhn.js +9 -9
  422. package/dist/luhn.js.map +1 -1
  423. package/dist/lv/mod.d.ts +3 -2
  424. package/dist/lv/vat.d.ts +2 -3
  425. package/dist/lv/vat.js +19 -18
  426. package/dist/lv/vat.js.map +1 -1
  427. package/dist/ma/ice.d.ts +2 -3
  428. package/dist/ma/ice.js +2 -11
  429. package/dist/ma/ice.js.map +1 -1
  430. package/dist/ma/mod.d.ts +3 -2
  431. package/dist/mc/mod.d.ts +3 -2
  432. package/dist/mc/tva.d.ts +2 -3
  433. package/dist/mc/tva.js +1 -0
  434. package/dist/mc/tva.js.map +1 -1
  435. package/dist/md/idno.d.ts +2 -3
  436. package/dist/md/idno.js +1 -10
  437. package/dist/md/idno.js.map +1 -1
  438. package/dist/md/mod.d.ts +3 -2
  439. package/dist/me/mod.d.ts +3 -2
  440. package/dist/me/pib.d.ts +2 -3
  441. package/dist/me/pib.js +2 -10
  442. package/dist/me/pib.js.map +1 -1
  443. package/dist/mk/edb.d.ts +2 -3
  444. package/dist/mk/edb.js +2 -11
  445. package/dist/mk/edb.js.map +1 -1
  446. package/dist/mk/mod.d.ts +3 -2
  447. package/dist/mt/mod.d.ts +3 -2
  448. package/dist/mt/vat.d.ts +2 -3
  449. package/dist/mt/vat.js +3 -10
  450. package/dist/mt/vat.js.map +1 -1
  451. package/dist/mu/brn.d.ts +23 -2
  452. package/dist/mu/brn.js +1 -21
  453. package/dist/mu/brn.js.map +1 -1
  454. package/dist/mu/mod.d.ts +3 -2
  455. package/dist/mx/clabe.d.ts +2 -3
  456. package/dist/mx/clabe.js +1 -14
  457. package/dist/mx/clabe.js.map +1 -1
  458. package/dist/mx/curp.d.ts +5 -4
  459. package/dist/mx/curp.js +27 -19
  460. package/dist/mx/curp.js.map +1 -1
  461. package/dist/mx/mod.d.ts +3 -2
  462. package/dist/mx/rfc.d.ts +5 -4
  463. package/dist/mx/rfc.js +23 -20
  464. package/dist/mx/rfc.js.map +1 -1
  465. package/dist/my/mod.d.ts +3 -2
  466. package/dist/my/nric.d.ts +5 -4
  467. package/dist/my/nric.js +18 -16
  468. package/dist/my/nric.js.map +1 -1
  469. package/dist/ng/mod.d.ts +3 -2
  470. package/dist/ng/nin.d.ts +13 -2
  471. package/dist/ng/nin.js +1 -11
  472. package/dist/ng/nin.js.map +1 -1
  473. package/dist/ni/mod.d.ts +3 -2
  474. package/dist/ni/ruc.d.ts +2 -3
  475. package/dist/ni/ruc.js +1 -23
  476. package/dist/ni/ruc.js.map +1 -1
  477. package/dist/nl/bsn.d.ts +2 -3
  478. package/dist/nl/bsn.js +2 -10
  479. package/dist/nl/bsn.js.map +1 -1
  480. package/dist/nl/kvk.d.ts +9 -2
  481. package/dist/nl/kvk.js +1 -7
  482. package/dist/nl/kvk.js.map +1 -1
  483. package/dist/nl/mod.d.ts +3 -2
  484. package/dist/nl/vat.d.ts +2 -3
  485. package/dist/nl/vat.js +4 -50
  486. package/dist/nl/vat.js.map +1 -1
  487. package/dist/no/fodselsnummer.d.ts +2 -3
  488. package/dist/no/fodselsnummer.js +3 -10
  489. package/dist/no/fodselsnummer.js.map +1 -1
  490. package/dist/no/mod.d.ts +3 -2
  491. package/dist/no/mva.d.ts +2 -3
  492. package/dist/no/mva.js +1 -8
  493. package/dist/no/mva.js.map +1 -1
  494. package/dist/no/orgnr.d.ts +2 -3
  495. package/dist/no/orgnr.js +2 -8
  496. package/dist/no/orgnr.js.map +1 -1
  497. package/dist/nz/ird.d.ts +2 -3
  498. package/dist/nz/ird.js +4 -13
  499. package/dist/nz/ird.js.map +1 -1
  500. package/dist/nz/mod.d.ts +3 -2
  501. package/dist/pa/mod.d.ts +3 -2
  502. package/dist/pa/ruc.d.ts +2 -3
  503. package/dist/pa/ruc.js +4 -19
  504. package/dist/pa/ruc.js.map +1 -1
  505. package/dist/patterns.d.ts +8 -10
  506. package/dist/patterns.js +83 -28
  507. package/dist/patterns.js.map +1 -1
  508. package/dist/pe/mod.d.ts +3 -2
  509. package/dist/pe/ruc.d.ts +2 -3
  510. package/dist/pe/ruc.js +10 -24
  511. package/dist/pe/ruc.js.map +1 -1
  512. package/dist/ph/mod.d.ts +3 -2
  513. package/dist/ph/philid.d.ts +14 -2
  514. package/dist/ph/philid.js +1 -12
  515. package/dist/ph/philid.js.map +1 -1
  516. package/dist/pk/cnic.d.ts +14 -2
  517. package/dist/pk/cnic.js +1 -12
  518. package/dist/pk/cnic.js.map +1 -1
  519. package/dist/pk/mod.d.ts +3 -2
  520. package/dist/pl/mod.d.ts +3 -2
  521. package/dist/pl/nip.d.ts +2 -3
  522. package/dist/pl/nip.js +2 -10
  523. package/dist/pl/nip.js.map +1 -1
  524. package/dist/pl/pesel.d.ts +2 -3
  525. package/dist/pl/pesel.js +4 -13
  526. package/dist/pl/pesel.js.map +1 -1
  527. package/dist/pl/regon.d.ts +2 -3
  528. package/dist/pl/regon.js +2 -11
  529. package/dist/pl/regon.js.map +1 -1
  530. package/dist/pt/cc.d.ts +2 -3
  531. package/dist/pt/cc.js +7 -13
  532. package/dist/pt/cc.js.map +1 -1
  533. package/dist/pt/mod.d.ts +3 -2
  534. package/dist/pt/vat.d.ts +2 -3
  535. package/dist/pt/vat.js +3 -11
  536. package/dist/pt/vat.js.map +1 -1
  537. package/dist/ro/cnp.d.ts +2 -3
  538. package/dist/ro/cnp.js +5 -14
  539. package/dist/ro/cnp.js.map +1 -1
  540. package/dist/ro/mod.d.ts +3 -2
  541. package/dist/ro/vat.d.ts +2 -3
  542. package/dist/ro/vat.js +13 -11
  543. package/dist/ro/vat.js.map +1 -1
  544. package/dist/rs/mod.d.ts +3 -2
  545. package/dist/rs/pib.d.ts +2 -3
  546. package/dist/rs/pib.js +1 -9
  547. package/dist/rs/pib.js.map +1 -1
  548. package/dist/ru/inn.d.ts +2 -3
  549. package/dist/ru/inn.js +2 -12
  550. package/dist/ru/inn.js.map +1 -1
  551. package/dist/ru/mod.d.ts +3 -2
  552. package/dist/se/mod.d.ts +3 -2
  553. package/dist/se/orgnr.d.ts +2 -3
  554. package/dist/se/orgnr.js +2 -9
  555. package/dist/se/orgnr.js.map +1 -1
  556. package/dist/se/personnummer.d.ts +2 -3
  557. package/dist/se/personnummer.js +8 -15
  558. package/dist/se/personnummer.js.map +1 -1
  559. package/dist/se/vat.d.ts +2 -3
  560. package/dist/se/vat.js +3 -10
  561. package/dist/se/vat.js.map +1 -1
  562. package/dist/sg/mod.d.ts +3 -2
  563. package/dist/sg/uen.d.ts +2 -3
  564. package/dist/sg/uen.js +47 -70
  565. package/dist/sg/uen.js.map +1 -1
  566. package/dist/si/emso.d.ts +2 -3
  567. package/dist/si/emso.js +12 -14
  568. package/dist/si/emso.js.map +1 -1
  569. package/dist/si/mod.d.ts +3 -2
  570. package/dist/si/vat.d.ts +2 -3
  571. package/dist/si/vat.js +3 -12
  572. package/dist/si/vat.js.map +1 -1
  573. package/dist/sk/dic.d.ts +2 -3
  574. package/dist/sk/dic.js +1 -0
  575. package/dist/sk/dic.js.map +1 -1
  576. package/dist/sk/ico.d.ts +2 -3
  577. package/dist/sk/ico.js +1 -0
  578. package/dist/sk/ico.js.map +1 -1
  579. package/dist/sk/mod.d.ts +3 -2
  580. package/dist/sk/rc.d.ts +4 -5
  581. package/dist/sk/rc.js +6 -2
  582. package/dist/sk/rc.js.map +1 -1
  583. package/dist/th/mod.d.ts +3 -2
  584. package/dist/th/tin.d.ts +2 -3
  585. package/dist/th/tin.js +1 -11
  586. package/dist/th/tin.js.map +1 -1
  587. package/dist/tr/mod.d.ts +3 -2
  588. package/dist/tr/tckimlik.d.ts +2 -3
  589. package/dist/tr/tckimlik.js +1 -20
  590. package/dist/tr/tckimlik.js.map +1 -1
  591. package/dist/tr/vkn.d.ts +2 -3
  592. package/dist/tr/vkn.js +1 -20
  593. package/dist/tr/vkn.js.map +1 -1
  594. package/dist/tw/mod.d.ts +3 -2
  595. package/dist/tw/ubn.d.ts +2 -3
  596. package/dist/tw/ubn.js +2 -12
  597. package/dist/tw/ubn.js.map +1 -1
  598. package/dist/types.d.ts +56 -21
  599. package/dist/ua/edrpou.d.ts +2 -3
  600. package/dist/ua/edrpou.js +5 -12
  601. package/dist/ua/edrpou.js.map +1 -1
  602. package/dist/ua/mod.d.ts +3 -2
  603. package/dist/us/ein.d.ts +12 -2
  604. package/dist/us/ein.js +88 -97
  605. package/dist/us/ein.js.map +1 -1
  606. package/dist/us/itin.d.ts +13 -2
  607. package/dist/us/itin.js +4 -15
  608. package/dist/us/itin.js.map +1 -1
  609. package/dist/us/mod.d.ts +3 -2
  610. package/dist/us/rtn.d.ts +2 -3
  611. package/dist/us/rtn.js +11 -23
  612. package/dist/us/rtn.js.map +1 -1
  613. package/dist/us/ssn.d.ts +13 -2
  614. package/dist/us/ssn.js +1 -11
  615. package/dist/us/ssn.js.map +1 -1
  616. package/dist/uy/mod.d.ts +3 -2
  617. package/dist/uy/rut.d.ts +2 -3
  618. package/dist/uy/rut.js +2 -15
  619. package/dist/uy/rut.js.map +1 -1
  620. package/dist/ve/mod.d.ts +3 -2
  621. package/dist/ve/rif.d.ts +2 -3
  622. package/dist/ve/rif.js +13 -26
  623. package/dist/ve/rif.js.map +1 -1
  624. package/dist/vn/mod.d.ts +3 -2
  625. package/dist/vn/mst.d.ts +2 -3
  626. package/dist/vn/mst.js +1 -12
  627. package/dist/vn/mst.js.map +1 -1
  628. package/dist/za/idnr.d.ts +2 -3
  629. package/dist/za/idnr.js +4 -16
  630. package/dist/za/idnr.js.map +1 -1
  631. package/dist/za/mod.d.ts +3 -2
  632. package/package.json +34 -21
  633. package/src/_checksums/mod1110.ts +1 -1
  634. package/src/_checksums/mod112.ts +7 -6
  635. package/src/_util/generate.ts +38 -0
  636. package/src/ad/nrt.ts +19 -7
  637. package/src/ae/eid.ts +7 -3
  638. package/src/ai/tin.ts +7 -3
  639. package/src/al/nipt.ts +7 -3
  640. package/src/am/tin.ts +7 -3
  641. package/src/ar/cbu.ts +9 -5
  642. package/src/ar/cuit.ts +22 -10
  643. package/src/ar/dni.ts +7 -3
  644. package/src/at/businessid.ts +7 -3
  645. package/src/at/tin.ts +7 -3
  646. package/src/at/uid.ts +7 -3
  647. package/src/at/vnr.ts +62 -12
  648. package/src/au/abn.ts +7 -3
  649. package/src/au/acn.ts +7 -3
  650. package/src/au/tfn.ts +7 -3
  651. package/src/az/voen.ts +9 -3
  652. package/src/ba/jmbg.ts +9 -7
  653. package/src/bd/nid.ts +11 -7
  654. package/src/be/bis.ts +8 -4
  655. package/src/be/nn.ts +7 -3
  656. package/src/be/vat.ts +7 -3
  657. package/src/bg/egn.ts +19 -10
  658. package/src/bg/pnf.ts +7 -3
  659. package/src/bg/vat.ts +8 -3
  660. package/src/bh/cpr.ts +17 -4
  661. package/src/bic.ts +26 -20
  662. package/src/br/cnpj.ts +7 -3
  663. package/src/br/cpf.ts +7 -3
  664. package/src/by/unp.ts +19 -9
  665. package/src/bz/tin.ts +19 -4
  666. package/src/ca/bn.ts +7 -3
  667. package/src/ca/sin.ts +7 -3
  668. package/src/ch/ssn.ts +7 -3
  669. package/src/ch/uid.ts +7 -3
  670. package/src/ch/vat.ts +9 -5
  671. package/src/cl/rut.ts +11 -5
  672. package/src/cn/ric.ts +11 -7
  673. package/src/cn/uscc.ts +27 -11
  674. package/src/co/nit.ts +14 -6
  675. package/src/cr/cpf.ts +11 -6
  676. package/src/creditcard.ts +10 -6
  677. package/src/cu/ni.ts +28 -7
  678. package/src/cy/vat.ts +7 -3
  679. package/src/cz/dic.ts +9 -4
  680. package/src/cz/ico.ts +7 -3
  681. package/src/cz/rc.ts +61 -29
  682. package/src/de/handelsreg.ts +21 -6
  683. package/src/de/idnr.ts +10 -3
  684. package/src/de/stnr.ts +11 -3
  685. package/src/de/svnr.ts +14 -5
  686. package/src/de/vat.ts +7 -3
  687. package/src/dk/cpr.ts +23 -8
  688. package/src/dk/cvr.ts +7 -3
  689. package/src/dk/vat.ts +8 -3
  690. package/src/do/rnc.ts +9 -5
  691. package/src/ec/ruc.ts +9 -5
  692. package/src/ee/ik.ts +21 -10
  693. package/src/ee/registrikood.ts +12 -7
  694. package/src/ee/vat.ts +7 -3
  695. package/src/eg/tn.ts +7 -3
  696. package/src/es/cif.ts +10 -7
  697. package/src/es/dni.ts +7 -3
  698. package/src/es/nie.ts +18 -9
  699. package/src/es/nss.ts +7 -3
  700. package/src/es/vat.ts +13 -5
  701. package/src/eu/vat.ts +55 -6
  702. package/src/fi/hetu.ts +26 -8
  703. package/src/fi/vat.ts +8 -3
  704. package/src/fi/ytunnus.ts +7 -3
  705. package/src/fr/nif.ts +7 -3
  706. package/src/fr/nir.ts +9 -7
  707. package/src/fr/siren.ts +7 -3
  708. package/src/fr/siret.ts +7 -3
  709. package/src/fr/tva.ts +7 -3
  710. package/src/gb/nino.ts +18 -13
  711. package/src/gb/sedol.ts +21 -15
  712. package/src/gb/utr.ts +7 -3
  713. package/src/gb/vat.ts +7 -3
  714. package/src/ge/pin.ts +7 -3
  715. package/src/gh/tin.ts +11 -6
  716. package/src/gr/amka.ts +7 -3
  717. package/src/gr/vat.ts +7 -3
  718. package/src/gt/nit.ts +13 -6
  719. package/src/hk/hkid.ts +9 -4
  720. package/src/hr/vat.ts +7 -3
  721. package/src/hu/vat.ts +8 -3
  722. package/src/iban.ts +7 -3
  723. package/src/id/npwp.ts +7 -3
  724. package/src/ie/pps.ts +7 -3
  725. package/src/ie/vat.ts +7 -3
  726. package/src/il/idnr.ts +7 -3
  727. package/src/in/aadhaar.ts +7 -3
  728. package/src/in/gstin.ts +10 -4
  729. package/src/in/pan.ts +15 -6
  730. package/src/index.ts +6 -0
  731. package/src/iq/nid.ts +7 -3
  732. package/src/ir/nid.ts +7 -3
  733. package/src/is/kennitala.ts +7 -3
  734. package/src/is/vsk.ts +7 -3
  735. package/src/isin.ts +17 -7
  736. package/src/it/codicefiscale.ts +49 -7
  737. package/src/it/iva.ts +7 -3
  738. package/src/jp/cn.ts +7 -3
  739. package/src/jp/mynumber.ts +7 -3
  740. package/src/kr/brn.ts +7 -3
  741. package/src/kr/rrn.ts +27 -8
  742. package/src/kw/civil.ts +31 -14
  743. package/src/kz/iin.ts +9 -8
  744. package/src/lei.ts +7 -3
  745. package/src/li/peid.ts +7 -3
  746. package/src/lk/nic.ts +31 -8
  747. package/src/lt/asmens.ts +8 -4
  748. package/src/lt/vat.ts +8 -3
  749. package/src/lu/vat.ts +8 -3
  750. package/src/luhn.ts +10 -3
  751. package/src/lv/vat.ts +53 -23
  752. package/src/ma/ice.ts +7 -3
  753. package/src/mc/tva.ts +9 -5
  754. package/src/md/idno.ts +7 -3
  755. package/src/me/pib.ts +7 -3
  756. package/src/mk/edb.ts +7 -3
  757. package/src/mt/vat.ts +8 -3
  758. package/src/mu/brn.ts +7 -3
  759. package/src/mx/clabe.ts +7 -3
  760. package/src/mx/curp.ts +47 -10
  761. package/src/mx/rfc.ts +42 -7
  762. package/src/my/nric.ts +33 -8
  763. package/src/ng/nin.ts +7 -3
  764. package/src/ni/ruc.ts +7 -3
  765. package/src/nl/bsn.ts +7 -3
  766. package/src/nl/kvk.ts +7 -3
  767. package/src/nl/vat.ts +18 -69
  768. package/src/no/fodselsnummer.ts +12 -7
  769. package/src/no/mva.ts +9 -5
  770. package/src/no/orgnr.ts +7 -3
  771. package/src/nz/ird.ts +12 -8
  772. package/src/pa/ruc.ts +39 -11
  773. package/src/patterns.ts +184 -46
  774. package/src/pe/ruc.ts +13 -10
  775. package/src/ph/philid.ts +7 -3
  776. package/src/pk/cnic.ts +9 -3
  777. package/src/pl/nip.ts +7 -3
  778. package/src/pl/pesel.ts +9 -7
  779. package/src/pl/regon.ts +7 -3
  780. package/src/pt/cc.ts +13 -7
  781. package/src/pt/vat.ts +8 -3
  782. package/src/ro/cnp.ts +16 -8
  783. package/src/ro/vat.ts +8 -3
  784. package/src/rs/pib.ts +7 -3
  785. package/src/ru/inn.ts +9 -5
  786. package/src/se/orgnr.ts +7 -3
  787. package/src/se/personnummer.ts +35 -32
  788. package/src/se/vat.ts +8 -3
  789. package/src/sg/uen.ts +44 -23
  790. package/src/si/emso.ts +37 -11
  791. package/src/si/vat.ts +8 -3
  792. package/src/sk/dic.ts +8 -4
  793. package/src/sk/ico.ts +3 -2
  794. package/src/sk/rc.ts +17 -4
  795. package/src/th/tin.ts +7 -3
  796. package/src/tr/tckimlik.ts +7 -3
  797. package/src/tr/vkn.ts +7 -3
  798. package/src/tw/ubn.ts +9 -5
  799. package/src/types.ts +69 -7
  800. package/src/ua/edrpou.ts +10 -5
  801. package/src/us/ein.ts +95 -91
  802. package/src/us/itin.ts +14 -11
  803. package/src/us/rtn.ts +32 -19
  804. package/src/us/ssn.ts +7 -3
  805. package/src/uy/rut.ts +9 -5
  806. package/src/ve/rif.ts +19 -12
  807. package/src/vn/mst.ts +7 -3
  808. package/src/za/idnr.ts +9 -7
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
- import { randomInt } from "./_util/generate.js";
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
  /**
@@ -44,17 +33,17 @@ const format = (value) => {
44
33
  const v = compact(value);
45
34
  return `${v.slice(0, 2)} ${v.slice(2, 6)} ${v.slice(6, 10)} ${v.slice(10)}`;
46
35
  };
36
+ const ISIN_COUNTRIES = [
37
+ "US",
38
+ "GB",
39
+ "DE",
40
+ "FR",
41
+ "JP"
42
+ ];
47
43
  /** Generate a random valid ISIN. */
48
44
  const generate = () => {
49
- const countries = [
50
- "US",
51
- "GB",
52
- "DE",
53
- "FR",
54
- "JP"
55
- ];
56
45
  for (;;) {
57
- const cc = countries[randomInt(0, countries.length - 1)];
46
+ const cc = randomPick(ISIN_COUNTRIES);
58
47
  let nsin = "";
59
48
  for (let i = 0; i < 9; i++) nsin += String(randomInt(0, 9));
60
49
  const base = cc + nsin;
@@ -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 } 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\n/** Generate a random valid ISIN. */\nconst generate = (): string => {\n const countries = [\"US\", \"GB\", \"DE\", \"FR\", \"JP\"];\n for (;;) {\n const cc =\n countries[randomInt(0, countries.length - 1)]!;\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;;;AAI3E,MAAM,iBAAyB;CAC7B,MAAM,YAAY;EAAC;EAAM;EAAM;EAAM;EAAM;EAAK;AAChD,UAAS;EACP,MAAM,KACJ,UAAU,UAAU,GAAG,UAAU,SAAS,EAAE;EAC9C,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,7 +1,6 @@
1
- import { ParsedPersonId, ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ParsedPersonId, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/it/codicefiscale.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
@@ -11,8 +10,10 @@ declare const format: (value: string) => string;
11
10
  * 11-digit Partita IVA (no personal data embedded).
12
11
  */
13
12
  declare const parse: (value: string) => ParsedPersonId | null;
13
+ /** Generate a random valid 16-character Codice Fiscale. */
14
+ declare const generate: () => string;
14
15
  /** Italian Tax Code. */
15
- declare const codiceFiscale: Validator;
16
+ declare const codiceFiscale: CountryValidator<"IT", ParsedPersonId>;
16
17
  //#endregion
17
- export { compact, codiceFiscale as default, format, parse, validate };
18
+ export { compact, codiceFiscale as default, format, generate, parse, validate };
18
19
  //# sourceMappingURL=codicefiscale.d.ts.map
@@ -1,29 +1,9 @@
1
1
  import { clean } from "../_util/clean.js";
2
+ import { randomInt } from "../_util/generate.js";
2
3
  import { err } from "../_util/result.js";
3
4
  import { isdigits } from "../_util/strings.js";
4
5
  import { validate as validate$1 } from "./iva.js";
5
6
  //#region src/it/codicefiscale.ts
6
- /**
7
- * Codice Fiscale (Italian tax code).
8
- *
9
- * 16-character alphanumeric code encoding name,
10
- * birth date, gender, and birthplace. The last
11
- * character is a check letter computed using
12
- * odd/even position value tables.
13
- *
14
- * Supports omocodia: when two people share the
15
- * same code, the tax office replaces digit
16
- * positions with letters from the set LMNPQRSTUV
17
- * (L=0, M=1, N=2, P=3, Q=4, R=5, S=6, T=7,
18
- * U=8, V=9). Only these 10 letters are valid
19
- * substitutes at digit positions.
20
- *
21
- * Also accepts 11-digit numbers (delegates to
22
- * Partita IVA validation).
23
- *
24
- * @see https://www.agenziaentrate.gov.it/
25
- * @see https://it.wikipedia.org/wiki/Codice_fiscale#Omocodia
26
- */
27
7
  const ODD = {
28
8
  "0": 1,
29
9
  "1": 0,
@@ -185,6 +165,27 @@ const parse = (value) => {
185
165
  gender
186
166
  };
187
167
  };
168
+ const LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
169
+ const MONTH_CODES = Object.keys(MONTH_LETTERS);
170
+ const randomLetter = () => LETTERS.charAt(randomInt(0, 25));
171
+ /** Generate a random valid 16-character Codice Fiscale. */
172
+ const generate = () => {
173
+ let body = "";
174
+ for (let i = 0; i < 6; i++) body += randomLetter();
175
+ body += String(randomInt(0, 99)).padStart(2, "0");
176
+ body += MONTH_CODES[randomInt(0, MONTH_CODES.length - 1)] ?? "A";
177
+ const day = randomInt(1, 28) + (randomInt(0, 1) === 0 ? 0 : 40);
178
+ body += String(day).padStart(2, "0");
179
+ body += randomLetter();
180
+ body += String(randomInt(0, 999)).padStart(3, "0");
181
+ let sum = 0;
182
+ for (let i = 0; i < body.length; i++) {
183
+ const ch = body[i];
184
+ if (ch === void 0) continue;
185
+ sum += i % 2 === 0 ? ODD[ch] ?? 0 : EVEN[ch] ?? 0;
186
+ }
187
+ return `${body}${CHECK_LETTERS.charAt(sum % 26)}`;
188
+ };
188
189
  /** Italian Tax Code. */
189
190
  const codiceFiscale = {
190
191
  name: "Italian Tax Code",
@@ -198,6 +199,7 @@ const codiceFiscale = {
198
199
  "fiscal code"
199
200
  ],
200
201
  candidatePattern: "[A-Z]{6}\\d{2}[A-Z]\\d{2}[A-Z]\\d{3}[A-Z]",
202
+ scope: "country",
201
203
  country: "IT",
202
204
  entityType: "person",
203
205
  description: "Personal/company tax code (16-char personal, 11-digit company)",
@@ -206,9 +208,11 @@ const codiceFiscale = {
206
208
  examples: ["RCCMNL83S18D969H"],
207
209
  compact,
208
210
  format,
209
- validate
211
+ parse,
212
+ validate,
213
+ generate
210
214
  };
211
215
  //#endregion
212
- export { compact, codiceFiscale as default, format, parse, validate };
216
+ export { compact, codiceFiscale as default, format, generate, parse, validate };
213
217
 
214
218
  //# sourceMappingURL=codicefiscale.js.map
@@ -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 { 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\n/** Italian Tax Code. */\nconst codiceFiscale: Validator = {\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 validate,\n};\n\nexport default codiceFiscale;\nexport { compact, format, 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":"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"}
package/dist/it/iva.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/it/iva.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid Italian Partita IVA. */
9
8
  declare const generate: () => string;
10
9
  /** Italian VAT Number. */
11
- declare const iva: Validator;
10
+ declare const iva: CountryValidator<"IT">;
12
11
  //#endregion
13
12
  export { compact, iva as default, format, generate, validate };
14
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/it/mod.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import codiceFiscale from "./codicefiscale.js";
3
2
  import iva from "./iva.js";
4
3
 
5
4
  //#region src/it/mod.d.ts
6
-
5
+ declare namespace mod_d_exports {
6
+ export { codiceFiscale, iva };
7
+ }
7
8
  //#endregion
8
9
  export { codiceFiscale, iva, mod_d_exports };
9
10
  //# sourceMappingURL=mod.d.ts.map
package/dist/jp/cn.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/jp/cn.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid Corporate Number. */
9
8
  declare const generate: () => string;
10
9
  /** Japanese Corporate Number. */
11
- declare const cn: Validator;
10
+ declare const cn: CountryValidator<"JP">;
12
11
  //#endregion
13
12
  export { compact, cn as default, format, generate, validate };
14
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"}
package/dist/jp/mod.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import cn from "./cn.js";
3
2
  import mynumber from "./mynumber.js";
4
3
 
5
4
  //#region src/jp/mod.d.ts
6
-
5
+ declare namespace mod_d_exports {
6
+ export { cn, mynumber };
7
+ }
7
8
  //#endregion
8
9
  export { cn, mod_d_exports, mynumber };
9
10
  //# sourceMappingURL=mod.d.ts.map
@@ -1,14 +1,13 @@
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
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
8
7
  /** Generate a random valid My Number. */
9
8
  declare const generate: () => string;
10
9
  /** Japanese Individual Number (My Number). */
11
- declare const mynumber: Validator;
10
+ declare const mynumber: CountryValidator<"JP">;
12
11
  //#endregion
13
12
  export { compact, mynumber as default, format, generate, validate };
14
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/mod.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import brn from "./brn.js";
3
2
  import rrn from "./rrn.js";
4
3
 
5
4
  //#region src/kr/mod.d.ts
6
-
5
+ declare namespace mod_d_exports {
6
+ export { brn, rrn };
7
+ }
7
8
  //#endregion
8
9
  export { brn, mod_d_exports, rrn };
9
10
  //# sourceMappingURL=mod.d.ts.map
package/dist/kr/rrn.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { ParsedPersonId, ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ParsedPersonId, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/kr/rrn.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  declare const format: (value: string) => string;
@@ -15,8 +14,10 @@ declare const format: (value: string) => string;
15
14
  * 0, 9 = pre-1800 (male/female by convention)
16
15
  */
17
16
  declare const parse: (value: string) => ParsedPersonId | null;
17
+ /** Generate a random valid Korean RRN. */
18
+ declare const generate: () => string;
18
19
  /** Korean Resident Registration Number. */
19
- declare const rrn: Validator;
20
+ declare const rrn: CountryValidator<"KR", ParsedPersonId>;
20
21
  //#endregion
21
- export { compact, rrn as default, format, parse, validate };
22
+ export { compact, rrn as default, format, generate, parse, validate };
22
23
  //# sourceMappingURL=rrn.d.ts.map