@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/eg/tn.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/eg/tn.ts
6
- /**
7
- * TN (Tax Registration Number, الرقم الضريبي).
8
- *
9
- * Egyptian tax number. 9 digits, no checksum.
10
- * Displayed as XXX-XXX-XXX. Accepts both
11
- * Arabic-Indic and Extended Arabic-Indic digits.
12
- *
13
- * @see https://www.eta.gov.eg/
14
- */
15
6
  /** Generate a random valid Egyptian TN. */
16
7
  const generate = () => randomDigits(9);
17
8
  /**
@@ -64,6 +55,7 @@ const tn = {
64
55
  abbreviation: "TN",
65
56
  aliases: ["الرقم الضريبي", "tax number"],
66
57
  candidatePattern: "\\d{9}",
58
+ scope: "country",
67
59
  country: "EG",
68
60
  entityType: "any",
69
61
  compact,
package/dist/eg/tn.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tn.js","names":[],"sources":["../../src/eg/tn.ts"],"sourcesContent":["/** Generate a random valid Egyptian TN. */\nconst generate = (): string => randomDigits(9);\n\n/**\n * TN (Tax Registration Number, الرقم الضريبي).\n *\n * Egyptian tax number. 9 digits, no checksum.\n * Displayed as XXX-XXX-XXX. Accepts both\n * Arabic-Indic and Extended Arabic-Indic digits.\n *\n * @see https://www.eta.gov.eg/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\n/**\n * Arabic-Indic and Extended Arabic-Indic digit map.\n * Converts Arabic numeral characters to ASCII digits.\n */\nconst ARABIC_DIGITS: Record<string, string> = {\n \"\\u0660\": \"0\", // ٠\n \"\\u0661\": \"1\", // ١\n \"\\u0662\": \"2\", // ٢\n \"\\u0663\": \"3\", // ٣\n \"\\u0664\": \"4\", // ٤\n \"\\u0665\": \"5\", // ٥\n \"\\u0666\": \"6\", // ٦\n \"\\u0667\": \"7\", // ٧\n \"\\u0668\": \"8\", // ٨\n \"\\u0669\": \"9\", // ٩\n \"\\u06F0\": \"0\", // ۰\n \"\\u06F1\": \"1\", // ۱\n \"\\u06F2\": \"2\", // ۲\n \"\\u06F3\": \"3\", // ۳\n \"\\u06F4\": \"4\", // ۴\n \"\\u06F5\": \"5\", // ۵\n \"\\u06F6\": \"6\", // ۶\n \"\\u06F7\": \"7\", // ۷\n \"\\u06F8\": \"8\", // ۸\n \"\\u06F9\": \"9\", // ۹\n};\n\nconst ARABIC_REGEX = new RegExp(\n `[${Object.keys(ARABIC_DIGITS).join(\"\")}]`,\n \"g\",\n);\n\nconst compact = (value: string): string => {\n const cleaned = clean(value, \" -/\");\n return cleaned.replace(\n ARABIC_REGEX,\n (ch) => ARABIC_DIGITS[ch] ?? ch,\n );\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Egyptian TN must be exactly 9 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Egyptian TN must contain only digits\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 3)}-${v.slice(3, 6)}-${v.slice(6)}`;\n};\n\n/** Egyptian Tax Registration Number. */\nconst tn: Validator = {\n name: \"Egyptian Tax Registration Number\",\n localName: \"الرقم الضريبي\",\n abbreviation: \"TN\",\n aliases: [\"الرقم الضريبي\", \"tax number\"] as const,\n candidatePattern: \"\\\\d{9}\",\n country: \"EG\",\n entityType: \"any\",\n compact,\n format,\n validate,\n description: \"Egyptian tax identification number\",\n sourceUrl: \"https://www.eta.gov.eg/\",\n lengths: [9] as const,\n examples: [\"100531385\", \"331105268\"] as const,\n generate,\n};\n\nexport default tn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AACA,MAAM,iBAAyB,aAAa,EAAE;;;;;AAuB9C,MAAM,gBAAwC;CAC5C,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACX;AAED,MAAM,eAAe,IAAI,OACvB,IAAI,OAAO,KAAK,cAAc,CAAC,KAAK,GAAG,CAAC,IACxC,IACD;AAED,MAAM,WAAW,UAA0B;AAEzC,QADgB,MAAM,OAAO,MAAM,CACpB,QACb,eACC,OAAO,cAAc,OAAO,GAC9B;;AAGH,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,uCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,uCACD;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,KAAgB;CACpB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,iBAAiB,aAAa;CACxC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,aAAa;CACb,WAAW;CACX,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,aAAa,YAAY;CACpC;CACD"}
1
+ {"version":3,"file":"tn.js","names":[],"sources":["../../src/eg/tn.ts"],"sourcesContent":["/** Generate a random valid Egyptian TN. */\nconst generate = (): string => randomDigits(9);\n\n/**\n * TN (Tax Registration Number, الرقم الضريبي).\n *\n * Egyptian tax number. 9 digits, no checksum.\n * Displayed as XXX-XXX-XXX. Accepts both\n * Arabic-Indic and Extended Arabic-Indic digits.\n *\n * @see https://www.eta.gov.eg/\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\n/**\n * Arabic-Indic and Extended Arabic-Indic digit map.\n * Converts Arabic numeral characters to ASCII digits.\n */\nconst ARABIC_DIGITS: Record<string, string> = {\n \"\\u0660\": \"0\", // ٠\n \"\\u0661\": \"1\", // ١\n \"\\u0662\": \"2\", // ٢\n \"\\u0663\": \"3\", // ٣\n \"\\u0664\": \"4\", // ٤\n \"\\u0665\": \"5\", // ٥\n \"\\u0666\": \"6\", // ٦\n \"\\u0667\": \"7\", // ٧\n \"\\u0668\": \"8\", // ٨\n \"\\u0669\": \"9\", // ٩\n \"\\u06F0\": \"0\", // ۰\n \"\\u06F1\": \"1\", // ۱\n \"\\u06F2\": \"2\", // ۲\n \"\\u06F3\": \"3\", // ۳\n \"\\u06F4\": \"4\", // ۴\n \"\\u06F5\": \"5\", // ۵\n \"\\u06F6\": \"6\", // ۶\n \"\\u06F7\": \"7\", // ۷\n \"\\u06F8\": \"8\", // ۸\n \"\\u06F9\": \"9\", // ۹\n};\n\nconst ARABIC_REGEX = new RegExp(\n `[${Object.keys(ARABIC_DIGITS).join(\"\")}]`,\n \"g\",\n);\n\nconst compact = (value: string): string => {\n const cleaned = clean(value, \" -/\");\n return cleaned.replace(\n ARABIC_REGEX,\n (ch) => ARABIC_DIGITS[ch] ?? ch,\n );\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Egyptian TN must be exactly 9 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Egyptian TN must contain only digits\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 3)}-${v.slice(3, 6)}-${v.slice(6)}`;\n};\n\n/** Egyptian Tax Registration Number. */\nconst tn: CountryValidator<\"EG\"> = {\n name: \"Egyptian Tax Registration Number\",\n localName: \"الرقم الضريبي\",\n abbreviation: \"TN\",\n aliases: [\"الرقم الضريبي\", \"tax number\"] as const,\n candidatePattern: \"\\\\d{9}\",\n scope: \"country\",\n country: \"EG\",\n entityType: \"any\",\n compact,\n format,\n validate,\n description: \"Egyptian tax identification number\",\n sourceUrl: \"https://www.eta.gov.eg/\",\n lengths: [9] as const,\n examples: [\"100531385\", \"331105268\"] as const,\n generate,\n};\n\nexport default tn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AACA,MAAM,iBAAyB,aAAa,CAAC;;;;;AA0B7C,MAAM,gBAAwC;CAC5C,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;AACZ;AAEA,MAAM,eAAe,IAAI,OACvB,IAAI,OAAO,KAAK,aAAa,EAAE,KAAK,EAAE,EAAE,IACxC,GACF;AAEA,MAAM,WAAW,UAA0B;CAEzC,OADgB,MAAM,OAAO,KAChB,EAAE,QACb,eACC,OAAO,cAAc,OAAO,EAC/B;AACF;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,sCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,sCACF;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,KAA6B;CACjC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,iBAAiB,YAAY;CACvC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,aAAa;CACb,WAAW;CACX,SAAS,CAAC,CAAC;CACX,UAAU,CAAC,aAAa,WAAW;CACnC;AACF"}
package/dist/es/cif.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/es/cif.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 Spanish CIF. */
9
8
  declare const generate: () => string;
10
9
  /** Spanish Company Tax ID (CIF). */
11
- declare const cif: Validator;
10
+ declare const cif: CountryValidator<"ES">;
12
11
  //#endregion
13
12
  export { compact, cif as default, format, generate, validate };
14
13
  //# sourceMappingURL=cif.d.ts.map
package/dist/es/cif.js CHANGED
@@ -1,19 +1,9 @@
1
1
  import { clean } from "../_util/clean.js";
2
- import { randomDigits, randomInt } from "../_util/generate.js";
2
+ import { randomChar, randomDigits } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  import { cifChecksum } from "./vat.js";
6
6
  //#region src/es/cif.ts
7
- /**
8
- * CIF (Código de Identificación Fiscal).
9
- *
10
- * Spanish company tax identification number.
11
- * Letter prefix (ABCDEFGHJNPQRSUVW) + 7 digits +
12
- * check digit or letter. Delegates to the CIF
13
- * branch of es/vat validation.
14
- *
15
- * @see https://www.agenciatributaria.es/
16
- */
17
7
  const CIF_PREFIXES = "ABCDEFGHJNPQRSUVW";
18
8
  const CIF_LETTERS = "JABCDEFGHI";
19
9
  const compact = (value) => {
@@ -38,7 +28,7 @@ const validate = (value) => {
38
28
  const format = (value) => compact(value);
39
29
  /** Generate a random valid Spanish CIF. */
40
30
  const generate = () => {
41
- const letter = CIF_PREFIXES[randomInt(0, 16)];
31
+ const letter = randomChar(CIF_PREFIXES);
42
32
  const payload = randomDigits(7);
43
33
  const check = cifChecksum(payload);
44
34
  if ("KPQS".includes(letter)) return letter + payload + CIF_LETTERS.charAt(check);
@@ -51,6 +41,7 @@ const cif = {
51
41
  abbreviation: "CIF",
52
42
  aliases: ["CIF", "código de identificación fiscal"],
53
43
  candidatePattern: "[A-HJNP-SUVW]\\d{7}[\\dA-J]",
44
+ scope: "country",
54
45
  country: "ES",
55
46
  entityType: "company",
56
47
  sourceUrl: "https://www.agenciatributaria.es/",
@@ -1 +1 @@
1
- {"version":3,"file":"cif.js","names":[],"sources":["../../src/es/cif.ts"],"sourcesContent":["/**\n * CIF (Código de Identificación Fiscal).\n *\n * Spanish company tax identification number.\n * Letter prefix (ABCDEFGHJNPQRSUVW) + 7 digits +\n * check digit or letter. Delegates to the CIF\n * branch of es/vat validation.\n *\n * @see https://www.agenciatributaria.es/\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\";\nimport { cifChecksum } from \"./vat\";\n\nconst CIF_PREFIXES = \"ABCDEFGHJNPQRSUVW\";\nconst CIF_LETTERS = \"JABCDEFGHI\";\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"ES\") || v.startsWith(\"es\")) {\n v = v.slice(2);\n }\n return v.toUpperCase();\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Spanish CIF must be 9 characters\",\n );\n }\n\n const first = v.charAt(0);\n if (!CIF_PREFIXES.includes(first)) {\n return err(\n \"INVALID_FORMAT\",\n \"Spanish CIF must start with a valid prefix letter\",\n );\n }\n\n if (!isdigits(v.slice(1, 8))) {\n return err(\n \"INVALID_FORMAT\",\n \"Spanish CIF must have 7 digits after prefix\",\n );\n }\n\n const last = v.charAt(8);\n const check = cifChecksum(v.slice(1, 8));\n\n if (\n last !== String(check) &&\n last !== CIF_LETTERS.charAt(check)\n ) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Spanish CIF check digit/letter mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Spanish CIF. */\nconst generate = (): string => {\n const letter =\n CIF_PREFIXES[randomInt(0, CIF_PREFIXES.length - 1)]!;\n const payload = randomDigits(7);\n const check = cifChecksum(payload);\n if (\"KPQS\".includes(letter))\n return letter + payload + CIF_LETTERS.charAt(check);\n return letter + payload + String(check);\n};\n\n/** Spanish Company Tax ID (CIF). */\nconst cif: Validator = {\n name: \"Spanish Company Tax ID\",\n localName: \"Código de Identificación Fiscal\",\n abbreviation: \"CIF\",\n aliases: [\n \"CIF\",\n \"código de identificación fiscal\",\n ] as const,\n candidatePattern: \"[A-HJNP-SUVW]\\\\d{7}[\\\\dA-J]\",\n country: \"ES\",\n entityType: \"company\",\n sourceUrl: \"https://www.agenciatributaria.es/\",\n examples: [\"A13585625\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cif;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,MAAM,eAAe;AACrB,MAAM,cAAc;AAEpB,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,OAAO;AAC5B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,KAAI,EAAE,MAAM,EAAE;AAEhB,QAAO,EAAE,aAAa;;AAGxB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,mCACD;CAGH,MAAM,QAAQ,EAAE,OAAO,EAAE;AACzB,KAAI,CAAC,aAAa,SAAS,MAAM,CAC/B,QAAO,IACL,kBACA,oDACD;AAGH,KAAI,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,CAC1B,QAAO,IACL,kBACA,8CACD;CAGH,MAAM,OAAO,EAAE,OAAO,EAAE;CACxB,MAAM,QAAQ,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAExC,KACE,SAAS,OAAO,MAAM,IACtB,SAAS,YAAY,OAAO,MAAM,CAElC,QAAO,IACL,oBACA,0CACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,MAAM,iBAAyB;CAC7B,MAAM,SACJ,aAAa,UAAU,GAAG,GAAwB;CACpD,MAAM,UAAU,aAAa,EAAE;CAC/B,MAAM,QAAQ,YAAY,QAAQ;AAClC,KAAI,OAAO,SAAS,OAAO,CACzB,QAAO,SAAS,UAAU,YAAY,OAAO,MAAM;AACrD,QAAO,SAAS,UAAU,OAAO,MAAM;;;AAIzC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CACP,OACA,kCACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,YAAY;CACvB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"cif.js","names":[],"sources":["../../src/es/cif.ts"],"sourcesContent":["/**\n * CIF (Código de Identificación Fiscal).\n *\n * Spanish company tax identification number.\n * Letter prefix (ABCDEFGHJNPQRSUVW) + 7 digits +\n * check digit or letter. Delegates to the CIF\n * branch of es/vat validation.\n *\n * @see https://www.agenciatributaria.es/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\nimport { cifChecksum } from \"./vat\";\n\nimport { clean } from \"#util/clean\";\nimport { randomChar, randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst CIF_PREFIXES = \"ABCDEFGHJNPQRSUVW\";\nconst CIF_LETTERS = \"JABCDEFGHI\";\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"ES\") || v.startsWith(\"es\")) {\n v = v.slice(2);\n }\n return v.toUpperCase();\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Spanish CIF must be 9 characters\",\n );\n }\n\n const first = v.charAt(0);\n if (!CIF_PREFIXES.includes(first)) {\n return err(\n \"INVALID_FORMAT\",\n \"Spanish CIF must start with a valid prefix letter\",\n );\n }\n\n if (!isdigits(v.slice(1, 8))) {\n return err(\n \"INVALID_FORMAT\",\n \"Spanish CIF must have 7 digits after prefix\",\n );\n }\n\n const last = v.charAt(8);\n const check = cifChecksum(v.slice(1, 8));\n\n if (\n last !== String(check) &&\n last !== CIF_LETTERS.charAt(check)\n ) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Spanish CIF check digit/letter mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Spanish CIF. */\nconst generate = (): string => {\n const letter = randomChar(CIF_PREFIXES);\n const payload = randomDigits(7);\n const check = cifChecksum(payload);\n if (\"KPQS\".includes(letter))\n return letter + payload + CIF_LETTERS.charAt(check);\n return letter + payload + String(check);\n};\n\n/** Spanish Company Tax ID (CIF). */\nconst cif: CountryValidator<\"ES\"> = {\n name: \"Spanish Company Tax ID\",\n localName: \"Código de Identificación Fiscal\",\n abbreviation: \"CIF\",\n aliases: [\n \"CIF\",\n \"código de identificación fiscal\",\n ] as const,\n candidatePattern: \"[A-HJNP-SUVW]\\\\d{7}[\\\\dA-J]\",\n scope: \"country\",\n country: \"ES\",\n entityType: \"company\",\n sourceUrl: \"https://www.agenciatributaria.es/\",\n examples: [\"A13585625\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cif;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAsBA,MAAM,eAAe;AACrB,MAAM,cAAc;AAEpB,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,MAAM;CAC3B,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO,EAAE,YAAY;AACvB;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,kCACF;CAGF,MAAM,QAAQ,EAAE,OAAO,CAAC;CACxB,IAAI,CAAC,aAAa,SAAS,KAAK,GAC9B,OAAO,IACL,kBACA,mDACF;CAGF,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,GACzB,OAAO,IACL,kBACA,6CACF;CAGF,MAAM,OAAO,EAAE,OAAO,CAAC;CACvB,MAAM,QAAQ,YAAY,EAAE,MAAM,GAAG,CAAC,CAAC;CAEvC,IACE,SAAS,OAAO,KAAK,KACrB,SAAS,YAAY,OAAO,KAAK,GAEjC,OAAO,IACL,oBACA,yCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,iBAAyB;CAC7B,MAAM,SAAS,WAAW,YAAY;CACtC,MAAM,UAAU,aAAa,CAAC;CAC9B,MAAM,QAAQ,YAAY,OAAO;CACjC,IAAI,OAAO,SAAS,MAAM,GACxB,OAAO,SAAS,UAAU,YAAY,OAAO,KAAK;CACpD,OAAO,SAAS,UAAU,OAAO,KAAK;AACxC;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CACP,OACA,iCACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;AACF"}
package/dist/es/dni.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/es/dni.d.ts
4
-
5
4
  declare const CHECK_LETTERS = "TRWAGMYFPDXBNJZSQVHLCKE";
6
5
  declare const compact: (value: string) => string;
7
6
  declare const validate: (value: string) => ValidateResult;
@@ -9,7 +8,7 @@ declare const format: (value: string) => string;
9
8
  /** Generate a random valid Spanish DNI. */
10
9
  declare const generate: () => string;
11
10
  /** Spanish National Identity Document. */
12
- declare const dni: Validator;
11
+ declare const dni: CountryValidator<"ES">;
13
12
  //#endregion
14
13
  export { CHECK_LETTERS, compact, dni as default, format, generate, validate };
15
14
  //# sourceMappingURL=dni.d.ts.map
package/dist/es/dni.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/es/dni.ts
6
- /**
7
- * DNI (Documento Nacional de Identidad).
8
- *
9
- * Spanish national identity document number.
10
- * 8 digits followed by a check letter determined
11
- * by the remainder of dividing the number by 23.
12
- *
13
- * @see https://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/dni/
14
- */
15
6
  const CHECK_LETTERS = "TRWAGMYFPDXBNJZSQVHLCKE";
16
7
  const compact = (value) => clean(value, " -").toUpperCase();
17
8
  const validate = (value) => {
@@ -43,6 +34,7 @@ const dni = {
43
34
  "documento nacional de identidad"
44
35
  ],
45
36
  candidatePattern: "\\d{1,2}\\.?\\d{3}\\.?\\d{3}-?[A-Z]",
37
+ scope: "country",
46
38
  country: "ES",
47
39
  entityType: "person",
48
40
  sourceUrl: "https://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/dni/",
@@ -1 +1 @@
1
- {"version":3,"file":"dni.js","names":[],"sources":["../../src/es/dni.ts"],"sourcesContent":["/**\n * DNI (Documento Nacional de Identidad).\n *\n * Spanish national identity document number.\n * 8 digits followed by a check letter determined\n * by the remainder of dividing the number by 23.\n *\n * @see https://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/dni/\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 CHECK_LETTERS = \"TRWAGMYFPDXBNJZSQVHLCKE\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"DNI must be 8 digits and 1 letter\",\n );\n }\n\n const digits = v.slice(0, 8);\n const letter = v[8];\n\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"DNI must start with 8 digits\",\n );\n }\n\n const expected = CHECK_LETTERS[Number(digits) % 23];\n if (letter !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"DNI check letter does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Spanish DNI. */\nconst generate = (): string => {\n const num = randomDigits(8);\n return num + CHECK_LETTERS[Number(num) % 23];\n};\n\n/** Spanish National Identity Document. */\nconst dni: Validator = {\n name: \"Spanish National ID\",\n localName: \"Documento Nacional de Identidad\",\n abbreviation: \"DNI\",\n aliases: [\n \"D.N.I.\",\n \"DNI\",\n \"documento nacional de identidad\",\n ] as const,\n candidatePattern: \"\\\\d{1,2}\\\\.?\\\\d{3}\\\\.?\\\\d{3}-?[A-Z]\",\n country: \"ES\",\n entityType: \"person\",\n sourceUrl:\n \"https://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/dni/\",\n examples: [\"54362315K\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default dni;\nexport {\n CHECK_LETTERS,\n compact,\n format,\n validate,\n generate,\n};\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,gBAAgB;AAEtB,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,CAAC,aAAa;AAElC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,oCACD;CAGH,MAAM,SAAS,EAAE,MAAM,GAAG,EAAE;CAC5B,MAAM,SAAS,EAAE;AAEjB,KAAI,CAAC,SAAS,OAAO,CACnB,QAAO,IACL,kBACA,+BACD;AAIH,KAAI,WAAA,0BAD2B,OAAO,OAAO,GAAG,IAE9C,QAAO,IACL,oBACA,kCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,MAAM,iBAAyB;CAC7B,MAAM,MAAM,aAAa,EAAE;AAC3B,QAAO,MAAM,cAAc,OAAO,IAAI,GAAG;;;AAI3C,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,YAAY;CACvB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"dni.js","names":[],"sources":["../../src/es/dni.ts"],"sourcesContent":["/**\n * DNI (Documento Nacional de Identidad).\n *\n * Spanish national identity document number.\n * 8 digits followed by a check letter determined\n * by the remainder of dividing the number by 23.\n *\n * @see https://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/dni/\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 CHECK_LETTERS = \"TRWAGMYFPDXBNJZSQVHLCKE\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"DNI must be 8 digits and 1 letter\",\n );\n }\n\n const digits = v.slice(0, 8);\n const letter = v[8];\n\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"DNI must start with 8 digits\",\n );\n }\n\n const expected = CHECK_LETTERS[Number(digits) % 23];\n if (letter !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"DNI check letter does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Spanish DNI. */\nconst generate = (): string => {\n const num = randomDigits(8);\n return num + CHECK_LETTERS[Number(num) % 23];\n};\n\n/** Spanish National Identity Document. */\nconst dni: CountryValidator<\"ES\"> = {\n name: \"Spanish National ID\",\n localName: \"Documento Nacional de Identidad\",\n abbreviation: \"DNI\",\n aliases: [\n \"D.N.I.\",\n \"DNI\",\n \"documento nacional de identidad\",\n ] as const,\n candidatePattern: \"\\\\d{1,2}\\\\.?\\\\d{3}\\\\.?\\\\d{3}-?[A-Z]\",\n scope: \"country\",\n country: \"ES\",\n entityType: \"person\",\n sourceUrl:\n \"https://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/dni/\",\n examples: [\"54362315K\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default dni;\nexport {\n CHECK_LETTERS,\n compact,\n format,\n validate,\n generate,\n};\n"],"mappings":";;;;;AAoBA,MAAM,gBAAgB;AAEtB,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,EAAE,YAAY;AAEjC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,mCACF;CAGF,MAAM,SAAS,EAAE,MAAM,GAAG,CAAC;CAC3B,MAAM,SAAS,EAAE;CAEjB,IAAI,CAAC,SAAS,MAAM,GAClB,OAAO,IACL,kBACA,8BACF;CAIF,IAAI,WAAA,0BAD2B,OAAO,MAAM,IAAI,KAE9C,OAAO,IACL,oBACA,iCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,iBAAyB;CAC7B,MAAM,MAAM,aAAa,CAAC;CAC1B,OAAO,MAAM,cAAc,OAAO,GAAG,IAAI;AAC3C;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;AACF"}
package/dist/es/mod.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import cif from "./cif.js";
3
2
  import dni from "./dni.js";
4
3
  import nie from "./nie.js";
@@ -6,7 +5,9 @@ import nss from "./nss.js";
6
5
  import vat from "./vat.js";
7
6
 
8
7
  //#region src/es/mod.d.ts
9
-
8
+ declare namespace mod_d_exports {
9
+ export { cif, dni, nie, nss, vat };
10
+ }
10
11
  //#endregion
11
12
  export { cif, dni, mod_d_exports, nie, nss, vat };
12
13
  //# sourceMappingURL=mod.d.ts.map
package/dist/es/nie.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/es/nie.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 Spanish NIE. */
9
8
  declare const generate: () => string;
10
9
  /** Spanish Foreigner Identification Number. */
11
- declare const nie: Validator;
10
+ declare const nie: CountryValidator<"ES">;
12
11
  //#endregion
13
12
  export { compact, nie as default, format, generate, validate };
14
13
  //# sourceMappingURL=nie.d.ts.map
package/dist/es/nie.js CHANGED
@@ -1,18 +1,9 @@
1
1
  import { clean } from "../_util/clean.js";
2
- import { randomDigits, randomInt } from "../_util/generate.js";
2
+ import { randomDigits, randomPick } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  import { CHECK_LETTERS } from "./dni.js";
6
6
  //#region src/es/nie.ts
7
- /**
8
- * NIE (Número de Identidad de Extranjero).
9
- *
10
- * Spanish foreigner identification number. Starts
11
- * with X, Y, or Z, followed by 7 digits and a check
12
- * letter computed using the DNI algorithm.
13
- *
14
- * @see https://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/nie/
15
- */
16
7
  const PREFIX_MAP = {
17
8
  X: "0",
18
9
  Y: "1",
@@ -35,21 +26,21 @@ const validate = (value) => {
35
26
  };
36
27
  };
37
28
  const format = (value) => compact(value);
29
+ const NIE_PREFIXES = [
30
+ "X",
31
+ "Y",
32
+ "Z"
33
+ ];
34
+ const NIE_PREFIX_VALUES = {
35
+ X: 0,
36
+ Y: 1,
37
+ Z: 2
38
+ };
38
39
  /** Generate a random valid Spanish NIE. */
39
40
  const generate = () => {
40
- const prefixes = [
41
- "X",
42
- "Y",
43
- "Z"
44
- ];
45
- const vals = {
46
- X: 0,
47
- Y: 1,
48
- Z: 2
49
- };
50
- const prefix = prefixes[randomInt(0, 2)];
41
+ const prefix = randomPick(NIE_PREFIXES);
51
42
  const digits = randomDigits(7);
52
- const num = vals[prefix] * 1e7 + Number(digits);
43
+ const num = NIE_PREFIX_VALUES[prefix] * 1e7 + Number(digits);
53
44
  return prefix + digits + CHECK_LETTERS.charAt(num % 23);
54
45
  };
55
46
  /** Spanish Foreigner Identification Number. */
@@ -63,6 +54,7 @@ const nie = {
63
54
  "número de identidad de extranjero"
64
55
  ],
65
56
  candidatePattern: "[XYZ]-?\\d{7}-?[A-Z]",
57
+ scope: "country",
66
58
  country: "ES",
67
59
  entityType: "person",
68
60
  sourceUrl: "https://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/nie/",
@@ -1 +1 @@
1
- {"version":3,"file":"nie.js","names":[],"sources":["../../src/es/nie.ts"],"sourcesContent":["/**\n * NIE (Número de Identidad de Extranjero).\n *\n * Spanish foreigner identification number. Starts\n * with X, Y, or Z, followed by 7 digits and a check\n * letter computed using the DNI algorithm.\n *\n * @see https://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/nie/\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\";\nimport { CHECK_LETTERS } from \"./dni\";\n\nconst PREFIX_MAP: Record<string, string> = {\n X: \"0\",\n Y: \"1\",\n Z: \"2\",\n};\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"NIE must be 9 characters\",\n );\n }\n\n const prefix = v.charAt(0);\n const replacement = PREFIX_MAP[prefix];\n if (replacement === undefined) {\n return err(\n \"INVALID_FORMAT\",\n \"NIE must start with X, Y, or Z\",\n );\n }\n\n const digits = v.slice(1, 8);\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"NIE must have 7 digits after prefix\",\n );\n }\n\n const letter = v.charAt(8);\n const num = Number(replacement + digits);\n const expected = CHECK_LETTERS.charAt(num % 23);\n if (letter !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"NIE check letter does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Spanish NIE. */\nconst generate = (): string => {\n const prefixes = [\"X\", \"Y\", \"Z\"] as const;\n const vals: Record<string, number> = { X: 0, Y: 1, Z: 2 };\n const prefix = prefixes[randomInt(0, 2)]!;\n const digits = randomDigits(7);\n const num = vals[prefix]! * 10000000 + Number(digits);\n return prefix + digits + CHECK_LETTERS.charAt(num % 23);\n};\n\n/** Spanish Foreigner Identification Number. */\nconst nie: Validator = {\n name: \"Spanish Foreigner ID\",\n localName: \"Número de Identidad de Extranjero\",\n abbreviation: \"NIE\",\n aliases: [\n \"N.I.E.\",\n \"NIE\",\n \"número de identidad de extranjero\",\n ] as const,\n candidatePattern: \"[XYZ]-?\\\\d{7}-?[A-Z]\",\n country: \"ES\",\n entityType: \"person\",\n sourceUrl:\n \"https://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/nie/\",\n examples: [\"X5253868R\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nie;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,aAAqC;CACzC,GAAG;CACH,GAAG;CACH,GAAG;CACJ;AAED,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,CAAC,aAAa;AAElC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,2BACD;CAIH,MAAM,cAAc,WADL,EAAE,OAAO,EAAE;AAE1B,KAAI,gBAAgB,KAAA,EAClB,QAAO,IACL,kBACA,iCACD;CAGH,MAAM,SAAS,EAAE,MAAM,GAAG,EAAE;AAC5B,KAAI,CAAC,SAAS,OAAO,CACnB,QAAO,IACL,kBACA,sCACD;CAGH,MAAM,SAAS,EAAE,OAAO,EAAE;CAC1B,MAAM,MAAM,OAAO,cAAc,OAAO;AAExC,KAAI,WAAA,0BAD2B,OAAO,MAAM,GAAG,CAE7C,QAAO,IACL,oBACA,kCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,MAAM,iBAAyB;CAC7B,MAAM,WAAW;EAAC;EAAK;EAAK;EAAI;CAChC,MAAM,OAA+B;EAAE,GAAG;EAAG,GAAG;EAAG,GAAG;EAAG;CACzD,MAAM,SAAS,SAAS,UAAU,GAAG,EAAE;CACvC,MAAM,SAAS,aAAa,EAAE;CAC9B,MAAM,MAAM,KAAK,UAAW,MAAW,OAAO,OAAO;AACrD,QAAO,SAAS,SAAS,cAAc,OAAO,MAAM,GAAG;;;AAIzD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,YAAY;CACvB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"nie.js","names":[],"sources":["../../src/es/nie.ts"],"sourcesContent":["/**\n * NIE (Número de Identidad de Extranjero).\n *\n * Spanish foreigner identification number. Starts\n * with X, Y, or Z, followed by 7 digits and a check\n * letter computed using the DNI algorithm.\n *\n * @see https://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/nie/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\nimport { CHECK_LETTERS } from \"./dni\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomPick } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst PREFIX_MAP: Record<string, string> = {\n X: \"0\",\n Y: \"1\",\n Z: \"2\",\n};\n\nconst compact = (value: string): string =>\n clean(value, \" -\").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"NIE must be 9 characters\",\n );\n }\n\n const prefix = v.charAt(0);\n const replacement = PREFIX_MAP[prefix];\n if (replacement === undefined) {\n return err(\n \"INVALID_FORMAT\",\n \"NIE must start with X, Y, or Z\",\n );\n }\n\n const digits = v.slice(1, 8);\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"NIE must have 7 digits after prefix\",\n );\n }\n\n const letter = v.charAt(8);\n const num = Number(replacement + digits);\n const expected = CHECK_LETTERS.charAt(num % 23);\n if (letter !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"NIE check letter does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\nconst NIE_PREFIXES = [\"X\", \"Y\", \"Z\"] as const;\nconst NIE_PREFIX_VALUES: Record<\n (typeof NIE_PREFIXES)[number],\n number\n> = { X: 0, Y: 1, Z: 2 };\n\n/** Generate a random valid Spanish NIE. */\nconst generate = (): string => {\n const prefix = randomPick(NIE_PREFIXES);\n const digits = randomDigits(7);\n const num =\n NIE_PREFIX_VALUES[prefix] * 10000000 + Number(digits);\n return prefix + digits + CHECK_LETTERS.charAt(num % 23);\n};\n\n/** Spanish Foreigner Identification Number. */\nconst nie: CountryValidator<\"ES\"> = {\n name: \"Spanish Foreigner ID\",\n localName: \"Número de Identidad de Extranjero\",\n abbreviation: \"NIE\",\n aliases: [\n \"N.I.E.\",\n \"NIE\",\n \"número de identidad de extranjero\",\n ] as const,\n candidatePattern: \"[XYZ]-?\\\\d{7}-?[A-Z]\",\n scope: \"country\",\n country: \"ES\",\n entityType: \"person\",\n sourceUrl:\n \"https://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/nie/\",\n examples: [\"X5253868R\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nie;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAqBA,MAAM,aAAqC;CACzC,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAEA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,EAAE,YAAY;AAEjC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,0BACF;CAIF,MAAM,cAAc,WADL,EAAE,OAAO,CACY;CACpC,IAAI,gBAAgB,KAAA,GAClB,OAAO,IACL,kBACA,gCACF;CAGF,MAAM,SAAS,EAAE,MAAM,GAAG,CAAC;CAC3B,IAAI,CAAC,SAAS,MAAM,GAClB,OAAO,IACL,kBACA,qCACF;CAGF,MAAM,SAAS,EAAE,OAAO,CAAC;CACzB,MAAM,MAAM,OAAO,cAAc,MAAM;CAEvC,IAAI,WAAA,0BAD2B,OAAO,MAAM,EACtB,GACpB,OAAO,IACL,oBACA,iCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;AAEvD,MAAM,eAAe;CAAC;CAAK;CAAK;AAAG;AACnC,MAAM,oBAGF;CAAE,GAAG;CAAG,GAAG;CAAG,GAAG;AAAE;;AAGvB,MAAM,iBAAyB;CAC7B,MAAM,SAAS,WAAW,YAAY;CACtC,MAAM,SAAS,aAAa,CAAC;CAC7B,MAAM,MACJ,kBAAkB,UAAU,MAAW,OAAO,MAAM;CACtD,OAAO,SAAS,SAAS,cAAc,OAAO,MAAM,EAAE;AACxD;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;AACF"}
package/dist/es/nss.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/es/nss.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 Spanish NSS. */
9
8
  declare const generate: () => string;
10
9
  /** Spanish Social Security Number. */
11
- declare const nss: Validator;
10
+ declare const nss: CountryValidator<"ES">;
12
11
  //#endregion
13
12
  export { compact, nss as default, format, generate, validate };
14
13
  //# sourceMappingURL=nss.d.ts.map
package/dist/es/nss.js CHANGED
@@ -3,22 +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/es/nss.ts
6
- /**
7
- * NSS (Número de la Seguridad Social).
8
- *
9
- * Spanish Social Security Number. 12 digits:
10
- * 2-digit province code (01–52) + 8-digit affiliate
11
- * number + 2-digit check digits.
12
- *
13
- * Check digits are computed as:
14
- * if affiliate < 10_000_000:
15
- * (affiliate + province × 10_000_000) mod 97
16
- * else:
17
- * parseInt(province + affiliate) mod 97
18
- *
19
- * @see https://www.seg-social.es/
20
- * @see https://intervia.com/doc/validar-numeros-de-la-seguridad-social/
21
- */
22
6
  const compact = (value) => clean(value, " -/.");
23
7
  const validate = (value) => {
24
8
  const v = compact(value);
@@ -55,6 +39,7 @@ const nss = {
55
39
  abbreviation: "NSS",
56
40
  aliases: ["NSS", "número de seguridad social"],
57
41
  candidatePattern: "\\d{12}",
42
+ scope: "country",
58
43
  country: "ES",
59
44
  entityType: "person",
60
45
  description: "Spanish Social Security affiliation number with mod-97 check digits",
@@ -1 +1 @@
1
- {"version":3,"file":"nss.js","names":[],"sources":["../../src/es/nss.ts"],"sourcesContent":["/**\n * NSS (Número de la Seguridad Social).\n *\n * Spanish Social Security Number. 12 digits:\n * 2-digit province code (01–52) + 8-digit affiliate\n * number + 2-digit check digits.\n *\n * Check digits are computed as:\n * if affiliate < 10_000_000:\n * (affiliate + province × 10_000_000) mod 97\n * else:\n * parseInt(province + affiliate) mod 97\n *\n * @see https://www.seg-social.es/\n * @see https://intervia.com/doc/validar-numeros-de-la-seguridad-social/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -/.\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"Spanish NSS must be 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Spanish NSS must contain only digits\",\n );\n }\n\n const province = Number(v.slice(0, 2));\n if (province < 1 || province > 52) {\n return err(\n \"INVALID_COMPONENT\",\n \"Spanish NSS province code must be 01–52\",\n );\n }\n\n const affiliate = Number(v.slice(2, 10));\n const check = Number(v.slice(10, 12));\n\n let base: number;\n if (affiliate < 10_000_000) {\n base = affiliate + province * 10_000_000;\n } else {\n // Concatenate province and affiliate as a number\n base = Number(`${province}${v.slice(2, 10)}`);\n }\n\n const expected = base % 97;\n\n if (expected !== check) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Spanish NSS check digits do not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 2)}/${v.slice(2, 10)}/${v.slice(10)}`;\n};\n\n/** Generate a random valid Spanish NSS. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(12);\n if (validate(c).valid) return c;\n }\n};\n\n/** Spanish Social Security Number. */\nconst nss: Validator = {\n name: \"Spanish Social Security Number\",\n localName: \"Número de la Seguridad Social\",\n abbreviation: \"NSS\",\n aliases: [\"NSS\", \"número de seguridad social\"] as const,\n candidatePattern: \"\\\\d{12}\",\n country: \"ES\",\n entityType: \"person\",\n description:\n \"Spanish Social Security affiliation number \" +\n \"with mod-97 check digits\",\n sourceUrl: \"https://www.seg-social.es/\",\n lengths: [12] as const,\n examples: [\"281234567840\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nss;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,WAAW,UACf,MAAM,OAAO,OAAO;AAEtB,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,uCACD;CAGH,MAAM,WAAW,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;AACtC,KAAI,WAAW,KAAK,WAAW,GAC7B,QAAO,IACL,qBACA,0CACD;CAGH,MAAM,YAAY,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;CACxC,MAAM,QAAQ,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;CAErC,IAAI;AACJ,KAAI,YAAY,IACd,QAAO,YAAY,WAAW;KAG9B,QAAO,OAAO,GAAG,WAAW,EAAE,MAAM,GAAG,GAAG,GAAG;AAK/C,KAFiB,OAAO,OAEP,MACf,QAAO,IACL,oBACA,wCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG;;;AAI1D,MAAM,iBAAyB;AAC7B,UAAS;EACP,MAAM,IAAI,aAAa,GAAG;AAC1B,MAAI,SAAS,EAAE,CAAC,MAAO,QAAO;;;;AAKlC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,6BAA6B;CAC9C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,aACE;CAEF,WAAW;CACX,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,eAAe;CAC1B;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"nss.js","names":[],"sources":["../../src/es/nss.ts"],"sourcesContent":["/**\n * NSS (Número de la Seguridad Social).\n *\n * Spanish Social Security Number. 12 digits:\n * 2-digit province code (01–52) + 8-digit affiliate\n * number + 2-digit check digits.\n *\n * Check digits are computed as:\n * if affiliate < 10_000_000:\n * (affiliate + province × 10_000_000) mod 97\n * else:\n * parseInt(province + affiliate) mod 97\n *\n * @see https://www.seg-social.es/\n * @see https://intervia.com/doc/validar-numeros-de-la-seguridad-social/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -/.\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"Spanish NSS must be 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Spanish NSS must contain only digits\",\n );\n }\n\n const province = Number(v.slice(0, 2));\n if (province < 1 || province > 52) {\n return err(\n \"INVALID_COMPONENT\",\n \"Spanish NSS province code must be 01–52\",\n );\n }\n\n const affiliate = Number(v.slice(2, 10));\n const check = Number(v.slice(10, 12));\n\n let base: number;\n if (affiliate < 10_000_000) {\n base = affiliate + province * 10_000_000;\n } else {\n // Concatenate province and affiliate as a number\n base = Number(`${province}${v.slice(2, 10)}`);\n }\n\n const expected = base % 97;\n\n if (expected !== check) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Spanish NSS check digits do not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 2)}/${v.slice(2, 10)}/${v.slice(10)}`;\n};\n\n/** Generate a random valid Spanish NSS. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(12);\n if (validate(c).valid) return c;\n }\n};\n\n/** Spanish Social Security Number. */\nconst nss: CountryValidator<\"ES\"> = {\n name: \"Spanish Social Security Number\",\n localName: \"Número de la Seguridad Social\",\n abbreviation: \"NSS\",\n aliases: [\"NSS\", \"número de seguridad social\"] as const,\n candidatePattern: \"\\\\d{12}\",\n scope: \"country\",\n country: \"ES\",\n entityType: \"person\",\n description:\n \"Spanish Social Security affiliation number \" +\n \"with mod-97 check digits\",\n sourceUrl: \"https://www.seg-social.es/\",\n lengths: [12] as const,\n examples: [\"281234567840\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nss;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AA2BA,MAAM,WAAW,UACf,MAAM,OAAO,MAAM;AAErB,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,sCACF;CAGF,MAAM,WAAW,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CACrC,IAAI,WAAW,KAAK,WAAW,IAC7B,OAAO,IACL,qBACA,yCACF;CAGF,MAAM,YAAY,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CACvC,MAAM,QAAQ,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;CAEpC,IAAI;CACJ,IAAI,YAAY,KACd,OAAO,YAAY,WAAW;MAG9B,OAAO,OAAO,GAAG,WAAW,EAAE,MAAM,GAAG,EAAE,GAAG;CAK9C,IAFiB,OAAO,OAEP,OACf,OAAO,IACL,oBACA,uCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;AACzD;;AAGA,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,IAAI,aAAa,EAAE;EACzB,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO;CAChC;AACF;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,4BAA4B;CAC7C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aACE;CAEF,WAAW;CACX,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,cAAc;CACzB;CACA;CACA;CACA;AACF"}
package/dist/es/vat.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/es/vat.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const cifChecksum: (digits: string) => number;
7
6
  declare const validate: (value: string) => ValidateResult;
@@ -9,7 +8,7 @@ declare const format: (value: string) => string;
9
8
  /** Generate a random valid Spanish VAT (DNI form). */
10
9
  declare const generate: () => string;
11
10
  /** Spanish VAT Number. */
12
- declare const vat: Validator;
11
+ declare const vat: CountryValidator<"ES">;
13
12
  //#endregion
14
13
  export { cifChecksum, compact, vat as default, format, generate, validate };
15
14
  //# sourceMappingURL=vat.d.ts.map
package/dist/es/vat.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/es/vat.ts
6
- /**
7
- * NIF/CIF (Spanish VAT number).
8
- *
9
- * 9 characters with 4 subtypes: DNI, NIE, CIF,
10
- * and K/L/M personal numbers.
11
- *
12
- * @see https://www.vatify.eu/spain-vat-number.html
13
- * @see https://www.agenciatributaria.es/
14
- */
15
6
  const DNI_LETTERS = "TRWAGMYFPDXBNJZSQVHLCKE";
16
7
  const CIF_LETTERS = "JABCDEFGHI";
17
8
  const compact = (value) => {
@@ -44,7 +35,10 @@ const validate = (value) => {
44
35
  };
45
36
  }
46
37
  if (first === "X" || first === "Y" || first === "Z") {
47
- const digits = (first === "X" ? "0" : first === "Y" ? "1" : "2") + v.slice(1, 8);
38
+ let prefix = "2";
39
+ if (first === "X") prefix = "0";
40
+ else if (first === "Y") prefix = "1";
41
+ const digits = prefix + v.slice(1, 8);
48
42
  if (!isdigits(digits) || !isdigits(v.slice(1, 8))) return err("INVALID_FORMAT", "Spanish NIE must have 7 digits after prefix");
49
43
  if (last !== DNI_LETTERS.charAt(Number.parseInt(digits, 10) % 23)) return err("INVALID_CHECKSUM", "Spanish NIE check letter mismatch");
50
44
  return {
@@ -89,6 +83,7 @@ const vat = {
89
83
  "número de identificación fiscal"
90
84
  ],
91
85
  candidatePattern: "ES[A-Z]\\d{7}[A-Z\\d]",
86
+ scope: "country",
92
87
  country: "ES",
93
88
  entityType: "any",
94
89
  sourceUrl: "https://www.agenciatributaria.es/",
@@ -1 +1 @@
1
- {"version":3,"file":"vat.js","names":[],"sources":["../../src/es/vat.ts"],"sourcesContent":["/**\n * NIF/CIF (Spanish VAT number).\n *\n * 9 characters with 4 subtypes: DNI, NIE, CIF,\n * and K/L/M personal numbers.\n *\n * @see https://www.vatify.eu/spain-vat-number.html\n * @see https://www.agenciatributaria.es/\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 DNI_LETTERS = \"TRWAGMYFPDXBNJZSQVHLCKE\";\nconst CIF_LETTERS = \"JABCDEFGHI\";\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"ES\") || v.startsWith(\"es\")) {\n v = v.slice(2);\n }\n return v.toUpperCase();\n};\n\nconst cifChecksum = (digits: string): number => {\n let even = 0;\n let odd = 0;\n for (let i = 0; i < 7; i++) {\n const d = Number(digits.charAt(i));\n if (i % 2 === 0) {\n // Odd positions (1-indexed): double and sum digits\n const doubled = d * 2;\n odd += Math.floor(doubled / 10) + (doubled % 10);\n } else {\n even += d;\n }\n }\n return (10 - ((even + odd) % 10)) % 10;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Spanish VAT number must be 9 characters\",\n );\n }\n\n const first = v.charAt(0);\n const last = v.charAt(8);\n\n // DNI: 8 digits + letter\n if (isdigits(v.slice(0, 8))) {\n const expected = DNI_LETTERS.charAt(\n Number.parseInt(v.slice(0, 8), 10) % 23,\n );\n if (last !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Spanish DNI check letter mismatch\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // NIE: X/Y/Z + 7 digits + letter\n if (first === \"X\" || first === \"Y\" || first === \"Z\") {\n const prefix =\n first === \"X\" ? \"0\" : first === \"Y\" ? \"1\" : \"2\";\n const digits = prefix + v.slice(1, 8);\n if (!isdigits(digits) || !isdigits(v.slice(1, 8))) {\n return err(\n \"INVALID_FORMAT\",\n \"Spanish NIE must have 7 digits after prefix\",\n );\n }\n const expected = DNI_LETTERS.charAt(\n Number.parseInt(digits, 10) % 23,\n );\n if (last !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Spanish NIE check letter mismatch\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // K, L, M: personal number, letter + 7 digits +\n // check letter\n if (first === \"K\" || first === \"L\" || first === \"M\") {\n if (!isdigits(v.slice(1, 8))) {\n return err(\n \"INVALID_FORMAT\",\n \"Spanish K/L/M number must have 7 digits\",\n );\n }\n const expected = DNI_LETTERS.charAt(\n Number.parseInt(v.slice(1, 8), 10) % 23,\n );\n if (last !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Spanish K/L/M check letter mismatch\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // CIF: letter + 7 digits + check digit/letter\n const CIF_PREFIXES = \"ABCDEFGHJNPQRSUVW\";\n if (CIF_PREFIXES.includes(first)) {\n if (!isdigits(v.slice(1, 8))) {\n return err(\n \"INVALID_FORMAT\",\n \"Spanish CIF must have 7 digits after prefix\",\n );\n }\n const check = cifChecksum(v.slice(1, 8));\n // Accept either numeric or alphabetic check digit\n // for all CIF prefixes (sources conflict on which\n // prefixes require which type)\n if (\n last !== String(check) &&\n last !== CIF_LETTERS.charAt(check)\n ) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Spanish CIF check digit/letter mismatch\",\n );\n }\n return { valid: true, compact: v };\n }\n\n return err(\n \"INVALID_FORMAT\",\n \"Spanish VAT number has invalid format\",\n );\n};\n\nconst format = (value: string): string =>\n `ES${compact(value)}`;\n\n/** Generate a random valid Spanish VAT (DNI form). */\nconst generate = (): string => {\n const letters = \"TRWAGMYFPDXBNJZSQVHLCKE\";\n const num = randomDigits(8);\n return num + letters.charAt(Number(num) % 23);\n};\n\n/** Spanish VAT Number. */\nconst vat: Validator = {\n name: \"Spanish VAT Number\",\n localName: \"Número de Identificación Fiscal\",\n abbreviation: \"NIF\",\n aliases: [\n \"NIF\",\n \"CIF\",\n \"número de identificación fiscal\",\n ] as const,\n candidatePattern: \"ES[A-Z]\\\\d{7}[A-Z\\\\d]\",\n country: \"ES\",\n entityType: \"any\",\n sourceUrl: \"https://www.agenciatributaria.es/\",\n examples: [\"12345678Z\", \"A78304516\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { cifChecksum, compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,cAAc;AACpB,MAAM,cAAc;AAEpB,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,OAAO;AAC5B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,KAAI,EAAE,MAAM,EAAE;AAEhB,QAAO,EAAE,aAAa;;AAGxB,MAAM,eAAe,WAA2B;CAC9C,IAAI,OAAO;CACX,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EAC1B,MAAM,IAAI,OAAO,OAAO,OAAO,EAAE,CAAC;AAClC,MAAI,IAAI,MAAM,GAAG;GAEf,MAAM,UAAU,IAAI;AACpB,UAAO,KAAK,MAAM,UAAU,GAAG,GAAI,UAAU;QAE7C,SAAQ;;AAGZ,SAAQ,MAAO,OAAO,OAAO,MAAO;;AAGtC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,0CACD;CAGH,MAAM,QAAQ,EAAE,OAAO,EAAE;CACzB,MAAM,OAAO,EAAE,OAAO,EAAE;AAGxB,KAAI,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE;AAI3B,MAAI,SAHa,YAAY,OAC3B,OAAO,SAAS,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,GAAG,GACtC,CAEC,QAAO,IACL,oBACA,oCACD;AAEH,SAAO;GAAE,OAAO;GAAM,SAAS;GAAG;;AAIpC,KAAI,UAAU,OAAO,UAAU,OAAO,UAAU,KAAK;EAGnD,MAAM,UADJ,UAAU,MAAM,MAAM,UAAU,MAAM,MAAM,OACtB,EAAE,MAAM,GAAG,EAAE;AACrC,MAAI,CAAC,SAAS,OAAO,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,CAC/C,QAAO,IACL,kBACA,8CACD;AAKH,MAAI,SAHa,YAAY,OAC3B,OAAO,SAAS,QAAQ,GAAG,GAAG,GAC/B,CAEC,QAAO,IACL,oBACA,oCACD;AAEH,SAAO;GAAE,OAAO;GAAM,SAAS;GAAG;;AAKpC,KAAI,UAAU,OAAO,UAAU,OAAO,UAAU,KAAK;AACnD,MAAI,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,CAC1B,QAAO,IACL,kBACA,0CACD;AAKH,MAAI,SAHa,YAAY,OAC3B,OAAO,SAAS,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,GAAG,GACtC,CAEC,QAAO,IACL,oBACA,sCACD;AAEH,SAAO;GAAE,OAAO;GAAM,SAAS;GAAG;;AAKpC,KADqB,oBACJ,SAAS,MAAM,EAAE;AAChC,MAAI,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,CAC1B,QAAO,IACL,kBACA,8CACD;EAEH,MAAM,QAAQ,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAIxC,MACE,SAAS,OAAO,MAAM,IACtB,SAAS,YAAY,OAAO,MAAM,CAElC,QAAO,IACL,oBACA,0CACD;AAEH,SAAO;GAAE,OAAO;GAAM,SAAS;GAAG;;AAGpC,QAAO,IACL,kBACA,wCACD;;AAGH,MAAM,UAAU,UACd,KAAK,QAAQ,MAAM;;AAGrB,MAAM,iBAAyB;CAC7B,MAAM,UAAU;CAChB,MAAM,MAAM,aAAa,EAAE;AAC3B,QAAO,MAAM,QAAQ,OAAO,OAAO,IAAI,GAAG,GAAG;;;AAI/C,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,aAAa,YAAY;CACpC;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"vat.js","names":[],"sources":["../../src/es/vat.ts"],"sourcesContent":["/**\n * NIF/CIF (Spanish VAT number).\n *\n * 9 characters with 4 subtypes: DNI, NIE, CIF,\n * and K/L/M personal numbers.\n *\n * @see https://www.vatify.eu/spain-vat-number.html\n * @see https://www.agenciatributaria.es/\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 DNI_LETTERS = \"TRWAGMYFPDXBNJZSQVHLCKE\";\nconst CIF_LETTERS = \"JABCDEFGHI\";\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"ES\") || v.startsWith(\"es\")) {\n v = v.slice(2);\n }\n return v.toUpperCase();\n};\n\nconst cifChecksum = (digits: string): number => {\n let even = 0;\n let odd = 0;\n for (let i = 0; i < 7; i++) {\n const d = Number(digits.charAt(i));\n if (i % 2 === 0) {\n // Odd positions (1-indexed): double and sum digits\n const doubled = d * 2;\n odd += Math.floor(doubled / 10) + (doubled % 10);\n } else {\n even += d;\n }\n }\n return (10 - ((even + odd) % 10)) % 10;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Spanish VAT number must be 9 characters\",\n );\n }\n\n const first = v.charAt(0);\n const last = v.charAt(8);\n\n // DNI: 8 digits + letter\n if (isdigits(v.slice(0, 8))) {\n const expected = DNI_LETTERS.charAt(\n Number.parseInt(v.slice(0, 8), 10) % 23,\n );\n if (last !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Spanish DNI check letter mismatch\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // NIE: X/Y/Z + 7 digits + letter\n if (first === \"X\" || first === \"Y\" || first === \"Z\") {\n let prefix = \"2\";\n if (first === \"X\") {\n prefix = \"0\";\n } else if (first === \"Y\") {\n prefix = \"1\";\n }\n const digits = prefix + v.slice(1, 8);\n if (!isdigits(digits) || !isdigits(v.slice(1, 8))) {\n return err(\n \"INVALID_FORMAT\",\n \"Spanish NIE must have 7 digits after prefix\",\n );\n }\n const expected = DNI_LETTERS.charAt(\n Number.parseInt(digits, 10) % 23,\n );\n if (last !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Spanish NIE check letter mismatch\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // K, L, M: personal number, letter + 7 digits +\n // check letter\n if (first === \"K\" || first === \"L\" || first === \"M\") {\n if (!isdigits(v.slice(1, 8))) {\n return err(\n \"INVALID_FORMAT\",\n \"Spanish K/L/M number must have 7 digits\",\n );\n }\n const expected = DNI_LETTERS.charAt(\n Number.parseInt(v.slice(1, 8), 10) % 23,\n );\n if (last !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Spanish K/L/M check letter mismatch\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // CIF: letter + 7 digits + check digit/letter\n const CIF_PREFIXES = \"ABCDEFGHJNPQRSUVW\";\n if (CIF_PREFIXES.includes(first)) {\n if (!isdigits(v.slice(1, 8))) {\n return err(\n \"INVALID_FORMAT\",\n \"Spanish CIF must have 7 digits after prefix\",\n );\n }\n const check = cifChecksum(v.slice(1, 8));\n // Accept either numeric or alphabetic check digit\n // for all CIF prefixes (sources conflict on which\n // prefixes require which type)\n if (\n last !== String(check) &&\n last !== CIF_LETTERS.charAt(check)\n ) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Spanish CIF check digit/letter mismatch\",\n );\n }\n return { valid: true, compact: v };\n }\n\n return err(\n \"INVALID_FORMAT\",\n \"Spanish VAT number has invalid format\",\n );\n};\n\nconst format = (value: string): string =>\n `ES${compact(value)}`;\n\n/** Generate a random valid Spanish VAT (DNI form). */\nconst generate = (): string => {\n const letters = \"TRWAGMYFPDXBNJZSQVHLCKE\";\n const num = randomDigits(8);\n return num + letters.charAt(Number(num) % 23);\n};\n\n/** Spanish VAT Number. */\nconst vat: CountryValidator<\"ES\"> = {\n name: \"Spanish VAT Number\",\n localName: \"Número de Identificación Fiscal\",\n abbreviation: \"NIF\",\n aliases: [\n \"NIF\",\n \"CIF\",\n \"número de identificación fiscal\",\n ] as const,\n candidatePattern: \"ES[A-Z]\\\\d{7}[A-Z\\\\d]\",\n scope: \"country\",\n country: \"ES\",\n entityType: \"any\",\n sourceUrl: \"https://www.agenciatributaria.es/\",\n examples: [\"12345678Z\", \"A78304516\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { cifChecksum, compact, format, validate, generate };\n"],"mappings":";;;;;AAoBA,MAAM,cAAc;AACpB,MAAM,cAAc;AAEpB,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,MAAM;CAC3B,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO,EAAE,YAAY;AACvB;AAEA,MAAM,eAAe,WAA2B;CAC9C,IAAI,OAAO;CACX,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EAC1B,MAAM,IAAI,OAAO,OAAO,OAAO,CAAC,CAAC;EACjC,IAAI,IAAI,MAAM,GAAG;GAEf,MAAM,UAAU,IAAI;GACpB,OAAO,KAAK,MAAM,UAAU,EAAE,IAAK,UAAU;EAC/C,OACE,QAAQ;CAEZ;CACA,QAAQ,MAAO,OAAO,OAAO,MAAO;AACtC;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,yCACF;CAGF,MAAM,QAAQ,EAAE,OAAO,CAAC;CACxB,MAAM,OAAO,EAAE,OAAO,CAAC;CAGvB,IAAI,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG;EAI3B,IAAI,SAHa,YAAY,OAC3B,OAAO,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,EAEnB,GAClB,OAAO,IACL,oBACA,mCACF;EAEF,OAAO;GAAE,OAAO;GAAM,SAAS;EAAE;CACnC;CAGA,IAAI,UAAU,OAAO,UAAU,OAAO,UAAU,KAAK;EACnD,IAAI,SAAS;EACb,IAAI,UAAU,KACZ,SAAS;OACJ,IAAI,UAAU,KACnB,SAAS;EAEX,MAAM,SAAS,SAAS,EAAE,MAAM,GAAG,CAAC;EACpC,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,GAC9C,OAAO,IACL,kBACA,6CACF;EAKF,IAAI,SAHa,YAAY,OAC3B,OAAO,SAAS,QAAQ,EAAE,IAAI,EAEZ,GAClB,OAAO,IACL,oBACA,mCACF;EAEF,OAAO;GAAE,OAAO;GAAM,SAAS;EAAE;CACnC;CAIA,IAAI,UAAU,OAAO,UAAU,OAAO,UAAU,KAAK;EACnD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,GACzB,OAAO,IACL,kBACA,yCACF;EAKF,IAAI,SAHa,YAAY,OAC3B,OAAO,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,EAEnB,GAClB,OAAO,IACL,oBACA,qCACF;EAEF,OAAO;GAAE,OAAO;GAAM,SAAS;EAAE;CACnC;CAIA,IAAI,oBAAa,SAAS,KAAK,GAAG;EAChC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,GACzB,OAAO,IACL,kBACA,6CACF;EAEF,MAAM,QAAQ,YAAY,EAAE,MAAM,GAAG,CAAC,CAAC;EAIvC,IACE,SAAS,OAAO,KAAK,KACrB,SAAS,YAAY,OAAO,KAAK,GAEjC,OAAO,IACL,oBACA,yCACF;EAEF,OAAO;GAAE,OAAO;GAAM,SAAS;EAAE;CACnC;CAEA,OAAO,IACL,kBACA,uCACF;AACF;AAEA,MAAM,UAAU,UACd,KAAK,QAAQ,KAAK;;AAGpB,MAAM,iBAAyB;CAC7B,MAAM,UAAU;CAChB,MAAM,MAAM,aAAa,CAAC;CAC1B,OAAO,MAAM,QAAQ,OAAO,OAAO,GAAG,IAAI,EAAE;AAC9C;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,aAAa,WAAW;CACnC;CACA;CACA;CACA;AACF"}
package/dist/eu/mod.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
1
  import euVat from "./vat.js";
3
2
 
4
3
  //#region src/eu/mod.d.ts
5
-
4
+ declare namespace mod_d_exports {
5
+ export { euVat as vat };
6
+ }
6
7
  //#endregion
7
8
  export { mod_d_exports, euVat as vat };
8
9
  //# sourceMappingURL=mod.d.ts.map
package/dist/eu/vat.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { GlobalValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/eu/vat.d.ts
4
-
5
4
  declare const compact: (value: string) => string;
6
5
  declare const validate: (value: string) => ValidateResult;
7
6
  /**
@@ -13,8 +12,10 @@ declare const validate: (value: string) => ValidateResult;
13
12
  * prefixing if used here.
14
13
  */
15
14
  declare const format: (value: string) => string;
15
+ /** Generate a random EU VAT number from a member validator. */
16
+ declare const generate: () => string;
16
17
  /** European Union VAT Number. */
17
- declare const euVat: Validator;
18
+ declare const euVat: GlobalValidator;
18
19
  //#endregion
19
- export { compact, euVat as default, format, validate };
20
+ export { compact, euVat as default, format, generate, validate };
20
21
  //# sourceMappingURL=vat.d.ts.map
package/dist/eu/vat.js CHANGED
@@ -1,4 +1,5 @@
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 uid from "../at/uid.js";
4
5
  import vat from "../be/vat.js";
@@ -125,8 +126,48 @@ const format = (value) => {
125
126
  if (validator === void 0) return value;
126
127
  return `${parts.cc}${validator.compact(parts.rest)}`;
127
128
  };
129
+ const GENERATORS = [
130
+ ["AT", uid],
131
+ ["BE", vat],
132
+ ["BG", vat$1],
133
+ ["CY", vat$2],
134
+ ["CZ", dic],
135
+ ["DE", vat$3],
136
+ ["DK", vat$4],
137
+ ["EE", vat$5],
138
+ ["ES", vat$6],
139
+ ["FI", vat$7],
140
+ ["FR", tva],
141
+ ["GR", vat$9],
142
+ ["HR", vat$10],
143
+ ["HU", vat$11],
144
+ ["IE", vat$12],
145
+ ["IT", iva],
146
+ ["LT", vat$13],
147
+ ["LU", vat$14],
148
+ ["LV", vat$15],
149
+ ["MT", vat$16],
150
+ ["NL", vat$17],
151
+ ["PL", nip],
152
+ ["PT", vat$18],
153
+ ["RO", vat$19],
154
+ ["SE", vat$20],
155
+ ["SI", vat$21],
156
+ ["SK", dic$1]
157
+ ];
158
+ /** Generate a random EU VAT number from a member validator. */
159
+ const generate = () => {
160
+ for (;;) {
161
+ const candidate = GENERATORS[randomInt(0, GENERATORS.length - 1)];
162
+ if (!candidate) continue;
163
+ const [prefix, validator] = candidate;
164
+ if (validator.generate === void 0) continue;
165
+ return `${prefix}${validator.generate()}`;
166
+ }
167
+ };
128
168
  /** European Union VAT Number. */
129
169
  const euVat = {
170
+ scope: "global",
130
171
  name: "EU VAT Number",
131
172
  localName: "EU VAT Number",
132
173
  abbreviation: "EU VAT",
@@ -137,9 +178,10 @@ const euVat = {
137
178
  examples: ["ATU13585627", "DE136695976"],
138
179
  compact,
139
180
  format,
140
- validate
181
+ validate,
182
+ generate
141
183
  };
142
184
  //#endregion
143
- export { compact, euVat as default, format, validate };
185
+ export { compact, euVat as default, format, generate, validate };
144
186
 
145
187
  //# sourceMappingURL=vat.js.map