@stll/stdnum 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (704) hide show
  1. package/dist/_checksums/luhn.js.map +1 -1
  2. package/dist/_checksums/mod1110.js +1 -1
  3. package/dist/_checksums/mod1110.js.map +1 -1
  4. package/dist/_checksums/mod112.js.map +1 -1
  5. package/dist/_checksums/mod97.js.map +1 -1
  6. package/dist/_checksums/verhoeff.js.map +1 -1
  7. package/dist/_checksums/weighted-sum.js.map +1 -1
  8. package/dist/_util/arabic.js.map +1 -1
  9. package/dist/_util/clean.js.map +1 -1
  10. package/dist/_util/date.js.map +1 -1
  11. package/dist/_util/generate.js.map +1 -1
  12. package/dist/_util/result.js.map +1 -1
  13. package/dist/_util/strings.js.map +1 -1
  14. package/dist/ad/nrt.d.ts +16 -2
  15. package/dist/ad/nrt.js +1 -14
  16. package/dist/ad/nrt.js.map +1 -1
  17. package/dist/ae/eid.d.ts +2 -2
  18. package/dist/ae/eid.js +2 -12
  19. package/dist/ae/eid.js.map +1 -1
  20. package/dist/ai/tin.d.ts +20 -2
  21. package/dist/ai/tin.js +1 -18
  22. package/dist/ai/tin.js.map +1 -1
  23. package/dist/al/nipt.d.ts +13 -2
  24. package/dist/al/nipt.js +1 -11
  25. package/dist/al/nipt.js.map +1 -1
  26. package/dist/am/tin.d.ts +16 -2
  27. package/dist/am/tin.js +1 -14
  28. package/dist/am/tin.js.map +1 -1
  29. package/dist/ar/cbu.d.ts +2 -2
  30. package/dist/ar/cbu.js +1 -9
  31. package/dist/ar/cbu.js.map +1 -1
  32. package/dist/ar/cuit.d.ts +2 -2
  33. package/dist/ar/cuit.js +1 -17
  34. package/dist/ar/cuit.js.map +1 -1
  35. package/dist/ar/dni.d.ts +11 -2
  36. package/dist/ar/dni.js +1 -9
  37. package/dist/ar/dni.js.map +1 -1
  38. package/dist/at/businessid.d.ts +10 -2
  39. package/dist/at/businessid.js +1 -8
  40. package/dist/at/businessid.js.map +1 -1
  41. package/dist/at/tin.d.ts +2 -2
  42. package/dist/at/tin.js +1 -11
  43. package/dist/at/tin.js.map +1 -1
  44. package/dist/at/uid.d.ts +2 -2
  45. package/dist/at/uid.js +2 -10
  46. package/dist/at/uid.js.map +1 -1
  47. package/dist/at/vnr.d.ts +2 -2
  48. package/dist/at/vnr.js +4 -14
  49. package/dist/at/vnr.js.map +1 -1
  50. package/dist/au/abn.d.ts +2 -2
  51. package/dist/au/abn.js +1 -10
  52. package/dist/au/abn.js.map +1 -1
  53. package/dist/au/acn.d.ts +2 -2
  54. package/dist/au/acn.js +1 -10
  55. package/dist/au/acn.js.map +1 -1
  56. package/dist/au/tfn.d.ts +2 -2
  57. package/dist/au/tfn.js +1 -10
  58. package/dist/au/tfn.js.map +1 -1
  59. package/dist/az/voen.d.ts +2 -2
  60. package/dist/az/voen.js +1 -14
  61. package/dist/az/voen.js.map +1 -1
  62. package/dist/ba/jmbg.d.ts +2 -2
  63. package/dist/ba/jmbg.js +3 -11
  64. package/dist/ba/jmbg.js.map +1 -1
  65. package/dist/bd/nid.d.ts +23 -2
  66. package/dist/bd/nid.js +1 -21
  67. package/dist/bd/nid.js.map +1 -1
  68. package/dist/be/bis.d.ts +2 -2
  69. package/dist/be/bis.js +1 -11
  70. package/dist/be/bis.js.map +1 -1
  71. package/dist/be/nn.d.ts +2 -2
  72. package/dist/be/nn.js +1 -11
  73. package/dist/be/nn.js.map +1 -1
  74. package/dist/be/vat.d.ts +2 -2
  75. package/dist/be/vat.js +1 -9
  76. package/dist/be/vat.js.map +1 -1
  77. package/dist/bg/egn.d.ts +2 -2
  78. package/dist/bg/egn.js +3 -18
  79. package/dist/bg/egn.js.map +1 -1
  80. package/dist/bg/pnf.d.ts +2 -2
  81. package/dist/bg/pnf.js +1 -8
  82. package/dist/bg/pnf.js.map +1 -1
  83. package/dist/bg/vat.d.ts +2 -2
  84. package/dist/bg/vat.js +3 -9
  85. package/dist/bg/vat.js.map +1 -1
  86. package/dist/bh/cpr.d.ts +2 -2
  87. package/dist/bh/cpr.js +1 -17
  88. package/dist/bh/cpr.js.map +1 -1
  89. package/dist/bic.d.ts +13 -2
  90. package/dist/bic.js +1 -11
  91. package/dist/bic.js.map +1 -1
  92. package/dist/br/cnpj.d.ts +2 -2
  93. package/dist/br/cnpj.js +1 -20
  94. package/dist/br/cnpj.js.map +1 -1
  95. package/dist/br/cpf.d.ts +2 -2
  96. package/dist/br/cpf.js +1 -14
  97. package/dist/br/cpf.js.map +1 -1
  98. package/dist/by/unp.d.ts +2 -2
  99. package/dist/by/unp.js +3 -14
  100. package/dist/by/unp.js.map +1 -1
  101. package/dist/bz/tin.d.ts +2 -2
  102. package/dist/bz/tin.js +1 -26
  103. package/dist/bz/tin.js.map +1 -1
  104. package/dist/ca/bn.d.ts +2 -2
  105. package/dist/ca/bn.js +2 -10
  106. package/dist/ca/bn.js.map +1 -1
  107. package/dist/ca/sin.d.ts +2 -2
  108. package/dist/ca/sin.js +2 -10
  109. package/dist/ca/sin.js.map +1 -1
  110. package/dist/ch/ssn.d.ts +2 -2
  111. package/dist/ch/ssn.js +1 -9
  112. package/dist/ch/ssn.js.map +1 -1
  113. package/dist/ch/uid.d.ts +2 -2
  114. package/dist/ch/uid.js +1 -9
  115. package/dist/ch/uid.js.map +1 -1
  116. package/dist/ch/vat.d.ts +2 -2
  117. package/dist/ch/vat.js +1 -9
  118. package/dist/ch/vat.js.map +1 -1
  119. package/dist/cl/rut.d.ts +2 -2
  120. package/dist/cl/rut.js +1 -14
  121. package/dist/cl/rut.js.map +1 -1
  122. package/dist/cn/ric.d.ts +2 -2
  123. package/dist/cn/ric.js +3 -14
  124. package/dist/cn/ric.js.map +1 -1
  125. package/dist/cn/uscc.d.ts +2 -2
  126. package/dist/cn/uscc.js +1 -10
  127. package/dist/cn/uscc.js.map +1 -1
  128. package/dist/co/nit.d.ts +2 -2
  129. package/dist/co/nit.js +2 -12
  130. package/dist/co/nit.js.map +1 -1
  131. package/dist/cr/cpf.d.ts +18 -2
  132. package/dist/cr/cpf.js +1 -16
  133. package/dist/cr/cpf.js.map +1 -1
  134. package/dist/creditcard.d.ts +2 -2
  135. package/dist/creditcard.js +5 -14
  136. package/dist/creditcard.js.map +1 -1
  137. package/dist/cu/ni.d.ts +2 -2
  138. package/dist/cu/ni.js +2 -17
  139. package/dist/cu/ni.js.map +1 -1
  140. package/dist/cy/vat.d.ts +2 -2
  141. package/dist/cy/vat.js +1 -8
  142. package/dist/cy/vat.js.map +1 -1
  143. package/dist/cz/dic.d.ts +2 -2
  144. package/dist/cz/dic.js +7 -13
  145. package/dist/cz/dic.js.map +1 -1
  146. package/dist/cz/ico.d.ts +2 -2
  147. package/dist/cz/ico.js +2 -10
  148. package/dist/cz/ico.js.map +1 -1
  149. package/dist/cz/rc.d.ts +2 -2
  150. package/dist/cz/rc.js +2 -26
  151. package/dist/cz/rc.js.map +1 -1
  152. package/dist/de/handelsreg.d.ts +19 -2
  153. package/dist/de/handelsreg.js +1 -17
  154. package/dist/de/handelsreg.js.map +1 -1
  155. package/dist/de/idnr.d.ts +2 -2
  156. package/dist/de/idnr.js +2 -12
  157. package/dist/de/idnr.js.map +1 -1
  158. package/dist/de/stnr.d.ts +17 -2
  159. package/dist/de/stnr.js +1 -15
  160. package/dist/de/stnr.js.map +1 -1
  161. package/dist/de/svnr.d.ts +2 -2
  162. package/dist/de/svnr.js +2 -11
  163. package/dist/de/svnr.js.map +1 -1
  164. package/dist/de/vat.d.ts +2 -2
  165. package/dist/de/vat.js +2 -11
  166. package/dist/de/vat.js.map +1 -1
  167. package/dist/dk/cpr.d.ts +2 -2
  168. package/dist/dk/cpr.js +2 -10
  169. package/dist/dk/cpr.js.map +1 -1
  170. package/dist/dk/cvr.d.ts +2 -2
  171. package/dist/dk/cvr.js +2 -15
  172. package/dist/dk/cvr.js.map +1 -1
  173. package/dist/dk/vat.d.ts +2 -2
  174. package/dist/dk/vat.js +3 -13
  175. package/dist/dk/vat.js.map +1 -1
  176. package/dist/do/rnc.d.ts +2 -2
  177. package/dist/do/rnc.js +2 -16
  178. package/dist/do/rnc.js.map +1 -1
  179. package/dist/ec/ruc.d.ts +2 -2
  180. package/dist/ec/ruc.js +1 -18
  181. package/dist/ec/ruc.js.map +1 -1
  182. package/dist/ee/ik.d.ts +2 -2
  183. package/dist/ee/ik.js +3 -20
  184. package/dist/ee/ik.js.map +1 -1
  185. package/dist/ee/registrikood.d.ts +2 -2
  186. package/dist/ee/registrikood.js +1 -8
  187. package/dist/ee/registrikood.js.map +1 -1
  188. package/dist/ee/vat.d.ts +2 -2
  189. package/dist/ee/vat.js +2 -10
  190. package/dist/ee/vat.js.map +1 -1
  191. package/dist/eg/tn.d.ts +11 -2
  192. package/dist/eg/tn.js +1 -9
  193. package/dist/eg/tn.js.map +1 -1
  194. package/dist/es/cif.d.ts +2 -2
  195. package/dist/es/cif.js +1 -10
  196. package/dist/es/cif.js.map +1 -1
  197. package/dist/es/dni.d.ts +2 -2
  198. package/dist/es/dni.js +1 -9
  199. package/dist/es/dni.js.map +1 -1
  200. package/dist/es/nie.d.ts +2 -2
  201. package/dist/es/nie.js +1 -9
  202. package/dist/es/nie.js.map +1 -1
  203. package/dist/es/nss.d.ts +2 -2
  204. package/dist/es/nss.js +1 -16
  205. package/dist/es/nss.js.map +1 -1
  206. package/dist/es/vat.d.ts +2 -2
  207. package/dist/es/vat.js +5 -10
  208. package/dist/es/vat.js.map +1 -1
  209. package/dist/eu/vat.d.ts +2 -2
  210. package/dist/eu/vat.js +1 -0
  211. package/dist/eu/vat.js.map +1 -1
  212. package/dist/fi/hetu.d.ts +2 -2
  213. package/dist/fi/hetu.js +2 -10
  214. package/dist/fi/hetu.js.map +1 -1
  215. package/dist/fi/vat.d.ts +2 -2
  216. package/dist/fi/vat.js +3 -10
  217. package/dist/fi/vat.js.map +1 -1
  218. package/dist/fi/ytunnus.d.ts +2 -2
  219. package/dist/fi/ytunnus.js +2 -10
  220. package/dist/fi/ytunnus.js.map +1 -1
  221. package/dist/fr/nif.d.ts +2 -2
  222. package/dist/fr/nif.js +1 -9
  223. package/dist/fr/nif.js.map +1 -1
  224. package/dist/fr/nir.d.ts +2 -2
  225. package/dist/fr/nir.js +2 -14
  226. package/dist/fr/nir.js.map +1 -1
  227. package/dist/fr/siren.d.ts +2 -2
  228. package/dist/fr/siren.js +2 -10
  229. package/dist/fr/siren.js.map +1 -1
  230. package/dist/fr/siret.d.ts +2 -2
  231. package/dist/fr/siret.js +2 -11
  232. package/dist/fr/siret.js.map +1 -1
  233. package/dist/fr/tva.d.ts +2 -2
  234. package/dist/fr/tva.js +2 -12
  235. package/dist/fr/tva.js.map +1 -1
  236. package/dist/gb/nino.d.ts +12 -2
  237. package/dist/gb/nino.js +1 -10
  238. package/dist/gb/nino.js.map +1 -1
  239. package/dist/gb/sedol.d.ts +2 -2
  240. package/dist/gb/sedol.js +1 -11
  241. package/dist/gb/sedol.js.map +1 -1
  242. package/dist/gb/utr.d.ts +2 -2
  243. package/dist/gb/utr.js +2 -10
  244. package/dist/gb/utr.js.map +1 -1
  245. package/dist/gb/vat.d.ts +2 -2
  246. package/dist/gb/vat.js +2 -11
  247. package/dist/gb/vat.js.map +1 -1
  248. package/dist/ge/pin.d.ts +14 -2
  249. package/dist/ge/pin.js +1 -12
  250. package/dist/ge/pin.js.map +1 -1
  251. package/dist/gh/tin.d.ts +2 -2
  252. package/dist/gh/tin.js +1 -15
  253. package/dist/gh/tin.js.map +1 -1
  254. package/dist/gr/amka.d.ts +2 -2
  255. package/dist/gr/amka.js +3 -11
  256. package/dist/gr/amka.js.map +1 -1
  257. package/dist/gr/vat.d.ts +2 -2
  258. package/dist/gr/vat.js +1 -10
  259. package/dist/gr/vat.js.map +1 -1
  260. package/dist/gt/nit.d.ts +2 -2
  261. package/dist/gt/nit.js +1 -12
  262. package/dist/gt/nit.js.map +1 -1
  263. package/dist/hk/hkid.d.ts +2 -2
  264. package/dist/hk/hkid.js +1 -10
  265. package/dist/hk/hkid.js.map +1 -1
  266. package/dist/hr/vat.d.ts +2 -2
  267. package/dist/hr/vat.js +2 -9
  268. package/dist/hr/vat.js.map +1 -1
  269. package/dist/hu/vat.d.ts +2 -2
  270. package/dist/hu/vat.js +3 -10
  271. package/dist/hu/vat.js.map +1 -1
  272. package/dist/iban.d.ts +2 -2
  273. package/dist/iban.js +2 -8
  274. package/dist/iban.js.map +1 -1
  275. package/dist/id/npwp.d.ts +2 -2
  276. package/dist/id/npwp.js +3 -13
  277. package/dist/id/npwp.js.map +1 -1
  278. package/dist/ie/pps.d.ts +2 -2
  279. package/dist/ie/pps.js +1 -10
  280. package/dist/ie/pps.js.map +1 -1
  281. package/dist/ie/vat.d.ts +2 -2
  282. package/dist/ie/vat.js +1 -9
  283. package/dist/ie/vat.js.map +1 -1
  284. package/dist/il/idnr.d.ts +2 -2
  285. package/dist/il/idnr.js +2 -9
  286. package/dist/il/idnr.js.map +1 -1
  287. package/dist/in/aadhaar.d.ts +2 -2
  288. package/dist/in/aadhaar.js +2 -12
  289. package/dist/in/aadhaar.js.map +1 -1
  290. package/dist/in/gstin.d.ts +2 -2
  291. package/dist/in/gstin.js +1 -10
  292. package/dist/in/gstin.js.map +1 -1
  293. package/dist/in/pan.d.ts +15 -2
  294. package/dist/in/pan.js +1 -13
  295. package/dist/in/pan.js.map +1 -1
  296. package/dist/index.d.ts +2 -2
  297. package/dist/index.js +6 -6
  298. package/dist/iq/nid.d.ts +16 -2
  299. package/dist/iq/nid.js +2 -15
  300. package/dist/iq/nid.js.map +1 -1
  301. package/dist/ir/nid.d.ts +2 -2
  302. package/dist/ir/nid.js +2 -24
  303. package/dist/ir/nid.js.map +1 -1
  304. package/dist/is/kennitala.d.ts +2 -2
  305. package/dist/is/kennitala.js +2 -13
  306. package/dist/is/kennitala.js.map +1 -1
  307. package/dist/is/vsk.d.ts +9 -2
  308. package/dist/is/vsk.js +1 -7
  309. package/dist/is/vsk.js.map +1 -1
  310. package/dist/isin.d.ts +2 -2
  311. package/dist/isin.js +2 -12
  312. package/dist/isin.js.map +1 -1
  313. package/dist/it/codicefiscale.d.ts +2 -2
  314. package/dist/it/codicefiscale.js +1 -21
  315. package/dist/it/codicefiscale.js.map +1 -1
  316. package/dist/it/iva.d.ts +2 -2
  317. package/dist/it/iva.js +2 -9
  318. package/dist/it/iva.js.map +1 -1
  319. package/dist/jp/cn.d.ts +2 -2
  320. package/dist/jp/cn.js +1 -9
  321. package/dist/jp/cn.js.map +1 -1
  322. package/dist/jp/mynumber.d.ts +2 -2
  323. package/dist/jp/mynumber.js +1 -10
  324. package/dist/jp/mynumber.js.map +1 -1
  325. package/dist/kr/brn.d.ts +11 -2
  326. package/dist/kr/brn.js +1 -9
  327. package/dist/kr/brn.js.map +1 -1
  328. package/dist/kr/rrn.d.ts +2 -2
  329. package/dist/kr/rrn.js +2 -11
  330. package/dist/kr/rrn.js.map +1 -1
  331. package/dist/kw/civil.d.ts +2 -2
  332. package/dist/kw/civil.js +2 -14
  333. package/dist/kw/civil.js.map +1 -1
  334. package/dist/kz/iin.d.ts +2 -2
  335. package/dist/kz/iin.js +3 -18
  336. package/dist/kz/iin.js.map +1 -1
  337. package/dist/lei.d.ts +2 -2
  338. package/dist/lei.js +2 -11
  339. package/dist/lei.js.map +1 -1
  340. package/dist/li/peid.d.ts +11 -2
  341. package/dist/li/peid.js +1 -9
  342. package/dist/li/peid.js.map +1 -1
  343. package/dist/lk/nic.d.ts +2 -2
  344. package/dist/lk/nic.js +2 -14
  345. package/dist/lk/nic.js.map +1 -1
  346. package/dist/lt/asmens.d.ts +2 -2
  347. package/dist/lt/asmens.js +2 -1
  348. package/dist/lt/asmens.js.map +1 -1
  349. package/dist/lt/vat.d.ts +2 -2
  350. package/dist/lt/vat.js +2 -10
  351. package/dist/lt/vat.js.map +1 -1
  352. package/dist/lu/vat.d.ts +2 -2
  353. package/dist/lu/vat.js +2 -8
  354. package/dist/lu/vat.js.map +1 -1
  355. package/dist/luhn.d.ts +2 -2
  356. package/dist/luhn.js +2 -9
  357. package/dist/luhn.js.map +1 -1
  358. package/dist/lv/vat.d.ts +2 -2
  359. package/dist/lv/vat.js +2 -28
  360. package/dist/lv/vat.js.map +1 -1
  361. package/dist/ma/ice.d.ts +2 -2
  362. package/dist/ma/ice.js +2 -11
  363. package/dist/ma/ice.js.map +1 -1
  364. package/dist/mc/tva.d.ts +2 -2
  365. package/dist/mc/tva.js +1 -0
  366. package/dist/mc/tva.js.map +1 -1
  367. package/dist/md/idno.d.ts +2 -2
  368. package/dist/md/idno.js +1 -10
  369. package/dist/md/idno.js.map +1 -1
  370. package/dist/me/pib.d.ts +2 -2
  371. package/dist/me/pib.js +2 -10
  372. package/dist/me/pib.js.map +1 -1
  373. package/dist/mk/edb.d.ts +2 -2
  374. package/dist/mk/edb.js +2 -11
  375. package/dist/mk/edb.js.map +1 -1
  376. package/dist/mt/vat.d.ts +2 -2
  377. package/dist/mt/vat.js +3 -10
  378. package/dist/mt/vat.js.map +1 -1
  379. package/dist/mu/brn.d.ts +23 -2
  380. package/dist/mu/brn.js +1 -21
  381. package/dist/mu/brn.js.map +1 -1
  382. package/dist/mx/clabe.d.ts +2 -2
  383. package/dist/mx/clabe.js +1 -14
  384. package/dist/mx/clabe.js.map +1 -1
  385. package/dist/mx/curp.d.ts +2 -2
  386. package/dist/mx/curp.js +3 -17
  387. package/dist/mx/curp.js.map +1 -1
  388. package/dist/mx/rfc.d.ts +2 -2
  389. package/dist/mx/rfc.js +3 -19
  390. package/dist/mx/rfc.js.map +1 -1
  391. package/dist/my/nric.d.ts +2 -2
  392. package/dist/my/nric.js +2 -14
  393. package/dist/my/nric.js.map +1 -1
  394. package/dist/ng/nin.d.ts +13 -2
  395. package/dist/ng/nin.js +1 -11
  396. package/dist/ng/nin.js.map +1 -1
  397. package/dist/ni/ruc.d.ts +2 -2
  398. package/dist/ni/ruc.js +1 -23
  399. package/dist/ni/ruc.js.map +1 -1
  400. package/dist/nl/bsn.d.ts +2 -2
  401. package/dist/nl/bsn.js +2 -10
  402. package/dist/nl/bsn.js.map +1 -1
  403. package/dist/nl/kvk.d.ts +9 -2
  404. package/dist/nl/kvk.js +1 -7
  405. package/dist/nl/kvk.js.map +1 -1
  406. package/dist/nl/vat.d.ts +2 -2
  407. package/dist/nl/vat.js +1 -13
  408. package/dist/nl/vat.js.map +1 -1
  409. package/dist/no/fodselsnummer.d.ts +2 -2
  410. package/dist/no/fodselsnummer.js +2 -10
  411. package/dist/no/fodselsnummer.js.map +1 -1
  412. package/dist/no/mva.d.ts +2 -2
  413. package/dist/no/mva.js +1 -8
  414. package/dist/no/mva.js.map +1 -1
  415. package/dist/no/orgnr.d.ts +2 -2
  416. package/dist/no/orgnr.js +2 -8
  417. package/dist/no/orgnr.js.map +1 -1
  418. package/dist/nz/ird.d.ts +2 -2
  419. package/dist/nz/ird.js +2 -11
  420. package/dist/nz/ird.js.map +1 -1
  421. package/dist/pa/ruc.d.ts +2 -2
  422. package/dist/pa/ruc.js +1 -18
  423. package/dist/pa/ruc.js.map +1 -1
  424. package/dist/patterns.d.ts +8 -7
  425. package/dist/patterns.js +3 -5
  426. package/dist/patterns.js.map +1 -1
  427. package/dist/pe/ruc.d.ts +2 -2
  428. package/dist/pe/ruc.js +1 -15
  429. package/dist/pe/ruc.js.map +1 -1
  430. package/dist/ph/philid.d.ts +14 -2
  431. package/dist/ph/philid.js +1 -12
  432. package/dist/ph/philid.js.map +1 -1
  433. package/dist/pk/cnic.d.ts +14 -2
  434. package/dist/pk/cnic.js +1 -12
  435. package/dist/pk/cnic.js.map +1 -1
  436. package/dist/pl/nip.d.ts +2 -2
  437. package/dist/pl/nip.js +2 -10
  438. package/dist/pl/nip.js.map +1 -1
  439. package/dist/pl/pesel.d.ts +2 -2
  440. package/dist/pl/pesel.js +3 -13
  441. package/dist/pl/pesel.js.map +1 -1
  442. package/dist/pl/regon.d.ts +2 -2
  443. package/dist/pl/regon.js +2 -11
  444. package/dist/pl/regon.js.map +1 -1
  445. package/dist/pt/cc.d.ts +2 -2
  446. package/dist/pt/cc.js +1 -9
  447. package/dist/pt/cc.js.map +1 -1
  448. package/dist/pt/vat.d.ts +2 -2
  449. package/dist/pt/vat.js +3 -11
  450. package/dist/pt/vat.js.map +1 -1
  451. package/dist/ro/cnp.d.ts +2 -2
  452. package/dist/ro/cnp.js +4 -14
  453. package/dist/ro/cnp.js.map +1 -1
  454. package/dist/ro/vat.d.ts +2 -2
  455. package/dist/ro/vat.js +13 -11
  456. package/dist/ro/vat.js.map +1 -1
  457. package/dist/rs/pib.d.ts +2 -2
  458. package/dist/rs/pib.js +1 -9
  459. package/dist/rs/pib.js.map +1 -1
  460. package/dist/ru/inn.d.ts +2 -2
  461. package/dist/ru/inn.js +1 -11
  462. package/dist/ru/inn.js.map +1 -1
  463. package/dist/se/orgnr.d.ts +2 -2
  464. package/dist/se/orgnr.js +2 -9
  465. package/dist/se/orgnr.js.map +1 -1
  466. package/dist/se/personnummer.d.ts +2 -2
  467. package/dist/se/personnummer.js +7 -15
  468. package/dist/se/personnummer.js.map +1 -1
  469. package/dist/se/vat.d.ts +2 -2
  470. package/dist/se/vat.js +3 -10
  471. package/dist/se/vat.js.map +1 -1
  472. package/dist/sg/uen.d.ts +2 -2
  473. package/dist/sg/uen.js +1 -15
  474. package/dist/sg/uen.js.map +1 -1
  475. package/dist/si/emso.d.ts +2 -2
  476. package/dist/si/emso.js +3 -18
  477. package/dist/si/emso.js.map +1 -1
  478. package/dist/si/vat.d.ts +2 -2
  479. package/dist/si/vat.js +3 -12
  480. package/dist/si/vat.js.map +1 -1
  481. package/dist/sk/dic.d.ts +2 -2
  482. package/dist/sk/dic.js +1 -0
  483. package/dist/sk/dic.js.map +1 -1
  484. package/dist/sk/ico.d.ts +2 -2
  485. package/dist/sk/ico.js +1 -0
  486. package/dist/sk/ico.js.map +1 -1
  487. package/dist/sk/rc.d.ts +2 -2
  488. package/dist/sk/rc.js +1 -0
  489. package/dist/sk/rc.js.map +1 -1
  490. package/dist/th/tin.d.ts +2 -2
  491. package/dist/th/tin.js +1 -11
  492. package/dist/th/tin.js.map +1 -1
  493. package/dist/tr/tckimlik.d.ts +2 -2
  494. package/dist/tr/tckimlik.js +1 -20
  495. package/dist/tr/tckimlik.js.map +1 -1
  496. package/dist/tr/vkn.d.ts +2 -2
  497. package/dist/tr/vkn.js +1 -20
  498. package/dist/tr/vkn.js.map +1 -1
  499. package/dist/tw/ubn.d.ts +2 -2
  500. package/dist/tw/ubn.js +1 -11
  501. package/dist/tw/ubn.js.map +1 -1
  502. package/dist/types.d.ts +26 -4
  503. package/dist/ua/edrpou.d.ts +2 -2
  504. package/dist/ua/edrpou.js +1 -11
  505. package/dist/ua/edrpou.js.map +1 -1
  506. package/dist/us/ein.d.ts +12 -2
  507. package/dist/us/ein.js +1 -10
  508. package/dist/us/ein.js.map +1 -1
  509. package/dist/us/itin.d.ts +13 -2
  510. package/dist/us/itin.js +1 -11
  511. package/dist/us/itin.js.map +1 -1
  512. package/dist/us/rtn.d.ts +2 -2
  513. package/dist/us/rtn.js +3 -18
  514. package/dist/us/rtn.js.map +1 -1
  515. package/dist/us/ssn.d.ts +13 -2
  516. package/dist/us/ssn.js +1 -11
  517. package/dist/us/ssn.js.map +1 -1
  518. package/dist/uy/rut.d.ts +2 -2
  519. package/dist/uy/rut.js +1 -14
  520. package/dist/uy/rut.js.map +1 -1
  521. package/dist/ve/rif.d.ts +2 -2
  522. package/dist/ve/rif.js +2 -15
  523. package/dist/ve/rif.js.map +1 -1
  524. package/dist/vn/mst.d.ts +2 -2
  525. package/dist/vn/mst.js +1 -12
  526. package/dist/vn/mst.js.map +1 -1
  527. package/dist/za/idnr.d.ts +2 -2
  528. package/dist/za/idnr.js +3 -16
  529. package/dist/za/idnr.js.map +1 -1
  530. package/package.json +22 -12
  531. package/src/_checksums/mod1110.ts +1 -1
  532. package/src/ad/nrt.ts +7 -3
  533. package/src/ae/eid.ts +7 -3
  534. package/src/ai/tin.ts +7 -3
  535. package/src/al/nipt.ts +7 -3
  536. package/src/am/tin.ts +7 -3
  537. package/src/ar/cbu.ts +7 -3
  538. package/src/ar/cuit.ts +7 -3
  539. package/src/ar/dni.ts +7 -3
  540. package/src/at/businessid.ts +7 -3
  541. package/src/at/tin.ts +7 -3
  542. package/src/at/uid.ts +7 -3
  543. package/src/at/vnr.ts +37 -9
  544. package/src/au/abn.ts +7 -3
  545. package/src/au/acn.ts +7 -3
  546. package/src/au/tfn.ts +7 -3
  547. package/src/az/voen.ts +7 -3
  548. package/src/ba/jmbg.ts +8 -7
  549. package/src/bd/nid.ts +7 -3
  550. package/src/be/bis.ts +8 -4
  551. package/src/be/nn.ts +7 -3
  552. package/src/be/vat.ts +7 -3
  553. package/src/bg/egn.ts +8 -7
  554. package/src/bg/pnf.ts +7 -3
  555. package/src/bg/vat.ts +8 -3
  556. package/src/bh/cpr.ts +7 -3
  557. package/src/bic.ts +7 -3
  558. package/src/br/cnpj.ts +7 -3
  559. package/src/br/cpf.ts +7 -3
  560. package/src/by/unp.ts +10 -5
  561. package/src/bz/tin.ts +7 -3
  562. package/src/ca/bn.ts +7 -3
  563. package/src/ca/sin.ts +7 -3
  564. package/src/ch/ssn.ts +7 -3
  565. package/src/ch/uid.ts +7 -3
  566. package/src/ch/vat.ts +9 -5
  567. package/src/cl/rut.ts +7 -3
  568. package/src/cn/ric.ts +8 -7
  569. package/src/cn/uscc.ts +7 -3
  570. package/src/co/nit.ts +8 -4
  571. package/src/cr/cpf.ts +7 -3
  572. package/src/creditcard.ts +10 -6
  573. package/src/cu/ni.ts +8 -7
  574. package/src/cy/vat.ts +7 -3
  575. package/src/cz/dic.ts +9 -4
  576. package/src/cz/ico.ts +7 -3
  577. package/src/cz/rc.ts +8 -7
  578. package/src/de/handelsreg.ts +7 -3
  579. package/src/de/idnr.ts +7 -3
  580. package/src/de/stnr.ts +7 -3
  581. package/src/de/svnr.ts +7 -3
  582. package/src/de/vat.ts +7 -3
  583. package/src/dk/cpr.ts +8 -7
  584. package/src/dk/cvr.ts +7 -3
  585. package/src/dk/vat.ts +8 -3
  586. package/src/do/rnc.ts +7 -3
  587. package/src/ec/ruc.ts +7 -3
  588. package/src/ee/ik.ts +8 -7
  589. package/src/ee/registrikood.ts +8 -4
  590. package/src/ee/vat.ts +7 -3
  591. package/src/eg/tn.ts +7 -3
  592. package/src/es/cif.ts +8 -4
  593. package/src/es/dni.ts +7 -3
  594. package/src/es/nie.ts +8 -4
  595. package/src/es/nss.ts +7 -3
  596. package/src/es/vat.ts +13 -5
  597. package/src/eu/vat.ts +10 -6
  598. package/src/fi/hetu.ts +8 -7
  599. package/src/fi/vat.ts +8 -3
  600. package/src/fi/ytunnus.ts +7 -3
  601. package/src/fr/nif.ts +7 -3
  602. package/src/fr/nir.ts +8 -7
  603. package/src/fr/siren.ts +7 -3
  604. package/src/fr/siret.ts +7 -3
  605. package/src/fr/tva.ts +7 -3
  606. package/src/gb/nino.ts +7 -3
  607. package/src/gb/sedol.ts +7 -3
  608. package/src/gb/utr.ts +7 -3
  609. package/src/gb/vat.ts +7 -3
  610. package/src/ge/pin.ts +7 -3
  611. package/src/gh/tin.ts +7 -3
  612. package/src/gr/amka.ts +7 -3
  613. package/src/gr/vat.ts +7 -3
  614. package/src/gt/nit.ts +7 -3
  615. package/src/hk/hkid.ts +7 -3
  616. package/src/hr/vat.ts +7 -3
  617. package/src/hu/vat.ts +8 -3
  618. package/src/iban.ts +7 -3
  619. package/src/id/npwp.ts +7 -3
  620. package/src/ie/pps.ts +7 -3
  621. package/src/ie/vat.ts +7 -3
  622. package/src/il/idnr.ts +7 -3
  623. package/src/in/aadhaar.ts +7 -3
  624. package/src/in/gstin.ts +7 -3
  625. package/src/in/pan.ts +7 -3
  626. package/src/index.ts +3 -0
  627. package/src/iq/nid.ts +7 -3
  628. package/src/ir/nid.ts +7 -3
  629. package/src/is/kennitala.ts +7 -3
  630. package/src/is/vsk.ts +7 -3
  631. package/src/isin.ts +7 -3
  632. package/src/it/codicefiscale.ts +11 -7
  633. package/src/it/iva.ts +7 -3
  634. package/src/jp/cn.ts +7 -3
  635. package/src/jp/mynumber.ts +7 -3
  636. package/src/kr/brn.ts +7 -3
  637. package/src/kr/rrn.ts +8 -7
  638. package/src/kw/civil.ts +8 -7
  639. package/src/kz/iin.ts +8 -8
  640. package/src/lei.ts +7 -3
  641. package/src/li/peid.ts +7 -3
  642. package/src/lk/nic.ts +8 -7
  643. package/src/lt/asmens.ts +8 -4
  644. package/src/lt/vat.ts +8 -3
  645. package/src/lu/vat.ts +8 -3
  646. package/src/luhn.ts +7 -3
  647. package/src/lv/vat.ts +7 -3
  648. package/src/ma/ice.ts +7 -3
  649. package/src/mc/tva.ts +9 -5
  650. package/src/md/idno.ts +7 -3
  651. package/src/me/pib.ts +7 -3
  652. package/src/mk/edb.ts +7 -3
  653. package/src/mt/vat.ts +8 -3
  654. package/src/mu/brn.ts +7 -3
  655. package/src/mx/clabe.ts +7 -3
  656. package/src/mx/curp.ts +9 -8
  657. package/src/mx/rfc.ts +8 -4
  658. package/src/my/nric.ts +8 -7
  659. package/src/ng/nin.ts +7 -3
  660. package/src/ni/ruc.ts +7 -3
  661. package/src/nl/bsn.ts +7 -3
  662. package/src/nl/kvk.ts +7 -3
  663. package/src/nl/vat.ts +7 -3
  664. package/src/no/fodselsnummer.ts +11 -7
  665. package/src/no/mva.ts +9 -5
  666. package/src/no/orgnr.ts +7 -3
  667. package/src/nz/ird.ts +8 -4
  668. package/src/pa/ruc.ts +7 -3
  669. package/src/patterns.ts +49 -18
  670. package/src/pe/ruc.ts +7 -3
  671. package/src/ph/philid.ts +7 -3
  672. package/src/pk/cnic.ts +7 -3
  673. package/src/pl/nip.ts +7 -3
  674. package/src/pl/pesel.ts +8 -7
  675. package/src/pl/regon.ts +7 -3
  676. package/src/pt/cc.ts +7 -3
  677. package/src/pt/vat.ts +8 -3
  678. package/src/ro/cnp.ts +15 -8
  679. package/src/ro/vat.ts +8 -3
  680. package/src/rs/pib.ts +7 -3
  681. package/src/ru/inn.ts +7 -3
  682. package/src/se/orgnr.ts +7 -3
  683. package/src/se/personnummer.ts +35 -33
  684. package/src/se/vat.ts +8 -3
  685. package/src/sg/uen.ts +7 -3
  686. package/src/si/emso.ts +8 -7
  687. package/src/si/vat.ts +8 -3
  688. package/src/sk/dic.ts +8 -4
  689. package/src/sk/ico.ts +3 -2
  690. package/src/sk/rc.ts +6 -2
  691. package/src/th/tin.ts +7 -3
  692. package/src/tr/tckimlik.ts +7 -3
  693. package/src/tr/vkn.ts +7 -3
  694. package/src/tw/ubn.ts +7 -3
  695. package/src/types.ts +34 -3
  696. package/src/ua/edrpou.ts +7 -3
  697. package/src/us/ein.ts +7 -3
  698. package/src/us/itin.ts +7 -3
  699. package/src/us/rtn.ts +16 -8
  700. package/src/us/ssn.ts +7 -3
  701. package/src/uy/rut.ts +7 -3
  702. package/src/ve/rif.ts +8 -6
  703. package/src/vn/mst.ts +7 -3
  704. package/src/za/idnr.ts +8 -7
@@ -1 +1 @@
1
- {"version":3,"file":"nino.js","names":[],"sources":["../../src/gb/nino.ts"],"sourcesContent":["const NINO_VALID_FIRST = \"ABCEGHJKLMNOPRSTWXYZ\";\nconst NINO_VALID_SECOND = \"ABCEGHJKLMNPRSTWXYZ\";\nconst NINO_SUFFIXES = \"ABCD\";\n\n/** Generate a random valid UK NINO. */\nconst generate = (): string => {\n let first: string;\n let second: string;\n let prefix: string;\n do {\n first = randomChar(NINO_VALID_FIRST);\n second = randomChar(NINO_VALID_SECOND);\n prefix = first + second;\n } while (INVALID_PREFIX.has(prefix));\n const digits = randomDigits(6);\n const suffix = randomChar(NINO_SUFFIXES);\n return `${prefix}${digits}${suffix}`;\n};\n\n/**\n * NINO (National Insurance Number).\n *\n * UK National Insurance Number. Format: 2 letters\n * + 6 digits + 1 suffix letter (A, B, C, or D).\n * Validated by format and prefix rules only; there\n * is no checksum.\n *\n * @see https://www.gov.uk/hmrc-internal-manuals/national-insurance-manual/nim39110\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomChar, randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst INVALID_FIRST = new Set([\n \"D\",\n \"F\",\n \"I\",\n \"Q\",\n \"U\",\n \"V\",\n]);\n\nconst INVALID_SECOND = new Set([\n \"D\",\n \"F\",\n \"I\",\n \"O\",\n \"Q\",\n \"U\",\n \"V\",\n]);\n\nconst INVALID_PREFIX = new Set([\n \"BG\",\n \"GB\",\n \"NK\",\n \"KN\",\n \"TN\",\n \"NT\",\n \"ZZ\",\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 \"UK NINO must be 9 characters\",\n );\n }\n\n if (!/^[A-Z]{2}\\d{6}[A-D]$/.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"UK NINO must be 2 letters, 6 digits, \" +\n \"then A/B/C/D\",\n );\n }\n\n // SAFETY: regex above guarantees v.length === 9.\n // eslint-disable-next-line no-non-null-assertion\n const first = v[0]!;\n // eslint-disable-next-line no-non-null-assertion\n const second = v[1]!;\n const prefix = v.slice(0, 2);\n\n if (INVALID_FIRST.has(first)) {\n return err(\n \"INVALID_COMPONENT\",\n `UK NINO first letter cannot be ${first}`,\n );\n }\n\n if (INVALID_SECOND.has(second)) {\n return err(\n \"INVALID_COMPONENT\",\n `UK NINO second letter cannot be ${second}`,\n );\n }\n\n if (INVALID_PREFIX.has(prefix)) {\n return err(\n \"INVALID_COMPONENT\",\n `UK NINO prefix ${prefix} is not allowed`,\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return (\n `${v.slice(0, 2)} ${v.slice(2, 4)}` +\n ` ${v.slice(4, 6)} ${v.slice(6, 8)}` +\n ` ${v.slice(8)}`\n );\n};\n\n/** UK National Insurance Number. */\nconst nino: Validator = {\n name: \"UK National Insurance Number\",\n localName: \"National Insurance Number\",\n abbreviation: \"NINO\",\n aliases: [\n \"National Insurance number\",\n \"NINO\",\n \"NI number\",\n ] as const,\n candidatePattern: \"[A-Z]{2}\\\\d{6}[A-Z]\",\n country: \"GB\",\n entityType: \"person\",\n description:\n \"UK National Insurance Number for tax \" +\n \"and benefits\",\n sourceUrl:\n \"https://www.gov.uk/hmrc-internal-manuals/\" +\n \"national-insurance-manual/nim39110\",\n lengths: [9] as const,\n examples: [\"AB123456C\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nino;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;AAAA,MAAM,mBAAmB;AACzB,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;;AAGtB,MAAM,iBAAyB;CAC7B,IAAI;CACJ,IAAI;CACJ,IAAI;AACJ,IAAG;AACD,UAAQ,WAAW,iBAAiB;AACpC,WAAS,WAAW,kBAAkB;AACtC,WAAS,QAAQ;UACV,eAAe,IAAI,OAAO;CACnC,MAAM,SAAS,aAAa,EAAE;CAC9B,MAAM,SAAS,WAAW,cAAc;AACxC,QAAO,GAAG,SAAS,SAAS;;AAoB9B,MAAM,gBAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,iBAAiB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,iBAAiB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,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,+BACD;AAGH,KAAI,CAAC,uBAAuB,KAAK,EAAE,CACjC,QAAO,IACL,kBACA,oDAED;CAKH,MAAM,QAAQ,EAAE;CAEhB,MAAM,SAAS,EAAE;CACjB,MAAM,SAAS,EAAE,MAAM,GAAG,EAAE;AAE5B,KAAI,cAAc,IAAI,MAAM,CAC1B,QAAO,IACL,qBACA,kCAAkC,QACnC;AAGH,KAAI,eAAe,IAAI,OAAO,CAC5B,QAAO,IACL,qBACA,mCAAmC,SACpC;AAGH,KAAI,eAAe,IAAI,OAAO,CAC5B,QAAO,IACL,qBACA,kBAAkB,OAAO,iBAC1B;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QACE,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAA,GAC7B,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAA,GAC9B,EAAE,MAAM,EAAE;;;AAKlB,MAAM,OAAkB;CACtB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,aACE;CAEF,WACE;CAEF,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,YAAY;CACvB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"nino.js","names":[],"sources":["../../src/gb/nino.ts"],"sourcesContent":["const NINO_VALID_FIRST = \"ABCEGHJKLMNOPRSTWXYZ\";\nconst NINO_VALID_SECOND = \"ABCEGHJKLMNPRSTWXYZ\";\nconst NINO_SUFFIXES = \"ABCD\";\n\n/** Generate a random valid UK NINO. */\nconst generate = (): string => {\n let first: string;\n let second: string;\n let prefix: string;\n do {\n first = randomChar(NINO_VALID_FIRST);\n second = randomChar(NINO_VALID_SECOND);\n prefix = first + second;\n } while (INVALID_PREFIX.has(prefix));\n const digits = randomDigits(6);\n const suffix = randomChar(NINO_SUFFIXES);\n return `${prefix}${digits}${suffix}`;\n};\n\n/**\n * NINO (National Insurance Number).\n *\n * UK National Insurance Number. Format: 2 letters\n * + 6 digits + 1 suffix letter (A, B, C, or D).\n * Validated by format and prefix rules only; there\n * is no checksum.\n *\n * @see https://www.gov.uk/hmrc-internal-manuals/national-insurance-manual/nim39110\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomChar, randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nconst INVALID_FIRST = new Set([\n \"D\",\n \"F\",\n \"I\",\n \"Q\",\n \"U\",\n \"V\",\n]);\n\nconst INVALID_SECOND = new Set([\n \"D\",\n \"F\",\n \"I\",\n \"O\",\n \"Q\",\n \"U\",\n \"V\",\n]);\n\nconst INVALID_PREFIX = new Set([\n \"BG\",\n \"GB\",\n \"NK\",\n \"KN\",\n \"TN\",\n \"NT\",\n \"ZZ\",\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 \"UK NINO must be 9 characters\",\n );\n }\n\n if (!/^[A-Z]{2}\\d{6}[A-D]$/.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"UK NINO must be 2 letters, 6 digits, \" +\n \"then A/B/C/D\",\n );\n }\n\n // SAFETY: regex above guarantees v.length === 9.\n // eslint-disable-next-line no-non-null-assertion\n const first = v[0]!;\n // eslint-disable-next-line no-non-null-assertion\n const second = v[1]!;\n const prefix = v.slice(0, 2);\n\n if (INVALID_FIRST.has(first)) {\n return err(\n \"INVALID_COMPONENT\",\n `UK NINO first letter cannot be ${first}`,\n );\n }\n\n if (INVALID_SECOND.has(second)) {\n return err(\n \"INVALID_COMPONENT\",\n `UK NINO second letter cannot be ${second}`,\n );\n }\n\n if (INVALID_PREFIX.has(prefix)) {\n return err(\n \"INVALID_COMPONENT\",\n `UK NINO prefix ${prefix} is not allowed`,\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return (\n `${v.slice(0, 2)} ${v.slice(2, 4)}` +\n ` ${v.slice(4, 6)} ${v.slice(6, 8)}` +\n ` ${v.slice(8)}`\n );\n};\n\n/** UK National Insurance Number. */\nconst nino: CountryValidator<\"GB\"> = {\n name: \"UK National Insurance Number\",\n localName: \"National Insurance Number\",\n abbreviation: \"NINO\",\n aliases: [\n \"National Insurance number\",\n \"NINO\",\n \"NI number\",\n ] as const,\n candidatePattern: \"[A-Z]{2}\\\\d{6}[A-Z]\",\n scope: \"country\",\n country: \"GB\",\n entityType: \"person\",\n description:\n \"UK National Insurance Number for tax \" +\n \"and benefits\",\n sourceUrl:\n \"https://www.gov.uk/hmrc-internal-manuals/\" +\n \"national-insurance-manual/nim39110\",\n lengths: [9] as const,\n examples: [\"AB123456C\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nino;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;AAAA,MAAM,mBAAmB;AACzB,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;;AAGtB,MAAM,iBAAyB;CAC7B,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,GAAG;EACD,QAAQ,WAAW,gBAAgB;EACnC,SAAS,WAAW,iBAAiB;EACrC,SAAS,QAAQ;CACnB,SAAS,eAAe,IAAI,MAAM;CAClC,MAAM,SAAS,aAAa,CAAC;CAC7B,MAAM,SAAS,WAAW,aAAa;CACvC,OAAO,GAAG,SAAS,SAAS;AAC9B;AAsBA,MAAM,gBAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,iBAAiB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,iBAAiB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,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,8BACF;CAGF,IAAI,CAAC,uBAAuB,KAAK,CAAC,GAChC,OAAO,IACL,kBACA,mDAEF;CAKF,MAAM,QAAQ,EAAE;CAEhB,MAAM,SAAS,EAAE;CACjB,MAAM,SAAS,EAAE,MAAM,GAAG,CAAC;CAE3B,IAAI,cAAc,IAAI,KAAK,GACzB,OAAO,IACL,qBACA,kCAAkC,OACpC;CAGF,IAAI,eAAe,IAAI,MAAM,GAC3B,OAAO,IACL,qBACA,mCAAmC,QACrC;CAGF,IAAI,eAAe,IAAI,MAAM,GAC3B,OAAO,IACL,qBACA,kBAAkB,OAAO,gBAC3B;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OACE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAA,GAC5B,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAA,GAC7B,EAAE,MAAM,CAAC;AAEjB;;AAGA,MAAM,OAA+B;CACnC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aACE;CAEF,WACE;CAEF,SAAS,CAAC,CAAC;CACX,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;AACF"}
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/gb/sedol.d.ts
4
4
  declare const calcCheckDigit: (number: string) => string;
@@ -8,7 +8,7 @@ declare const format: (value: string) => string;
8
8
  /** Generate a random valid SEDOL. */
9
9
  declare const generate: () => string;
10
10
  /** Stock Exchange Daily Official List number. */
11
- declare const sedol: Validator;
11
+ declare const sedol: CountryValidator<"GB">;
12
12
  //#endregion
13
13
  export { calcCheckDigit, compact, sedol as default, format, generate, validate };
14
14
  //# sourceMappingURL=sedol.d.ts.map
package/dist/gb/sedol.js CHANGED
@@ -4,17 +4,6 @@ import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/gb/sedol.ts
6
6
  /**
7
- * SEDOL (Stock Exchange Daily Official List number).
8
- *
9
- * 7-character security identifier used in the UK and
10
- * Ireland, assigned by the London Stock Exchange.
11
- * Consists of 6 alphanumeric characters (vowels
12
- * excluded) followed by a weighted mod-10 check
13
- * digit.
14
- *
15
- * @see https://en.wikipedia.org/wiki/SEDOL
16
- */
17
- /**
18
7
  * Allowed characters in a SEDOL: digits and
19
8
  * consonants only (vowels are never used).
20
9
  * Spaces occupy vowel positions (A=10, E=14,
@@ -70,6 +59,7 @@ const sedol = {
70
59
  abbreviation: "SEDOL",
71
60
  aliases: ["SEDOL", "Stock Exchange Daily Official List"],
72
61
  candidatePattern: "[B-DF-HJ-NP-TV-Z0-9]{6}\\d",
62
+ scope: "country",
73
63
  country: "GB",
74
64
  entityType: "any",
75
65
  sourceUrl: "https://en.wikipedia.org/wiki/SEDOL",
@@ -1 +1 @@
1
- {"version":3,"file":"sedol.js","names":[],"sources":["../../src/gb/sedol.ts"],"sourcesContent":["/**\n * SEDOL (Stock Exchange Daily Official List number).\n *\n * 7-character security identifier used in the UK and\n * Ireland, assigned by the London Stock Exchange.\n * Consists of 6 alphanumeric characters (vowels\n * excluded) followed by a weighted mod-10 check\n * digit.\n *\n * @see https://en.wikipedia.org/wiki/SEDOL\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomChar } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\n/**\n * Allowed characters in a SEDOL: digits and\n * consonants only (vowels are never used).\n * Spaces occupy vowel positions (A=10, E=14,\n * I=18, O=24, U=30) so that indexOf returns\n * the correct SEDOL weight for each consonant.\n */\nconst ALPHABET = \"0123456789 BCD FGH JKLMN PQRST VWXYZ\";\n\nconst WEIGHTS = [1, 3, 1, 7, 3, 9] as const;\n\nconst calcCheckDigit = (number: string): string => {\n if (number.length !== 6) {\n throw new Error(\n \"calcCheckDigit requires a 6-character \" +\n \"SEDOL prefix\",\n );\n }\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n const ch = number[i];\n if (ch === undefined) continue;\n const val = ALPHABET.indexOf(ch);\n if (val < 0) {\n throw new Error(`Invalid SEDOL character: ${ch}`);\n }\n sum += weight * val;\n }\n return String((10 - (sum % 10)) % 10);\n};\n\nconst compact = (value: string): string =>\n clean(value, \" \").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 7) {\n return err(\n \"INVALID_LENGTH\",\n \"SEDOL must be exactly 7 characters\",\n );\n }\n\n for (const ch of v) {\n if (!ALPHABET.includes(ch)) {\n return err(\n \"INVALID_FORMAT\",\n \"SEDOL contains invalid character: \" +\n \"vowels are not allowed\",\n );\n }\n }\n\n // Old-style SEDOLs are fully numeric; new-style\n // SEDOLs start with a letter. A number that starts\n // with a digit but contains letters is invalid.\n // SAFETY: v.length === 7 here.\n // eslint-disable-next-line no-non-null-assertion\n if (isdigits(v[0]!) && !isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Numeric-prefix SEDOL must be fully \" +\n \"numeric (old-style)\",\n );\n }\n\n if (calcCheckDigit(v.slice(0, 6)) !== v[6]) {\n return err(\n \"INVALID_CHECKSUM\",\n \"SEDOL check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\nconst SEDOL_CONSONANTS = \"BCDFGHJKLMNPQRSTVWXYZ\";\nconst SEDOL_CHARS = \"0123456789BCDFGHJKLMNPQRSTVWXYZ\";\n\n/** Generate a random valid SEDOL. */\nconst generate = (): string => {\n let payload = randomChar(SEDOL_CONSONANTS);\n for (let i = 1; i < 6; i++) {\n payload += randomChar(SEDOL_CHARS);\n }\n return payload + calcCheckDigit(payload);\n};\n\n/** Stock Exchange Daily Official List number. */\nconst sedol: Validator = {\n name: \"Stock Exchange Daily Official List number\",\n localName: \"Stock Exchange Daily Official List number\",\n abbreviation: \"SEDOL\",\n aliases: [\n \"SEDOL\",\n \"Stock Exchange Daily Official List\",\n ] as const,\n candidatePattern: \"[B-DF-HJ-NP-TV-Z0-9]{6}\\\\d\",\n country: \"GB\",\n entityType: \"any\",\n sourceUrl: \"https://en.wikipedia.org/wiki/SEDOL\",\n lengths: [7] as const,\n examples: [\"B15KXQ8\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default sedol;\nexport {\n calcCheckDigit,\n compact,\n format,\n validate,\n generate,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAM,WAAW;AAEjB,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAElC,MAAM,kBAAkB,WAA2B;AACjD,KAAI,OAAO,WAAW,EACpB,OAAM,IAAI,MACR,qDAED;CAEH,IAAI,MAAM;AACV,MAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,SAAS,EAAE;EAC3C,MAAM,KAAK,OAAO;AAClB,MAAI,OAAO,KAAA,EAAW;EACtB,MAAM,MAAM,SAAS,QAAQ,GAAG;AAChC,MAAI,MAAM,EACR,OAAM,IAAI,MAAM,4BAA4B,KAAK;AAEnD,SAAO,SAAS;;AAElB,QAAO,QAAQ,KAAM,MAAM,MAAO,GAAG;;AAGvC,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,CAAC,aAAa;AAEjC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,qCACD;AAGH,MAAK,MAAM,MAAM,EACf,KAAI,CAAC,SAAS,SAAS,GAAG,CACxB,QAAO,IACL,kBACA,2DAED;AASL,KAAI,SAAS,EAAE,GAAI,IAAI,CAAC,SAAS,EAAE,CACjC,QAAO,IACL,kBACA,yDAED;AAGH,KAAI,eAAe,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,GACtC,QAAO,IACL,oBACA,6BACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;AAExD,MAAM,mBAAmB;AACzB,MAAM,cAAc;;AAGpB,MAAM,iBAAyB;CAC7B,IAAI,UAAU,WAAW,iBAAiB;AAC1C,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,YAAW,WAAW,YAAY;AAEpC,QAAO,UAAU,eAAe,QAAQ;;;AAI1C,MAAM,QAAmB;CACvB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CACP,SACA,qCACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,UAAU;CACrB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"sedol.js","names":[],"sources":["../../src/gb/sedol.ts"],"sourcesContent":["/**\n * SEDOL (Stock Exchange Daily Official List number).\n *\n * 7-character security identifier used in the UK and\n * Ireland, assigned by the London Stock Exchange.\n * Consists of 6 alphanumeric characters (vowels\n * excluded) followed by a weighted mod-10 check\n * digit.\n *\n * @see https://en.wikipedia.org/wiki/SEDOL\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomChar } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\n/**\n * Allowed characters in a SEDOL: digits and\n * consonants only (vowels are never used).\n * Spaces occupy vowel positions (A=10, E=14,\n * I=18, O=24, U=30) so that indexOf returns\n * the correct SEDOL weight for each consonant.\n */\nconst ALPHABET = \"0123456789 BCD FGH JKLMN PQRST VWXYZ\";\n\nconst WEIGHTS = [1, 3, 1, 7, 3, 9] as const;\n\nconst calcCheckDigit = (number: string): string => {\n if (number.length !== 6) {\n throw new Error(\n \"calcCheckDigit requires a 6-character \" +\n \"SEDOL prefix\",\n );\n }\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n const ch = number[i];\n if (ch === undefined) continue;\n const val = ALPHABET.indexOf(ch);\n if (val < 0) {\n throw new Error(`Invalid SEDOL character: ${ch}`);\n }\n sum += weight * val;\n }\n return String((10 - (sum % 10)) % 10);\n};\n\nconst compact = (value: string): string =>\n clean(value, \" \").toUpperCase();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 7) {\n return err(\n \"INVALID_LENGTH\",\n \"SEDOL must be exactly 7 characters\",\n );\n }\n\n for (const ch of v) {\n if (!ALPHABET.includes(ch)) {\n return err(\n \"INVALID_FORMAT\",\n \"SEDOL contains invalid character: \" +\n \"vowels are not allowed\",\n );\n }\n }\n\n // Old-style SEDOLs are fully numeric; new-style\n // SEDOLs start with a letter. A number that starts\n // with a digit but contains letters is invalid.\n // SAFETY: v.length === 7 here.\n // eslint-disable-next-line no-non-null-assertion\n if (isdigits(v[0]!) && !isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Numeric-prefix SEDOL must be fully \" +\n \"numeric (old-style)\",\n );\n }\n\n if (calcCheckDigit(v.slice(0, 6)) !== v[6]) {\n return err(\n \"INVALID_CHECKSUM\",\n \"SEDOL check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\nconst SEDOL_CONSONANTS = \"BCDFGHJKLMNPQRSTVWXYZ\";\nconst SEDOL_CHARS = \"0123456789BCDFGHJKLMNPQRSTVWXYZ\";\n\n/** Generate a random valid SEDOL. */\nconst generate = (): string => {\n let payload = randomChar(SEDOL_CONSONANTS);\n for (let i = 1; i < 6; i++) {\n payload += randomChar(SEDOL_CHARS);\n }\n return payload + calcCheckDigit(payload);\n};\n\n/** Stock Exchange Daily Official List number. */\nconst sedol: CountryValidator<\"GB\"> = {\n name: \"Stock Exchange Daily Official List number\",\n localName: \"Stock Exchange Daily Official List number\",\n abbreviation: \"SEDOL\",\n aliases: [\n \"SEDOL\",\n \"Stock Exchange Daily Official List\",\n ] as const,\n candidatePattern: \"[B-DF-HJ-NP-TV-Z0-9]{6}\\\\d\",\n scope: \"country\",\n country: \"GB\",\n entityType: \"any\",\n sourceUrl: \"https://en.wikipedia.org/wiki/SEDOL\",\n lengths: [7] as const,\n examples: [\"B15KXQ8\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default sedol;\nexport {\n calcCheckDigit,\n compact,\n format,\n validate,\n generate,\n};\n"],"mappings":";;;;;;;;;;;;AA6BA,MAAM,WAAW;AAEjB,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAEjC,MAAM,kBAAkB,WAA2B;CACjD,IAAI,OAAO,WAAW,GACpB,MAAM,IAAI,MACR,oDAEF;CAEF,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GAAG;EAC3C,MAAM,KAAK,OAAO;EAClB,IAAI,OAAO,KAAA,GAAW;EACtB,MAAM,MAAM,SAAS,QAAQ,EAAE;EAC/B,IAAI,MAAM,GACR,MAAM,IAAI,MAAM,4BAA4B,IAAI;EAElD,OAAO,SAAS;CAClB;CACA,OAAO,QAAQ,KAAM,MAAM,MAAO,EAAE;AACtC;AAEA,MAAM,WAAW,UACf,MAAM,OAAO,GAAG,EAAE,YAAY;AAEhC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,oCACF;CAGF,KAAK,MAAM,MAAM,GACf,IAAI,CAAC,SAAS,SAAS,EAAE,GACvB,OAAO,IACL,kBACA,0DAEF;CASJ,IAAI,SAAS,EAAE,EAAG,KAAK,CAAC,SAAS,CAAC,GAChC,OAAO,IACL,kBACA,wDAEF;CAGF,IAAI,eAAe,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,IACtC,OAAO,IACL,oBACA,4BACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;AAEvD,MAAM,mBAAmB;AACzB,MAAM,cAAc;;AAGpB,MAAM,iBAAyB;CAC7B,IAAI,UAAU,WAAW,gBAAgB;CACzC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,WAAW,WAAW,WAAW;CAEnC,OAAO,UAAU,eAAe,OAAO;AACzC;;AAGA,MAAM,QAAgC;CACpC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CACP,SACA,oCACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,SAAS,CAAC,CAAC;CACX,UAAU,CAAC,SAAS;CACpB;CACA;CACA;CACA;AACF"}
package/dist/gb/utr.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/gb/utr.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid UK UTR. */
8
8
  declare const generate: () => string;
9
9
  /** UK Unique Taxpayer Reference. */
10
- declare const utr: Validator;
10
+ declare const utr: CountryValidator<"GB">;
11
11
  //#endregion
12
12
  export { compact, utr as default, format, generate, validate };
13
13
  //# sourceMappingURL=utr.d.ts.map
package/dist/gb/utr.js CHANGED
@@ -1,18 +1,9 @@
1
+ import { weightedSum } from "../_checksums/weighted-sum.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits } from "../_util/generate.js";
3
4
  import { err } from "../_util/result.js";
4
5
  import { isdigits } from "../_util/strings.js";
5
- import { weightedSum } from "../_checksums/weighted-sum.js";
6
6
  //#region src/gb/utr.ts
7
- /**
8
- * UTR (Unique Taxpayer Reference).
9
- *
10
- * UK 10-digit tax reference number. The first
11
- * digit is a check digit computed using a
12
- * weighted sum with lookup table.
13
- *
14
- * @see https://www.gov.uk/find-utr-number
15
- */
16
7
  const WEIGHTS = [
17
8
  6,
18
9
  7,
@@ -54,6 +45,7 @@ const utr = {
54
45
  abbreviation: "UTR",
55
46
  aliases: ["Unique Taxpayer Reference", "UTR"],
56
47
  candidatePattern: "\\d{10}",
48
+ scope: "country",
57
49
  country: "GB",
58
50
  entityType: "any",
59
51
  sourceUrl: "https://www.gov.uk/find-utr-number",
@@ -1 +1 @@
1
- {"version":3,"file":"utr.js","names":[],"sources":["../../src/gb/utr.ts"],"sourcesContent":["/**\n * UTR (Unique Taxpayer Reference).\n *\n * UK 10-digit tax reference number. The first\n * digit is a check digit computed using a\n * weighted sum with lookup table.\n *\n * @see https://www.gov.uk/find-utr-number\n */\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst WEIGHTS = [6, 7, 8, 9, 10, 5, 4, 3, 2] as const;\nconst CHECK_LOOKUP = \"21987654321\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"UK UTR must be exactly 10 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"UK UTR must contain only digits\",\n );\n }\n const sum = weightedSum(v.slice(1), WEIGHTS, 11);\n const expected = CHECK_LOOKUP[sum];\n if (expected !== v[0]) {\n return err(\n \"INVALID_CHECKSUM\",\n \"UK UTR check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 5)} ${v.slice(5)}`;\n};\n\n/** Generate a random valid UK UTR. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(10);\n if (validate(c).valid) return c;\n }\n};\n\n/** UK Unique Taxpayer Reference. */\nconst utr: Validator = {\n name: \"UK Unique Taxpayer Reference\",\n localName: \"Unique Taxpayer Reference\",\n abbreviation: \"UTR\",\n aliases: [\"Unique Taxpayer Reference\", \"UTR\"] as const,\n candidatePattern: \"\\\\d{10}\",\n country: \"GB\",\n entityType: \"any\",\n sourceUrl: \"https://www.gov.uk/find-utr-number\",\n examples: [\"1955839661\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default utr;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAE;AAC5C,MAAM,eAAe;AAErB,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,mCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,kCACD;AAIH,KADiB,aADL,YAAY,EAAE,MAAM,EAAE,EAAE,SAAS,GAAG,MAE/B,EAAE,GACjB,QAAO,IACL,oBACA,8BACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,QAAO,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;;;AAIvC,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,6BAA6B,MAAM;CAC7C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,aAAa;CACxB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"utr.js","names":[],"sources":["../../src/gb/utr.ts"],"sourcesContent":["/**\n * UTR (Unique Taxpayer Reference).\n *\n * UK 10-digit tax reference number. The first\n * digit is a check digit computed using a\n * weighted sum with lookup table.\n *\n * @see https://www.gov.uk/find-utr-number\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [6, 7, 8, 9, 10, 5, 4, 3, 2] as const;\nconst CHECK_LOOKUP = \"21987654321\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"UK UTR must be exactly 10 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"UK UTR must contain only digits\",\n );\n }\n const sum = weightedSum(v.slice(1), WEIGHTS, 11);\n const expected = CHECK_LOOKUP[sum];\n if (expected !== v[0]) {\n return err(\n \"INVALID_CHECKSUM\",\n \"UK UTR check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 5)} ${v.slice(5)}`;\n};\n\n/** Generate a random valid UK UTR. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(10);\n if (validate(c).valid) return c;\n }\n};\n\n/** UK Unique Taxpayer Reference. */\nconst utr: CountryValidator<\"GB\"> = {\n name: \"UK Unique Taxpayer Reference\",\n localName: \"Unique Taxpayer Reference\",\n abbreviation: \"UTR\",\n aliases: [\"Unique Taxpayer Reference\", \"UTR\"] as const,\n candidatePattern: \"\\\\d{10}\",\n scope: \"country\",\n country: \"GB\",\n entityType: \"any\",\n sourceUrl: \"https://www.gov.uk/find-utr-number\",\n examples: [\"1955839661\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default utr;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAqBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;AAAC;AAC3C,MAAM,eAAe;AAErB,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,kCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,iCACF;CAIF,IADiB,aADL,YAAY,EAAE,MAAM,CAAC,GAAG,SAAS,EACb,OACf,EAAE,IACjB,OAAO,IACL,oBACA,6BACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;AACtC;;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,6BAA6B,KAAK;CAC5C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,YAAY;CACvB;CACA;CACA;CACA;AACF"}
package/dist/gb/vat.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/gb/vat.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid UK VAT number. */
8
8
  declare const generate: () => string;
9
9
  /** UK VAT Registration Number. */
10
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"GB">;
11
11
  //#endregion
12
12
  export { compact, vat as default, format, generate, validate };
13
13
  //# sourceMappingURL=vat.d.ts.map
package/dist/gb/vat.js CHANGED
@@ -1,19 +1,9 @@
1
+ import { weightedSum } from "../_checksums/weighted-sum.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits } from "../_util/generate.js";
3
4
  import { err } from "../_util/result.js";
4
5
  import { isdigits } from "../_util/strings.js";
5
- import { weightedSum } from "../_checksums/weighted-sum.js";
6
6
  //#region src/gb/vat.ts
7
- /**
8
- * VAT (Value Added Tax registration number).
9
- *
10
- * UK VAT number. Multiple formats: 9 or 12
11
- * digit standard, GD+3 (government), HA+3
12
- * (health authority). Standard numbers use a
13
- * weighted checksum mod 97.
14
- *
15
- * @see https://www.gov.uk/vat-registration
16
- */
17
7
  const WEIGHTS = [
18
8
  8,
19
9
  7,
@@ -87,6 +77,7 @@ const vat = {
87
77
  abbreviation: "VAT",
88
78
  aliases: ["VAT registration number", "VAT number"],
89
79
  candidatePattern: "GB\\d{9,12}",
80
+ scope: "country",
90
81
  country: "GB",
91
82
  entityType: "company",
92
83
  sourceUrl: "https://www.gov.uk/vat-registration",
@@ -1 +1 @@
1
- {"version":3,"file":"vat.js","names":[],"sources":["../../src/gb/vat.ts"],"sourcesContent":["/**\n * VAT (Value Added Tax registration number).\n *\n * UK VAT number. Multiple formats: 9 or 12\n * digit standard, GD+3 (government), HA+3\n * (health authority). Standard numbers use a\n * weighted checksum mod 97.\n *\n * @see https://www.gov.uk/vat-registration\n */\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst WEIGHTS = [8, 7, 6, 5, 4, 3, 2] as const;\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -.\");\n if (v.startsWith(\"GB\") || v.startsWith(\"gb\")) {\n v = v.slice(2);\n }\n return v.toUpperCase();\n};\n\nconst validateStandard = (v: string): ValidateResult => {\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"UK VAT must contain only digits\",\n );\n }\n // Weighted sum of first 7 digits\n const sum = weightedSum(v.slice(0, 7), WEIGHTS, 97);\n // Check digits are digits 8-9\n const checkPart = Number(v.slice(7, 9));\n const total = (sum + checkPart) % 97;\n\n const prefix = Number(v.slice(0, 3));\n if (prefix >= 100) {\n // Numbers >= 100 000 000: remainder must be\n // 0, 42, or 55\n if (total !== 0 && total !== 42 && total !== 55) {\n return err(\n \"INVALID_CHECKSUM\",\n \"UK VAT check digits mismatch\",\n );\n }\n } else {\n if (total !== 0) {\n return err(\n \"INVALID_CHECKSUM\",\n \"UK VAT check digits mismatch\",\n );\n }\n }\n return { valid: true, compact: v };\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n // Government departments: GD + 3 digits (< 500)\n if (v.startsWith(\"GD\")) {\n const num = v.slice(2);\n if (num.length !== 3 || !isdigits(num)) {\n return err(\n \"INVALID_FORMAT\",\n \"UK VAT GD number must be GD + 3 digits\",\n );\n }\n if (Number(num) >= 500) {\n return err(\n \"INVALID_COMPONENT\",\n \"UK VAT GD number must be < 500\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // Health authorities: HA + 3 digits (>= 500)\n if (v.startsWith(\"HA\")) {\n const num = v.slice(2);\n if (num.length !== 3 || !isdigits(num)) {\n return err(\n \"INVALID_FORMAT\",\n \"UK VAT HA number must be HA + 3 digits\",\n );\n }\n if (Number(num) < 500) {\n return err(\n \"INVALID_COMPONENT\",\n \"UK VAT HA number must be >= 500\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // Standard: 9 or 12 digits\n if (v.length !== 9 && v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"UK VAT must be 9 or 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"UK VAT must contain only digits\",\n );\n }\n const result = validateStandard(v.slice(0, 9));\n if (!result.valid) return result;\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.startsWith(\"GD\") || v.startsWith(\"HA\")) {\n return `GB${v}`;\n }\n return `GB ${v.slice(0, 3)} ${v.slice(3, 7)} ${v.slice(7)}`;\n};\n\n/** Generate a random valid UK VAT number. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(9);\n if (validate(c).valid) return c;\n }\n};\n\n/** UK VAT Registration Number. */\nconst vat: Validator = {\n name: \"UK VAT Number\",\n localName: \"VAT Registration Number\",\n abbreviation: \"VAT\",\n aliases: [\n \"VAT registration number\",\n \"VAT number\",\n ] as const,\n candidatePattern: \"GB\\\\d{9,12}\",\n country: \"GB\",\n entityType: \"company\",\n sourceUrl: \"https://www.gov.uk/vat-registration\",\n examples: [\"980780684\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAErC,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,MAAM;AAC3B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,KAAI,EAAE,MAAM,EAAE;AAEhB,QAAO,EAAE,aAAa;;AAGxB,MAAM,oBAAoB,MAA8B;AACtD,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,kCACD;CAMH,MAAM,SAHM,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,SAAS,GAAG,GAEjC,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,IACL;AAGlC,KADe,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,IACtB;MAGR,UAAU,KAAK,UAAU,MAAM,UAAU,GAC3C,QAAO,IACL,oBACA,+BACD;YAGC,UAAU,EACZ,QAAO,IACL,oBACA,+BACD;AAGL,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAGxB,KAAI,EAAE,WAAW,KAAK,EAAE;EACtB,MAAM,MAAM,EAAE,MAAM,EAAE;AACtB,MAAI,IAAI,WAAW,KAAK,CAAC,SAAS,IAAI,CACpC,QAAO,IACL,kBACA,yCACD;AAEH,MAAI,OAAO,IAAI,IAAI,IACjB,QAAO,IACL,qBACA,iCACD;AAEH,SAAO;GAAE,OAAO;GAAM,SAAS;GAAG;;AAIpC,KAAI,EAAE,WAAW,KAAK,EAAE;EACtB,MAAM,MAAM,EAAE,MAAM,EAAE;AACtB,MAAI,IAAI,WAAW,KAAK,CAAC,SAAS,IAAI,CACpC,QAAO,IACL,kBACA,yCACD;AAEH,MAAI,OAAO,IAAI,GAAG,IAChB,QAAO,IACL,qBACA,kCACD;AAEH,SAAO;GAAE,OAAO;GAAM,SAAS;GAAG;;AAIpC,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,QAAO,IACL,kBACA,gCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,kCACD;CAEH,MAAM,SAAS,iBAAiB,EAAE,MAAM,GAAG,EAAE,CAAC;AAC9C,KAAI,CAAC,OAAO,MAAO,QAAO;AAC1B,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,QAAO,KAAK;AAEd,QAAO,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE;;;AAI3D,MAAM,iBAAyB;AAC7B,UAAS;EACP,MAAM,IAAI,aAAa,EAAE;AACzB,MAAI,SAAS,EAAE,CAAC,MAAO,QAAO;;;;AAKlC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CACP,2BACA,aACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,YAAY;CACvB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"vat.js","names":[],"sources":["../../src/gb/vat.ts"],"sourcesContent":["/**\n * VAT (Value Added Tax registration number).\n *\n * UK VAT number. Multiple formats: 9 or 12\n * digit standard, GD+3 (government), HA+3\n * (health authority). Standard numbers use a\n * weighted checksum mod 97.\n *\n * @see https://www.gov.uk/vat-registration\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [8, 7, 6, 5, 4, 3, 2] as const;\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -.\");\n if (v.startsWith(\"GB\") || v.startsWith(\"gb\")) {\n v = v.slice(2);\n }\n return v.toUpperCase();\n};\n\nconst validateStandard = (v: string): ValidateResult => {\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"UK VAT must contain only digits\",\n );\n }\n // Weighted sum of first 7 digits\n const sum = weightedSum(v.slice(0, 7), WEIGHTS, 97);\n // Check digits are digits 8-9\n const checkPart = Number(v.slice(7, 9));\n const total = (sum + checkPart) % 97;\n\n const prefix = Number(v.slice(0, 3));\n if (prefix >= 100) {\n // Numbers >= 100 000 000: remainder must be\n // 0, 42, or 55\n if (total !== 0 && total !== 42 && total !== 55) {\n return err(\n \"INVALID_CHECKSUM\",\n \"UK VAT check digits mismatch\",\n );\n }\n } else {\n if (total !== 0) {\n return err(\n \"INVALID_CHECKSUM\",\n \"UK VAT check digits mismatch\",\n );\n }\n }\n return { valid: true, compact: v };\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n // Government departments: GD + 3 digits (< 500)\n if (v.startsWith(\"GD\")) {\n const num = v.slice(2);\n if (num.length !== 3 || !isdigits(num)) {\n return err(\n \"INVALID_FORMAT\",\n \"UK VAT GD number must be GD + 3 digits\",\n );\n }\n if (Number(num) >= 500) {\n return err(\n \"INVALID_COMPONENT\",\n \"UK VAT GD number must be < 500\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // Health authorities: HA + 3 digits (>= 500)\n if (v.startsWith(\"HA\")) {\n const num = v.slice(2);\n if (num.length !== 3 || !isdigits(num)) {\n return err(\n \"INVALID_FORMAT\",\n \"UK VAT HA number must be HA + 3 digits\",\n );\n }\n if (Number(num) < 500) {\n return err(\n \"INVALID_COMPONENT\",\n \"UK VAT HA number must be >= 500\",\n );\n }\n return { valid: true, compact: v };\n }\n\n // Standard: 9 or 12 digits\n if (v.length !== 9 && v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"UK VAT must be 9 or 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"UK VAT must contain only digits\",\n );\n }\n const result = validateStandard(v.slice(0, 9));\n if (!result.valid) return result;\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.startsWith(\"GD\") || v.startsWith(\"HA\")) {\n return `GB${v}`;\n }\n return `GB ${v.slice(0, 3)} ${v.slice(3, 7)} ${v.slice(7)}`;\n};\n\n/** Generate a random valid UK VAT number. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(9);\n if (validate(c).valid) return c;\n }\n};\n\n/** UK VAT Registration Number. */\nconst vat: CountryValidator<\"GB\"> = {\n name: \"UK VAT Number\",\n localName: \"VAT Registration Number\",\n abbreviation: \"VAT\",\n aliases: [\n \"VAT registration number\",\n \"VAT number\",\n ] as const,\n candidatePattern: \"GB\\\\d{9,12}\",\n scope: \"country\",\n country: \"GB\",\n entityType: \"company\",\n sourceUrl: \"https://www.gov.uk/vat-registration\",\n examples: [\"980780684\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAsBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAEpC,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,KAAK;CAC1B,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO,EAAE,YAAY;AACvB;AAEA,MAAM,oBAAoB,MAA8B;CACtD,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,iCACF;CAMF,MAAM,SAHM,YAAY,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,EAG/B,IADC,OAAO,EAAE,MAAM,GAAG,CAAC,CACR,KAAK;CAGlC,IADe,OAAO,EAAE,MAAM,GAAG,CAAC,CACzB,KAAK;MAGR,UAAU,KAAK,UAAU,MAAM,UAAU,IAC3C,OAAO,IACL,oBACA,8BACF;CAAA,OAGF,IAAI,UAAU,GACZ,OAAO,IACL,oBACA,8BACF;CAGJ,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAGvB,IAAI,EAAE,WAAW,IAAI,GAAG;EACtB,MAAM,MAAM,EAAE,MAAM,CAAC;EACrB,IAAI,IAAI,WAAW,KAAK,CAAC,SAAS,GAAG,GACnC,OAAO,IACL,kBACA,wCACF;EAEF,IAAI,OAAO,GAAG,KAAK,KACjB,OAAO,IACL,qBACA,gCACF;EAEF,OAAO;GAAE,OAAO;GAAM,SAAS;EAAE;CACnC;CAGA,IAAI,EAAE,WAAW,IAAI,GAAG;EACtB,MAAM,MAAM,EAAE,MAAM,CAAC;EACrB,IAAI,IAAI,WAAW,KAAK,CAAC,SAAS,GAAG,GACnC,OAAO,IACL,kBACA,wCACF;EAEF,IAAI,OAAO,GAAG,IAAI,KAChB,OAAO,IACL,qBACA,iCACF;EAEF,OAAO;GAAE,OAAO;GAAM,SAAS;EAAE;CACnC;CAGA,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,IACjC,OAAO,IACL,kBACA,+BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,iCACF;CAEF,MAAM,SAAS,iBAAiB,EAAE,MAAM,GAAG,CAAC,CAAC;CAC7C,IAAI,CAAC,OAAO,OAAO,OAAO;CAC1B,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,OAAO,KAAK;CAEd,OAAO,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;AAC1D;;AAGA,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,IAAI,aAAa,CAAC;EACxB,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO;CAChC;AACF;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CACP,2BACA,YACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;AACF"}
package/dist/ge/pin.d.ts CHANGED
@@ -1,13 +1,25 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/ge/pin.d.ts
4
4
  /** Generate a random valid Georgian PIN (11-digit). */
5
5
  declare const generate: () => string;
6
+ /**
7
+ * PIN (Personal Identification Number, პირადი ნომერი).
8
+ *
9
+ * Georgian personal identification number issued by the
10
+ * Public Service Development Agency. Citizens receive an
11
+ * 11-digit number (also used as TIN); non-citizens and
12
+ * entities receive a 9-digit number. The number is a
13
+ * serial with no embedded semantics and no publicly
14
+ * documented checksum algorithm.
15
+ *
16
+ * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Georgia-TIN.pdf
17
+ */
6
18
  declare const compact: (value: string) => string;
7
19
  declare const validate: (value: string) => ValidateResult;
8
20
  declare const format: (value: string) => string;
9
21
  /** Georgian Personal Identification Number. */
10
- declare const pin: Validator;
22
+ declare const pin: CountryValidator<"GE">;
11
23
  //#endregion
12
24
  export { compact, pin as default, format, generate, validate };
13
25
  //# sourceMappingURL=pin.d.ts.map
package/dist/ge/pin.js CHANGED
@@ -3,18 +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/ge/pin.ts
6
- /**
7
- * PIN (Personal Identification Number, პირადი ნომერი).
8
- *
9
- * Georgian personal identification number issued by the
10
- * Public Service Development Agency. Citizens receive an
11
- * 11-digit number (also used as TIN); non-citizens and
12
- * entities receive a 9-digit number. The number is a
13
- * serial with no embedded semantics and no publicly
14
- * documented checksum algorithm.
15
- *
16
- * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Georgia-TIN.pdf
17
- */
18
6
  /** Generate a random valid Georgian PIN (11-digit). */
19
7
  const generate = () => randomDigits(11);
20
8
  const compact = (value) => clean(value, " -").trim();
@@ -35,6 +23,7 @@ const pin = {
35
23
  abbreviation: "PIN",
36
24
  aliases: ["პირადი ნომერი", "PIN"],
37
25
  candidatePattern: "\\d{11}",
26
+ scope: "country",
38
27
  country: "GE",
39
28
  entityType: "any",
40
29
  lengths: [9, 11],
@@ -1 +1 @@
1
- {"version":3,"file":"pin.js","names":[],"sources":["../../src/ge/pin.ts"],"sourcesContent":["/** Generate a random valid Georgian PIN (11-digit). */\nconst generate = (): string => randomDigits(11);\n\n/**\n * PIN (Personal Identification Number, პირადი ნომერი).\n *\n * Georgian personal identification number issued by the\n * Public Service Development Agency. Citizens receive an\n * 11-digit number (also used as TIN); non-citizens and\n * entities receive a 9-digit number. The number is a\n * serial with no embedded semantics and no publicly\n * documented checksum algorithm.\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Georgia-TIN.pdf\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, \" -\").trim();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 9 && v.length !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"Georgian PIN must be 9 or 11 digits\",\n );\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Georgian PIN must contain only digits\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Georgian Personal Identification Number. */\nconst pin: Validator = {\n name: \"Georgian Personal ID\",\n localName: \"პირადი ნომერი\",\n abbreviation: \"PIN\",\n aliases: [\"პირადი ნომერი\", \"PIN\"] as const,\n candidatePattern: \"\\\\d{11}\",\n country: \"GE\",\n entityType: \"any\",\n lengths: [9, 11] as const,\n examples: [\"010043120\", \"01024030303\"] as const,\n compact,\n format,\n validate,\n sourceUrl:\n \"https://www.oecd.org/tax/automatic-exchange/\" +\n \"crs-implementation-and-assistance/\" +\n \"tax-identification-numbers/Georgia-TIN.pdf\",\n generate,\n};\n\nexport default pin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;AACA,MAAM,iBAAyB,aAAa,GAAG;AAsB/C,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,CAAC,MAAM;AAE3B,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AAExB,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,QAAO,IACL,kBACA,sCACD;AAGH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,wCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,iBAAiB,MAAM;CACjC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,GAAG,GAAG;CAChB,UAAU,CAAC,aAAa,cAAc;CACtC;CACA;CACA;CACA,WACE;CAGF;CACD"}
1
+ {"version":3,"file":"pin.js","names":[],"sources":["../../src/ge/pin.ts"],"sourcesContent":["/** Generate a random valid Georgian PIN (11-digit). */\nconst generate = (): string => randomDigits(11);\n\n/**\n * PIN (Personal Identification Number, პირადი ნომერი).\n *\n * Georgian personal identification number issued by the\n * Public Service Development Agency. Citizens receive an\n * 11-digit number (also used as TIN); non-citizens and\n * entities receive a 9-digit number. The number is a\n * serial with no embedded semantics and no publicly\n * documented checksum algorithm.\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Georgia-TIN.pdf\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, \" -\").trim();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 9 && v.length !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"Georgian PIN must be 9 or 11 digits\",\n );\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Georgian PIN must contain only digits\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Georgian Personal Identification Number. */\nconst pin: CountryValidator<\"GE\"> = {\n name: \"Georgian Personal ID\",\n localName: \"პირადი ნომერი\",\n abbreviation: \"PIN\",\n aliases: [\"პირადი ნომერი\", \"PIN\"] as const,\n candidatePattern: \"\\\\d{11}\",\n scope: \"country\",\n country: \"GE\",\n entityType: \"any\",\n lengths: [9, 11] as const,\n examples: [\"010043120\", \"01024030303\"] as const,\n compact,\n format,\n validate,\n sourceUrl:\n \"https://www.oecd.org/tax/automatic-exchange/\" +\n \"crs-implementation-and-assistance/\" +\n \"tax-identification-numbers/Georgia-TIN.pdf\",\n generate,\n};\n\nexport default pin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AACA,MAAM,iBAAyB,aAAa,EAAE;AAyB9C,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,EAAE,KAAK;AAE1B,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,IACjC,OAAO,IACL,kBACA,qCACF;CAGF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,uCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,iBAAiB,KAAK;CAChC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,GAAG,EAAE;CACf,UAAU,CAAC,aAAa,aAAa;CACrC;CACA;CACA;CACA,WACE;CAGF;AACF"}
package/dist/gh/tin.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/gh/tin.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Ghana TIN. */
8
8
  declare const generate: () => string;
9
9
  /** Ghanaian Tax Identification Number. */
10
- declare const tin: Validator;
10
+ declare const tin: CountryValidator<"GH">;
11
11
  //#endregion
12
12
  export { compact, tin as default, format, generate, validate };
13
13
  //# sourceMappingURL=tin.d.ts.map
package/dist/gh/tin.js CHANGED
@@ -2,21 +2,6 @@ import { clean } from "../_util/clean.js";
2
2
  import { randomDigits, randomPick } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  //#region src/gh/tin.ts
5
- /**
6
- * TIN (Tax Identification Number, Ghana).
7
- *
8
- * 11-character alphanumeric identifier. Structure:
9
- * - Position 1: type prefix (P/C/G/Q/V)
10
- * - Positions 2-3: always "00"
11
- * - Positions 4-10: digits
12
- * - Position 11: check digit (0-9 or X)
13
- *
14
- * Prefixes: P = individual, C = company,
15
- * G = government, Q = foreign mission,
16
- * V = public institution / trust.
17
- *
18
- * @see https://gra.gov.gh/
19
- */
20
5
  const FORMAT_RE = /^[PCGQV]00[0-9]{7}[0-9X]$/;
21
6
  const compact = (value) => clean(value, " ").toUpperCase();
22
7
  /**
@@ -63,6 +48,7 @@ const tin = {
63
48
  abbreviation: "TIN",
64
49
  aliases: ["TIN", "Tax Identification Number"],
65
50
  candidatePattern: "[A-Z]\\d{9,10}",
51
+ scope: "country",
66
52
  country: "GH",
67
53
  entityType: "any",
68
54
  compact,
@@ -1 +1 @@
1
- {"version":3,"file":"tin.js","names":[],"sources":["../../src/gh/tin.ts"],"sourcesContent":["/**\n * TIN (Tax Identification Number, Ghana).\n *\n * 11-character alphanumeric identifier. Structure:\n * - Position 1: type prefix (P/C/G/Q/V)\n * - Positions 2-3: always \"00\"\n * - Positions 4-10: digits\n * - Position 11: check digit (0-9 or X)\n *\n * Prefixes: P = individual, C = company,\n * G = government, Q = foreign mission,\n * V = public institution / trust.\n *\n * @see https://gra.gov.gh/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomPick } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst FORMAT_RE = /^[PCGQV]00[0-9]{7}[0-9X]$/;\n\nconst compact = (value: string): string =>\n clean(value, \" \").toUpperCase();\n\n/**\n * Calculate the expected check digit.\n * Uses positions 1-9 (0-indexed) with weights 1-9,\n * mod 11. Returns \"X\" when the remainder is 10.\n */\nconst calcCheckDigit = (value: string): string => {\n let sum = 0;\n for (let i = 1; i <= 9; i++) {\n sum += i * Number(value[i]);\n }\n const check = sum % 11;\n return check === 10 ? \"X\" : String(check);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"Ghanaian TIN must be exactly 11 characters\",\n );\n }\n if (!FORMAT_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Ghanaian TIN must match [PCGQV]00 + \" +\n \"7 digits + check digit\",\n );\n }\n if (v[10] !== calcCheckDigit(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Ghanaian TIN check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\nconst TIN_PREFIXES = [\"P\", \"C\", \"G\", \"Q\", \"V\"] as const;\n\n/** Generate a random valid Ghana TIN. */\nconst generate = (): string => {\n for (;;) {\n const p = randomPick(TIN_PREFIXES);\n const d = randomDigits(9);\n const partial = p + d;\n const c = partial + calcCheckDigit(partial);\n if (validate(c).valid) return c;\n }\n};\n\n/** Ghanaian Tax Identification Number. */\nconst tin: Validator = {\n name: \"Ghanaian Tax Identification Number\",\n localName: \"Tax Identification Number\",\n abbreviation: \"TIN\",\n aliases: [\"TIN\", \"Tax Identification Number\"] as const,\n candidatePattern: \"[A-Z]\\\\d{9,10}\",\n country: \"GH\",\n entityType: \"any\",\n compact,\n format,\n validate,\n description: \"Ghanaian tax identification number\",\n sourceUrl: \"https://gra.gov.gh/\",\n lengths: [11] as const,\n examples: [\"C0000803561\"] as const,\n generate,\n};\n\nexport default tin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAsBA,MAAM,YAAY;AAElB,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,CAAC,aAAa;;;;;;AAOjC,MAAM,kBAAkB,UAA0B;CAChD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,KAAK,GAAG,IACtB,QAAO,IAAI,OAAO,MAAM,GAAG;CAE7B,MAAM,QAAQ,MAAM;AACpB,QAAO,UAAU,KAAK,MAAM,OAAO,MAAM;;AAG3C,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,6CACD;AAEH,KAAI,CAAC,UAAU,KAAK,EAAE,CACpB,QAAO,IACL,kBACA,6DAED;AAEH,KAAI,EAAE,QAAQ,eAAe,EAAE,CAC7B,QAAO,IACL,oBACA,oCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;AAExD,MAAM,eAAe;CAAC;CAAK;CAAK;CAAK;CAAK;CAAI;;AAG9C,MAAM,iBAAyB;AAC7B,UAAS;EAGP,MAAM,UAFI,WAAW,aAAa,GACxB,aAAa,EAAE;EAEzB,MAAM,IAAI,UAAU,eAAe,QAAQ;AAC3C,MAAI,SAAS,EAAE,CAAC,MAAO,QAAO;;;;AAKlC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,4BAA4B;CAC7C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,aAAa;CACb,WAAW;CACX,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,cAAc;CACzB;CACD"}
1
+ {"version":3,"file":"tin.js","names":[],"sources":["../../src/gh/tin.ts"],"sourcesContent":["/**\n * TIN (Tax Identification Number, Ghana).\n *\n * 11-character alphanumeric identifier. Structure:\n * - Position 1: type prefix (P/C/G/Q/V)\n * - Positions 2-3: always \"00\"\n * - Positions 4-10: digits\n * - Position 11: check digit (0-9 or X)\n *\n * Prefixes: P = individual, C = company,\n * G = government, Q = foreign mission,\n * V = public institution / trust.\n *\n * @see https://gra.gov.gh/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomPick } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nconst FORMAT_RE = /^[PCGQV]00[0-9]{7}[0-9X]$/;\n\nconst compact = (value: string): string =>\n clean(value, \" \").toUpperCase();\n\n/**\n * Calculate the expected check digit.\n * Uses positions 1-9 (0-indexed) with weights 1-9,\n * mod 11. Returns \"X\" when the remainder is 10.\n */\nconst calcCheckDigit = (value: string): string => {\n let sum = 0;\n for (let i = 1; i <= 9; i++) {\n sum += i * Number(value[i]);\n }\n const check = sum % 11;\n return check === 10 ? \"X\" : String(check);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"Ghanaian TIN must be exactly 11 characters\",\n );\n }\n if (!FORMAT_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Ghanaian TIN must match [PCGQV]00 + \" +\n \"7 digits + check digit\",\n );\n }\n if (v[10] !== calcCheckDigit(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Ghanaian TIN check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\nconst TIN_PREFIXES = [\"P\", \"C\", \"G\", \"Q\", \"V\"] as const;\n\n/** Generate a random valid Ghana TIN. */\nconst generate = (): string => {\n for (;;) {\n const p = randomPick(TIN_PREFIXES);\n const d = randomDigits(9);\n const partial = p + d;\n const c = partial + calcCheckDigit(partial);\n if (validate(c).valid) return c;\n }\n};\n\n/** Ghanaian Tax Identification Number. */\nconst tin: CountryValidator<\"GH\"> = {\n name: \"Ghanaian Tax Identification Number\",\n localName: \"Tax Identification Number\",\n abbreviation: \"TIN\",\n aliases: [\"TIN\", \"Tax Identification Number\"] as const,\n candidatePattern: \"[A-Z]\\\\d{9,10}\",\n scope: \"country\",\n country: \"GH\",\n entityType: \"any\",\n compact,\n format,\n validate,\n description: \"Ghanaian tax identification number\",\n sourceUrl: \"https://gra.gov.gh/\",\n lengths: [11] as const,\n examples: [\"C0000803561\"] as const,\n generate,\n};\n\nexport default tin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;AAyBA,MAAM,YAAY;AAElB,MAAM,WAAW,UACf,MAAM,OAAO,GAAG,EAAE,YAAY;;;;;;AAOhC,MAAM,kBAAkB,UAA0B;CAChD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG,KACtB,OAAO,IAAI,OAAO,MAAM,EAAE;CAE5B,MAAM,QAAQ,MAAM;CACpB,OAAO,UAAU,KAAK,MAAM,OAAO,KAAK;AAC1C;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,4CACF;CAEF,IAAI,CAAC,UAAU,KAAK,CAAC,GACnB,OAAO,IACL,kBACA,4DAEF;CAEF,IAAI,EAAE,QAAQ,eAAe,CAAC,GAC5B,OAAO,IACL,oBACA,mCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;AAEvD,MAAM,eAAe;CAAC;CAAK;CAAK;CAAK;CAAK;AAAG;;AAG7C,MAAM,iBAAyB;CAC7B,SAAS;EAGP,MAAM,UAFI,WAAW,YAEL,IADN,aAAa,CACH;EACpB,MAAM,IAAI,UAAU,eAAe,OAAO;EAC1C,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO;CAChC;AACF;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,2BAA2B;CAC5C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,aAAa;CACb,WAAW;CACX,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,aAAa;CACxB;AACF"}
package/dist/gr/amka.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/gr/amka.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Greek AMKA. */
8
8
  declare const generate: () => string;
9
9
  /** Greek Social Security Number. */
10
- declare const amka: Validator;
10
+ declare const amka: CountryValidator<"GR">;
11
11
  //#endregion
12
12
  export { compact, amka as default, format, generate, validate };
13
13
  //# sourceMappingURL=amka.d.ts.map
package/dist/gr/amka.js CHANGED
@@ -1,19 +1,10 @@
1
+ import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
1
2
  import { clean } from "../_util/clean.js";
3
+ import { isValidDate } from "../_util/date.js";
2
4
  import { randomDigits, randomInt } from "../_util/generate.js";
3
5
  import { err } from "../_util/result.js";
4
- import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
5
6
  import { isdigits } from "../_util/strings.js";
6
- import { isValidDate } from "../_util/date.js";
7
7
  //#region src/gr/amka.ts
8
- /**
9
- * AMKA (Αριθμός Μητρώου Κοινωνικής Ασφάλισης).
10
- *
11
- * Greek social security number. 11 digits where the
12
- * first 6 are DDMMYY, followed by 4-digit serial and
13
- * a Luhn check digit.
14
- *
15
- * @see https://www.amka.gr/
16
- */
17
8
  const compact = (value) => clean(value, " -");
18
9
  const validate = (value) => {
19
10
  const v = compact(value);
@@ -56,6 +47,7 @@ const amka = {
56
47
  "AMKA"
57
48
  ],
58
49
  candidatePattern: "\\d{11}",
50
+ scope: "country",
59
51
  country: "GR",
60
52
  entityType: "person",
61
53
  sourceUrl: "https://www.amka.gr/",
@@ -1 +1 @@
1
- {"version":3,"file":"amka.js","names":[],"sources":["../../src/gr/amka.ts"],"sourcesContent":["/**\n * AMKA (Αριθμός Μητρώου Κοινωνικής Ασφάλισης).\n *\n * Greek social security number. 11 digits where the\n * first 6 are DDMMYY, followed by 4-digit serial and\n * a Luhn check digit.\n *\n * @see https://www.amka.gr/\n */\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { 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 !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"AMKA must be exactly 11 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"AMKA must contain only digits\",\n );\n }\n\n const dd = Number(v.slice(0, 2));\n const mm = Number(v.slice(2, 4));\n const yy = Number(v.slice(4, 6));\n\n // AMKA doesn't encode century explicitly;\n // validate the date for both 1900s and 2000s\n const valid1900 = isValidDate(1900 + yy, mm, dd);\n const valid2000 = isValidDate(2000 + yy, mm, dd);\n if (!valid1900 && !valid2000) {\n return err(\n \"INVALID_COMPONENT\",\n \"AMKA contains an invalid date\",\n );\n }\n\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"AMKA Luhn check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Greek AMKA. */\nconst generate = (): string => {\n for (;;) {\n const dd = String(randomInt(1, 28)).padStart(2, \"0\");\n const mm = String(randomInt(1, 12)).padStart(2, \"0\");\n const yy = String(randomInt(50, 99)).padStart(2, \"0\");\n const serial = randomDigits(4);\n const payload = dd + mm + yy + serial;\n const cs = luhnChecksum(payload + \"0\");\n const c = payload + String((10 - cs) % 10);\n if (validate(c).valid) return c;\n }\n};\n\n/** Greek Social Security Number. */\nconst amka: Validator = {\n name: \"Greek Social Security Number\",\n localName: \"Αριθμός Μητρώου Κοινωνικής Ασφάλισης\",\n abbreviation: \"ΑΜΚΑ\",\n aliases: [\n \"ΑΜΚΑ\",\n \"Αριθμός Μητρώου Κοινωνικής Ασφάλισης\",\n \"AMKA\",\n ] as const,\n candidatePattern: \"\\\\d{11}\",\n country: \"GR\",\n entityType: \"person\",\n sourceUrl: \"https://www.amka.gr/\",\n examples: [\"01013099997\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default amka;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;AAsBA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,iCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,gCACD;CAGH,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAChC,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAChC,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAIhC,MAAM,YAAY,YAAY,OAAO,IAAI,IAAI,GAAG;CAChD,MAAM,YAAY,YAAY,MAAO,IAAI,IAAI,GAAG;AAChD,KAAI,CAAC,aAAa,CAAC,UACjB,QAAO,IACL,qBACA,gCACD;AAGH,KAAI,CAAC,aAAa,EAAE,CAClB,QAAO,IACL,oBACA,uCACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,MAAM,iBAAyB;AAC7B,UAAS;EACP,MAAM,KAAK,OAAO,UAAU,GAAG,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI;EACpD,MAAM,KAAK,OAAO,UAAU,GAAG,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI;EACpD,MAAM,KAAK,OAAO,UAAU,IAAI,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI;EACrD,MAAM,SAAS,aAAa,EAAE;EAC9B,MAAM,UAAU,KAAK,KAAK,KAAK;EAC/B,MAAM,KAAK,aAAa,UAAU,IAAI;EACtC,MAAM,IAAI,UAAU,QAAQ,KAAK,MAAM,GAAG;AAC1C,MAAI,SAAS,EAAE,CAAC,MAAO,QAAO;;;;AAKlC,MAAM,OAAkB;CACtB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,cAAc;CACzB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"amka.js","names":[],"sources":["../../src/gr/amka.ts"],"sourcesContent":["/**\n * AMKA (Αριθμός Μητρώου Κοινωνικής Ασφάλισης).\n *\n * Greek social security number. 11 digits where the\n * first 6 are DDMMYY, followed by 4-digit serial and\n * a Luhn check digit.\n *\n * @see https://www.amka.gr/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"AMKA must be exactly 11 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"AMKA must contain only digits\",\n );\n }\n\n const dd = Number(v.slice(0, 2));\n const mm = Number(v.slice(2, 4));\n const yy = Number(v.slice(4, 6));\n\n // AMKA doesn't encode century explicitly;\n // validate the date for both 1900s and 2000s\n const valid1900 = isValidDate(1900 + yy, mm, dd);\n const valid2000 = isValidDate(2000 + yy, mm, dd);\n if (!valid1900 && !valid2000) {\n return err(\n \"INVALID_COMPONENT\",\n \"AMKA contains an invalid date\",\n );\n }\n\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"AMKA Luhn check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Greek AMKA. */\nconst generate = (): string => {\n for (;;) {\n const dd = String(randomInt(1, 28)).padStart(2, \"0\");\n const mm = String(randomInt(1, 12)).padStart(2, \"0\");\n const yy = String(randomInt(50, 99)).padStart(2, \"0\");\n const serial = randomDigits(4);\n const payload = dd + mm + yy + serial;\n const cs = luhnChecksum(payload + \"0\");\n const c = payload + String((10 - cs) % 10);\n if (validate(c).valid) return c;\n }\n};\n\n/** Greek Social Security Number. */\nconst amka: CountryValidator<\"GR\"> = {\n name: \"Greek Social Security Number\",\n localName: \"Αριθμός Μητρώου Κοινωνικής Ασφάλισης\",\n abbreviation: \"ΑΜΚΑ\",\n aliases: [\n \"ΑΜΚΑ\",\n \"Αριθμός Μητρώου Κοινωνικής Ασφάλισης\",\n \"AMKA\",\n ] as const,\n candidatePattern: \"\\\\d{11}\",\n scope: \"country\",\n country: \"GR\",\n entityType: \"person\",\n sourceUrl: \"https://www.amka.gr/\",\n examples: [\"01013099997\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default amka;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;AAyBA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,gCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,+BACF;CAGF,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAC/B,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAC/B,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAI/B,MAAM,YAAY,YAAY,OAAO,IAAI,IAAI,EAAE;CAC/C,MAAM,YAAY,YAAY,MAAO,IAAI,IAAI,EAAE;CAC/C,IAAI,CAAC,aAAa,CAAC,WACjB,OAAO,IACL,qBACA,+BACF;CAGF,IAAI,CAAC,aAAa,CAAC,GACjB,OAAO,IACL,oBACA,sCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,KAAK,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;EACnD,MAAM,KAAK,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;EACnD,MAAM,KAAK,OAAO,UAAU,IAAI,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;EACpD,MAAM,SAAS,aAAa,CAAC;EAC7B,MAAM,UAAU,KAAK,KAAK,KAAK;EAC/B,MAAM,KAAK,aAAa,UAAU,GAAG;EACrC,MAAM,IAAI,UAAU,QAAQ,KAAK,MAAM,EAAE;EACzC,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO;CAChC;AACF;;AAGA,MAAM,OAA+B;CACnC,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;CACxB;CACA;CACA;CACA;AACF"}
package/dist/gr/vat.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/gr/vat.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
7
7
  /** Generate a random valid Greek VAT number. */
8
8
  declare const generate: () => string;
9
9
  /** Greek VAT Number. */
10
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"GR">;
11
11
  //#endregion
12
12
  export { compact, vat as default, format, generate, validate };
13
13
  //# sourceMappingURL=vat.d.ts.map
package/dist/gr/vat.js CHANGED
@@ -3,16 +3,6 @@ import { randomDigits } from "../_util/generate.js";
3
3
  import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/gr/vat.ts
6
- /**
7
- * ΑΦΜ (Greek VAT number).
8
- *
9
- * 9 digits. 8-digit numbers are zero-padded.
10
- * Iterative checksum: cs = 0; for each d[0..7]:
11
- * cs = cs*2 + d; check = (cs*2) % 11 % 10 == d[8].
12
- *
13
- * @see https://www.vatify.eu/greece-vat-number.html
14
- * @see https://www.aade.gr/
15
- */
16
6
  const compact = (value) => {
17
7
  let v = clean(value, " -/.");
18
8
  if (v.startsWith("EL") || v.startsWith("el")) v = v.slice(2);
@@ -51,6 +41,7 @@ const vat = {
51
41
  "AFM"
52
42
  ],
53
43
  candidatePattern: "EL\\d{9}",
44
+ scope: "country",
54
45
  country: "GR",
55
46
  entityType: "any",
56
47
  sourceUrl: "https://www.aade.gr/",
@@ -1 +1 @@
1
- {"version":3,"file":"vat.js","names":[],"sources":["../../src/gr/vat.ts"],"sourcesContent":["/**\n * ΑΦΜ (Greek VAT number).\n *\n * 9 digits. 8-digit numbers are zero-padded.\n * Iterative checksum: cs = 0; for each d[0..7]:\n * cs = cs*2 + d; check = (cs*2) % 11 % 10 == d[8].\n *\n * @see https://www.vatify.eu/greece-vat-number.html\n * @see https://www.aade.gr/\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 let v = clean(value, \" -/.\");\n if (v.startsWith(\"EL\") || v.startsWith(\"el\")) {\n v = v.slice(2);\n }\n if (v.startsWith(\"GR\") || v.startsWith(\"gr\")) {\n v = v.slice(2);\n }\n // Zero-pad 8-digit numbers\n if (v.length === 8) {\n v = `0${v}`;\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Greek VAT number must be 9 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Greek VAT number must contain only digits\",\n );\n }\n let cs = 0;\n for (let i = 0; i < 8; i++) {\n cs = cs * 2 + Number(v[i]);\n }\n const check = ((cs * 2) % 11) % 10;\n if (check !== Number(v[8])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Greek VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `EL${compact(value)}`;\n\n/** Generate a random valid Greek VAT number. */\nconst generate = (): string => {\n const payload = randomDigits(8);\n let cs = 0;\n for (let i = 0; i < 8; i++)\n cs = cs * 2 + Number(payload[i]);\n return payload + String(((cs * 2) % 11) % 10);\n};\n\n/** Greek VAT Number. */\nconst vat: Validator = {\n name: \"Greek VAT Number\",\n localName: \"Αριθμός Φορολογικού Μητρώου\",\n abbreviation: \"ΑΦΜ\",\n aliases: [\n \"ΑΦΜ\",\n \"Αριθμός Φορολογικού Μητρώου\",\n \"AFM\",\n ] as const,\n candidatePattern: \"EL\\\\d{9}\",\n country: \"GR\",\n entityType: \"any\",\n sourceUrl: \"https://www.aade.gr/\",\n examples: [\"094259216\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,OAAO;AAC5B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,KAAI,EAAE,MAAM,EAAE;AAEhB,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,KAAI,EAAE,MAAM,EAAE;AAGhB,KAAI,EAAE,WAAW,EACf,KAAI,IAAI;AAEV,QAAO;;AAGT,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,oCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,4CACD;CAEH,IAAI,KAAK;AACT,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,MAAK,KAAK,IAAI,OAAO,EAAE,GAAG;AAG5B,KADgB,KAAK,IAAK,KAAM,OAClB,OAAO,EAAE,GAAG,CACxB,QAAO,IACL,oBACA,wCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UACd,KAAK,QAAQ,MAAM;;AAGrB,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,EAAE;CAC/B,IAAI,KAAK;AACT,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,MAAK,KAAK,IAAI,OAAO,QAAQ,GAAG;AAClC,QAAO,UAAU,OAAS,KAAK,IAAK,KAAM,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,YAAY;CACvB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"vat.js","names":[],"sources":["../../src/gr/vat.ts"],"sourcesContent":["/**\n * ΑΦΜ (Greek VAT number).\n *\n * 9 digits. 8-digit numbers are zero-padded.\n * Iterative checksum: cs = 0; for each d[0..7]:\n * cs = cs*2 + d; check = (cs*2) % 11 % 10 == d[8].\n *\n * @see https://www.vatify.eu/greece-vat-number.html\n * @see https://www.aade.gr/\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 let v = clean(value, \" -/.\");\n if (v.startsWith(\"EL\") || v.startsWith(\"el\")) {\n v = v.slice(2);\n }\n if (v.startsWith(\"GR\") || v.startsWith(\"gr\")) {\n v = v.slice(2);\n }\n // Zero-pad 8-digit numbers\n if (v.length === 8) {\n v = `0${v}`;\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9) {\n return err(\n \"INVALID_LENGTH\",\n \"Greek VAT number must be 9 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Greek VAT number must contain only digits\",\n );\n }\n let cs = 0;\n for (let i = 0; i < 8; i++) {\n cs = cs * 2 + Number(v[i]);\n }\n const check = ((cs * 2) % 11) % 10;\n if (check !== Number(v[8])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Greek VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `EL${compact(value)}`;\n\n/** Generate a random valid Greek VAT number. */\nconst generate = (): string => {\n const payload = randomDigits(8);\n let cs = 0;\n for (let i = 0; i < 8; i++)\n cs = cs * 2 + Number(payload[i]);\n return payload + String(((cs * 2) % 11) % 10);\n};\n\n/** Greek VAT Number. */\nconst vat: CountryValidator<\"GR\"> = {\n name: \"Greek VAT Number\",\n localName: \"Αριθμός Φορολογικού Μητρώου\",\n abbreviation: \"ΑΦΜ\",\n aliases: [\n \"ΑΦΜ\",\n \"Αριθμός Φορολογικού Μητρώου\",\n \"AFM\",\n ] as const,\n candidatePattern: \"EL\\\\d{9}\",\n scope: \"country\",\n country: \"GR\",\n entityType: \"any\",\n sourceUrl: \"https://www.aade.gr/\",\n examples: [\"094259216\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAqBA,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,MAAM;CAC3B,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,IAAI,EAAE,MAAM,CAAC;CAEf,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,IAAI,EAAE,MAAM,CAAC;CAGf,IAAI,EAAE,WAAW,GACf,IAAI,IAAI;CAEV,OAAO;AACT;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,mCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,2CACF;CAEF,IAAI,KAAK;CACT,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,KAAK,KAAK,IAAI,OAAO,EAAE,EAAE;CAG3B,IADgB,KAAK,IAAK,KAAM,OAClB,OAAO,EAAE,EAAE,GACvB,OAAO,IACL,oBACA,uCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UACd,KAAK,QAAQ,KAAK;;AAGpB,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,CAAC;CAC9B,IAAI,KAAK;CACT,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,KAAK,KAAK,IAAI,OAAO,QAAQ,EAAE;CACjC,OAAO,UAAU,OAAS,KAAK,IAAK,KAAM,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,WAAW;CACtB;CACA;CACA;CACA;AACF"}
package/dist/gt/nit.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/gt/nit.d.ts
4
4
  /**
@@ -14,7 +14,7 @@ declare const format: (value: string) => string;
14
14
  /** Generate a random valid NIT (7 body digits). */
15
15
  declare const generate: () => string;
16
16
  /** Guatemala tax identification number. */
17
- declare const nit: Validator;
17
+ declare const nit: CountryValidator<"GT">;
18
18
  //#endregion
19
19
  export { compact, nit as default, format, generate, validate };
20
20
  //# sourceMappingURL=nit.d.ts.map
package/dist/gt/nit.js CHANGED
@@ -4,18 +4,6 @@ import { err } from "../_util/result.js";
4
4
  import { isdigits } from "../_util/strings.js";
5
5
  //#region src/gt/nit.ts
6
6
  /**
7
- * NIT (Número de Identificación Tributaria,
8
- * Guatemala tax number).
9
- *
10
- * 2–12 characters: body digits followed by a check
11
- * character. The check character is computed via a
12
- * weighted sum mod 11; remainder 10 maps to 'K'.
13
- *
14
- * Ported from python-stdnum gt.nit module.
15
- *
16
- * @see https://portal.sat.gob.gt/portal/
17
- */
18
- /**
19
7
  * Compact: strip spaces, hyphens, leading zeros,
20
8
  * and uppercase.
21
9
  */
@@ -68,6 +56,7 @@ const nit = {
68
56
  abbreviation: "NIT",
69
57
  aliases: ["NIT"],
70
58
  candidatePattern: "\\d{7,8}-?\\d",
59
+ scope: "country",
71
60
  country: "GT",
72
61
  entityType: "any",
73
62
  description: "Tax identifier issued by Guatemala's SAT",