@stll/stdnum 1.0.0 → 2.0.1

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 (705) hide show
  1. package/README.md +1 -4
  2. package/dist/_checksums/luhn.js.map +1 -1
  3. package/dist/_checksums/mod1110.js +1 -1
  4. package/dist/_checksums/mod1110.js.map +1 -1
  5. package/dist/_checksums/mod112.js.map +1 -1
  6. package/dist/_checksums/mod97.js.map +1 -1
  7. package/dist/_checksums/verhoeff.js.map +1 -1
  8. package/dist/_checksums/weighted-sum.js.map +1 -1
  9. package/dist/_util/arabic.js.map +1 -1
  10. package/dist/_util/clean.js.map +1 -1
  11. package/dist/_util/date.js.map +1 -1
  12. package/dist/_util/generate.js.map +1 -1
  13. package/dist/_util/result.js.map +1 -1
  14. package/dist/_util/strings.js.map +1 -1
  15. package/dist/ad/nrt.d.ts +16 -2
  16. package/dist/ad/nrt.js +1 -14
  17. package/dist/ad/nrt.js.map +1 -1
  18. package/dist/ae/eid.d.ts +2 -2
  19. package/dist/ae/eid.js +2 -12
  20. package/dist/ae/eid.js.map +1 -1
  21. package/dist/ai/tin.d.ts +20 -2
  22. package/dist/ai/tin.js +1 -18
  23. package/dist/ai/tin.js.map +1 -1
  24. package/dist/al/nipt.d.ts +13 -2
  25. package/dist/al/nipt.js +1 -11
  26. package/dist/al/nipt.js.map +1 -1
  27. package/dist/am/tin.d.ts +16 -2
  28. package/dist/am/tin.js +1 -14
  29. package/dist/am/tin.js.map +1 -1
  30. package/dist/ar/cbu.d.ts +2 -2
  31. package/dist/ar/cbu.js +1 -9
  32. package/dist/ar/cbu.js.map +1 -1
  33. package/dist/ar/cuit.d.ts +2 -2
  34. package/dist/ar/cuit.js +1 -17
  35. package/dist/ar/cuit.js.map +1 -1
  36. package/dist/ar/dni.d.ts +11 -2
  37. package/dist/ar/dni.js +1 -9
  38. package/dist/ar/dni.js.map +1 -1
  39. package/dist/at/businessid.d.ts +10 -2
  40. package/dist/at/businessid.js +1 -8
  41. package/dist/at/businessid.js.map +1 -1
  42. package/dist/at/tin.d.ts +2 -2
  43. package/dist/at/tin.js +1 -11
  44. package/dist/at/tin.js.map +1 -1
  45. package/dist/at/uid.d.ts +2 -2
  46. package/dist/at/uid.js +2 -10
  47. package/dist/at/uid.js.map +1 -1
  48. package/dist/at/vnr.d.ts +2 -2
  49. package/dist/at/vnr.js +4 -14
  50. package/dist/at/vnr.js.map +1 -1
  51. package/dist/au/abn.d.ts +2 -2
  52. package/dist/au/abn.js +1 -10
  53. package/dist/au/abn.js.map +1 -1
  54. package/dist/au/acn.d.ts +2 -2
  55. package/dist/au/acn.js +1 -10
  56. package/dist/au/acn.js.map +1 -1
  57. package/dist/au/tfn.d.ts +2 -2
  58. package/dist/au/tfn.js +1 -10
  59. package/dist/au/tfn.js.map +1 -1
  60. package/dist/az/voen.d.ts +2 -2
  61. package/dist/az/voen.js +1 -14
  62. package/dist/az/voen.js.map +1 -1
  63. package/dist/ba/jmbg.d.ts +2 -2
  64. package/dist/ba/jmbg.js +3 -11
  65. package/dist/ba/jmbg.js.map +1 -1
  66. package/dist/bd/nid.d.ts +23 -2
  67. package/dist/bd/nid.js +1 -21
  68. package/dist/bd/nid.js.map +1 -1
  69. package/dist/be/bis.d.ts +2 -2
  70. package/dist/be/bis.js +1 -11
  71. package/dist/be/bis.js.map +1 -1
  72. package/dist/be/nn.d.ts +2 -2
  73. package/dist/be/nn.js +1 -11
  74. package/dist/be/nn.js.map +1 -1
  75. package/dist/be/vat.d.ts +2 -2
  76. package/dist/be/vat.js +1 -9
  77. package/dist/be/vat.js.map +1 -1
  78. package/dist/bg/egn.d.ts +2 -2
  79. package/dist/bg/egn.js +3 -18
  80. package/dist/bg/egn.js.map +1 -1
  81. package/dist/bg/pnf.d.ts +2 -2
  82. package/dist/bg/pnf.js +1 -8
  83. package/dist/bg/pnf.js.map +1 -1
  84. package/dist/bg/vat.d.ts +2 -2
  85. package/dist/bg/vat.js +3 -9
  86. package/dist/bg/vat.js.map +1 -1
  87. package/dist/bh/cpr.d.ts +2 -2
  88. package/dist/bh/cpr.js +1 -17
  89. package/dist/bh/cpr.js.map +1 -1
  90. package/dist/bic.d.ts +13 -2
  91. package/dist/bic.js +1 -11
  92. package/dist/bic.js.map +1 -1
  93. package/dist/br/cnpj.d.ts +2 -2
  94. package/dist/br/cnpj.js +1 -20
  95. package/dist/br/cnpj.js.map +1 -1
  96. package/dist/br/cpf.d.ts +2 -2
  97. package/dist/br/cpf.js +1 -14
  98. package/dist/br/cpf.js.map +1 -1
  99. package/dist/by/unp.d.ts +2 -2
  100. package/dist/by/unp.js +3 -14
  101. package/dist/by/unp.js.map +1 -1
  102. package/dist/bz/tin.d.ts +2 -2
  103. package/dist/bz/tin.js +1 -26
  104. package/dist/bz/tin.js.map +1 -1
  105. package/dist/ca/bn.d.ts +2 -2
  106. package/dist/ca/bn.js +2 -10
  107. package/dist/ca/bn.js.map +1 -1
  108. package/dist/ca/sin.d.ts +2 -2
  109. package/dist/ca/sin.js +2 -10
  110. package/dist/ca/sin.js.map +1 -1
  111. package/dist/ch/ssn.d.ts +2 -2
  112. package/dist/ch/ssn.js +1 -9
  113. package/dist/ch/ssn.js.map +1 -1
  114. package/dist/ch/uid.d.ts +2 -2
  115. package/dist/ch/uid.js +1 -9
  116. package/dist/ch/uid.js.map +1 -1
  117. package/dist/ch/vat.d.ts +2 -2
  118. package/dist/ch/vat.js +1 -9
  119. package/dist/ch/vat.js.map +1 -1
  120. package/dist/cl/rut.d.ts +2 -2
  121. package/dist/cl/rut.js +1 -14
  122. package/dist/cl/rut.js.map +1 -1
  123. package/dist/cn/ric.d.ts +2 -2
  124. package/dist/cn/ric.js +3 -14
  125. package/dist/cn/ric.js.map +1 -1
  126. package/dist/cn/uscc.d.ts +2 -2
  127. package/dist/cn/uscc.js +1 -10
  128. package/dist/cn/uscc.js.map +1 -1
  129. package/dist/co/nit.d.ts +2 -2
  130. package/dist/co/nit.js +2 -12
  131. package/dist/co/nit.js.map +1 -1
  132. package/dist/cr/cpf.d.ts +18 -2
  133. package/dist/cr/cpf.js +1 -16
  134. package/dist/cr/cpf.js.map +1 -1
  135. package/dist/creditcard.d.ts +2 -2
  136. package/dist/creditcard.js +5 -14
  137. package/dist/creditcard.js.map +1 -1
  138. package/dist/cu/ni.d.ts +2 -2
  139. package/dist/cu/ni.js +2 -17
  140. package/dist/cu/ni.js.map +1 -1
  141. package/dist/cy/vat.d.ts +2 -2
  142. package/dist/cy/vat.js +1 -8
  143. package/dist/cy/vat.js.map +1 -1
  144. package/dist/cz/dic.d.ts +2 -2
  145. package/dist/cz/dic.js +7 -13
  146. package/dist/cz/dic.js.map +1 -1
  147. package/dist/cz/ico.d.ts +2 -2
  148. package/dist/cz/ico.js +2 -10
  149. package/dist/cz/ico.js.map +1 -1
  150. package/dist/cz/rc.d.ts +2 -2
  151. package/dist/cz/rc.js +2 -26
  152. package/dist/cz/rc.js.map +1 -1
  153. package/dist/de/handelsreg.d.ts +19 -2
  154. package/dist/de/handelsreg.js +1 -17
  155. package/dist/de/handelsreg.js.map +1 -1
  156. package/dist/de/idnr.d.ts +2 -2
  157. package/dist/de/idnr.js +2 -12
  158. package/dist/de/idnr.js.map +1 -1
  159. package/dist/de/stnr.d.ts +17 -2
  160. package/dist/de/stnr.js +1 -15
  161. package/dist/de/stnr.js.map +1 -1
  162. package/dist/de/svnr.d.ts +2 -2
  163. package/dist/de/svnr.js +2 -11
  164. package/dist/de/svnr.js.map +1 -1
  165. package/dist/de/vat.d.ts +2 -2
  166. package/dist/de/vat.js +2 -11
  167. package/dist/de/vat.js.map +1 -1
  168. package/dist/dk/cpr.d.ts +2 -2
  169. package/dist/dk/cpr.js +2 -10
  170. package/dist/dk/cpr.js.map +1 -1
  171. package/dist/dk/cvr.d.ts +2 -2
  172. package/dist/dk/cvr.js +2 -15
  173. package/dist/dk/cvr.js.map +1 -1
  174. package/dist/dk/vat.d.ts +2 -2
  175. package/dist/dk/vat.js +3 -13
  176. package/dist/dk/vat.js.map +1 -1
  177. package/dist/do/rnc.d.ts +2 -2
  178. package/dist/do/rnc.js +2 -16
  179. package/dist/do/rnc.js.map +1 -1
  180. package/dist/ec/ruc.d.ts +2 -2
  181. package/dist/ec/ruc.js +1 -18
  182. package/dist/ec/ruc.js.map +1 -1
  183. package/dist/ee/ik.d.ts +2 -2
  184. package/dist/ee/ik.js +3 -20
  185. package/dist/ee/ik.js.map +1 -1
  186. package/dist/ee/registrikood.d.ts +2 -2
  187. package/dist/ee/registrikood.js +1 -8
  188. package/dist/ee/registrikood.js.map +1 -1
  189. package/dist/ee/vat.d.ts +2 -2
  190. package/dist/ee/vat.js +2 -10
  191. package/dist/ee/vat.js.map +1 -1
  192. package/dist/eg/tn.d.ts +11 -2
  193. package/dist/eg/tn.js +1 -9
  194. package/dist/eg/tn.js.map +1 -1
  195. package/dist/es/cif.d.ts +2 -2
  196. package/dist/es/cif.js +1 -10
  197. package/dist/es/cif.js.map +1 -1
  198. package/dist/es/dni.d.ts +2 -2
  199. package/dist/es/dni.js +1 -9
  200. package/dist/es/dni.js.map +1 -1
  201. package/dist/es/nie.d.ts +2 -2
  202. package/dist/es/nie.js +1 -9
  203. package/dist/es/nie.js.map +1 -1
  204. package/dist/es/nss.d.ts +2 -2
  205. package/dist/es/nss.js +1 -16
  206. package/dist/es/nss.js.map +1 -1
  207. package/dist/es/vat.d.ts +2 -2
  208. package/dist/es/vat.js +5 -10
  209. package/dist/es/vat.js.map +1 -1
  210. package/dist/eu/vat.d.ts +2 -2
  211. package/dist/eu/vat.js +1 -0
  212. package/dist/eu/vat.js.map +1 -1
  213. package/dist/fi/hetu.d.ts +2 -2
  214. package/dist/fi/hetu.js +2 -10
  215. package/dist/fi/hetu.js.map +1 -1
  216. package/dist/fi/vat.d.ts +2 -2
  217. package/dist/fi/vat.js +3 -10
  218. package/dist/fi/vat.js.map +1 -1
  219. package/dist/fi/ytunnus.d.ts +2 -2
  220. package/dist/fi/ytunnus.js +2 -10
  221. package/dist/fi/ytunnus.js.map +1 -1
  222. package/dist/fr/nif.d.ts +2 -2
  223. package/dist/fr/nif.js +1 -9
  224. package/dist/fr/nif.js.map +1 -1
  225. package/dist/fr/nir.d.ts +2 -2
  226. package/dist/fr/nir.js +2 -14
  227. package/dist/fr/nir.js.map +1 -1
  228. package/dist/fr/siren.d.ts +2 -2
  229. package/dist/fr/siren.js +2 -10
  230. package/dist/fr/siren.js.map +1 -1
  231. package/dist/fr/siret.d.ts +2 -2
  232. package/dist/fr/siret.js +2 -11
  233. package/dist/fr/siret.js.map +1 -1
  234. package/dist/fr/tva.d.ts +2 -2
  235. package/dist/fr/tva.js +2 -12
  236. package/dist/fr/tva.js.map +1 -1
  237. package/dist/gb/nino.d.ts +12 -2
  238. package/dist/gb/nino.js +1 -10
  239. package/dist/gb/nino.js.map +1 -1
  240. package/dist/gb/sedol.d.ts +2 -2
  241. package/dist/gb/sedol.js +1 -11
  242. package/dist/gb/sedol.js.map +1 -1
  243. package/dist/gb/utr.d.ts +2 -2
  244. package/dist/gb/utr.js +2 -10
  245. package/dist/gb/utr.js.map +1 -1
  246. package/dist/gb/vat.d.ts +2 -2
  247. package/dist/gb/vat.js +2 -11
  248. package/dist/gb/vat.js.map +1 -1
  249. package/dist/ge/pin.d.ts +14 -2
  250. package/dist/ge/pin.js +1 -12
  251. package/dist/ge/pin.js.map +1 -1
  252. package/dist/gh/tin.d.ts +2 -2
  253. package/dist/gh/tin.js +1 -15
  254. package/dist/gh/tin.js.map +1 -1
  255. package/dist/gr/amka.d.ts +2 -2
  256. package/dist/gr/amka.js +3 -11
  257. package/dist/gr/amka.js.map +1 -1
  258. package/dist/gr/vat.d.ts +2 -2
  259. package/dist/gr/vat.js +1 -10
  260. package/dist/gr/vat.js.map +1 -1
  261. package/dist/gt/nit.d.ts +2 -2
  262. package/dist/gt/nit.js +1 -12
  263. package/dist/gt/nit.js.map +1 -1
  264. package/dist/hk/hkid.d.ts +2 -2
  265. package/dist/hk/hkid.js +1 -10
  266. package/dist/hk/hkid.js.map +1 -1
  267. package/dist/hr/vat.d.ts +2 -2
  268. package/dist/hr/vat.js +2 -9
  269. package/dist/hr/vat.js.map +1 -1
  270. package/dist/hu/vat.d.ts +2 -2
  271. package/dist/hu/vat.js +3 -10
  272. package/dist/hu/vat.js.map +1 -1
  273. package/dist/iban.d.ts +2 -2
  274. package/dist/iban.js +2 -8
  275. package/dist/iban.js.map +1 -1
  276. package/dist/id/npwp.d.ts +2 -2
  277. package/dist/id/npwp.js +3 -13
  278. package/dist/id/npwp.js.map +1 -1
  279. package/dist/ie/pps.d.ts +2 -2
  280. package/dist/ie/pps.js +1 -10
  281. package/dist/ie/pps.js.map +1 -1
  282. package/dist/ie/vat.d.ts +2 -2
  283. package/dist/ie/vat.js +1 -9
  284. package/dist/ie/vat.js.map +1 -1
  285. package/dist/il/idnr.d.ts +2 -2
  286. package/dist/il/idnr.js +2 -9
  287. package/dist/il/idnr.js.map +1 -1
  288. package/dist/in/aadhaar.d.ts +2 -2
  289. package/dist/in/aadhaar.js +2 -12
  290. package/dist/in/aadhaar.js.map +1 -1
  291. package/dist/in/gstin.d.ts +2 -2
  292. package/dist/in/gstin.js +1 -10
  293. package/dist/in/gstin.js.map +1 -1
  294. package/dist/in/pan.d.ts +15 -2
  295. package/dist/in/pan.js +1 -13
  296. package/dist/in/pan.js.map +1 -1
  297. package/dist/index.d.ts +2 -2
  298. package/dist/index.js +6 -6
  299. package/dist/iq/nid.d.ts +16 -2
  300. package/dist/iq/nid.js +2 -15
  301. package/dist/iq/nid.js.map +1 -1
  302. package/dist/ir/nid.d.ts +2 -2
  303. package/dist/ir/nid.js +2 -24
  304. package/dist/ir/nid.js.map +1 -1
  305. package/dist/is/kennitala.d.ts +2 -2
  306. package/dist/is/kennitala.js +2 -13
  307. package/dist/is/kennitala.js.map +1 -1
  308. package/dist/is/vsk.d.ts +9 -2
  309. package/dist/is/vsk.js +1 -7
  310. package/dist/is/vsk.js.map +1 -1
  311. package/dist/isin.d.ts +2 -2
  312. package/dist/isin.js +2 -12
  313. package/dist/isin.js.map +1 -1
  314. package/dist/it/codicefiscale.d.ts +2 -2
  315. package/dist/it/codicefiscale.js +1 -21
  316. package/dist/it/codicefiscale.js.map +1 -1
  317. package/dist/it/iva.d.ts +2 -2
  318. package/dist/it/iva.js +2 -9
  319. package/dist/it/iva.js.map +1 -1
  320. package/dist/jp/cn.d.ts +2 -2
  321. package/dist/jp/cn.js +1 -9
  322. package/dist/jp/cn.js.map +1 -1
  323. package/dist/jp/mynumber.d.ts +2 -2
  324. package/dist/jp/mynumber.js +1 -10
  325. package/dist/jp/mynumber.js.map +1 -1
  326. package/dist/kr/brn.d.ts +11 -2
  327. package/dist/kr/brn.js +1 -9
  328. package/dist/kr/brn.js.map +1 -1
  329. package/dist/kr/rrn.d.ts +2 -2
  330. package/dist/kr/rrn.js +2 -11
  331. package/dist/kr/rrn.js.map +1 -1
  332. package/dist/kw/civil.d.ts +2 -2
  333. package/dist/kw/civil.js +2 -14
  334. package/dist/kw/civil.js.map +1 -1
  335. package/dist/kz/iin.d.ts +2 -2
  336. package/dist/kz/iin.js +3 -18
  337. package/dist/kz/iin.js.map +1 -1
  338. package/dist/lei.d.ts +2 -2
  339. package/dist/lei.js +2 -11
  340. package/dist/lei.js.map +1 -1
  341. package/dist/li/peid.d.ts +11 -2
  342. package/dist/li/peid.js +1 -9
  343. package/dist/li/peid.js.map +1 -1
  344. package/dist/lk/nic.d.ts +2 -2
  345. package/dist/lk/nic.js +2 -14
  346. package/dist/lk/nic.js.map +1 -1
  347. package/dist/lt/asmens.d.ts +2 -2
  348. package/dist/lt/asmens.js +2 -1
  349. package/dist/lt/asmens.js.map +1 -1
  350. package/dist/lt/vat.d.ts +2 -2
  351. package/dist/lt/vat.js +2 -10
  352. package/dist/lt/vat.js.map +1 -1
  353. package/dist/lu/vat.d.ts +2 -2
  354. package/dist/lu/vat.js +2 -8
  355. package/dist/lu/vat.js.map +1 -1
  356. package/dist/luhn.d.ts +2 -2
  357. package/dist/luhn.js +2 -9
  358. package/dist/luhn.js.map +1 -1
  359. package/dist/lv/vat.d.ts +2 -2
  360. package/dist/lv/vat.js +2 -28
  361. package/dist/lv/vat.js.map +1 -1
  362. package/dist/ma/ice.d.ts +2 -2
  363. package/dist/ma/ice.js +2 -11
  364. package/dist/ma/ice.js.map +1 -1
  365. package/dist/mc/tva.d.ts +2 -2
  366. package/dist/mc/tva.js +1 -0
  367. package/dist/mc/tva.js.map +1 -1
  368. package/dist/md/idno.d.ts +2 -2
  369. package/dist/md/idno.js +1 -10
  370. package/dist/md/idno.js.map +1 -1
  371. package/dist/me/pib.d.ts +2 -2
  372. package/dist/me/pib.js +2 -10
  373. package/dist/me/pib.js.map +1 -1
  374. package/dist/mk/edb.d.ts +2 -2
  375. package/dist/mk/edb.js +2 -11
  376. package/dist/mk/edb.js.map +1 -1
  377. package/dist/mt/vat.d.ts +2 -2
  378. package/dist/mt/vat.js +3 -10
  379. package/dist/mt/vat.js.map +1 -1
  380. package/dist/mu/brn.d.ts +23 -2
  381. package/dist/mu/brn.js +1 -21
  382. package/dist/mu/brn.js.map +1 -1
  383. package/dist/mx/clabe.d.ts +2 -2
  384. package/dist/mx/clabe.js +1 -14
  385. package/dist/mx/clabe.js.map +1 -1
  386. package/dist/mx/curp.d.ts +2 -2
  387. package/dist/mx/curp.js +3 -17
  388. package/dist/mx/curp.js.map +1 -1
  389. package/dist/mx/rfc.d.ts +2 -2
  390. package/dist/mx/rfc.js +3 -19
  391. package/dist/mx/rfc.js.map +1 -1
  392. package/dist/my/nric.d.ts +2 -2
  393. package/dist/my/nric.js +2 -14
  394. package/dist/my/nric.js.map +1 -1
  395. package/dist/ng/nin.d.ts +13 -2
  396. package/dist/ng/nin.js +1 -11
  397. package/dist/ng/nin.js.map +1 -1
  398. package/dist/ni/ruc.d.ts +2 -2
  399. package/dist/ni/ruc.js +1 -23
  400. package/dist/ni/ruc.js.map +1 -1
  401. package/dist/nl/bsn.d.ts +2 -2
  402. package/dist/nl/bsn.js +2 -10
  403. package/dist/nl/bsn.js.map +1 -1
  404. package/dist/nl/kvk.d.ts +9 -2
  405. package/dist/nl/kvk.js +1 -7
  406. package/dist/nl/kvk.js.map +1 -1
  407. package/dist/nl/vat.d.ts +2 -2
  408. package/dist/nl/vat.js +1 -13
  409. package/dist/nl/vat.js.map +1 -1
  410. package/dist/no/fodselsnummer.d.ts +2 -2
  411. package/dist/no/fodselsnummer.js +2 -10
  412. package/dist/no/fodselsnummer.js.map +1 -1
  413. package/dist/no/mva.d.ts +2 -2
  414. package/dist/no/mva.js +1 -8
  415. package/dist/no/mva.js.map +1 -1
  416. package/dist/no/orgnr.d.ts +2 -2
  417. package/dist/no/orgnr.js +2 -8
  418. package/dist/no/orgnr.js.map +1 -1
  419. package/dist/nz/ird.d.ts +2 -2
  420. package/dist/nz/ird.js +2 -11
  421. package/dist/nz/ird.js.map +1 -1
  422. package/dist/pa/ruc.d.ts +2 -2
  423. package/dist/pa/ruc.js +1 -18
  424. package/dist/pa/ruc.js.map +1 -1
  425. package/dist/patterns.d.ts +8 -7
  426. package/dist/patterns.js +3 -5
  427. package/dist/patterns.js.map +1 -1
  428. package/dist/pe/ruc.d.ts +2 -2
  429. package/dist/pe/ruc.js +1 -15
  430. package/dist/pe/ruc.js.map +1 -1
  431. package/dist/ph/philid.d.ts +14 -2
  432. package/dist/ph/philid.js +1 -12
  433. package/dist/ph/philid.js.map +1 -1
  434. package/dist/pk/cnic.d.ts +14 -2
  435. package/dist/pk/cnic.js +1 -12
  436. package/dist/pk/cnic.js.map +1 -1
  437. package/dist/pl/nip.d.ts +2 -2
  438. package/dist/pl/nip.js +2 -10
  439. package/dist/pl/nip.js.map +1 -1
  440. package/dist/pl/pesel.d.ts +2 -2
  441. package/dist/pl/pesel.js +3 -13
  442. package/dist/pl/pesel.js.map +1 -1
  443. package/dist/pl/regon.d.ts +2 -2
  444. package/dist/pl/regon.js +2 -11
  445. package/dist/pl/regon.js.map +1 -1
  446. package/dist/pt/cc.d.ts +2 -2
  447. package/dist/pt/cc.js +1 -9
  448. package/dist/pt/cc.js.map +1 -1
  449. package/dist/pt/vat.d.ts +2 -2
  450. package/dist/pt/vat.js +3 -11
  451. package/dist/pt/vat.js.map +1 -1
  452. package/dist/ro/cnp.d.ts +2 -2
  453. package/dist/ro/cnp.js +4 -14
  454. package/dist/ro/cnp.js.map +1 -1
  455. package/dist/ro/vat.d.ts +2 -2
  456. package/dist/ro/vat.js +13 -11
  457. package/dist/ro/vat.js.map +1 -1
  458. package/dist/rs/pib.d.ts +2 -2
  459. package/dist/rs/pib.js +1 -9
  460. package/dist/rs/pib.js.map +1 -1
  461. package/dist/ru/inn.d.ts +2 -2
  462. package/dist/ru/inn.js +1 -11
  463. package/dist/ru/inn.js.map +1 -1
  464. package/dist/se/orgnr.d.ts +2 -2
  465. package/dist/se/orgnr.js +2 -9
  466. package/dist/se/orgnr.js.map +1 -1
  467. package/dist/se/personnummer.d.ts +2 -2
  468. package/dist/se/personnummer.js +7 -15
  469. package/dist/se/personnummer.js.map +1 -1
  470. package/dist/se/vat.d.ts +2 -2
  471. package/dist/se/vat.js +3 -10
  472. package/dist/se/vat.js.map +1 -1
  473. package/dist/sg/uen.d.ts +2 -2
  474. package/dist/sg/uen.js +1 -15
  475. package/dist/sg/uen.js.map +1 -1
  476. package/dist/si/emso.d.ts +2 -2
  477. package/dist/si/emso.js +3 -18
  478. package/dist/si/emso.js.map +1 -1
  479. package/dist/si/vat.d.ts +2 -2
  480. package/dist/si/vat.js +3 -12
  481. package/dist/si/vat.js.map +1 -1
  482. package/dist/sk/dic.d.ts +2 -2
  483. package/dist/sk/dic.js +1 -0
  484. package/dist/sk/dic.js.map +1 -1
  485. package/dist/sk/ico.d.ts +2 -2
  486. package/dist/sk/ico.js +1 -0
  487. package/dist/sk/ico.js.map +1 -1
  488. package/dist/sk/rc.d.ts +2 -2
  489. package/dist/sk/rc.js +1 -0
  490. package/dist/sk/rc.js.map +1 -1
  491. package/dist/th/tin.d.ts +2 -2
  492. package/dist/th/tin.js +1 -11
  493. package/dist/th/tin.js.map +1 -1
  494. package/dist/tr/tckimlik.d.ts +2 -2
  495. package/dist/tr/tckimlik.js +1 -20
  496. package/dist/tr/tckimlik.js.map +1 -1
  497. package/dist/tr/vkn.d.ts +2 -2
  498. package/dist/tr/vkn.js +1 -20
  499. package/dist/tr/vkn.js.map +1 -1
  500. package/dist/tw/ubn.d.ts +2 -2
  501. package/dist/tw/ubn.js +1 -11
  502. package/dist/tw/ubn.js.map +1 -1
  503. package/dist/types.d.ts +26 -4
  504. package/dist/ua/edrpou.d.ts +2 -2
  505. package/dist/ua/edrpou.js +1 -11
  506. package/dist/ua/edrpou.js.map +1 -1
  507. package/dist/us/ein.d.ts +12 -2
  508. package/dist/us/ein.js +1 -10
  509. package/dist/us/ein.js.map +1 -1
  510. package/dist/us/itin.d.ts +13 -2
  511. package/dist/us/itin.js +1 -11
  512. package/dist/us/itin.js.map +1 -1
  513. package/dist/us/rtn.d.ts +2 -2
  514. package/dist/us/rtn.js +3 -18
  515. package/dist/us/rtn.js.map +1 -1
  516. package/dist/us/ssn.d.ts +13 -2
  517. package/dist/us/ssn.js +1 -11
  518. package/dist/us/ssn.js.map +1 -1
  519. package/dist/uy/rut.d.ts +2 -2
  520. package/dist/uy/rut.js +1 -14
  521. package/dist/uy/rut.js.map +1 -1
  522. package/dist/ve/rif.d.ts +2 -2
  523. package/dist/ve/rif.js +2 -15
  524. package/dist/ve/rif.js.map +1 -1
  525. package/dist/vn/mst.d.ts +2 -2
  526. package/dist/vn/mst.js +1 -12
  527. package/dist/vn/mst.js.map +1 -1
  528. package/dist/za/idnr.d.ts +2 -2
  529. package/dist/za/idnr.js +3 -16
  530. package/dist/za/idnr.js.map +1 -1
  531. package/package.json +22 -12
  532. package/src/_checksums/mod1110.ts +1 -1
  533. package/src/ad/nrt.ts +7 -3
  534. package/src/ae/eid.ts +7 -3
  535. package/src/ai/tin.ts +7 -3
  536. package/src/al/nipt.ts +7 -3
  537. package/src/am/tin.ts +7 -3
  538. package/src/ar/cbu.ts +7 -3
  539. package/src/ar/cuit.ts +7 -3
  540. package/src/ar/dni.ts +7 -3
  541. package/src/at/businessid.ts +7 -3
  542. package/src/at/tin.ts +7 -3
  543. package/src/at/uid.ts +7 -3
  544. package/src/at/vnr.ts +37 -9
  545. package/src/au/abn.ts +7 -3
  546. package/src/au/acn.ts +7 -3
  547. package/src/au/tfn.ts +7 -3
  548. package/src/az/voen.ts +7 -3
  549. package/src/ba/jmbg.ts +8 -7
  550. package/src/bd/nid.ts +7 -3
  551. package/src/be/bis.ts +8 -4
  552. package/src/be/nn.ts +7 -3
  553. package/src/be/vat.ts +7 -3
  554. package/src/bg/egn.ts +8 -7
  555. package/src/bg/pnf.ts +7 -3
  556. package/src/bg/vat.ts +8 -3
  557. package/src/bh/cpr.ts +7 -3
  558. package/src/bic.ts +7 -3
  559. package/src/br/cnpj.ts +7 -3
  560. package/src/br/cpf.ts +7 -3
  561. package/src/by/unp.ts +10 -5
  562. package/src/bz/tin.ts +7 -3
  563. package/src/ca/bn.ts +7 -3
  564. package/src/ca/sin.ts +7 -3
  565. package/src/ch/ssn.ts +7 -3
  566. package/src/ch/uid.ts +7 -3
  567. package/src/ch/vat.ts +9 -5
  568. package/src/cl/rut.ts +7 -3
  569. package/src/cn/ric.ts +8 -7
  570. package/src/cn/uscc.ts +7 -3
  571. package/src/co/nit.ts +8 -4
  572. package/src/cr/cpf.ts +7 -3
  573. package/src/creditcard.ts +10 -6
  574. package/src/cu/ni.ts +8 -7
  575. package/src/cy/vat.ts +7 -3
  576. package/src/cz/dic.ts +9 -4
  577. package/src/cz/ico.ts +7 -3
  578. package/src/cz/rc.ts +8 -7
  579. package/src/de/handelsreg.ts +7 -3
  580. package/src/de/idnr.ts +7 -3
  581. package/src/de/stnr.ts +7 -3
  582. package/src/de/svnr.ts +7 -3
  583. package/src/de/vat.ts +7 -3
  584. package/src/dk/cpr.ts +8 -7
  585. package/src/dk/cvr.ts +7 -3
  586. package/src/dk/vat.ts +8 -3
  587. package/src/do/rnc.ts +7 -3
  588. package/src/ec/ruc.ts +7 -3
  589. package/src/ee/ik.ts +8 -7
  590. package/src/ee/registrikood.ts +8 -4
  591. package/src/ee/vat.ts +7 -3
  592. package/src/eg/tn.ts +7 -3
  593. package/src/es/cif.ts +8 -4
  594. package/src/es/dni.ts +7 -3
  595. package/src/es/nie.ts +8 -4
  596. package/src/es/nss.ts +7 -3
  597. package/src/es/vat.ts +13 -5
  598. package/src/eu/vat.ts +10 -6
  599. package/src/fi/hetu.ts +8 -7
  600. package/src/fi/vat.ts +8 -3
  601. package/src/fi/ytunnus.ts +7 -3
  602. package/src/fr/nif.ts +7 -3
  603. package/src/fr/nir.ts +8 -7
  604. package/src/fr/siren.ts +7 -3
  605. package/src/fr/siret.ts +7 -3
  606. package/src/fr/tva.ts +7 -3
  607. package/src/gb/nino.ts +7 -3
  608. package/src/gb/sedol.ts +7 -3
  609. package/src/gb/utr.ts +7 -3
  610. package/src/gb/vat.ts +7 -3
  611. package/src/ge/pin.ts +7 -3
  612. package/src/gh/tin.ts +7 -3
  613. package/src/gr/amka.ts +7 -3
  614. package/src/gr/vat.ts +7 -3
  615. package/src/gt/nit.ts +7 -3
  616. package/src/hk/hkid.ts +7 -3
  617. package/src/hr/vat.ts +7 -3
  618. package/src/hu/vat.ts +8 -3
  619. package/src/iban.ts +7 -3
  620. package/src/id/npwp.ts +7 -3
  621. package/src/ie/pps.ts +7 -3
  622. package/src/ie/vat.ts +7 -3
  623. package/src/il/idnr.ts +7 -3
  624. package/src/in/aadhaar.ts +7 -3
  625. package/src/in/gstin.ts +7 -3
  626. package/src/in/pan.ts +7 -3
  627. package/src/index.ts +3 -0
  628. package/src/iq/nid.ts +7 -3
  629. package/src/ir/nid.ts +7 -3
  630. package/src/is/kennitala.ts +7 -3
  631. package/src/is/vsk.ts +7 -3
  632. package/src/isin.ts +7 -3
  633. package/src/it/codicefiscale.ts +11 -7
  634. package/src/it/iva.ts +7 -3
  635. package/src/jp/cn.ts +7 -3
  636. package/src/jp/mynumber.ts +7 -3
  637. package/src/kr/brn.ts +7 -3
  638. package/src/kr/rrn.ts +8 -7
  639. package/src/kw/civil.ts +8 -7
  640. package/src/kz/iin.ts +8 -8
  641. package/src/lei.ts +7 -3
  642. package/src/li/peid.ts +7 -3
  643. package/src/lk/nic.ts +8 -7
  644. package/src/lt/asmens.ts +8 -4
  645. package/src/lt/vat.ts +8 -3
  646. package/src/lu/vat.ts +8 -3
  647. package/src/luhn.ts +7 -3
  648. package/src/lv/vat.ts +7 -3
  649. package/src/ma/ice.ts +7 -3
  650. package/src/mc/tva.ts +9 -5
  651. package/src/md/idno.ts +7 -3
  652. package/src/me/pib.ts +7 -3
  653. package/src/mk/edb.ts +7 -3
  654. package/src/mt/vat.ts +8 -3
  655. package/src/mu/brn.ts +7 -3
  656. package/src/mx/clabe.ts +7 -3
  657. package/src/mx/curp.ts +9 -8
  658. package/src/mx/rfc.ts +8 -4
  659. package/src/my/nric.ts +8 -7
  660. package/src/ng/nin.ts +7 -3
  661. package/src/ni/ruc.ts +7 -3
  662. package/src/nl/bsn.ts +7 -3
  663. package/src/nl/kvk.ts +7 -3
  664. package/src/nl/vat.ts +7 -3
  665. package/src/no/fodselsnummer.ts +11 -7
  666. package/src/no/mva.ts +9 -5
  667. package/src/no/orgnr.ts +7 -3
  668. package/src/nz/ird.ts +8 -4
  669. package/src/pa/ruc.ts +7 -3
  670. package/src/patterns.ts +49 -18
  671. package/src/pe/ruc.ts +7 -3
  672. package/src/ph/philid.ts +7 -3
  673. package/src/pk/cnic.ts +7 -3
  674. package/src/pl/nip.ts +7 -3
  675. package/src/pl/pesel.ts +8 -7
  676. package/src/pl/regon.ts +7 -3
  677. package/src/pt/cc.ts +7 -3
  678. package/src/pt/vat.ts +8 -3
  679. package/src/ro/cnp.ts +15 -8
  680. package/src/ro/vat.ts +8 -3
  681. package/src/rs/pib.ts +7 -3
  682. package/src/ru/inn.ts +7 -3
  683. package/src/se/orgnr.ts +7 -3
  684. package/src/se/personnummer.ts +35 -33
  685. package/src/se/vat.ts +8 -3
  686. package/src/sg/uen.ts +7 -3
  687. package/src/si/emso.ts +8 -7
  688. package/src/si/vat.ts +8 -3
  689. package/src/sk/dic.ts +8 -4
  690. package/src/sk/ico.ts +3 -2
  691. package/src/sk/rc.ts +6 -2
  692. package/src/th/tin.ts +7 -3
  693. package/src/tr/tckimlik.ts +7 -3
  694. package/src/tr/vkn.ts +7 -3
  695. package/src/tw/ubn.ts +7 -3
  696. package/src/types.ts +34 -3
  697. package/src/ua/edrpou.ts +7 -3
  698. package/src/us/ein.ts +7 -3
  699. package/src/us/itin.ts +7 -3
  700. package/src/us/rtn.ts +16 -8
  701. package/src/us/ssn.ts +7 -3
  702. package/src/uy/rut.ts +7 -3
  703. package/src/ve/rif.ts +8 -6
  704. package/src/vn/mst.ts +7 -3
  705. package/src/za/idnr.ts +8 -7
@@ -1 +1 @@
1
- {"version":3,"file":"vat.js","names":[],"sources":["../../src/lt/vat.ts"],"sourcesContent":["/**\n * PVM kodas (Lithuanian VAT number).\n *\n * 9 or 12 digits. 9-digit: d[7] must be 1.\n * 12-digit: d[10] must be 1. Weighted checksum\n * with fallback weights.\n *\n * @see https://www.vatify.eu/lithuania-vat-number.html\n * @see https://www.vmi.lt/\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(\"LT\") || v.startsWith(\"lt\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst checksum = (v: string): boolean => {\n const n = v.length;\n let check = 0;\n for (let i = 0; i < n - 1; i++) {\n check += (1 + (i % 9)) * Number(v[i]);\n }\n check %= 11;\n if (check === 10) {\n check = 0;\n for (let i = 0; i < n - 1; i++) {\n check += (1 + ((i + 2) % 9)) * Number(v[i]);\n }\n check %= 11;\n }\n return check % 10 === Number(v[n - 1]);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9 && v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"Lithuanian VAT number must be 9 or 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Lithuanian VAT number must contain only digits\",\n );\n }\n // Check the marker digit\n if (v.length === 9 && v[7] !== \"1\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Lithuanian 9-digit VAT: digit 8 must be 1\",\n );\n }\n if (v.length === 12 && v[10] !== \"1\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Lithuanian 12-digit VAT: digit 11 must be 1\",\n );\n }\n if (!checksum(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Lithuanian VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `LT${compact(value)}`;\n\n/** Generate a random valid Lithuanian VAT number. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(9);\n if (validate(c).valid) return c;\n }\n};\n\n/** Lithuanian VAT Number. */\nconst vat: Validator = {\n name: \"Lithuanian VAT Number\",\n localName: \"PVM mokėtojo kodas\",\n abbreviation: \"PVM kodas\",\n aliases: [\"PVM mokėtojo kodas\", \"PVM\"] as const,\n candidatePattern: \"LT\\\\d{9,12}\",\n country: \"LT\",\n entityType: \"any\",\n sourceUrl: \"https://www.vmi.lt/\",\n examples: [\"119511515\", \"100001919017\"] 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,QAAO;;AAGT,MAAM,YAAY,MAAuB;CACvC,MAAM,IAAI,EAAE;CACZ,IAAI,QAAQ;AACZ,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IACzB,WAAU,IAAK,IAAI,KAAM,OAAO,EAAE,GAAG;AAEvC,UAAS;AACT,KAAI,UAAU,IAAI;AAChB,UAAQ;AACR,OAAK,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IACzB,WAAU,KAAM,IAAI,KAAK,KAAM,OAAO,EAAE,GAAG;AAE7C,WAAS;;AAEX,QAAO,QAAQ,OAAO,OAAO,EAAE,IAAI,GAAG;;AAGxC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GACjC,QAAO,IACL,kBACA,+CACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,iDACD;AAGH,KAAI,EAAE,WAAW,KAAK,EAAE,OAAO,IAC7B,QAAO,IACL,qBACA,4CACD;AAEH,KAAI,EAAE,WAAW,MAAM,EAAE,QAAQ,IAC/B,QAAO,IACL,qBACA,8CACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,oBACA,6CACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UACd,KAAK,QAAQ,MAAM;;AAGrB,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,CAAC,sBAAsB,MAAM;CACtC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,aAAa,eAAe;CACvC;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"vat.js","names":[],"sources":["../../src/lt/vat.ts"],"sourcesContent":["/**\n * PVM kodas (Lithuanian VAT number).\n *\n * 9 or 12 digits. 9-digit: d[7] must be 1.\n * 12-digit: d[10] must be 1. Weighted checksum\n * with fallback weights.\n *\n * @see https://www.vatify.eu/lithuania-vat-number.html\n * @see https://www.vmi.lt/\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(\"LT\") || v.startsWith(\"lt\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst checksum = (v: string): boolean => {\n const n = v.length;\n let check = 0;\n for (let i = 0; i < n - 1; i++) {\n check += (1 + (i % 9)) * Number(v[i]);\n }\n check %= 11;\n if (check === 10) {\n check = 0;\n for (let i = 0; i < n - 1; i++) {\n check += (1 + ((i + 2) % 9)) * Number(v[i]);\n }\n check %= 11;\n }\n return check % 10 === Number(v[n - 1]);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 9 && v.length !== 12) {\n return err(\n \"INVALID_LENGTH\",\n \"Lithuanian VAT number must be 9 or 12 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Lithuanian VAT number must contain only digits\",\n );\n }\n // Check the marker digit\n if (v.length === 9 && v[7] !== \"1\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Lithuanian 9-digit VAT: digit 8 must be 1\",\n );\n }\n if (v.length === 12 && v[10] !== \"1\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Lithuanian 12-digit VAT: digit 11 must be 1\",\n );\n }\n if (!checksum(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Lithuanian VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `LT${compact(value)}`;\n\n/** Generate a random valid Lithuanian VAT number. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(9);\n if (validate(c).valid) return c;\n }\n};\n\n/** Lithuanian VAT Number. */\nconst vat: CountryValidator<\"LT\"> = {\n name: \"Lithuanian VAT Number\",\n localName: \"PVM mokėtojo kodas\",\n abbreviation: \"PVM kodas\",\n aliases: [\"PVM mokėtojo kodas\", \"PVM\"] as const,\n candidatePattern: \"LT\\\\d{9,12}\",\n scope: \"country\",\n country: \"LT\",\n entityType: \"any\",\n sourceUrl: \"https://www.vmi.lt/\",\n lengths: [9, 12] as const,\n examples: [\"119511515\", \"100001919017\"] 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,OAAO;AACT;AAEA,MAAM,YAAY,MAAuB;CACvC,MAAM,IAAI,EAAE;CACZ,IAAI,QAAQ;CACZ,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,KACzB,UAAU,IAAK,IAAI,KAAM,OAAO,EAAE,EAAE;CAEtC,SAAS;CACT,IAAI,UAAU,IAAI;EAChB,QAAQ;EACR,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,KACzB,UAAU,KAAM,IAAI,KAAK,KAAM,OAAO,EAAE,EAAE;EAE5C,SAAS;CACX;CACA,OAAO,QAAQ,OAAO,OAAO,EAAE,IAAI,EAAE;AACvC;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,IACjC,OAAO,IACL,kBACA,8CACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,gDACF;CAGF,IAAI,EAAE,WAAW,KAAK,EAAE,OAAO,KAC7B,OAAO,IACL,qBACA,2CACF;CAEF,IAAI,EAAE,WAAW,MAAM,EAAE,QAAQ,KAC/B,OAAO,IACL,qBACA,6CACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,oBACA,4CACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UACd,KAAK,QAAQ,KAAK;;AAGpB,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,CAAC,sBAAsB,KAAK;CACrC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,SAAS,CAAC,GAAG,EAAE;CACf,UAAU,CAAC,aAAa,cAAc;CACtC;CACA;CACA;CACA;AACF"}
package/dist/lu/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/lu/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 Luxembourg VAT number. */
8
8
  declare const generate: () => string;
9
9
  /** Luxembourg VAT Number. */
10
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"LU">;
11
11
  //#endregion
12
12
  export { compact, vat as default, format, generate, validate };
13
13
  //# sourceMappingURL=vat.d.ts.map
package/dist/lu/vat.js CHANGED
@@ -3,14 +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/lu/vat.ts
6
- /**
7
- * TVA (Luxembourg VAT number).
8
- *
9
- * 8 digits. First 6 digits mod 89 === last 2 digits.
10
- *
11
- * @see https://www.vatify.eu/luxembourg-vat-number.html
12
- * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/luxembourg-tin.pdf
13
- */
14
6
  const compact = (value) => {
15
7
  let v = clean(value, " -/.");
16
8
  if (v.startsWith("LU") || v.startsWith("lu")) v = v.slice(2);
@@ -41,9 +33,11 @@ const vat = {
41
33
  abbreviation: "TVA",
42
34
  aliases: ["TVA", "numéro d'identification TVA"],
43
35
  candidatePattern: "LU\\d{8}",
36
+ scope: "country",
44
37
  country: "LU",
45
38
  entityType: "company",
46
39
  sourceUrl: "https://pfi.public.lu/",
40
+ lengths: [8],
47
41
  examples: ["15027442"],
48
42
  compact,
49
43
  format,
@@ -1 +1 @@
1
- {"version":3,"file":"vat.js","names":[],"sources":["../../src/lu/vat.ts"],"sourcesContent":["/**\n * TVA (Luxembourg VAT number).\n *\n * 8 digits. First 6 digits mod 89 === last 2 digits.\n *\n * @see https://www.vatify.eu/luxembourg-vat-number.html\n * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/luxembourg-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 let v = clean(value, \" -/.\");\n if (v.startsWith(\"LU\") || v.startsWith(\"lu\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"Luxembourg VAT number must be 8 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Luxembourg VAT number must contain only digits\",\n );\n }\n const front = Number.parseInt(v.slice(0, 6), 10);\n const check = Number.parseInt(v.slice(6, 8), 10);\n if (front % 89 !== check) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Luxembourg VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `LU${compact(value)}`;\n\n/** Generate a random valid Luxembourg VAT number. */\nconst generate = (): string => {\n const body = randomDigits(6);\n return (\n body +\n String(Number.parseInt(body, 10) % 89).padStart(2, \"0\")\n );\n};\n\n/** Luxembourg VAT Number. */\nconst vat: Validator = {\n name: \"Luxembourg VAT Number\",\n localName: \"Numéro de TVA\",\n abbreviation: \"TVA\",\n aliases: [\"TVA\", \"numéro d'identification TVA\"] as const,\n candidatePattern: \"LU\\\\d{8}\",\n country: \"LU\",\n entityType: \"company\",\n sourceUrl: \"https://pfi.public.lu/\",\n examples: [\"15027442\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;AAgBA,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,OAAO;AAC5B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,KAAI,EAAE,MAAM,EAAE;AAEhB,QAAO;;AAGT,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,yCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,iDACD;CAEH,MAAM,QAAQ,OAAO,SAAS,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG;CAChD,MAAM,QAAQ,OAAO,SAAS,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG;AAChD,KAAI,QAAQ,OAAO,MACjB,QAAO,IACL,oBACA,6CACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UACd,KAAK,QAAQ,MAAM;;AAGrB,MAAM,iBAAyB;CAC7B,MAAM,OAAO,aAAa,EAAE;AAC5B,QACE,OACA,OAAO,OAAO,SAAS,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,GAAG,IAAI;;;AAK3D,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,8BAA8B;CAC/C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"vat.js","names":[],"sources":["../../src/lu/vat.ts"],"sourcesContent":["/**\n * TVA (Luxembourg VAT number).\n *\n * 8 digits. First 6 digits mod 89 === last 2 digits.\n *\n * @see https://www.vatify.eu/luxembourg-vat-number.html\n * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/luxembourg-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 let v = clean(value, \" -/.\");\n if (v.startsWith(\"LU\") || v.startsWith(\"lu\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"Luxembourg VAT number must be 8 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Luxembourg VAT number must contain only digits\",\n );\n }\n const front = Number.parseInt(v.slice(0, 6), 10);\n const check = Number.parseInt(v.slice(6, 8), 10);\n if (front % 89 !== check) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Luxembourg VAT number check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `LU${compact(value)}`;\n\n/** Generate a random valid Luxembourg VAT number. */\nconst generate = (): string => {\n const body = randomDigits(6);\n return (\n body +\n String(Number.parseInt(body, 10) % 89).padStart(2, \"0\")\n );\n};\n\n/** Luxembourg VAT Number. */\nconst vat: CountryValidator<\"LU\"> = {\n name: \"Luxembourg VAT Number\",\n localName: \"Numéro de TVA\",\n abbreviation: \"TVA\",\n aliases: [\"TVA\", \"numéro d'identification TVA\"] as const,\n candidatePattern: \"LU\\\\d{8}\",\n scope: \"country\",\n country: \"LU\",\n entityType: \"company\",\n sourceUrl: \"https://pfi.public.lu/\",\n lengths: [8] as const,\n examples: [\"15027442\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAmBA,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,MAAM;CAC3B,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO;AACT;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,wCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,gDACF;CAEF,MAAM,QAAQ,OAAO,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;CAC/C,MAAM,QAAQ,OAAO,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;CAC/C,IAAI,QAAQ,OAAO,OACjB,OAAO,IACL,oBACA,4CACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UACd,KAAK,QAAQ,KAAK;;AAGpB,MAAM,iBAAyB;CAC7B,MAAM,OAAO,aAAa,CAAC;CAC3B,OACE,OACA,OAAO,OAAO,SAAS,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,GAAG,GAAG;AAE1D;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,6BAA6B;CAC9C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,SAAS,CAAC,CAAC;CACX,UAAU,CAAC,UAAU;CACrB;CACA;CACA;CACA;AACF"}
package/dist/luhn.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidateResult, Validator } from "./types.js";
1
+ import { GlobalValidator, ValidateResult } from "./types.js";
2
2
 
3
3
  //#region src/luhn.d.ts
4
4
  declare const compact: (value: string) => string;
@@ -10,7 +10,7 @@ declare const format: (value: string) => string;
10
10
  */
11
11
  declare const generate: (length?: number) => string;
12
12
  /** Generic Luhn Validator. */
13
- declare const luhn: Validator;
13
+ declare const luhn: GlobalValidator;
14
14
  //#endregion
15
15
  export { compact, luhn as default, format, generate, validate };
16
16
  //# sourceMappingURL=luhn.d.ts.map
package/dist/luhn.js CHANGED
@@ -1,17 +1,9 @@
1
+ import { luhnChecksum, luhnValidate } from "./_checksums/luhn.js";
1
2
  import { clean } from "./_util/clean.js";
2
3
  import { randomDigits } from "./_util/generate.js";
3
4
  import { err } from "./_util/result.js";
4
- import { luhnChecksum, luhnValidate } from "./_checksums/luhn.js";
5
5
  import { isdigits } from "./_util/strings.js";
6
6
  //#region src/luhn.ts
7
- /**
8
- * Generic Luhn checksum validation.
9
- *
10
- * Validates any digit string using the Luhn
11
- * algorithm (ISO/IEC 7812-1). No length
12
- * restriction. For credit card validation
13
- * (13-19 digits), use `creditcard` instead.
14
- */
15
7
  const compact = (value) => clean(value, " -.");
16
8
  const validate = (value) => {
17
9
  const v = compact(value);
@@ -35,6 +27,7 @@ const generate = (length = 16) => {
35
27
  };
36
28
  /** Generic Luhn Validator. */
37
29
  const luhn = {
30
+ scope: "global",
38
31
  name: "Luhn",
39
32
  localName: "Luhn",
40
33
  abbreviation: "Luhn",
package/dist/luhn.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"luhn.js","names":[],"sources":["../src/luhn.ts"],"sourcesContent":["/**\n * Generic Luhn checksum validation.\n *\n * Validates any digit string using the Luhn\n * algorithm (ISO/IEC 7812-1). No length\n * restriction. For credit card validation\n * (13-19 digits), use `creditcard` instead.\n */\n\nimport {\n luhnChecksum,\n luhnValidate,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"./types\";\n\nconst compact = (value: string): string =>\n clean(value, \" -.\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length < 1) {\n return err(\"INVALID_LENGTH\", \"Value must not be empty\");\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Value must contain only digits\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Luhn check digit does not match\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/**\n * Generate a random Luhn-valid number of the\n * given length (default 16).\n */\nconst generate = (length = 16): string => {\n const payload = randomDigits(length - 1);\n const partial = `${payload}0`;\n const remainder = luhnChecksum(partial);\n const check = (10 - remainder) % 10;\n return `${payload}${String(check)}`;\n};\n\n/** Generic Luhn Validator. */\nconst luhn: Validator = {\n name: \"Luhn\",\n localName: \"Luhn\",\n abbreviation: \"Luhn\",\n aliases: [\"Luhn\", \"Luhn algorithm\", \"mod 10\"] as const,\n candidatePattern: \"\\\\d{2,}\",\n entityType: \"any\",\n sourceUrl: \"https://en.wikipedia.org/wiki/Luhn_algorithm\",\n examples: [\"4111111111111111\", \"18\"] as const,\n compact,\n format,\n validate,\n generate: () => generate(),\n};\n\nexport default luhn;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;;;;;;;;;AAoBA,MAAM,WAAW,UACf,MAAM,OAAO,MAAM;AAErB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,SAAS,EACb,QAAO,IAAI,kBAAkB,0BAA0B;AAEzD,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,iCACD;AAEH,KAAI,CAAC,aAAa,EAAE,CAClB,QAAO,IACL,oBACA,kCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;;;;AAMxD,MAAM,YAAY,SAAS,OAAe;CACxC,MAAM,UAAU,aAAa,SAAS,EAAE;CAGxC,MAAM,SAAS,KADG,aADF,GAAG,QAAQ,GACY,IACN;AACjC,QAAO,GAAG,UAAU,OAAO,MAAM;;;AAInC,MAAM,OAAkB;CACtB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAQ;EAAkB;EAAS;CAC7C,kBAAkB;CAClB,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,oBAAoB,KAAK;CACpC;CACA;CACA;CACA,gBAAgB,UAAU;CAC3B"}
1
+ {"version":3,"file":"luhn.js","names":[],"sources":["../src/luhn.ts"],"sourcesContent":["/**\n * Generic Luhn checksum validation.\n *\n * Validates any digit string using the Luhn\n * algorithm (ISO/IEC 7812-1). No length\n * restriction. For credit card validation\n * (13-19 digits), use `creditcard` instead.\n */\n\nimport type {\n ValidateResult,\n GlobalValidator,\n} from \"./types\";\n\nimport {\n luhnChecksum,\n luhnValidate,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } 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 < 1) {\n return err(\"INVALID_LENGTH\", \"Value must not be empty\");\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Value must contain only digits\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Luhn check digit does not match\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/**\n * Generate a random Luhn-valid number of the\n * given length (default 16).\n */\nconst generate = (length = 16): string => {\n const payload = randomDigits(length - 1);\n const partial = `${payload}0`;\n const remainder = luhnChecksum(partial);\n const check = (10 - remainder) % 10;\n return `${payload}${String(check)}`;\n};\n\n/** Generic Luhn Validator. */\nconst luhn: GlobalValidator = {\n scope: \"global\",\n name: \"Luhn\",\n localName: \"Luhn\",\n abbreviation: \"Luhn\",\n aliases: [\"Luhn\", \"Luhn algorithm\", \"mod 10\"] as const,\n candidatePattern: \"\\\\d{2,}\",\n entityType: \"any\",\n sourceUrl: \"https://en.wikipedia.org/wiki/Luhn_algorithm\",\n examples: [\"4111111111111111\", \"18\"] as const,\n compact,\n format,\n validate,\n generate: () => generate(),\n};\n\nexport default luhn;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;AAuBA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,SAAS,GACb,OAAO,IAAI,kBAAkB,yBAAyB;CAExD,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,gCACF;CAEF,IAAI,CAAC,aAAa,CAAC,GACjB,OAAO,IACL,oBACA,iCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;;;;AAMvD,MAAM,YAAY,SAAS,OAAe;CACxC,MAAM,UAAU,aAAa,SAAS,CAAC;CAGvC,MAAM,SAAS,KADG,aAAa,GADZ,QAAQ,EAEC,KAAK;CACjC,OAAO,GAAG,UAAU,OAAO,KAAK;AAClC;;AAGA,MAAM,OAAwB;CAC5B,OAAO;CACP,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAQ;EAAkB;CAAQ;CAC5C,kBAAkB;CAClB,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,oBAAoB,IAAI;CACnC;CACA;CACA;CACA,gBAAgB,SAAS;AAC3B"}
package/dist/lv/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/lv/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 Latvian VAT number. */
8
8
  declare const generate: () => string;
9
9
  /** Latvian VAT Number. */
10
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"LV">;
11
11
  //#endregion
12
12
  export { compact, vat as default, format, generate, validate };
13
13
  //# sourceMappingURL=vat.d.ts.map
package/dist/lv/vat.js CHANGED
@@ -1,36 +1,9 @@
1
+ import { weightedSum } from "../_checksums/weighted-sum.js";
1
2
  import { clean } from "../_util/clean.js";
2
3
  import { randomDigits, randomInt } from "../_util/generate.js";
3
4
  import { err } from "../_util/result.js";
4
5
  import { isdigits } from "../_util/strings.js";
5
- import { weightedSum } from "../_checksums/weighted-sum.js";
6
6
  //#region src/lv/vat.ts
7
- /**
8
- * PVN (Latvian VAT number).
9
- *
10
- * 11 digits.
11
- *
12
- * Individuals:
13
- * - legacy personal codes: DDMMYY + century digit 0/1/2 + 4 digits
14
- * - since 1 July 2017: codes start with 3, the second digit is 2-9,
15
- * and the remaining digits are random
16
- *
17
- * Entities:
18
- * - tax administration issued: 9XXXXXXXXXX
19
- * - enterprise register issued: 4XXXXXXXXXX / 5XXXXXXXXXX
20
- *
21
- * Canonical sources:
22
- * - OECD Latvia TIN sheet for the tax-facing formats
23
- * - PMLP page documenting the post-2017 personal code
24
- *
25
- * These are the reasons we accept the new personal
26
- * code shape (`3` + second digit `2-9`) without the
27
- * legacy birth-date checksum, and why we reject
28
- * legacy personal codes with century digits outside
29
- * 0/1/2.
30
- *
31
- * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Latvia-TIN.pdf
32
- * @see https://www.pmlp.gov.lv/en/change-personal-identity-number
33
- */
34
7
  const WEIGHTS = [
35
8
  9,
36
9
  1,
@@ -116,6 +89,7 @@ const vat = {
116
89
  abbreviation: "PVN",
117
90
  aliases: ["PVN reģistrācijas numurs", "PVN"],
118
91
  candidatePattern: "LV\\d{11}",
92
+ scope: "country",
119
93
  country: "LV",
120
94
  entityType: "any",
121
95
  sourceUrl: "https://www.pmlp.gov.lv/en/change-personal-identity-number",
@@ -1 +1 @@
1
- {"version":3,"file":"vat.js","names":[],"sources":["../../src/lv/vat.ts"],"sourcesContent":["/**\n * PVN (Latvian VAT number).\n *\n * 11 digits.\n *\n * Individuals:\n * - legacy personal codes: DDMMYY + century digit 0/1/2 + 4 digits\n * - since 1 July 2017: codes start with 3, the second digit is 2-9,\n * and the remaining digits are random\n *\n * Entities:\n * - tax administration issued: 9XXXXXXXXXX\n * - enterprise register issued: 4XXXXXXXXXX / 5XXXXXXXXXX\n *\n * Canonical sources:\n * - OECD Latvia TIN sheet for the tax-facing formats\n * - PMLP page documenting the post-2017 personal code\n *\n * These are the reasons we accept the new personal\n * code shape (`3` + second digit `2-9`) without the\n * legacy birth-date checksum, and why we reject\n * legacy personal codes with century digits outside\n * 0/1/2.\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Latvia-TIN.pdf\n * @see https://www.pmlp.gov.lv/en/change-personal-identity-number\n */\n\nimport { weightedSum } from \"#checksums/weighted-sum\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst WEIGHTS = [9, 1, 4, 8, 3, 10, 2, 5, 7, 6, 1];\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"LV\") || v.startsWith(\"lv\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst PERS_WEIGHTS = [10, 5, 8, 4, 2, 1, 6, 3, 7, 9];\n\nconst checkPersonal = (v: string): boolean => {\n // Initial sum = 1 (not 0), so can't use\n // weightedSum directly\n let sum = 1;\n for (let i = 0; i < 10; i++) {\n // SAFETY: both arrays are length 10+\n // eslint-disable-next-line no-non-null-assertion\n sum += PERS_WEIGHTS[i]! * Number(v[i]);\n }\n return (sum % 11) % 10 === Number(v[10]);\n};\n\nconst validateBirthDate = (v: string): boolean => {\n const day = Number(v.slice(0, 2));\n const month = Number(v.slice(2, 4));\n const year2 = Number(v.slice(4, 6));\n const century = Number(v[6]);\n if (century < 0 || century > 2) {\n return false;\n }\n const fullYear = 1800 + century * 100 + year2;\n const date = new Date(fullYear, month - 1, day);\n return (\n date.getFullYear() === fullYear &&\n date.getMonth() === month - 1 &&\n date.getDate() === day\n );\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"Latvian VAT number must be 11 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Latvian VAT number must contain only digits\",\n );\n }\n if (\n v[0] === \"3\" &&\n v[1] !== undefined &&\n v[1] >= \"2\" &&\n v[1] <= \"9\"\n ) {\n // Since 1 July 2017, new personal codes start with 3\n // and are syntactic identifiers only.\n return { valid: true, compact: v };\n }\n\n const first = v[0];\n if (first === \"4\" || first === \"5\" || first === \"9\") {\n const sum = weightedSum(v, WEIGHTS, 11);\n if (sum !== 3) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Latvian VAT number check digit mismatch\",\n );\n }\n } else {\n // Old-format personal code: first 6 digits encode\n // birth date as DDMMYY, digit 7 encodes century\n if (!validateBirthDate(v)) {\n return err(\n \"INVALID_COMPONENT\",\n \"Latvian personal code has invalid birth date\",\n );\n }\n if (!checkPersonal(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Latvian personal code check digit mismatch\",\n );\n }\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `LV${compact(value)}`;\n\n/** Generate a random valid Latvian VAT number. */\nconst generate = (): string => {\n const entityPrefixes = [\"4\", \"5\", \"9\"] as const;\n for (;;) {\n const c =\n randomInt(0, 1) === 0\n ? `3${randomInt(2, 9)}${randomDigits(9)}`\n : `${entityPrefixes[randomInt(0, entityPrefixes.length - 1)] ?? \"4\"}${randomDigits(10)}`;\n if (validate(c).valid) return c;\n }\n};\n\n/** Latvian VAT Number. */\nconst vat: Validator = {\n name: \"Latvian VAT Number\",\n localName: \"PVN reģistrācijas numurs\",\n abbreviation: \"PVN\",\n aliases: [\"PVN reģistrācijas numurs\", \"PVN\"] as const,\n candidatePattern: \"LV\\\\d{11}\",\n country: \"LV\",\n entityType: \"any\",\n sourceUrl:\n \"https://www.pmlp.gov.lv/en/change-personal-identity-number\",\n examples: [\"40003521600\", \"32999999999\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAE;AAElD,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,OAAO;AAC5B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,CAC1C,KAAI,EAAE,MAAM,EAAE;AAEhB,QAAO;;AAGT,MAAM,eAAe;CAAC;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAEpD,MAAM,iBAAiB,MAAuB;CAG5C,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IAGtB,QAAO,aAAa,KAAM,OAAO,EAAE,GAAG;AAExC,QAAQ,MAAM,KAAM,OAAO,OAAO,EAAE,IAAI;;AAG1C,MAAM,qBAAqB,MAAuB;CAChD,MAAM,MAAM,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CACjC,MAAM,QAAQ,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CACnC,MAAM,QAAQ,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CACnC,MAAM,UAAU,OAAO,EAAE,GAAG;AAC5B,KAAI,UAAU,KAAK,UAAU,EAC3B,QAAO;CAET,MAAM,WAAW,OAAO,UAAU,MAAM;CACxC,MAAM,OAAO,IAAI,KAAK,UAAU,QAAQ,GAAG,IAAI;AAC/C,QACE,KAAK,aAAa,KAAK,YACvB,KAAK,UAAU,KAAK,QAAQ,KAC5B,KAAK,SAAS,KAAK;;AAIvB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,uCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,8CACD;AAEH,KACE,EAAE,OAAO,OACT,EAAE,OAAO,KAAA,KACT,EAAE,MAAM,OACR,EAAE,MAAM,IAIR,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;CAGpC,MAAM,QAAQ,EAAE;AAChB,KAAI,UAAU,OAAO,UAAU,OAAO,UAAU;MAClC,YAAY,GAAG,SAAS,GAAG,KAC3B,EACV,QAAO,IACL,oBACA,0CACD;QAEE;AAGL,MAAI,CAAC,kBAAkB,EAAE,CACvB,QAAO,IACL,qBACA,+CACD;AAEH,MAAI,CAAC,cAAc,EAAE,CACnB,QAAO,IACL,oBACA,6CACD;;AAGL,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UACd,KAAK,QAAQ,MAAM;;AAGrB,MAAM,iBAAyB;CAC7B,MAAM,iBAAiB;EAAC;EAAK;EAAK;EAAI;AACtC,UAAS;EACP,MAAM,IACJ,UAAU,GAAG,EAAE,KAAK,IAChB,IAAI,UAAU,GAAG,EAAE,GAAG,aAAa,EAAE,KACrC,GAAG,eAAe,UAAU,GAAG,eAAe,SAAS,EAAE,KAAK,MAAM,aAAa,GAAG;AAC1F,MAAI,SAAS,EAAE,CAAC,MAAO,QAAO;;;;AAKlC,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,4BAA4B,MAAM;CAC5C,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,eAAe,cAAc;CACxC;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"vat.js","names":[],"sources":["../../src/lv/vat.ts"],"sourcesContent":["/**\n * PVN (Latvian VAT number).\n *\n * 11 digits.\n *\n * Individuals:\n * - legacy personal codes: DDMMYY + century digit 0/1/2 + 4 digits\n * - since 1 July 2017: codes start with 3, the second digit is 2-9,\n * and the remaining digits are random\n *\n * Entities:\n * - tax administration issued: 9XXXXXXXXXX\n * - enterprise register issued: 4XXXXXXXXXX / 5XXXXXXXXXX\n *\n * Canonical sources:\n * - OECD Latvia TIN sheet for the tax-facing formats\n * - PMLP page documenting the post-2017 personal code\n *\n * These are the reasons we accept the new personal\n * code shape (`3` + second digit `2-9`) without the\n * legacy birth-date checksum, and why we reject\n * legacy personal codes with century digits outside\n * 0/1/2.\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Latvia-TIN.pdf\n * @see https://www.pmlp.gov.lv/en/change-personal-identity-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, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [9, 1, 4, 8, 3, 10, 2, 5, 7, 6, 1];\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -/.\");\n if (v.startsWith(\"LV\") || v.startsWith(\"lv\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst PERS_WEIGHTS = [10, 5, 8, 4, 2, 1, 6, 3, 7, 9];\n\nconst checkPersonal = (v: string): boolean => {\n // Initial sum = 1 (not 0), so can't use\n // weightedSum directly\n let sum = 1;\n for (let i = 0; i < 10; i++) {\n // SAFETY: both arrays are length 10+\n // eslint-disable-next-line no-non-null-assertion\n sum += PERS_WEIGHTS[i]! * Number(v[i]);\n }\n return (sum % 11) % 10 === Number(v[10]);\n};\n\nconst validateBirthDate = (v: string): boolean => {\n const day = Number(v.slice(0, 2));\n const month = Number(v.slice(2, 4));\n const year2 = Number(v.slice(4, 6));\n const century = Number(v[6]);\n if (century < 0 || century > 2) {\n return false;\n }\n const fullYear = 1800 + century * 100 + year2;\n const date = new Date(fullYear, month - 1, day);\n return (\n date.getFullYear() === fullYear &&\n date.getMonth() === month - 1 &&\n date.getDate() === day\n );\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 11) {\n return err(\n \"INVALID_LENGTH\",\n \"Latvian VAT number must be 11 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Latvian VAT number must contain only digits\",\n );\n }\n if (\n v[0] === \"3\" &&\n v[1] !== undefined &&\n v[1] >= \"2\" &&\n v[1] <= \"9\"\n ) {\n // Since 1 July 2017, new personal codes start with 3\n // and are syntactic identifiers only.\n return { valid: true, compact: v };\n }\n\n const first = v[0];\n if (first === \"4\" || first === \"5\" || first === \"9\") {\n const sum = weightedSum(v, WEIGHTS, 11);\n if (sum !== 3) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Latvian VAT number check digit mismatch\",\n );\n }\n } else {\n // Old-format personal code: first 6 digits encode\n // birth date as DDMMYY, digit 7 encodes century\n if (!validateBirthDate(v)) {\n return err(\n \"INVALID_COMPONENT\",\n \"Latvian personal code has invalid birth date\",\n );\n }\n if (!checkPersonal(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Latvian personal code check digit mismatch\",\n );\n }\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string =>\n `LV${compact(value)}`;\n\n/** Generate a random valid Latvian VAT number. */\nconst generate = (): string => {\n const entityPrefixes = [\"4\", \"5\", \"9\"] as const;\n for (;;) {\n const c =\n randomInt(0, 1) === 0\n ? `3${randomInt(2, 9)}${randomDigits(9)}`\n : `${entityPrefixes[randomInt(0, entityPrefixes.length - 1)] ?? \"4\"}${randomDigits(10)}`;\n if (validate(c).valid) return c;\n }\n};\n\n/** Latvian VAT Number. */\nconst vat: CountryValidator<\"LV\"> = {\n name: \"Latvian VAT Number\",\n localName: \"PVN reģistrācijas numurs\",\n abbreviation: \"PVN\",\n aliases: [\"PVN reģistrācijas numurs\", \"PVN\"] as const,\n candidatePattern: \"LV\\\\d{11}\",\n scope: \"country\",\n country: \"LV\",\n entityType: \"any\",\n sourceUrl:\n \"https://www.pmlp.gov.lv/en/change-personal-identity-number\",\n examples: [\"40003521600\", \"32999999999\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default vat;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAuCA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;AAAC;AAEjD,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,MAAM;CAC3B,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GACzC,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO;AACT;AAEA,MAAM,eAAe;CAAC;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAEnD,MAAM,iBAAiB,MAAuB;CAG5C,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAGtB,OAAO,aAAa,KAAM,OAAO,EAAE,EAAE;CAEvC,OAAQ,MAAM,KAAM,OAAO,OAAO,EAAE,GAAG;AACzC;AAEA,MAAM,qBAAqB,MAAuB;CAChD,MAAM,MAAM,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAChC,MAAM,QAAQ,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAClC,MAAM,QAAQ,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAClC,MAAM,UAAU,OAAO,EAAE,EAAE;CAC3B,IAAI,UAAU,KAAK,UAAU,GAC3B,OAAO;CAET,MAAM,WAAW,OAAO,UAAU,MAAM;CACxC,MAAM,OAAO,IAAI,KAAK,UAAU,QAAQ,GAAG,GAAG;CAC9C,OACE,KAAK,YAAY,MAAM,YACvB,KAAK,SAAS,MAAM,QAAQ,KAC5B,KAAK,QAAQ,MAAM;AAEvB;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,sCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,6CACF;CAEF,IACE,EAAE,OAAO,OACT,EAAE,OAAO,KAAA,KACT,EAAE,MAAM,OACR,EAAE,MAAM,KAIR,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;CAGnC,MAAM,QAAQ,EAAE;CAChB,IAAI,UAAU,OAAO,UAAU,OAAO,UAAU;MAClC,YAAY,GAAG,SAAS,EAC9B,MAAM,GACV,OAAO,IACL,oBACA,yCACF;CAAA,OAEG;EAGL,IAAI,CAAC,kBAAkB,CAAC,GACtB,OAAO,IACL,qBACA,8CACF;EAEF,IAAI,CAAC,cAAc,CAAC,GAClB,OAAO,IACL,oBACA,4CACF;CAEJ;CACA,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UACd,KAAK,QAAQ,KAAK;;AAGpB,MAAM,iBAAyB;CAC7B,MAAM,iBAAiB;EAAC;EAAK;EAAK;CAAG;CACrC,SAAS;EACP,MAAM,IACJ,UAAU,GAAG,CAAC,MAAM,IAChB,IAAI,UAAU,GAAG,CAAC,IAAI,aAAa,CAAC,MACpC,GAAG,eAAe,UAAU,GAAG,eAAe,SAAS,CAAC,MAAM,MAAM,aAAa,EAAE;EACzF,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO;CAChC;AACF;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,4BAA4B,KAAK;CAC3C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU,CAAC,eAAe,aAAa;CACvC;CACA;CACA;CACA;AACF"}
package/dist/ma/ice.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/ma/ice.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 Moroccan ICE. */
8
8
  declare const generate: () => string;
9
9
  /** Moroccan Company Identification Number. */
10
- declare const ice: Validator;
10
+ declare const ice: CountryValidator<"MA">;
11
11
  //#endregion
12
12
  export { compact, ice as default, format, generate, validate };
13
13
  //# sourceMappingURL=ice.d.ts.map
package/dist/ma/ice.js CHANGED
@@ -1,19 +1,9 @@
1
+ import { mod97 } from "../_checksums/mod97.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 { mod97 } from "../_checksums/mod97.js";
6
6
  //#region src/ma/ice.ts
7
- /**
8
- * ICE (Identifiant Commun de l'Entreprise).
9
- *
10
- * Moroccan company identification number. 15 digits:
11
- * 9 enterprise digits + 4 establishment digits +
12
- * 2 check digits. Uses Mod 97-10 checksum
13
- * (full number mod 97 must equal 0).
14
- *
15
- * @see https://www.ice.gov.ma/
16
- */
17
7
  const compact = (value) => clean(value, " ");
18
8
  const validate = (value) => {
19
9
  const v = compact(value);
@@ -40,6 +30,7 @@ const ice = {
40
30
  abbreviation: "ICE",
41
31
  aliases: ["ICE", "Identifiant Commun de l'Entreprise"],
42
32
  candidatePattern: "\\d{15}",
33
+ scope: "country",
43
34
  country: "MA",
44
35
  entityType: "company",
45
36
  compact,
@@ -1 +1 @@
1
- {"version":3,"file":"ice.js","names":[],"sources":["../../src/ma/ice.ts"],"sourcesContent":["/**\n * ICE (Identifiant Commun de l'Entreprise).\n *\n * Moroccan company identification number. 15 digits:\n * 9 enterprise digits + 4 establishment digits +\n * 2 check digits. Uses Mod 97-10 checksum\n * (full number mod 97 must equal 0).\n *\n * @see https://www.ice.gov.ma/\n */\n\nimport { mod97 } from \"#checksums/mod97\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst compact = (value: string): string =>\n clean(value, \" \");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 15) {\n return err(\n \"INVALID_LENGTH\",\n \"Moroccan ICE must be exactly 15 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Moroccan ICE must contain only digits\",\n );\n }\n if (mod97(v) !== 0) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Moroccan ICE check digits mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Moroccan ICE. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(15);\n if (validate(c).valid) return c;\n }\n};\n\n/** Moroccan Company Identification Number. */\nconst ice: Validator = {\n name: \"Moroccan Company Identification Number\",\n localName: \"Identifiant Commun de l'Entreprise\",\n abbreviation: \"ICE\",\n aliases: [\n \"ICE\",\n \"Identifiant Commun de l'Entreprise\",\n ] as const,\n candidatePattern: \"\\\\d{15}\",\n country: \"MA\",\n entityType: \"company\",\n compact,\n format,\n validate,\n description: \"Moroccan common enterprise identifier\",\n sourceUrl: \"https://www.ice.gov.ma/\",\n lengths: [15] as const,\n examples: [\"001561191000066\", \"002136093000040\"] as const,\n generate,\n};\n\nexport default ice;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,yCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,wCACD;AAEH,KAAI,MAAM,EAAE,KAAK,EACf,QAAO,IACL,oBACA,qCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,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,CACP,OACA,qCACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,aAAa;CACb,WAAW;CACX,SAAS,CAAC,GAAG;CACb,UAAU,CAAC,mBAAmB,kBAAkB;CAChD;CACD"}
1
+ {"version":3,"file":"ice.js","names":[],"sources":["../../src/ma/ice.ts"],"sourcesContent":["/**\n * ICE (Identifiant Commun de l'Entreprise).\n *\n * Moroccan company identification number. 15 digits:\n * 9 enterprise digits + 4 establishment digits +\n * 2 check digits. Uses Mod 97-10 checksum\n * (full number mod 97 must equal 0).\n *\n * @see https://www.ice.gov.ma/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { mod97 } from \"#checksums/mod97\";\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" \");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 15) {\n return err(\n \"INVALID_LENGTH\",\n \"Moroccan ICE must be exactly 15 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Moroccan ICE must contain only digits\",\n );\n }\n if (mod97(v) !== 0) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Moroccan ICE check digits mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Moroccan ICE. */\nconst generate = (): string => {\n for (;;) {\n const c = randomDigits(15);\n if (validate(c).valid) return c;\n }\n};\n\n/** Moroccan Company Identification Number. */\nconst ice: CountryValidator<\"MA\"> = {\n name: \"Moroccan Company Identification Number\",\n localName: \"Identifiant Commun de l'Entreprise\",\n abbreviation: \"ICE\",\n aliases: [\n \"ICE\",\n \"Identifiant Commun de l'Entreprise\",\n ] as const,\n candidatePattern: \"\\\\d{15}\",\n scope: \"country\",\n country: \"MA\",\n entityType: \"company\",\n compact,\n format,\n validate,\n description: \"Moroccan common enterprise identifier\",\n sourceUrl: \"https://www.ice.gov.ma/\",\n lengths: [15] as const,\n examples: [\"001561191000066\", \"002136093000040\"] as const,\n generate,\n};\n\nexport default ice;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAsBA,MAAM,WAAW,UACf,MAAM,OAAO,GAAG;AAElB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,wCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,uCACF;CAEF,IAAI,MAAM,CAAC,MAAM,GACf,OAAO,IACL,oBACA,oCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,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,CACP,OACA,oCACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,aAAa;CACb,WAAW;CACX,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,mBAAmB,iBAAiB;CAC/C;AACF"}
package/dist/mc/tva.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/mc/tva.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 Monacan TVA number. */
8
8
  declare const generate: () => string;
9
9
  /** Monacan VAT Number. */
10
- declare const tva: Validator;
10
+ declare const tva: CountryValidator<"MC">;
11
11
  //#endregion
12
12
  export { compact, tva as default, format, generate, validate };
13
13
  //# sourceMappingURL=tva.d.ts.map
package/dist/mc/tva.js CHANGED
@@ -38,6 +38,7 @@ const tva = {
38
38
  abbreviation: "TVA",
39
39
  aliases: ["numéro de TVA", "TVA"],
40
40
  candidatePattern: "FR\\d{11}",
41
+ scope: "country",
41
42
  country: "MC",
42
43
  entityType: "company",
43
44
  sourceUrl: "https://www.economie.gouv.fr/",
@@ -1 +1 @@
1
- {"version":3,"file":"tva.js","names":["frCompact","frValidate"],"sources":["../../src/mc/tva.ts"],"sourcesContent":["/**\n * n° TVA (taxe sur la valeur ajoutée, Monacan VAT).\n *\n * For VAT purposes Monaco is treated as French\n * territory. The number follows the French TVA\n * format but the SIREN part starts with \"000\"\n * (not a real SIREN). The compact form is\n * prefixed with \"FR\".\n *\n * @see https://www.economie.gouv.fr/\n */\n\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nimport {\n compact as frCompact,\n validate as frValidate,\n} from \"../fr/tva\";\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst compact = (value: string): string => {\n const v = frCompact(value);\n return `FR${v}`;\n};\n\nconst validate = (value: string): ValidateResult => {\n const frResult = frValidate(value);\n if (!frResult.valid) {\n return frResult;\n }\n\n // Monaco SIREN part must start with \"000\"\n const siren = frResult.compact.slice(2);\n if (!siren.startsWith(\"000\")) {\n return err(\n \"INVALID_COMPONENT\",\n \"Monacan TVA SIREN part must start with 000\",\n );\n }\n\n return { valid: true, compact: `FR${frResult.compact}` };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Monacan TVA number. */\nconst generate = (): string => {\n const siren = \"000\" + randomDigits(6);\n const prefix = String(\n (12 + 3 * (Number(siren) % 97)) % 97,\n ).padStart(2, \"0\");\n return \"FR\" + prefix + siren;\n};\n\n/** Monacan VAT Number. */\nconst tva: Validator = {\n name: \"Monacan VAT Number\",\n localName: \"Numéro de TVA\",\n abbreviation: \"TVA\",\n aliases: [\"numéro de TVA\", \"TVA\"] as const,\n candidatePattern: \"FR\\\\d{11}\",\n country: \"MC\",\n entityType: \"company\",\n sourceUrl: \"https://www.economie.gouv.fr/\",\n examples: [\"FR53000004605\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default tva;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAqBA,MAAM,WAAW,UAA0B;AAEzC,QAAO,KADGA,UAAU,MAAM;;AAI5B,MAAM,YAAY,UAAkC;CAClD,MAAM,WAAWC,WAAW,MAAM;AAClC,KAAI,CAAC,SAAS,MACZ,QAAO;AAKT,KAAI,CADU,SAAS,QAAQ,MAAM,EAAE,CAC5B,WAAW,MAAM,CAC1B,QAAO,IACL,qBACA,6CACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS,KAAK,SAAS;EAAW;;AAG1D,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,MAAM,iBAAyB;CAC7B,MAAM,QAAQ,QAAQ,aAAa,EAAE;AAIrC,QAAO,OAHQ,QACZ,KAAK,KAAK,OAAO,MAAM,GAAG,OAAO,GACnC,CAAC,SAAS,GAAG,IAAI,GACK;;;AAIzB,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,iBAAiB,MAAM;CACjC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,gBAAgB;CAC3B;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"tva.js","names":["frCompact","frValidate"],"sources":["../../src/mc/tva.ts"],"sourcesContent":["/**\n * n° TVA (taxe sur la valeur ajoutée, Monacan VAT).\n *\n * For VAT purposes Monaco is treated as French\n * territory. The number follows the French TVA\n * format but the SIREN part starts with \"000\"\n * (not a real SIREN). The compact form is\n * prefixed with \"FR\".\n *\n * @see https://www.economie.gouv.fr/\n */\n\nimport {\n compact as frCompact,\n validate as frValidate,\n} from \"../fr/tva\";\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nconst compact = (value: string): string => {\n const v = frCompact(value);\n return `FR${v}`;\n};\n\nconst validate = (value: string): ValidateResult => {\n const frResult = frValidate(value);\n if (!frResult.valid) {\n return frResult;\n }\n\n // Monaco SIREN part must start with \"000\"\n const siren = frResult.compact.slice(2);\n if (!siren.startsWith(\"000\")) {\n return err(\n \"INVALID_COMPONENT\",\n \"Monacan TVA SIREN part must start with 000\",\n );\n }\n\n return { valid: true, compact: `FR${frResult.compact}` };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Monacan TVA number. */\nconst generate = (): string => {\n const siren = \"000\" + randomDigits(6);\n const prefix = String(\n (12 + 3 * (Number(siren) % 97)) % 97,\n ).padStart(2, \"0\");\n return \"FR\" + prefix + siren;\n};\n\n/** Monacan VAT Number. */\nconst tva: CountryValidator<\"MC\"> = {\n name: \"Monacan VAT Number\",\n localName: \"Numéro de TVA\",\n abbreviation: \"TVA\",\n aliases: [\"numéro de TVA\", \"TVA\"] as const,\n candidatePattern: \"FR\\\\d{11}\",\n scope: \"country\",\n country: \"MC\",\n entityType: \"company\",\n sourceUrl: \"https://www.economie.gouv.fr/\",\n examples: [\"FR53000004605\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default tva;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAwBA,MAAM,WAAW,UAA0B;CAEzC,OAAO,KADGA,UAAU,KACR;AACd;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,WAAWC,WAAW,KAAK;CACjC,IAAI,CAAC,SAAS,OACZ,OAAO;CAKT,IAAI,CADU,SAAS,QAAQ,MAAM,CAC5B,EAAE,WAAW,KAAK,GACzB,OAAO,IACL,qBACA,4CACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS,KAAK,SAAS;CAAU;AACzD;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,iBAAyB;CAC7B,MAAM,QAAQ,QAAQ,aAAa,CAAC;CAIpC,OAAO,OAHQ,QACZ,KAAK,KAAK,OAAO,KAAK,IAAI,OAAO,EACpC,EAAE,SAAS,GAAG,GACK,IAAI;AACzB;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,iBAAiB,KAAK;CAChC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,eAAe;CAC1B;CACA;CACA;CACA;AACF"}
package/dist/md/idno.d.ts CHANGED
@@ -1,11 +1,11 @@
1
- import { ValidateResult, Validator } from "../types.js";
1
+ import { CountryValidator, ValidateResult } from "../types.js";
2
2
 
3
3
  //#region src/md/idno.d.ts
4
4
  declare const compact: (value: string) => string;
5
5
  declare const validate: (value: string) => ValidateResult;
6
6
  declare const format: (value: string) => string;
7
7
  /** Moldavian Company Identification Number. */
8
- declare const idno: Validator;
8
+ declare const idno: CountryValidator<"MD">;
9
9
  //#endregion
10
10
  export { compact, idno as default, format, validate };
11
11
  //# sourceMappingURL=idno.d.ts.map
package/dist/md/idno.js CHANGED
@@ -2,16 +2,6 @@ import { clean } from "../_util/clean.js";
2
2
  import { err } from "../_util/result.js";
3
3
  import { isdigits } from "../_util/strings.js";
4
4
  //#region src/md/idno.ts
5
- /**
6
- * IDNO (Moldavian company identification number).
7
- *
8
- * 13 digits: first digit identifies the registry,
9
- * next three are the assignment year, followed by
10
- * five identifier digits and a check digit.
11
- * Checksum uses weights [7, 3, 1] repeated.
12
- *
13
- * @see https://www.idno.md
14
- */
15
5
  const WEIGHTS = [
16
6
  7,
17
7
  3,
@@ -55,6 +45,7 @@ const idno = {
55
45
  abbreviation: "IDNO",
56
46
  aliases: ["IDNO", "cod de identificare"],
57
47
  candidatePattern: "\\d{13}",
48
+ scope: "country",
58
49
  country: "MD",
59
50
  entityType: "company",
60
51
  lengths: [13],
@@ -1 +1 @@
1
- {"version":3,"file":"idno.js","names":[],"sources":["../../src/md/idno.ts"],"sourcesContent":["/**\n * IDNO (Moldavian company identification number).\n *\n * 13 digits: first digit identifies the registry,\n * next three are the assignment year, followed by\n * five identifier digits and a check digit.\n * Checksum uses weights [7, 3, 1] repeated.\n *\n * @see https://www.idno.md\n */\n\nimport { clean } from \"#util/clean\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nimport type { ValidateResult, Validator } from \"../types\";\n\nconst WEIGHTS = [\n 7, 3, 1, 7, 3, 1, 7, 3, 1, 7, 3, 1,\n] as const;\n\nconst calcCheckDigit = (number: string): number => {\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n sum += (WEIGHTS[i] ?? 0) * Number(number[i]);\n }\n return sum % 10;\n};\n\nconst compact = (value: string): string =>\n clean(value, \" \");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Moldavian IDNO must contain only digits\",\n );\n }\n if (v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"Moldavian IDNO must be 13 digits\",\n );\n }\n const expected = calcCheckDigit(v);\n if (expected !== Number(v[12])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Moldavian IDNO check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\nconst generate = (): string => {\n let digits = \"\";\n for (let i = 0; i < 12; i++) {\n digits += String(Math.floor(Math.random() * 10));\n }\n return digits + String(calcCheckDigit(digits));\n};\n\n/** Moldavian Company Identification Number. */\nconst idno: Validator = {\n name: \"Moldavian Company Identification Number\",\n localName: \"IDNO\",\n abbreviation: \"IDNO\",\n aliases: [\"IDNO\", \"cod de identificare\"] as const,\n candidatePattern: \"\\\\d{13}\",\n country: \"MD\",\n entityType: \"company\",\n lengths: [13] as const,\n sourceUrl: \"https://www.idno.md/\",\n examples: [\"1008600038413\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default idno;\nexport { compact, format, validate };\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,UAAU;CACd;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAClC;AAED,MAAM,kBAAkB,WAA2B;CACjD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IACtB,SAAQ,QAAQ,MAAM,KAAK,OAAO,OAAO,GAAG;AAE9C,QAAO,MAAM;;AAGf,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,0CACD;AAEH,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,mCACD;AAGH,KADiB,eAAe,EAAE,KACjB,OAAO,EAAE,IAAI,CAC5B,QAAO,IACL,oBACA,sCACD;AAEH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;AAExD,MAAM,iBAAyB;CAC7B,IAAI,SAAS;AACb,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IACtB,WAAU,OAAO,KAAK,MAAM,KAAK,QAAQ,GAAG,GAAG,CAAC;AAElD,QAAO,SAAS,OAAO,eAAe,OAAO,CAAC;;;AAIhD,MAAM,OAAkB;CACtB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,QAAQ,sBAAsB;CACxC,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,GAAG;CACb,WAAW;CACX,UAAU,CAAC,gBAAgB;CAC3B;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"idno.js","names":[],"sources":["../../src/md/idno.ts"],"sourcesContent":["/**\n * IDNO (Moldavian company identification number).\n *\n * 13 digits: first digit identifies the registry,\n * next three are the assignment year, followed by\n * five identifier digits and a check digit.\n * Checksum uses weights [7, 3, 1] repeated.\n *\n * @see https://www.idno.md\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [\n 7, 3, 1, 7, 3, 1, 7, 3, 1, 7, 3, 1,\n] as const;\n\nconst calcCheckDigit = (number: string): number => {\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n sum += (WEIGHTS[i] ?? 0) * Number(number[i]);\n }\n return sum % 10;\n};\n\nconst compact = (value: string): string =>\n clean(value, \" \");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Moldavian IDNO must contain only digits\",\n );\n }\n if (v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"Moldavian IDNO must be 13 digits\",\n );\n }\n const expected = calcCheckDigit(v);\n if (expected !== Number(v[12])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Moldavian IDNO check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\nconst generate = (): string => {\n let digits = \"\";\n for (let i = 0; i < 12; i++) {\n digits += String(Math.floor(Math.random() * 10));\n }\n return digits + String(calcCheckDigit(digits));\n};\n\n/** Moldavian Company Identification Number. */\nconst idno: CountryValidator<\"MD\"> = {\n name: \"Moldavian Company Identification Number\",\n localName: \"IDNO\",\n abbreviation: \"IDNO\",\n aliases: [\"IDNO\", \"cod de identificare\"] as const,\n candidatePattern: \"\\\\d{13}\",\n scope: \"country\",\n country: \"MD\",\n entityType: \"company\",\n lengths: [13] as const,\n sourceUrl: \"https://www.idno.md/\",\n examples: [\"1008600038413\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default idno;\nexport { compact, format, validate };\n"],"mappings":";;;;AAoBA,MAAM,UAAU;CACd;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AACnC;AAEA,MAAM,kBAAkB,WAA2B;CACjD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KACtB,QAAQ,QAAQ,MAAM,KAAK,OAAO,OAAO,EAAE;CAE7C,OAAO,MAAM;AACf;AAEA,MAAM,WAAW,UACf,MAAM,OAAO,GAAG;AAElB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,yCACF;CAEF,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,kCACF;CAGF,IADiB,eAAe,CACrB,MAAM,OAAO,EAAE,GAAG,GAC3B,OAAO,IACL,oBACA,qCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;AAEvD,MAAM,iBAAyB;CAC7B,IAAI,SAAS;CACb,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KACtB,UAAU,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC;CAEjD,OAAO,SAAS,OAAO,eAAe,MAAM,CAAC;AAC/C;;AAGA,MAAM,OAA+B;CACnC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,QAAQ,qBAAqB;CACvC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,WAAW;CACX,UAAU,CAAC,eAAe;CAC1B;CACA;CACA;CACA;AACF"}
package/dist/me/pib.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/me/pib.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 Montenegrin PIB. */
8
8
  declare const generate: () => string;
9
9
  /** Montenegrin Tax Identification Number. */
10
- declare const pib: Validator;
10
+ declare const pib: CountryValidator<"ME">;
11
11
  //#endregion
12
12
  export { compact, pib as default, format, generate, validate };
13
13
  //# sourceMappingURL=pib.d.ts.map
package/dist/me/pib.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/me/pib.ts
7
- /**
8
- * PIB (Poreski identifikacioni broj).
9
- *
10
- * Montenegrin tax identification number. 8 digits with
11
- * a weighted mod 11 checksum.
12
- *
13
- * @see https://github.com/arthurdejong/python-stdnum/blob/master/stdnum/me/pib.py
14
- * @see https://www.tax.gov.me/
15
- */
16
7
  const WEIGHTS = [
17
8
  8,
18
9
  7,
@@ -47,6 +38,7 @@ const pib = {
47
38
  abbreviation: "PIB",
48
39
  aliases: ["PIB"],
49
40
  candidatePattern: "\\d{8}",
41
+ scope: "country",
50
42
  country: "ME",
51
43
  entityType: "any",
52
44
  lengths: [8],
@@ -1 +1 @@
1
- {"version":3,"file":"pib.js","names":[],"sources":["../../src/me/pib.ts"],"sourcesContent":["/**\n * PIB (Poreski identifikacioni broj).\n *\n * Montenegrin tax identification number. 8 digits with\n * a weighted mod 11 checksum.\n *\n * @see https://github.com/arthurdejong/python-stdnum/blob/master/stdnum/me/pib.py\n * @see https://www.tax.gov.me/\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 clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"PIB must be exactly 8 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"PIB must contain only digits\",\n );\n }\n\n const total = weightedSum(v.slice(0, 7), WEIGHTS, 11);\n const check = ((11 - total) % 11) % 10;\n if (check !== Number(v[7])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"PIB check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Montenegrin PIB. */\nconst generate = (): string => {\n const payload = randomDigits(7);\n const total = weightedSum(payload, WEIGHTS, 11);\n return payload + String(((11 - total) % 11) % 10);\n};\n\n/** Montenegrin Tax Identification Number. */\nconst pib: Validator = {\n name: \"Montenegrin Tax ID\",\n localName: \"Poreski identifikacioni broj\",\n abbreviation: \"PIB\",\n aliases: [\"PIB\"] as const,\n candidatePattern: \"\\\\d{8}\",\n country: \"ME\",\n entityType: \"any\",\n lengths: [8] as const,\n sourceUrl: \"https://www.tax.gov.me/\",\n examples: [\"02655284\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default pib;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE;AAErC,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,EACf,QAAO,IACL,kBACA,+BACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;AAKH,MADgB,KADF,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,SAAS,GAAG,IACvB,KAAM,OACtB,OAAO,EAAE,GAAG,CACxB,QAAO,IACL,oBACA,2BACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,EAAE;CAC/B,MAAM,QAAQ,YAAY,SAAS,SAAS,GAAG;AAC/C,QAAO,UAAU,QAAS,KAAK,SAAS,KAAM,GAAG;;;AAInD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,MAAM;CAChB,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,WAAW;CACX,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"pib.js","names":[],"sources":["../../src/me/pib.ts"],"sourcesContent":["/**\n * PIB (Poreski identifikacioni broj).\n *\n * Montenegrin tax identification number. 8 digits with\n * a weighted mod 11 checksum.\n *\n * @see https://github.com/arthurdejong/python-stdnum/blob/master/stdnum/me/pib.py\n * @see https://www.tax.gov.me/\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 clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"PIB must be exactly 8 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"PIB must contain only digits\",\n );\n }\n\n const total = weightedSum(v.slice(0, 7), WEIGHTS, 11);\n const check = ((11 - total) % 11) % 10;\n if (check !== Number(v[7])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"PIB check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Montenegrin PIB. */\nconst generate = (): string => {\n const payload = randomDigits(7);\n const total = weightedSum(payload, WEIGHTS, 11);\n return payload + String(((11 - total) % 11) % 10);\n};\n\n/** Montenegrin Tax Identification Number. */\nconst pib: CountryValidator<\"ME\"> = {\n name: \"Montenegrin Tax ID\",\n localName: \"Poreski identifikacioni broj\",\n abbreviation: \"PIB\",\n aliases: [\"PIB\"] as const,\n candidatePattern: \"\\\\d{8}\",\n scope: \"country\",\n country: \"ME\",\n entityType: \"any\",\n lengths: [8] as const,\n sourceUrl: \"https://www.tax.gov.me/\",\n examples: [\"02655284\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default pib;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAqBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAEpC,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,8BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAKF,KADgB,KADF,YAAY,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,EACzB,KAAK,KAAM,OACtB,OAAO,EAAE,EAAE,GACvB,OAAO,IACL,oBACA,0BACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,CAAC;CAC9B,MAAM,QAAQ,YAAY,SAAS,SAAS,EAAE;CAC9C,OAAO,UAAU,QAAS,KAAK,SAAS,KAAM,EAAE;AAClD;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,KAAK;CACf,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,CAAC;CACX,WAAW;CACX,UAAU,CAAC,UAAU;CACrB;CACA;CACA;CACA;AACF"}
package/dist/mk/edb.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/mk/edb.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 Macedonian EDB. */
8
8
  declare const generate: () => string;
9
9
  /** North Macedonian Tax Identification Number. */
10
- declare const edb: Validator;
10
+ declare const edb: CountryValidator<"MK">;
11
11
  //#endregion
12
12
  export { compact, edb as default, format, generate, validate };
13
13
  //# sourceMappingURL=edb.d.ts.map
package/dist/mk/edb.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/mk/edb.ts
7
- /**
8
- * EDB (Edinstven danocen broj).
9
- *
10
- * North Macedonian tax identification number. 13 digits
11
- * with a weighted mod 11 checksum. May be prefixed with
12
- * "MK" (Latin) or "МК" (Cyrillic).
13
- *
14
- * @see https://github.com/arthurdejong/python-stdnum/blob/master/stdnum/mk/edb.py
15
- * @see https://www.ujp.gov.mk/
16
- */
17
7
  const WEIGHTS = [
18
8
  7,
19
9
  6,
@@ -61,6 +51,7 @@ const edb = {
61
51
  "EDB"
62
52
  ],
63
53
  candidatePattern: "MK\\d{13}",
54
+ scope: "country",
64
55
  country: "MK",
65
56
  entityType: "any",
66
57
  lengths: [13],
@@ -1 +1 @@
1
- {"version":3,"file":"edb.js","names":[],"sources":["../../src/mk/edb.ts"],"sourcesContent":["/**\n * EDB (Edinstven danocen broj).\n *\n * North Macedonian tax identification number. 13 digits\n * with a weighted mod 11 checksum. May be prefixed with\n * \"MK\" (Latin) or \"МК\" (Cyrillic).\n *\n * @see https://github.com/arthurdejong/python-stdnum/blob/master/stdnum/mk/edb.py\n * @see https://www.ujp.gov.mk/\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 = [\n 7, 6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2,\n] as const;\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -\");\n if (v.startsWith(\"MK\") || v.startsWith(\"\\u041C\\u041A\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"EDB must be exactly 13 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"EDB must contain only digits\",\n );\n }\n\n const total = weightedSum(v.slice(0, 12), WEIGHTS, 11);\n const check = ((11 - total) % 11) % 10;\n if (check !== Number(v[12])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"EDB check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Macedonian EDB. */\nconst generate = (): string => {\n const payload = randomDigits(12);\n const total = weightedSum(payload, WEIGHTS, 11);\n return payload + String(((11 - total) % 11) % 10);\n};\n\n/** North Macedonian Tax Identification Number. */\nconst edb: Validator = {\n name: \"North Macedonian Tax ID\",\n localName: \"Edinstven danocen broj\",\n abbreviation: \"EDB\",\n aliases: [\n \"ЕДБ\",\n \"единствен даночен број\",\n \"EDB\",\n ] as const,\n candidatePattern: \"MK\\\\d{13}\",\n country: \"MK\",\n entityType: \"any\",\n lengths: [13] as const,\n sourceUrl: \"https://www.ujp.gov.mk/\",\n examples: [\"4002012527974\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default edb;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,MAAM,UAAU;CACd;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAClC;AAED,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,KAAK;AAC1B,KAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAW,KAAe,CACpD,KAAI,EAAE,MAAM,EAAE;AAEhB,QAAO;;AAGT,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,MAAM;AACxB,KAAI,EAAE,WAAW,GACf,QAAO,IACL,kBACA,gCACD;AAEH,KAAI,CAAC,SAAS,EAAE,CACd,QAAO,IACL,kBACA,+BACD;AAKH,MADgB,KADF,YAAY,EAAE,MAAM,GAAG,GAAG,EAAE,SAAS,GAAG,IACxB,KAAM,OACtB,OAAO,EAAE,IAAI,CACzB,QAAO,IACL,oBACA,2BACD;AAGH,QAAO;EAAE,OAAO;EAAM,SAAS;EAAG;;AAGpC,MAAM,UAAU,UAA0B,QAAQ,MAAM;;AAGxD,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,GAAG;CAChC,MAAM,QAAQ,YAAY,SAAS,SAAS,GAAG;AAC/C,QAAO,UAAU,QAAS,KAAK,SAAS,KAAM,GAAG;;;AAInD,MAAM,MAAiB;CACrB,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACD;CACD,kBAAkB;CAClB,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,GAAG;CACb,WAAW;CACX,UAAU,CAAC,gBAAgB;CAC3B;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"edb.js","names":[],"sources":["../../src/mk/edb.ts"],"sourcesContent":["/**\n * EDB (Edinstven danocen broj).\n *\n * North Macedonian tax identification number. 13 digits\n * with a weighted mod 11 checksum. May be prefixed with\n * \"MK\" (Latin) or \"МК\" (Cyrillic).\n *\n * @see https://github.com/arthurdejong/python-stdnum/blob/master/stdnum/mk/edb.py\n * @see https://www.ujp.gov.mk/\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 = [\n 7, 6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2,\n] as const;\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -\");\n if (v.startsWith(\"MK\") || v.startsWith(\"\\u041C\\u041A\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"EDB must be exactly 13 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"EDB must contain only digits\",\n );\n }\n\n const total = weightedSum(v.slice(0, 12), WEIGHTS, 11);\n const check = ((11 - total) % 11) % 10;\n if (check !== Number(v[12])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"EDB check digit mismatch\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Generate a random valid Macedonian EDB. */\nconst generate = (): string => {\n const payload = randomDigits(12);\n const total = weightedSum(payload, WEIGHTS, 11);\n return payload + String(((11 - total) % 11) % 10);\n};\n\n/** North Macedonian Tax Identification Number. */\nconst edb: CountryValidator<\"MK\"> = {\n name: \"North Macedonian Tax ID\",\n localName: \"Edinstven danocen broj\",\n abbreviation: \"EDB\",\n aliases: [\n \"ЕДБ\",\n \"единствен даночен број\",\n \"EDB\",\n ] as const,\n candidatePattern: \"MK\\\\d{13}\",\n scope: \"country\",\n country: \"MK\",\n entityType: \"any\",\n lengths: [13] as const,\n sourceUrl: \"https://www.ujp.gov.mk/\",\n examples: [\"4002012527974\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default edb;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AAsBA,MAAM,UAAU;CACd;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AACnC;AAEA,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,IAAI;CACzB,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAc,GACnD,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO;AACT;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,+BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAKF,KADgB,KADF,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,SAAS,EAC1B,KAAK,KAAM,OACtB,OAAO,EAAE,GAAG,GACxB,OAAO,IACL,oBACA,0BACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,iBAAyB;CAC7B,MAAM,UAAU,aAAa,EAAE;CAC/B,MAAM,QAAQ,YAAY,SAAS,SAAS,EAAE;CAC9C,OAAO,UAAU,QAAS,KAAK,SAAS,KAAM,EAAE;AAClD;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,WAAW;CACX,UAAU,CAAC,eAAe;CAC1B;CACA;CACA;CACA;AACF"}
package/dist/mt/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/mt/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 Maltese VAT number. */
8
8
  declare const generate: () => string;
9
9
  /** Maltese VAT Number. */
10
- declare const vat: Validator;
10
+ declare const vat: CountryValidator<"MT">;
11
11
  //#endregion
12
12
  export { compact, vat as default, format, generate, validate };
13
13
  //# sourceMappingURL=vat.d.ts.map
package/dist/mt/vat.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, randomInt } 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/mt/vat.ts
7
- /**
8
- * VAT (Maltese VAT number).
9
- *
10
- * 8 digits, no leading 0.
11
- * Weights [3,4,6,7,8,9,10,1], sum % 37 === 0.
12
- *
13
- * @see https://www.vatify.eu/malta-vat-number.html
14
- * @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/malta-tin.pdf
15
- */
16
7
  const WEIGHTS = [
17
8
  3,
18
9
  4,
@@ -54,9 +45,11 @@ const vat = {
54
45
  abbreviation: "VAT",
55
46
  aliases: ["VAT number MT"],
56
47
  candidatePattern: "MT\\d{8}",
48
+ scope: "country",
57
49
  country: "MT",
58
50
  entityType: "company",
59
51
  sourceUrl: "https://cfr.gov.mt/",
52
+ lengths: [8],
60
53
  examples: ["11679112"],
61
54
  compact,
62
55
  format,