stdnum 1.9.16 → 1.10.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 (541) hide show
  1. package/lib/cjs/at/vnr.js +2 -2
  2. package/lib/cjs/ba/jmbg.js +2 -2
  3. package/lib/cjs/cn/ric.js +2 -2
  4. package/lib/cjs/cu/ni.js +2 -2
  5. package/lib/cjs/cz/rc.js +2 -2
  6. package/lib/cjs/de/pwnr.js +2 -2
  7. package/lib/cjs/dk/cpr.js +7 -7
  8. package/lib/cjs/ee/ik.js +2 -2
  9. package/lib/cjs/fi/hetu.js +2 -3
  10. package/lib/cjs/gr/amka.js +2 -2
  11. package/lib/cjs/is/kennitala.js +2 -2
  12. package/lib/cjs/kr/rrn.js +2 -2
  13. package/lib/cjs/lv/pvn.js +2 -2
  14. package/lib/cjs/mx/curp.d.ts +1 -1
  15. package/lib/cjs/mx/curp.js +7 -11
  16. package/lib/cjs/mx/rfc.js +2 -2
  17. package/lib/cjs/my/nric.js +2 -2
  18. package/lib/cjs/no/fodselsnummer.js +3 -3
  19. package/lib/cjs/pl/pesel.js +2 -2
  20. package/lib/cjs/ro/cnp.js +2 -2
  21. package/lib/cjs/se/personnummer.js +34 -7
  22. package/lib/cjs/tw/tax_code.js +3 -3
  23. package/lib/cjs/util/index.d.ts +1 -1
  24. package/lib/cjs/util/index.js +4 -2
  25. package/lib/cjs/util/isValidDate.d.ts +6 -4
  26. package/lib/cjs/util/isValidDate.js +28 -12
  27. package/lib/cjs/za/idnr.js +2 -3
  28. package/lib/esm/at/vnr.js +2 -2
  29. package/lib/esm/ba/jmbg.js +3 -3
  30. package/lib/esm/cn/ric.js +2 -2
  31. package/lib/esm/cu/ni.js +3 -3
  32. package/lib/esm/cz/rc.js +3 -3
  33. package/lib/esm/de/pwnr.js +2 -2
  34. package/lib/esm/dk/cpr.js +8 -8
  35. package/lib/esm/ee/ik.js +2 -2
  36. package/lib/esm/fi/hetu.js +3 -4
  37. package/lib/esm/gr/amka.js +3 -3
  38. package/lib/esm/is/kennitala.js +3 -3
  39. package/lib/esm/kr/rrn.js +2 -2
  40. package/lib/esm/lv/pvn.js +3 -3
  41. package/lib/esm/mx/curp.d.ts +1 -1
  42. package/lib/esm/mx/curp.js +8 -12
  43. package/lib/esm/mx/rfc.js +2 -2
  44. package/lib/esm/my/nric.js +2 -2
  45. package/lib/esm/no/fodselsnummer.js +3 -3
  46. package/lib/esm/pl/pesel.js +2 -2
  47. package/lib/esm/ro/cnp.js +2 -2
  48. package/lib/esm/se/personnummer.js +35 -8
  49. package/lib/esm/tw/tax_code.js +3 -3
  50. package/lib/esm/util/index.d.ts +1 -1
  51. package/lib/esm/util/index.js +2 -2
  52. package/lib/esm/util/isValidDate.d.ts +6 -4
  53. package/lib/esm/util/isValidDate.js +25 -11
  54. package/lib/esm/za/idnr.js +3 -4
  55. package/package.json +5 -2
  56. package/src/ad/index.ts +1 -0
  57. package/src/ad/nrt.spec.ts +36 -0
  58. package/src/ad/nrt.ts +87 -0
  59. package/src/al/index.ts +1 -0
  60. package/src/al/nipt.spec.ts +43 -0
  61. package/src/al/nipt.ts +111 -0
  62. package/src/ar/cbu.spec.ts +28 -0
  63. package/src/ar/cbu.ts +96 -0
  64. package/src/ar/cuit.spec.ts +28 -0
  65. package/src/ar/cuit.ts +102 -0
  66. package/src/ar/dni.spec.ts +22 -0
  67. package/src/ar/dni.ts +72 -0
  68. package/src/ar/index.ts +3 -0
  69. package/src/at/businessid.spec.ts +34 -0
  70. package/src/at/businessid.ts +73 -0
  71. package/src/at/index.ts +4 -0
  72. package/src/at/tin.spec.ts +173 -0
  73. package/src/at/tin.ts +140 -0
  74. package/src/at/uid.spec.ts +44 -0
  75. package/src/at/uid.ts +84 -0
  76. package/src/at/vnr.spec.ts +38 -0
  77. package/src/at/vnr.ts +84 -0
  78. package/src/au/abn.spec.ts +28 -0
  79. package/src/au/abn.ts +78 -0
  80. package/src/au/acn.spec.ts +34 -0
  81. package/src/au/acn.ts +76 -0
  82. package/src/au/index.ts +3 -0
  83. package/src/au/tfn.spec.ts +28 -0
  84. package/src/au/tfn.ts +79 -0
  85. package/src/az/index.ts +2 -0
  86. package/src/az/pin.spec.ts +16 -0
  87. package/src/az/pin.ts +61 -0
  88. package/src/az/tin.spec.ts +28 -0
  89. package/src/az/tin.ts +64 -0
  90. package/src/ba/index.ts +1 -0
  91. package/src/ba/jmbg.spec.ts +28 -0
  92. package/src/ba/jmbg.ts +85 -0
  93. package/src/be/bis.spec.ts +184 -0
  94. package/src/be/bis.ts +85 -0
  95. package/src/be/index.ts +4 -0
  96. package/src/be/insz.spec.ts +51 -0
  97. package/src/be/insz.ts +55 -0
  98. package/src/be/nn.spec.ts +117 -0
  99. package/src/be/nn.ts +77 -0
  100. package/src/be/personIdentifierHelpers.spec.ts +254 -0
  101. package/src/be/personIdentifierHelpers.ts +130 -0
  102. package/src/be/vat.spec.ts +46 -0
  103. package/src/be/vat.ts +84 -0
  104. package/src/bg/egn.spec.ts +28 -0
  105. package/src/bg/egn.ts +75 -0
  106. package/src/bg/index.ts +3 -0
  107. package/src/bg/pnf.spec.ts +28 -0
  108. package/src/bg/pnf.ts +73 -0
  109. package/src/bg/vat.spec.ts +34 -0
  110. package/src/bg/vat.ts +120 -0
  111. package/src/br/cnpj.spec.ts +34 -0
  112. package/src/br/cnpj.ts +89 -0
  113. package/src/br/cpf.spec.ts +34 -0
  114. package/src/br/cpf.ts +87 -0
  115. package/src/br/index.ts +2 -0
  116. package/src/by/index.ts +1 -0
  117. package/src/by/unp.spec.ts +34 -0
  118. package/src/by/unp.ts +108 -0
  119. package/src/bz/index.ts +1 -0
  120. package/src/bz/tin.spec.ts +28 -0
  121. package/src/bz/tin.ts +67 -0
  122. package/src/ca/bn.spec.ts +40 -0
  123. package/src/ca/bn.ts +88 -0
  124. package/src/ca/gst.spec.ts +34 -0
  125. package/src/ca/gst.ts +70 -0
  126. package/src/ca/index.ts +5 -0
  127. package/src/ca/pst.spec.ts +28 -0
  128. package/src/ca/pst.ts +71 -0
  129. package/src/ca/qst.spec.ts +47 -0
  130. package/src/ca/qst.ts +88 -0
  131. package/src/ca/sin.spec.ts +34 -0
  132. package/src/ca/sin.ts +72 -0
  133. package/src/ch/index.ts +3 -0
  134. package/src/ch/ssn.spec.ts +50 -0
  135. package/src/ch/ssn.ts +74 -0
  136. package/src/ch/uid.spec.ts +34 -0
  137. package/src/ch/uid.ts +82 -0
  138. package/src/ch/vat.spec.ts +28 -0
  139. package/src/ch/vat.ts +83 -0
  140. package/src/cl/index.ts +2 -0
  141. package/src/cl/run.ts +13 -0
  142. package/src/cl/rut.spec.ts +50 -0
  143. package/src/cl/rut.ts +97 -0
  144. package/src/cn/index.ts +2 -0
  145. package/src/cn/ric.spec.ts +34 -0
  146. package/src/cn/ric.ts +86 -0
  147. package/src/cn/uscc.spec.ts +34 -0
  148. package/src/cn/uscc.ts +110 -0
  149. package/src/co/index.ts +1 -0
  150. package/src/co/nit.spec.ts +40 -0
  151. package/src/co/nit.ts +85 -0
  152. package/src/cr/cpf.spec.ts +34 -0
  153. package/src/cr/cpf.ts +93 -0
  154. package/src/cr/cpj.spec.ts +28 -0
  155. package/src/cr/cpj.ts +111 -0
  156. package/src/cr/cr.spec.ts +28 -0
  157. package/src/cr/cr.ts +75 -0
  158. package/src/cr/index.ts +3 -0
  159. package/src/cu/index.ts +1 -0
  160. package/src/cu/ni.spec.ts +34 -0
  161. package/src/cu/ni.ts +74 -0
  162. package/src/cy/index.ts +1 -0
  163. package/src/cy/vat.spec.ts +28 -0
  164. package/src/cy/vat.ts +98 -0
  165. package/src/cz/dic.spec.ts +28 -0
  166. package/src/cz/dic.ts +127 -0
  167. package/src/cz/index.ts +2 -0
  168. package/src/cz/rc.spec.ts +44 -0
  169. package/src/cz/rc.ts +95 -0
  170. package/src/de/idnr.spec.ts +34 -0
  171. package/src/de/idnr.ts +91 -0
  172. package/src/de/index.ts +6 -0
  173. package/src/de/passport.spec.ts +31 -0
  174. package/src/de/passport.ts +86 -0
  175. package/src/de/pwnr.spec.ts +62 -0
  176. package/src/de/pwnr.ts +190 -0
  177. package/src/de/stnr.spec.ts +85 -0
  178. package/src/de/stnr.ts +193 -0
  179. package/src/de/svnr.spec.ts +56 -0
  180. package/src/de/svnr.ts +158 -0
  181. package/src/de/vat.spec.ts +28 -0
  182. package/src/de/vat.ts +74 -0
  183. package/src/dk/cpr.spec.ts +34 -0
  184. package/src/dk/cpr.ts +129 -0
  185. package/src/dk/cvr.spec.ts +28 -0
  186. package/src/dk/cvr.ts +81 -0
  187. package/src/dk/index.ts +2 -0
  188. package/src/do/cedula.spec.ts +34 -0
  189. package/src/do/cedula.ts +67 -0
  190. package/src/do/index.ts +3 -0
  191. package/src/do/ncf.spec.ts +34 -0
  192. package/src/do/ncf.ts +133 -0
  193. package/src/do/rnc.spec.ts +40 -0
  194. package/src/do/rnc.ts +74 -0
  195. package/src/dz/index.ts +1 -0
  196. package/src/dz/nif.spec.ts +39 -0
  197. package/src/dz/nif.ts +80 -0
  198. package/src/ec/ci.spec.ts +28 -0
  199. package/src/ec/ci.ts +92 -0
  200. package/src/ec/index.ts +2 -0
  201. package/src/ec/ruc.spec.ts +37 -0
  202. package/src/ec/ruc.ts +117 -0
  203. package/src/ee/ik.spec.ts +28 -0
  204. package/src/ee/ik.ts +114 -0
  205. package/src/ee/index.ts +3 -0
  206. package/src/ee/kmkr.spec.ts +28 -0
  207. package/src/ee/kmkr.ts +76 -0
  208. package/src/ee/registrikood.spec.ts +28 -0
  209. package/src/ee/registrikood.ts +80 -0
  210. package/src/eg/index.ts +1 -0
  211. package/src/eg/tn.spec.ts +44 -0
  212. package/src/eg/tn.ts +96 -0
  213. package/src/es/cif.spec.ts +43 -0
  214. package/src/es/cif.ts +84 -0
  215. package/src/es/dni.spec.ts +28 -0
  216. package/src/es/dni.ts +83 -0
  217. package/src/es/index.ts +5 -0
  218. package/src/es/nie.spec.ts +28 -0
  219. package/src/es/nie.ts +79 -0
  220. package/src/es/nif.spec.ts +52 -0
  221. package/src/es/nif.ts +95 -0
  222. package/src/es/nss.spec.ts +28 -0
  223. package/src/es/nss.ts +132 -0
  224. package/src/exceptions.ts +66 -0
  225. package/src/fi/alv.spec.ts +28 -0
  226. package/src/fi/alv.ts +76 -0
  227. package/src/fi/hetu.spec.ts +37 -0
  228. package/src/fi/hetu.ts +108 -0
  229. package/src/fi/index.ts +3 -0
  230. package/src/fi/ytunnus.spec.ts +28 -0
  231. package/src/fi/ytunnus.ts +49 -0
  232. package/src/fo/index.ts +1 -0
  233. package/src/fo/vn.spec.ts +34 -0
  234. package/src/fo/vn.ts +71 -0
  235. package/src/fr/index.ts +5 -0
  236. package/src/fr/nif.spec.ts +34 -0
  237. package/src/fr/nif.ts +82 -0
  238. package/src/fr/nir.spec.ts +36 -0
  239. package/src/fr/nir.ts +98 -0
  240. package/src/fr/siren.spec.ts +28 -0
  241. package/src/fr/siren.ts +68 -0
  242. package/src/fr/siret.spec.ts +38 -0
  243. package/src/fr/siret.ts +79 -0
  244. package/src/fr/tva.spec.ts +40 -0
  245. package/src/fr/tva.ts +125 -0
  246. package/src/gb/index.ts +3 -0
  247. package/src/gb/nino-prefixes.ts +245 -0
  248. package/src/gb/nino.spec.ts +80 -0
  249. package/src/gb/nino.ts +80 -0
  250. package/src/gb/utr.spec.ts +28 -0
  251. package/src/gb/utr.ts +76 -0
  252. package/src/gb/vat.spec.ts +40 -0
  253. package/src/gb/vat.ts +112 -0
  254. package/src/gen/ean.spec.ts +34 -0
  255. package/src/gen/ean.ts +71 -0
  256. package/src/gen/index.ts +1 -0
  257. package/src/gh/index.ts +1 -0
  258. package/src/gh/tin.spec.ts +42 -0
  259. package/src/gh/tin.ts +93 -0
  260. package/src/gn/index.ts +1 -0
  261. package/src/gn/nifp.spec.ts +40 -0
  262. package/src/gn/nifp.ts +72 -0
  263. package/src/gr/amka.spec.ts +28 -0
  264. package/src/gr/amka.ts +76 -0
  265. package/src/gr/index.ts +2 -0
  266. package/src/gr/vat.spec.ts +34 -0
  267. package/src/gr/vat.ts +84 -0
  268. package/src/gt/cui.spec.ts +34 -0
  269. package/src/gt/cui.ts +110 -0
  270. package/src/gt/index.ts +2 -0
  271. package/src/gt/nit.spec.ts +34 -0
  272. package/src/gt/nit.ts +86 -0
  273. package/src/hk/hkid.spec.ts +52 -0
  274. package/src/hk/hkid.ts +90 -0
  275. package/src/hk/index.ts +1 -0
  276. package/src/hr/index.ts +1 -0
  277. package/src/hr/oib.spec.ts +28 -0
  278. package/src/hr/oib.ts +67 -0
  279. package/src/hu/anum.spec.ts +28 -0
  280. package/src/hu/anum.ts +71 -0
  281. package/src/hu/index.ts +1 -0
  282. package/src/id/index.ts +1 -0
  283. package/src/id/npwp.spec.ts +34 -0
  284. package/src/id/npwp.ts +116 -0
  285. package/src/ie/index.ts +2 -0
  286. package/src/ie/pps.spec.ts +58 -0
  287. package/src/ie/pps.ts +81 -0
  288. package/src/ie/vat.spec.ts +40 -0
  289. package/src/ie/vat.ts +99 -0
  290. package/src/il/hp.spec.ts +38 -0
  291. package/src/il/hp.ts +75 -0
  292. package/src/il/idnr.spec.ts +28 -0
  293. package/src/il/idnr.ts +70 -0
  294. package/src/il/index.ts +2 -0
  295. package/src/in/aadhaar.spec.ts +40 -0
  296. package/src/in/aadhaar.ts +85 -0
  297. package/src/in/epic.spec.ts +34 -0
  298. package/src/in/epic.ts +85 -0
  299. package/src/in/gstin.spec.ts +34 -0
  300. package/src/in/gstin.ts +156 -0
  301. package/src/in/index.ts +4 -0
  302. package/src/in/pan.spec.ts +40 -0
  303. package/src/in/pan.ts +93 -0
  304. package/src/index.ts +404 -0
  305. package/src/is/index.ts +2 -0
  306. package/src/is/kennitala.spec.ts +46 -0
  307. package/src/is/kennitala.ts +80 -0
  308. package/src/is/vsk.spec.ts +22 -0
  309. package/src/is/vsk.ts +60 -0
  310. package/src/it/aic.spec.ts +40 -0
  311. package/src/it/aic.ts +97 -0
  312. package/src/it/codicefiscale.spec.ts +28 -0
  313. package/src/it/codicefiscale.ts +167 -0
  314. package/src/it/index.ts +3 -0
  315. package/src/it/iva.spec.ts +28 -0
  316. package/src/it/iva.ts +65 -0
  317. package/src/jp/cn.spec.ts +28 -0
  318. package/src/jp/cn.ts +77 -0
  319. package/src/jp/index.ts +1 -0
  320. package/src/ke/index.ts +1 -0
  321. package/src/ke/pin.spec.ts +34 -0
  322. package/src/ke/pin.ts +77 -0
  323. package/src/kr/brn.spec.ts +28 -0
  324. package/src/kr/brn.ts +91 -0
  325. package/src/kr/index.ts +2 -0
  326. package/src/kr/rrn.spec.ts +34 -0
  327. package/src/kr/rrn.ts +104 -0
  328. package/src/li/index.ts +1 -0
  329. package/src/li/peid.spec.ts +22 -0
  330. package/src/li/peid.ts +71 -0
  331. package/src/lt/asmens.spec.ts +28 -0
  332. package/src/lt/asmens.ts +73 -0
  333. package/src/lt/index.ts +2 -0
  334. package/src/lt/pvm.spec.ts +34 -0
  335. package/src/lt/pvm.ts +75 -0
  336. package/src/lu/index.ts +1 -0
  337. package/src/lu/tva.spec.ts +28 -0
  338. package/src/lu/tva.ts +70 -0
  339. package/src/lv/index.ts +1 -0
  340. package/src/lv/pvn.spec.ts +44 -0
  341. package/src/lv/pvn.ts +102 -0
  342. package/src/ma/ice.spec.ts +39 -0
  343. package/src/ma/ice.ts +72 -0
  344. package/src/ma/ice9.spec.ts +28 -0
  345. package/src/ma/ice9.ts +62 -0
  346. package/src/ma/index.ts +2 -0
  347. package/src/mc/index.ts +1 -0
  348. package/src/mc/tva.spec.ts +28 -0
  349. package/src/mc/tva.ts +67 -0
  350. package/src/md/idno.spec.ts +28 -0
  351. package/src/md/idno.ts +78 -0
  352. package/src/md/index.ts +1 -0
  353. package/src/me/index.ts +2 -0
  354. package/src/me/jmbg.ts +17 -0
  355. package/src/me/pib.spec.ts +158 -0
  356. package/src/me/pib.ts +77 -0
  357. package/src/mk/edb.spec.ts +50 -0
  358. package/src/mk/edb.ts +88 -0
  359. package/src/mk/index.ts +2 -0
  360. package/src/mk/jmbg.ts +17 -0
  361. package/src/mt/index.ts +1 -0
  362. package/src/mt/vat.spec.ts +28 -0
  363. package/src/mt/vat.ts +69 -0
  364. package/src/mu/index.ts +1 -0
  365. package/src/mu/nid.spec.ts +34 -0
  366. package/src/mu/nid.ts +89 -0
  367. package/src/mx/banks.ts +658 -0
  368. package/src/mx/clabe.spec.ts +68 -0
  369. package/src/mx/clabe.ts +105 -0
  370. package/src/mx/curp.spec.ts +28 -0
  371. package/src/mx/curp.ts +261 -0
  372. package/src/mx/index.ts +3 -0
  373. package/src/mx/rfc.spec.ts +69 -0
  374. package/src/mx/rfc.ts +193 -0
  375. package/src/my/index.ts +1 -0
  376. package/src/my/nric.spec.ts +40 -0
  377. package/src/my/nric.ts +91 -0
  378. package/src/nl/bsn.spec.ts +68 -0
  379. package/src/nl/bsn.ts +81 -0
  380. package/src/nl/btw.spec.ts +40 -0
  381. package/src/nl/btw.ts +95 -0
  382. package/src/nl/index.ts +3 -0
  383. package/src/nl/onderwijsnummer.spec.ts +34 -0
  384. package/src/nl/onderwijsnummer.ts +77 -0
  385. package/src/no/fodselsnummer.spec.ts +56 -0
  386. package/src/no/fodselsnummer.ts +118 -0
  387. package/src/no/index.ts +4 -0
  388. package/src/no/kontonr.spec.ts +34 -0
  389. package/src/no/kontonr.ts +84 -0
  390. package/src/no/mva.spec.ts +28 -0
  391. package/src/no/mva.ts +80 -0
  392. package/src/no/orgnr.spec.ts +28 -0
  393. package/src/no/orgnr.ts +75 -0
  394. package/src/nz/bank.spec.ts +28 -0
  395. package/src/nz/bank.ts +238 -0
  396. package/src/nz/index.ts +2 -0
  397. package/src/nz/ird.spec.ts +34 -0
  398. package/src/nz/ird.ts +102 -0
  399. package/src/pe/ce.spec.ts +46 -0
  400. package/src/pe/ce.ts +61 -0
  401. package/src/pe/cui.spec.ts +28 -0
  402. package/src/pe/cui.ts +85 -0
  403. package/src/pe/index.ts +3 -0
  404. package/src/pe/ruc.spec.ts +46 -0
  405. package/src/pe/ruc.ts +84 -0
  406. package/src/pk/cnic.spec.ts +34 -0
  407. package/src/pk/cnic.ts +97 -0
  408. package/src/pk/index.ts +2 -0
  409. package/src/pk/ntn.spec.ts +22 -0
  410. package/src/pk/ntn.ts +65 -0
  411. package/src/pl/index.ts +3 -0
  412. package/src/pl/nip.spec.ts +34 -0
  413. package/src/pl/nip.ts +74 -0
  414. package/src/pl/pesel.spec.ts +34 -0
  415. package/src/pl/pesel.ts +97 -0
  416. package/src/pl/regon.spec.ts +52 -0
  417. package/src/pl/regon.ts +88 -0
  418. package/src/pt/cc.spec.ts +43 -0
  419. package/src/pt/cc.ts +74 -0
  420. package/src/pt/index.ts +3 -0
  421. package/src/pt/nif.spec.ts +28 -0
  422. package/src/pt/nif.ts +78 -0
  423. package/src/pt/nipc.ts +27 -0
  424. package/src/py/cedula.spec.ts +46 -0
  425. package/src/py/cedula.ts +73 -0
  426. package/src/py/index.ts +2 -0
  427. package/src/py/ruc.spec.ts +40 -0
  428. package/src/py/ruc.ts +93 -0
  429. package/src/ro/cif.spec.ts +40 -0
  430. package/src/ro/cif.ts +62 -0
  431. package/src/ro/cnp.spec.ts +50 -0
  432. package/src/ro/cnp.ts +158 -0
  433. package/src/ro/cui.spec.ts +28 -0
  434. package/src/ro/cui.ts +83 -0
  435. package/src/ro/index.ts +4 -0
  436. package/src/ro/onrc.spec.ts +28 -0
  437. package/src/ro/onrc.ts +109 -0
  438. package/src/rs/index.ts +2 -0
  439. package/src/rs/jmbg.ts +16 -0
  440. package/src/rs/pib.spec.ts +28 -0
  441. package/src/rs/pib.ts +69 -0
  442. package/src/ru/index.ts +1 -0
  443. package/src/ru/inn.spec.ts +32 -0
  444. package/src/ru/inn.ts +106 -0
  445. package/src/se/index.ts +3 -0
  446. package/src/se/orgnr.spec.ts +28 -0
  447. package/src/se/orgnr.ts +68 -0
  448. package/src/se/personnummer.spec.ts +45 -0
  449. package/src/se/personnummer.ts +143 -0
  450. package/src/se/vat.spec.ts +28 -0
  451. package/src/se/vat.ts +73 -0
  452. package/src/sg/index.ts +1 -0
  453. package/src/sg/uen.spec.ts +46 -0
  454. package/src/sg/uen.ts +209 -0
  455. package/src/si/ddv.spec.ts +28 -0
  456. package/src/si/ddv.ts +76 -0
  457. package/src/si/emso.spec.ts +15 -0
  458. package/src/si/emso.ts +27 -0
  459. package/src/si/index.ts +3 -0
  460. package/src/si/jmbg.ts +20 -0
  461. package/src/sk/dph.spec.ts +28 -0
  462. package/src/sk/dph.ts +71 -0
  463. package/src/sk/index.ts +2 -0
  464. package/src/sk/rc.ts +12 -0
  465. package/src/sm/coe.spec.ts +34 -0
  466. package/src/sm/coe.ts +80 -0
  467. package/src/sm/index.ts +1 -0
  468. package/src/sv/index.ts +1 -0
  469. package/src/sv/nit.spec.ts +34 -0
  470. package/src/sv/nit.ts +117 -0
  471. package/src/th/idnr.spec.ts +41 -0
  472. package/src/th/idnr.ts +80 -0
  473. package/src/th/index.ts +3 -0
  474. package/src/th/moa.spec.ts +62 -0
  475. package/src/th/moa.ts +85 -0
  476. package/src/th/tin.spec.ts +77 -0
  477. package/src/th/tin.ts +56 -0
  478. package/src/tn/index.ts +1 -0
  479. package/src/tn/mf.spec.ts +37 -0
  480. package/src/tn/mf.ts +169 -0
  481. package/src/tr/index.ts +2 -0
  482. package/src/tr/tckimlik.spec.ts +40 -0
  483. package/src/tr/tckimlik.ts +87 -0
  484. package/src/tr/vkn.spec.ts +28 -0
  485. package/src/tr/vkn.ts +87 -0
  486. package/src/tw/ban.spec.ts +28 -0
  487. package/src/tw/ban.ts +67 -0
  488. package/src/tw/index.ts +5 -0
  489. package/src/tw/natid.spec.ts +28 -0
  490. package/src/tw/natid.ts +105 -0
  491. package/src/tw/tax_code.spec.ts +34 -0
  492. package/src/tw/tax_code.ts +98 -0
  493. package/src/tw/ubn.spec.ts +28 -0
  494. package/src/tw/ubn.ts +80 -0
  495. package/src/tw/ui.spec.ts +38 -0
  496. package/src/tw/ui.ts +107 -0
  497. package/src/types.ts +82 -0
  498. package/src/ua/edrpou.spec.ts +28 -0
  499. package/src/ua/edrpou.ts +88 -0
  500. package/src/ua/index.ts +2 -0
  501. package/src/ua/rntrc.spec.ts +28 -0
  502. package/src/ua/rntrc.ts +77 -0
  503. package/src/us/ein.spec.ts +28 -0
  504. package/src/us/ein.ts +179 -0
  505. package/src/us/index.ts +2 -0
  506. package/src/us/ssn.spec.ts +28 -0
  507. package/src/us/ssn.ts +117 -0
  508. package/src/util/checksum.spec.ts +70 -0
  509. package/src/util/checksum.ts +258 -0
  510. package/src/util/index.ts +13 -0
  511. package/src/util/isValidDate.spec.ts +49 -0
  512. package/src/util/isValidDate.ts +87 -0
  513. package/src/util/iso7064.spec.ts +17 -0
  514. package/src/util/iso7064.ts +8 -0
  515. package/src/util/pymod.ts +8 -0
  516. package/src/util/strings/char.ts +18 -0
  517. package/src/util/strings/clean.spec.ts +15 -0
  518. package/src/util/strings/clean.ts +305 -0
  519. package/src/util/strings/format.ts +18 -0
  520. package/src/util/strings/index.ts +5 -0
  521. package/src/util/strings/reverseString.ts +3 -0
  522. package/src/util/strings/splitAt.spec.ts +15 -0
  523. package/src/util/strings/splitAt.ts +16 -0
  524. package/src/uy/cedula.spec.ts +28 -0
  525. package/src/uy/cedula.ts +74 -0
  526. package/src/uy/index.ts +3 -0
  527. package/src/uy/nie.spec.ts +28 -0
  528. package/src/uy/nie.ts +84 -0
  529. package/src/uy/rut.spec.ts +34 -0
  530. package/src/uy/rut.ts +99 -0
  531. package/src/ve/index.ts +1 -0
  532. package/src/ve/rif.spec.ts +38 -0
  533. package/src/ve/rif.ts +92 -0
  534. package/src/vn/index.ts +1 -0
  535. package/src/vn/mst.spec.ts +40 -0
  536. package/src/vn/mst.ts +100 -0
  537. package/src/za/idnr.spec.ts +28 -0
  538. package/src/za/idnr.ts +84 -0
  539. package/src/za/index.ts +2 -0
  540. package/src/za/tin.spec.ts +28 -0
  541. package/src/za/tin.ts +75 -0
package/src/es/dni.ts ADDED
@@ -0,0 +1,83 @@
1
+ /**
2
+ * DNI (Documento Nacional de Identidad, Spanish personal identity codes).
3
+ *
4
+ * The DNI is a 9 digit number used to identify Spanish citizens. The last
5
+ * digit is a checksum letter.
6
+ *
7
+ * Foreign nationals, since 2010 are issued an NIE (Número de Identificación
8
+ * de Extranjeros, Foreigner's Identity Number) instead.
9
+ *
10
+ * Sources:
11
+ * https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/SPAIN-TIN.pdf
12
+ *
13
+ * PERSON
14
+ */
15
+
16
+ import * as exceptions from '../exceptions';
17
+ import { strings } from '../util';
18
+ import { Validator, ValidateReturn } from '../types';
19
+
20
+ const checkDigits = 'TRWAGMYFPDXBNJZSQVHLCKE';
21
+
22
+ export function calcCheckDigit(value: string): string {
23
+ return checkDigits[parseInt(value.substr(0, 8), 10) % 23];
24
+ }
25
+
26
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
27
+ return strings.cleanUnicode(input, ' -');
28
+ }
29
+
30
+ const impl: Validator = {
31
+ name: 'Spanish Personal Identify Code',
32
+ localName: 'Documento Nacional de Identidad',
33
+ abbreviation: 'DNI',
34
+ compact(input: string): string {
35
+ const [value, err] = clean(input);
36
+
37
+ if (err) {
38
+ throw err;
39
+ }
40
+
41
+ return value;
42
+ },
43
+
44
+ format(input: string): string {
45
+ const [value] = clean(input);
46
+
47
+ return strings.splitAt(value, 8).join('-');
48
+ },
49
+
50
+ validate(input: string): ValidateReturn {
51
+ const [value, error] = clean(input);
52
+
53
+ if (error) {
54
+ return { isValid: false, error };
55
+ }
56
+ if (value.length !== 9) {
57
+ return { isValid: false, error: new exceptions.InvalidLength() };
58
+ }
59
+
60
+ const [body, check] = strings.splitAt(value, 8);
61
+
62
+ if ('KLM'.includes(body[0]) && strings.isdigits(body.substring(1))) {
63
+ // Currently no test data for these cases, so
64
+ // we're assuming they're good based on format
65
+ } else if (!strings.isdigits(body)) {
66
+ // Not all digits in the body, it's not valid
67
+ return { isValid: false, error: new exceptions.InvalidComponent() };
68
+ } else if (calcCheckDigit(body) !== check) {
69
+ // Check the checksum on a non-[KLM] person
70
+ return { isValid: false, error: new exceptions.InvalidChecksum() };
71
+ }
72
+
73
+ return {
74
+ isValid: true,
75
+ compact: value,
76
+ isIndividual: true,
77
+ isCompany: false,
78
+ };
79
+ },
80
+ };
81
+
82
+ export const { name, localName, abbreviation, validate, format, compact } =
83
+ impl;
@@ -0,0 +1,5 @@
1
+ export * as cif from './cif';
2
+ export * as dni from './dni';
3
+ export * as nie from './nie';
4
+ export * as nif from './nif';
5
+ export * as nss from './nss';
@@ -0,0 +1,28 @@
1
+ import { validate, format } from './nie';
2
+ import { InvalidLength, InvalidChecksum } from '../exceptions';
3
+
4
+ describe('es/nie', () => {
5
+ it('format:x-2482300w', () => {
6
+ const result = format('x-2482300w');
7
+
8
+ expect(result).toEqual('X-2482300-W');
9
+ });
10
+
11
+ it('validate:x-2482300w', () => {
12
+ const result = validate('x-2482300w');
13
+
14
+ expect(result.isValid && result.compact).toEqual('X2482300W');
15
+ });
16
+
17
+ it('validate:X2482300', () => {
18
+ const result = validate('X2482300');
19
+
20
+ expect(result.error).toBeInstanceOf(InvalidLength);
21
+ });
22
+
23
+ it('validate:x-2482300a', () => {
24
+ const result = validate('x-2482300a');
25
+
26
+ expect(result.error).toBeInstanceOf(InvalidChecksum);
27
+ });
28
+ });
package/src/es/nie.ts ADDED
@@ -0,0 +1,79 @@
1
+ /**
2
+ * NIE (Número de Identificación de Extranjero, Spanish foreigner number).
3
+ *
4
+ * The NIE is an identification number for foreigners. It is a 9 digit number
5
+ * where the first digit is either X, Y or Z and last digit is a checksum
6
+ * letter.
7
+ *
8
+ * Sources:
9
+ * https://es.wikipedia.org/wiki/N%C3%BAmero_de_identidad_de_extranjero
10
+ *
11
+ * PERSON
12
+ */
13
+
14
+ import * as exceptions from '../exceptions';
15
+ import { strings } from '../util';
16
+ import * as dni from './dni';
17
+ import { Validator, ValidateReturn } from '../types';
18
+
19
+ const checkDigits = 'XYZ';
20
+
21
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
22
+ return strings.cleanUnicode(input, ' -');
23
+ }
24
+
25
+ const impl: Validator = {
26
+ name: 'Spanish Foreign Number',
27
+ localName: 'Número de Identificación de Extranjero',
28
+ abbreviation: 'NIE',
29
+ compact(input: string): string {
30
+ const [value, err] = clean(input);
31
+
32
+ if (err) {
33
+ throw err;
34
+ }
35
+
36
+ return value;
37
+ },
38
+
39
+ format(input: string): string {
40
+ const [value] = clean(input);
41
+
42
+ return strings.splitAt(value, 1, 8).join('-');
43
+ },
44
+
45
+ validate(input: string): ValidateReturn {
46
+ const [value, error] = clean(input);
47
+
48
+ if (error) {
49
+ return { isValid: false, error };
50
+ }
51
+ if (value.length !== 9) {
52
+ return { isValid: false, error: new exceptions.InvalidLength() };
53
+ }
54
+
55
+ const [first, body, check] = strings.splitAt(value, 1, 8);
56
+
57
+ if (
58
+ !strings.isdigits(body) ||
59
+ !checkDigits.includes(first) ||
60
+ strings.isdigits(check)
61
+ ) {
62
+ return { isValid: false, error: new exceptions.InvalidComponent() };
63
+ }
64
+
65
+ if (dni.calcCheckDigit(`${checkDigits.indexOf(first)}${body}`) !== check) {
66
+ return { isValid: false, error: new exceptions.InvalidChecksum() };
67
+ }
68
+
69
+ return {
70
+ isValid: true,
71
+ compact: value,
72
+ isIndividual: true,
73
+ isCompany: false,
74
+ };
75
+ },
76
+ };
77
+
78
+ export const { name, localName, abbreviation, validate, format, compact } =
79
+ impl;
@@ -0,0 +1,52 @@
1
+ import { validate, format } from './nif';
2
+ import { InvalidLength, InvalidChecksum } from '../exceptions';
3
+
4
+ describe('es/nif', () => {
5
+ it('format:ES B58378431', () => {
6
+ const result = format('ES B58378431');
7
+
8
+ expect(result).toEqual('B-58378431');
9
+ });
10
+
11
+ it('validate:ES B-58378431', () => {
12
+ const result = validate('ES B-58378431');
13
+
14
+ expect(result.isValid && result.compact).toEqual('B58378431');
15
+ });
16
+
17
+ it('validate:B64717838', () => {
18
+ const result = validate('B64717838');
19
+
20
+ expect(result.isValid && result.compact).toEqual('B64717838');
21
+ });
22
+
23
+ it('validate:54362315K', () => {
24
+ const result = validate('54362315K');
25
+
26
+ expect(result.isValid && result.compact).toEqual('54362315K');
27
+ });
28
+
29
+ it('validate:X-5253868-R', () => {
30
+ const result = validate('X-5253868-R');
31
+
32
+ expect(result.isValid && result.compact).toEqual('X5253868R');
33
+ });
34
+
35
+ it('validate:M-1234567-L', () => {
36
+ const result = validate('M-1234567-L');
37
+
38
+ expect(result.isValid && result.compact).toEqual('M1234567L');
39
+ });
40
+
41
+ it('validate:B647178390', () => {
42
+ const result = validate('54362315');
43
+
44
+ expect(result.error).toBeInstanceOf(InvalidLength);
45
+ });
46
+
47
+ it('validate:B64717839', () => {
48
+ const result = validate('B64717839');
49
+
50
+ expect(result.error).toBeInstanceOf(InvalidChecksum);
51
+ });
52
+ });
package/src/es/nif.ts ADDED
@@ -0,0 +1,95 @@
1
+ /**
2
+ * NIF (Número de Identificación Fiscal, Spanish VAT number).
3
+ *
4
+ * The Spanish VAT number is a 9-digit number where either the first, last
5
+ * digits or both can be letters.
6
+ * The number is either a DNI (Documento Nacional de Identidad, for
7
+ *
8
+ * Spaniards), a NIE (Número de Identificación de Extranjero, for
9
+ * foreigners) or a CIF (Código de Identificación Fiscal, for legal
10
+ * entities and others).
11
+ *
12
+ * VAT (PERSON/ENTITY)
13
+ */
14
+
15
+ import * as exceptions from '../exceptions';
16
+ import { strings } from '../util';
17
+ import { Validator, ValidateReturn } from '../types';
18
+ import * as nie from './nie';
19
+ import * as dni from './dni';
20
+ import * as cif from './cif';
21
+
22
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
23
+ const [value, err] = strings.cleanUnicode(input, ' -./');
24
+
25
+ if (err) {
26
+ return [value, err];
27
+ }
28
+ if (value.startsWith('ES')) {
29
+ return [value.substr(2), null];
30
+ }
31
+
32
+ return [value, null];
33
+ }
34
+
35
+ const impl: Validator = {
36
+ name: 'Spanish VAT Number',
37
+ localName: 'Número de Identificación Fiscal',
38
+ abbreviation: 'NIF',
39
+ compact(input: string): string {
40
+ const [value, err] = clean(input);
41
+
42
+ if (err) {
43
+ throw err;
44
+ }
45
+
46
+ return value;
47
+ },
48
+
49
+ format(input: string): string {
50
+ const [value] = clean(input);
51
+
52
+ return strings.splitAt(value, 1).join('-');
53
+ },
54
+
55
+ validate(input: string): ValidateReturn {
56
+ const [value, error] = clean(input);
57
+
58
+ if (error) {
59
+ return { isValid: false, error };
60
+ }
61
+ if (value.length !== 9) {
62
+ return { isValid: false, error: new exceptions.InvalidLength() };
63
+ }
64
+
65
+ if ('KLM'.includes(value[0])) {
66
+ // K: Spanish younger than 14 year old
67
+ // L: Spanish living outside Spain without DNI
68
+ // M: granted the tax to foreigners who have no NIE
69
+ // these use the old checkdigit algorithm (the DNI one)
70
+ if (value[value.length - 1] !== dni.calcCheckDigit(value.substr(1))) {
71
+ return { isValid: false, error: new exceptions.InvalidChecksum() };
72
+ }
73
+ return {
74
+ isValid: true,
75
+ compact: value,
76
+ isIndividual: true,
77
+ isCompany: false,
78
+ };
79
+ }
80
+ if (strings.isdigits(value[0])) {
81
+ // Natural resident (DNI)
82
+ return dni.validate(value);
83
+ }
84
+ if ('XYZ'.includes(value[0])) {
85
+ // Foreign natural person (NIE)
86
+ return nie.validate(value);
87
+ }
88
+
89
+ // Otherwise it has to be a (CIF)
90
+ return cif.validate(value);
91
+ },
92
+ };
93
+
94
+ export const { name, localName, abbreviation, validate, format, compact } =
95
+ impl;
@@ -0,0 +1,28 @@
1
+ import { validate, format } from './nss';
2
+ import { InvalidLength, InvalidComponent } from '../exceptions';
3
+
4
+ describe('es/nss', () => {
5
+ it('format:281234567840', () => {
6
+ const result = format('281234567840');
7
+
8
+ expect('28-1234567840').toEqual(result);
9
+ });
10
+
11
+ it.each(['281234567840'])('validate:%s', (value: string) => {
12
+ const result = validate(value);
13
+
14
+ expect(value).toEqual(result.isValid && result.compact);
15
+ });
16
+
17
+ it('validate:77 12345678 40', () => {
18
+ const result = validate('77 12345678 40');
19
+
20
+ expect(result.error).toBeInstanceOf(InvalidComponent);
21
+ });
22
+
23
+ it('validate:28 12345678 4', () => {
24
+ const result = validate('28 12345678 4');
25
+
26
+ expect(result.error).toBeInstanceOf(InvalidLength);
27
+ });
28
+ });
package/src/es/nss.ts ADDED
@@ -0,0 +1,132 @@
1
+ /**
2
+ * NSS (El número de Seguridad Social, Social Security Number).
3
+ *
4
+ * The SSN is a tax identification number for individuals entities. It has 12 digits
5
+ * where where the first 2 digits indicate province, followed by 8 digits and
6
+ * a 2 digit checksum
7
+ *
8
+ * Sources:
9
+ * https://cis.ier.hit-u.ac.jp/English/society/conference1001/delgado-paper.pdf
10
+ * https://www.grupoalquerque.es/ferias/2012/archivos/digitos/codigo_seguridad_social.pdf
11
+ *
12
+ * TAX/PERSON
13
+ */
14
+
15
+ import * as exceptions from '../exceptions';
16
+ import { strings } from '../util';
17
+ import { Validator, ValidateReturn } from '../types';
18
+
19
+ const PROVINCES = {
20
+ ÁLAVA: '01',
21
+ ALBACETE: '02',
22
+ ALICANTE: '03',
23
+ ALMERÍA: '04',
24
+ ASTURIAS: '33',
25
+ ÁVILA: '05',
26
+ BADAJOZ: '06',
27
+ BALEARES: '07',
28
+ BARCELONA: '08',
29
+ BURGOS: '09',
30
+ CÁCERES: '10',
31
+ CÁDIZ: '11',
32
+ CANTABRIA: '39',
33
+ CASTELLÓN: '12',
34
+ 'CIUDAD REAL': '13',
35
+ CÓRDOBA: '14',
36
+ CORUÑA: '15',
37
+ CUENCA: '16',
38
+ GERONA: '17',
39
+ GRANADA: '18',
40
+ GUADALAJARA: '19',
41
+ GUIPÚZCOA: '20',
42
+ HUELVA: '21',
43
+ HUESCA: '22',
44
+ JAÉN: '23',
45
+ LEÓN: '24',
46
+ LÉRIDA: '25',
47
+ LUGO: '27',
48
+ MADRID: '28',
49
+ MÁLAGA: '29',
50
+ MURCIA: '30',
51
+ NAVARRA: '31',
52
+ ORENSE: '32',
53
+ PALENCIA: '34',
54
+ 'PALMAS (LAS)': '35',
55
+ PONTEVEDRA: '36',
56
+ 'RIOJA (LA)': '26',
57
+ SALAMANCA: '37',
58
+ 'SANTA CRUZ DE TENERIFE': '38',
59
+ SEGOVIA: '40',
60
+ SEVILLA: '41',
61
+ SORIA: '42',
62
+ TARRAGONA: '43',
63
+ TERUEL: '44',
64
+ TOLEDO: '45',
65
+ VALENCIA: '46',
66
+ VALLADOLID: '47',
67
+ VIZCAYA: '48',
68
+ ZAMORA: '49',
69
+ ZARAGOZA: '50',
70
+ 'OTROS TERRITORIOS': '53',
71
+ EXTRANJERO: '66',
72
+ };
73
+ const VALID_PROVINCES = Object.values(PROVINCES);
74
+
75
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
76
+ return strings.cleanUnicode(input, ' -/');
77
+ }
78
+
79
+ const impl: Validator = {
80
+ name: 'Spanish Social Security Number',
81
+ localName: 'Número de Seguridad Social',
82
+ abbreviation: 'NSS',
83
+ compact(input: string): string {
84
+ const [value, err] = clean(input);
85
+
86
+ if (err) {
87
+ throw err;
88
+ }
89
+
90
+ return value;
91
+ },
92
+
93
+ format(input: string): string {
94
+ const [value] = clean(input);
95
+
96
+ return strings.splitAt(value, 2).join('-');
97
+ },
98
+
99
+ validate(input: string): ValidateReturn {
100
+ const [value, error] = clean(input);
101
+
102
+ if (error) {
103
+ return { isValid: false, error };
104
+ }
105
+ if (value.length !== 12) {
106
+ return { isValid: false, error: new exceptions.InvalidLength() };
107
+ }
108
+
109
+ if (!strings.isdigits(value)) {
110
+ return { isValid: false, error: new exceptions.InvalidComponent() };
111
+ }
112
+
113
+ const [province, body, check] = strings.splitAt(value, 2, 10);
114
+ if (!VALID_PROVINCES.includes(province)) {
115
+ return { isValid: false, error: new exceptions.InvalidComponent() };
116
+ }
117
+
118
+ if (parseInt(province + body, 10) % 97 !== parseInt(check, 10)) {
119
+ return { isValid: false, error: new exceptions.InvalidChecksum() };
120
+ }
121
+
122
+ return {
123
+ isValid: true,
124
+ compact: value,
125
+ isIndividual: true,
126
+ isCompany: false,
127
+ };
128
+ },
129
+ };
130
+
131
+ export const { name, localName, abbreviation, validate, format, compact } =
132
+ impl;
@@ -0,0 +1,66 @@
1
+ /* eslint-disable max-classes-per-file */
2
+ /**
3
+ * Collection of exceptions.
4
+ * The validation functions of stdnum should raise one of the below exceptions
5
+ * when validation of the number fails.
6
+ */
7
+
8
+ /**
9
+ * Top-level error for validating numbers.
10
+ *
11
+ * This exception should normally not be raised, only subclasses of this
12
+ * exception.
13
+ */
14
+ export class ValidationError extends Error {
15
+ constructor(msg: string) {
16
+ super(msg);
17
+ this.name = 'ValidationError';
18
+ }
19
+ }
20
+
21
+ /**
22
+ * Something is wrong with the format of the number.
23
+ *
24
+ * This generally means characters or delimiters that are not allowed are
25
+ * part of the number or required parts are missing.
26
+ */
27
+ export class InvalidFormat extends ValidationError {
28
+ constructor(msg = 'The number has an invlidad format.') {
29
+ super(msg);
30
+ this.name = 'InvalidFormat';
31
+ }
32
+ }
33
+
34
+ /**
35
+ * The number's internal checksum or check digit does not match.
36
+ */
37
+ export class InvalidChecksum extends ValidationError {
38
+ constructor(msg = "The number number's checksum or check digit is invalid.") {
39
+ super(msg);
40
+ this.name = 'InvalidChecksum';
41
+ }
42
+ }
43
+
44
+ /**
45
+ * The length of the number is wrong
46
+ */
47
+ export class InvalidLength extends ValidationError {
48
+ constructor(msg = 'The number has an invalid length.') {
49
+ super(msg);
50
+ this.name = 'InvalidLength';
51
+ }
52
+ }
53
+
54
+ /**
55
+ * One of the parts of the number has an invalid reference.
56
+ *
57
+ * Some part of the number refers to some external entity like a country
58
+ * code, a date or a predefined collection of values. The number contains
59
+ * some invalid reference.
60
+ */
61
+ export class InvalidComponent extends ValidationError {
62
+ constructor(msg = 'One of the parts of the number are invalid or unknown.') {
63
+ super(msg);
64
+ this.name = 'InvalidComponent';
65
+ }
66
+ }
@@ -0,0 +1,28 @@
1
+ import { validate, format } from './alv';
2
+ import { InvalidLength, InvalidChecksum } from '../exceptions';
3
+
4
+ describe('fi/alv', () => {
5
+ it('format:FI 20774740', () => {
6
+ const result = format('FI 20774740');
7
+
8
+ expect(result).toEqual('20774740');
9
+ });
10
+
11
+ it('validate:FI 20774740', () => {
12
+ const result = validate('FI 20774740');
13
+
14
+ expect(result.isValid && result.compact).toEqual('20774740');
15
+ });
16
+
17
+ it('validate:123458', () => {
18
+ const result = validate('123458');
19
+
20
+ expect(result.error).toBeInstanceOf(InvalidLength);
21
+ });
22
+
23
+ it('validate:20774741', () => {
24
+ const result = validate('20774741');
25
+
26
+ expect(result.error).toBeInstanceOf(InvalidChecksum);
27
+ });
28
+ });
package/src/fi/alv.ts ADDED
@@ -0,0 +1,76 @@
1
+ /**
2
+ * ALV nro (Arvonlisäveronumero, Finnish VAT number).
3
+ *
4
+ * The number is an 8-digit code with a weighted checksum.
5
+ *
6
+ * ENTITY
7
+ */
8
+
9
+ import * as exceptions from '../exceptions';
10
+ import { strings } from '../util';
11
+ import { Validator, ValidateReturn } from '../types';
12
+ import { weightedSum } from '../util/checksum';
13
+
14
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
15
+ const [value, err] = strings.cleanUnicode(input, ' ');
16
+ if (err !== null) {
17
+ return [value, err];
18
+ }
19
+ if (value.startsWith('FI')) {
20
+ return [value.substr(2), null];
21
+ }
22
+ return [value, null];
23
+ }
24
+
25
+ const impl: Validator = {
26
+ name: 'Finnish VAT Number',
27
+ localName: 'Arvonlisäveronumero Mervärdesskattenummer',
28
+ abbreviation: 'ALV nro',
29
+ compact(input: string): string {
30
+ const [value, err] = clean(input);
31
+
32
+ if (err) {
33
+ throw err;
34
+ }
35
+
36
+ return value;
37
+ },
38
+
39
+ format(input: string): string {
40
+ const [value] = clean(input);
41
+
42
+ return value;
43
+ },
44
+
45
+ validate(input: string): ValidateReturn {
46
+ const [value, error] = clean(input);
47
+
48
+ if (error) {
49
+ return { isValid: false, error };
50
+ }
51
+ if (value.length !== 8) {
52
+ return { isValid: false, error: new exceptions.InvalidLength() };
53
+ }
54
+ if (!strings.isdigits(value)) {
55
+ return { isValid: false, error: new exceptions.InvalidFormat() };
56
+ }
57
+
58
+ const sum = weightedSum(value, {
59
+ modulus: 11,
60
+ weights: [7, 9, 10, 5, 8, 4, 2, 1],
61
+ });
62
+ if (sum !== 0) {
63
+ return { isValid: false, error: new exceptions.InvalidChecksum() };
64
+ }
65
+
66
+ return {
67
+ isValid: true,
68
+ compact: value,
69
+ isIndividual: false,
70
+ isCompany: true,
71
+ };
72
+ },
73
+ };
74
+
75
+ export const { name, localName, abbreviation, validate, format, compact } =
76
+ impl;