stdnum 1.10.0 → 1.10.2

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 (496) hide show
  1. package/README.md +1 -0
  2. package/lib/cjs/in/gstin.js +3 -3
  3. package/lib/cjs/no/fodselsnummer.js +2 -2
  4. package/lib/cjs/tw/natid.js +8 -5
  5. package/lib/cjs/tw/ui.js +8 -5
  6. package/lib/esm/in/gstin.js +3 -3
  7. package/lib/esm/no/fodselsnummer.js +2 -2
  8. package/lib/esm/tw/natid.js +8 -5
  9. package/lib/esm/tw/ui.js +8 -5
  10. package/package.json +5 -2
  11. package/src/ad/index.ts +1 -0
  12. package/src/ad/nrt.spec.ts +36 -0
  13. package/src/ad/nrt.ts +87 -0
  14. package/src/al/index.ts +1 -0
  15. package/src/al/nipt.spec.ts +43 -0
  16. package/src/al/nipt.ts +111 -0
  17. package/src/ar/cbu.spec.ts +28 -0
  18. package/src/ar/cbu.ts +96 -0
  19. package/src/ar/cuit.spec.ts +28 -0
  20. package/src/ar/cuit.ts +102 -0
  21. package/src/ar/dni.spec.ts +22 -0
  22. package/src/ar/dni.ts +72 -0
  23. package/src/ar/index.ts +3 -0
  24. package/src/at/businessid.spec.ts +34 -0
  25. package/src/at/businessid.ts +73 -0
  26. package/src/at/index.ts +4 -0
  27. package/src/at/tin.spec.ts +173 -0
  28. package/src/at/tin.ts +140 -0
  29. package/src/at/uid.spec.ts +44 -0
  30. package/src/at/uid.ts +84 -0
  31. package/src/at/vnr.spec.ts +38 -0
  32. package/src/at/vnr.ts +84 -0
  33. package/src/au/abn.spec.ts +28 -0
  34. package/src/au/abn.ts +78 -0
  35. package/src/au/acn.spec.ts +34 -0
  36. package/src/au/acn.ts +76 -0
  37. package/src/au/index.ts +3 -0
  38. package/src/au/tfn.spec.ts +28 -0
  39. package/src/au/tfn.ts +79 -0
  40. package/src/az/index.ts +2 -0
  41. package/src/az/pin.spec.ts +16 -0
  42. package/src/az/pin.ts +61 -0
  43. package/src/az/tin.spec.ts +28 -0
  44. package/src/az/tin.ts +64 -0
  45. package/src/ba/index.ts +1 -0
  46. package/src/ba/jmbg.spec.ts +28 -0
  47. package/src/ba/jmbg.ts +85 -0
  48. package/src/be/bis.spec.ts +184 -0
  49. package/src/be/bis.ts +85 -0
  50. package/src/be/index.ts +4 -0
  51. package/src/be/insz.spec.ts +51 -0
  52. package/src/be/insz.ts +55 -0
  53. package/src/be/nn.spec.ts +117 -0
  54. package/src/be/nn.ts +77 -0
  55. package/src/be/personIdentifierHelpers.spec.ts +254 -0
  56. package/src/be/personIdentifierHelpers.ts +130 -0
  57. package/src/be/vat.spec.ts +46 -0
  58. package/src/be/vat.ts +84 -0
  59. package/src/bg/egn.spec.ts +28 -0
  60. package/src/bg/egn.ts +75 -0
  61. package/src/bg/index.ts +3 -0
  62. package/src/bg/pnf.spec.ts +28 -0
  63. package/src/bg/pnf.ts +73 -0
  64. package/src/bg/vat.spec.ts +34 -0
  65. package/src/bg/vat.ts +120 -0
  66. package/src/br/cnpj.spec.ts +34 -0
  67. package/src/br/cnpj.ts +89 -0
  68. package/src/br/cpf.spec.ts +34 -0
  69. package/src/br/cpf.ts +87 -0
  70. package/src/br/index.ts +2 -0
  71. package/src/by/index.ts +1 -0
  72. package/src/by/unp.spec.ts +34 -0
  73. package/src/by/unp.ts +108 -0
  74. package/src/bz/index.ts +1 -0
  75. package/src/bz/tin.spec.ts +28 -0
  76. package/src/bz/tin.ts +67 -0
  77. package/src/ca/bn.spec.ts +40 -0
  78. package/src/ca/bn.ts +88 -0
  79. package/src/ca/gst.spec.ts +34 -0
  80. package/src/ca/gst.ts +70 -0
  81. package/src/ca/index.ts +5 -0
  82. package/src/ca/pst.spec.ts +28 -0
  83. package/src/ca/pst.ts +71 -0
  84. package/src/ca/qst.spec.ts +47 -0
  85. package/src/ca/qst.ts +88 -0
  86. package/src/ca/sin.spec.ts +34 -0
  87. package/src/ca/sin.ts +72 -0
  88. package/src/ch/index.ts +3 -0
  89. package/src/ch/ssn.spec.ts +50 -0
  90. package/src/ch/ssn.ts +74 -0
  91. package/src/ch/uid.spec.ts +34 -0
  92. package/src/ch/uid.ts +82 -0
  93. package/src/ch/vat.spec.ts +28 -0
  94. package/src/ch/vat.ts +83 -0
  95. package/src/cl/index.ts +2 -0
  96. package/src/cl/run.ts +13 -0
  97. package/src/cl/rut.spec.ts +50 -0
  98. package/src/cl/rut.ts +97 -0
  99. package/src/cn/index.ts +2 -0
  100. package/src/cn/ric.spec.ts +34 -0
  101. package/src/cn/ric.ts +86 -0
  102. package/src/cn/uscc.spec.ts +34 -0
  103. package/src/cn/uscc.ts +110 -0
  104. package/src/co/index.ts +1 -0
  105. package/src/co/nit.spec.ts +40 -0
  106. package/src/co/nit.ts +85 -0
  107. package/src/cr/cpf.spec.ts +34 -0
  108. package/src/cr/cpf.ts +93 -0
  109. package/src/cr/cpj.spec.ts +28 -0
  110. package/src/cr/cpj.ts +111 -0
  111. package/src/cr/cr.spec.ts +28 -0
  112. package/src/cr/cr.ts +75 -0
  113. package/src/cr/index.ts +3 -0
  114. package/src/cu/index.ts +1 -0
  115. package/src/cu/ni.spec.ts +34 -0
  116. package/src/cu/ni.ts +74 -0
  117. package/src/cy/index.ts +1 -0
  118. package/src/cy/vat.spec.ts +28 -0
  119. package/src/cy/vat.ts +98 -0
  120. package/src/cz/dic.spec.ts +28 -0
  121. package/src/cz/dic.ts +127 -0
  122. package/src/cz/index.ts +2 -0
  123. package/src/cz/rc.spec.ts +44 -0
  124. package/src/cz/rc.ts +95 -0
  125. package/src/de/idnr.spec.ts +34 -0
  126. package/src/de/idnr.ts +91 -0
  127. package/src/de/index.ts +6 -0
  128. package/src/de/passport.spec.ts +31 -0
  129. package/src/de/passport.ts +86 -0
  130. package/src/de/pwnr.spec.ts +62 -0
  131. package/src/de/pwnr.ts +190 -0
  132. package/src/de/stnr.spec.ts +85 -0
  133. package/src/de/stnr.ts +193 -0
  134. package/src/de/svnr.spec.ts +56 -0
  135. package/src/de/svnr.ts +158 -0
  136. package/src/de/vat.spec.ts +28 -0
  137. package/src/de/vat.ts +74 -0
  138. package/src/dk/cpr.spec.ts +34 -0
  139. package/src/dk/cpr.ts +129 -0
  140. package/src/dk/cvr.spec.ts +28 -0
  141. package/src/dk/cvr.ts +81 -0
  142. package/src/dk/index.ts +2 -0
  143. package/src/do/cedula.spec.ts +34 -0
  144. package/src/do/cedula.ts +67 -0
  145. package/src/do/index.ts +3 -0
  146. package/src/do/ncf.spec.ts +34 -0
  147. package/src/do/ncf.ts +133 -0
  148. package/src/do/rnc.spec.ts +40 -0
  149. package/src/do/rnc.ts +74 -0
  150. package/src/dz/index.ts +1 -0
  151. package/src/dz/nif.spec.ts +39 -0
  152. package/src/dz/nif.ts +80 -0
  153. package/src/ec/ci.spec.ts +28 -0
  154. package/src/ec/ci.ts +92 -0
  155. package/src/ec/index.ts +2 -0
  156. package/src/ec/ruc.spec.ts +37 -0
  157. package/src/ec/ruc.ts +117 -0
  158. package/src/ee/ik.spec.ts +28 -0
  159. package/src/ee/ik.ts +114 -0
  160. package/src/ee/index.ts +3 -0
  161. package/src/ee/kmkr.spec.ts +28 -0
  162. package/src/ee/kmkr.ts +76 -0
  163. package/src/ee/registrikood.spec.ts +28 -0
  164. package/src/ee/registrikood.ts +80 -0
  165. package/src/eg/index.ts +1 -0
  166. package/src/eg/tn.spec.ts +44 -0
  167. package/src/eg/tn.ts +96 -0
  168. package/src/es/cif.spec.ts +43 -0
  169. package/src/es/cif.ts +84 -0
  170. package/src/es/dni.spec.ts +28 -0
  171. package/src/es/dni.ts +83 -0
  172. package/src/es/index.ts +5 -0
  173. package/src/es/nie.spec.ts +28 -0
  174. package/src/es/nie.ts +79 -0
  175. package/src/es/nif.spec.ts +52 -0
  176. package/src/es/nif.ts +95 -0
  177. package/src/es/nss.spec.ts +28 -0
  178. package/src/es/nss.ts +132 -0
  179. package/src/exceptions.ts +66 -0
  180. package/src/fi/alv.spec.ts +28 -0
  181. package/src/fi/alv.ts +76 -0
  182. package/src/fi/hetu.spec.ts +37 -0
  183. package/src/fi/hetu.ts +108 -0
  184. package/src/fi/index.ts +3 -0
  185. package/src/fi/ytunnus.spec.ts +28 -0
  186. package/src/fi/ytunnus.ts +49 -0
  187. package/src/fo/index.ts +1 -0
  188. package/src/fo/vn.spec.ts +34 -0
  189. package/src/fo/vn.ts +71 -0
  190. package/src/fr/index.ts +5 -0
  191. package/src/fr/nif.spec.ts +34 -0
  192. package/src/fr/nif.ts +82 -0
  193. package/src/fr/nir.spec.ts +36 -0
  194. package/src/fr/nir.ts +98 -0
  195. package/src/fr/siren.spec.ts +28 -0
  196. package/src/fr/siren.ts +68 -0
  197. package/src/fr/siret.spec.ts +38 -0
  198. package/src/fr/siret.ts +79 -0
  199. package/src/fr/tva.spec.ts +40 -0
  200. package/src/fr/tva.ts +125 -0
  201. package/src/gb/index.ts +3 -0
  202. package/src/gb/nino-prefixes.ts +245 -0
  203. package/src/gb/nino.spec.ts +80 -0
  204. package/src/gb/nino.ts +80 -0
  205. package/src/gb/utr.spec.ts +28 -0
  206. package/src/gb/utr.ts +76 -0
  207. package/src/gb/vat.spec.ts +40 -0
  208. package/src/gb/vat.ts +112 -0
  209. package/src/gen/ean.spec.ts +34 -0
  210. package/src/gen/ean.ts +71 -0
  211. package/src/gen/index.ts +1 -0
  212. package/src/gh/index.ts +1 -0
  213. package/src/gh/tin.spec.ts +42 -0
  214. package/src/gh/tin.ts +93 -0
  215. package/src/gn/index.ts +1 -0
  216. package/src/gn/nifp.spec.ts +40 -0
  217. package/src/gn/nifp.ts +72 -0
  218. package/src/gr/amka.spec.ts +28 -0
  219. package/src/gr/amka.ts +76 -0
  220. package/src/gr/index.ts +2 -0
  221. package/src/gr/vat.spec.ts +34 -0
  222. package/src/gr/vat.ts +84 -0
  223. package/src/gt/cui.spec.ts +34 -0
  224. package/src/gt/cui.ts +110 -0
  225. package/src/gt/index.ts +2 -0
  226. package/src/gt/nit.spec.ts +34 -0
  227. package/src/gt/nit.ts +86 -0
  228. package/src/hk/hkid.spec.ts +52 -0
  229. package/src/hk/hkid.ts +90 -0
  230. package/src/hk/index.ts +1 -0
  231. package/src/hr/index.ts +1 -0
  232. package/src/hr/oib.spec.ts +28 -0
  233. package/src/hr/oib.ts +67 -0
  234. package/src/hu/anum.spec.ts +28 -0
  235. package/src/hu/anum.ts +71 -0
  236. package/src/hu/index.ts +1 -0
  237. package/src/id/index.ts +1 -0
  238. package/src/id/npwp.spec.ts +34 -0
  239. package/src/id/npwp.ts +116 -0
  240. package/src/ie/index.ts +2 -0
  241. package/src/ie/pps.spec.ts +58 -0
  242. package/src/ie/pps.ts +81 -0
  243. package/src/ie/vat.spec.ts +40 -0
  244. package/src/ie/vat.ts +99 -0
  245. package/src/il/hp.spec.ts +38 -0
  246. package/src/il/hp.ts +75 -0
  247. package/src/il/idnr.spec.ts +28 -0
  248. package/src/il/idnr.ts +70 -0
  249. package/src/il/index.ts +2 -0
  250. package/src/in/aadhaar.spec.ts +40 -0
  251. package/src/in/aadhaar.ts +85 -0
  252. package/src/in/epic.spec.ts +34 -0
  253. package/src/in/epic.ts +85 -0
  254. package/src/in/gstin.spec.ts +34 -0
  255. package/src/in/gstin.ts +156 -0
  256. package/src/in/index.ts +4 -0
  257. package/src/in/pan.spec.ts +40 -0
  258. package/src/in/pan.ts +93 -0
  259. package/src/index.ts +404 -0
  260. package/src/is/index.ts +2 -0
  261. package/src/is/kennitala.spec.ts +46 -0
  262. package/src/is/kennitala.ts +80 -0
  263. package/src/is/vsk.spec.ts +22 -0
  264. package/src/is/vsk.ts +60 -0
  265. package/src/it/aic.spec.ts +40 -0
  266. package/src/it/aic.ts +97 -0
  267. package/src/it/codicefiscale.spec.ts +28 -0
  268. package/src/it/codicefiscale.ts +167 -0
  269. package/src/it/index.ts +3 -0
  270. package/src/it/iva.spec.ts +28 -0
  271. package/src/it/iva.ts +65 -0
  272. package/src/jp/cn.spec.ts +28 -0
  273. package/src/jp/cn.ts +77 -0
  274. package/src/jp/index.ts +1 -0
  275. package/src/ke/index.ts +1 -0
  276. package/src/ke/pin.spec.ts +34 -0
  277. package/src/ke/pin.ts +77 -0
  278. package/src/kr/brn.spec.ts +28 -0
  279. package/src/kr/brn.ts +91 -0
  280. package/src/kr/index.ts +2 -0
  281. package/src/kr/rrn.spec.ts +34 -0
  282. package/src/kr/rrn.ts +104 -0
  283. package/src/li/index.ts +1 -0
  284. package/src/li/peid.spec.ts +22 -0
  285. package/src/li/peid.ts +71 -0
  286. package/src/lt/asmens.spec.ts +28 -0
  287. package/src/lt/asmens.ts +73 -0
  288. package/src/lt/index.ts +2 -0
  289. package/src/lt/pvm.spec.ts +34 -0
  290. package/src/lt/pvm.ts +75 -0
  291. package/src/lu/index.ts +1 -0
  292. package/src/lu/tva.spec.ts +28 -0
  293. package/src/lu/tva.ts +70 -0
  294. package/src/lv/index.ts +1 -0
  295. package/src/lv/pvn.spec.ts +44 -0
  296. package/src/lv/pvn.ts +102 -0
  297. package/src/ma/ice.spec.ts +39 -0
  298. package/src/ma/ice.ts +72 -0
  299. package/src/ma/ice9.spec.ts +28 -0
  300. package/src/ma/ice9.ts +62 -0
  301. package/src/ma/index.ts +2 -0
  302. package/src/mc/index.ts +1 -0
  303. package/src/mc/tva.spec.ts +28 -0
  304. package/src/mc/tva.ts +67 -0
  305. package/src/md/idno.spec.ts +28 -0
  306. package/src/md/idno.ts +78 -0
  307. package/src/md/index.ts +1 -0
  308. package/src/me/index.ts +2 -0
  309. package/src/me/jmbg.ts +17 -0
  310. package/src/me/pib.spec.ts +158 -0
  311. package/src/me/pib.ts +77 -0
  312. package/src/mk/edb.spec.ts +50 -0
  313. package/src/mk/edb.ts +88 -0
  314. package/src/mk/index.ts +2 -0
  315. package/src/mk/jmbg.ts +17 -0
  316. package/src/mt/index.ts +1 -0
  317. package/src/mt/vat.spec.ts +28 -0
  318. package/src/mt/vat.ts +69 -0
  319. package/src/mu/index.ts +1 -0
  320. package/src/mu/nid.spec.ts +34 -0
  321. package/src/mu/nid.ts +89 -0
  322. package/src/mx/banks.ts +658 -0
  323. package/src/mx/clabe.spec.ts +68 -0
  324. package/src/mx/clabe.ts +105 -0
  325. package/src/mx/curp.spec.ts +28 -0
  326. package/src/mx/curp.ts +261 -0
  327. package/src/mx/index.ts +3 -0
  328. package/src/mx/rfc.spec.ts +69 -0
  329. package/src/mx/rfc.ts +193 -0
  330. package/src/my/index.ts +1 -0
  331. package/src/my/nric.spec.ts +40 -0
  332. package/src/my/nric.ts +91 -0
  333. package/src/nl/bsn.spec.ts +68 -0
  334. package/src/nl/bsn.ts +81 -0
  335. package/src/nl/btw.spec.ts +40 -0
  336. package/src/nl/btw.ts +95 -0
  337. package/src/nl/index.ts +3 -0
  338. package/src/nl/onderwijsnummer.spec.ts +34 -0
  339. package/src/nl/onderwijsnummer.ts +77 -0
  340. package/src/no/fodselsnummer.spec.ts +56 -0
  341. package/src/no/fodselsnummer.ts +118 -0
  342. package/src/no/index.ts +4 -0
  343. package/src/no/kontonr.spec.ts +34 -0
  344. package/src/no/kontonr.ts +84 -0
  345. package/src/no/mva.spec.ts +28 -0
  346. package/src/no/mva.ts +80 -0
  347. package/src/no/orgnr.spec.ts +28 -0
  348. package/src/no/orgnr.ts +75 -0
  349. package/src/nz/bank.spec.ts +28 -0
  350. package/src/nz/bank.ts +238 -0
  351. package/src/nz/index.ts +2 -0
  352. package/src/nz/ird.spec.ts +34 -0
  353. package/src/nz/ird.ts +102 -0
  354. package/src/pe/ce.spec.ts +46 -0
  355. package/src/pe/ce.ts +61 -0
  356. package/src/pe/cui.spec.ts +28 -0
  357. package/src/pe/cui.ts +85 -0
  358. package/src/pe/index.ts +3 -0
  359. package/src/pe/ruc.spec.ts +46 -0
  360. package/src/pe/ruc.ts +84 -0
  361. package/src/pk/cnic.spec.ts +34 -0
  362. package/src/pk/cnic.ts +97 -0
  363. package/src/pk/index.ts +2 -0
  364. package/src/pk/ntn.spec.ts +22 -0
  365. package/src/pk/ntn.ts +65 -0
  366. package/src/pl/index.ts +3 -0
  367. package/src/pl/nip.spec.ts +34 -0
  368. package/src/pl/nip.ts +74 -0
  369. package/src/pl/pesel.spec.ts +34 -0
  370. package/src/pl/pesel.ts +97 -0
  371. package/src/pl/regon.spec.ts +52 -0
  372. package/src/pl/regon.ts +88 -0
  373. package/src/pt/cc.spec.ts +43 -0
  374. package/src/pt/cc.ts +74 -0
  375. package/src/pt/index.ts +3 -0
  376. package/src/pt/nif.spec.ts +28 -0
  377. package/src/pt/nif.ts +78 -0
  378. package/src/pt/nipc.ts +27 -0
  379. package/src/py/cedula.spec.ts +46 -0
  380. package/src/py/cedula.ts +73 -0
  381. package/src/py/index.ts +2 -0
  382. package/src/py/ruc.spec.ts +40 -0
  383. package/src/py/ruc.ts +93 -0
  384. package/src/ro/cif.spec.ts +40 -0
  385. package/src/ro/cif.ts +62 -0
  386. package/src/ro/cnp.spec.ts +50 -0
  387. package/src/ro/cnp.ts +158 -0
  388. package/src/ro/cui.spec.ts +28 -0
  389. package/src/ro/cui.ts +83 -0
  390. package/src/ro/index.ts +4 -0
  391. package/src/ro/onrc.spec.ts +28 -0
  392. package/src/ro/onrc.ts +109 -0
  393. package/src/rs/index.ts +2 -0
  394. package/src/rs/jmbg.ts +16 -0
  395. package/src/rs/pib.spec.ts +28 -0
  396. package/src/rs/pib.ts +69 -0
  397. package/src/ru/index.ts +1 -0
  398. package/src/ru/inn.spec.ts +32 -0
  399. package/src/ru/inn.ts +106 -0
  400. package/src/se/index.ts +3 -0
  401. package/src/se/orgnr.spec.ts +28 -0
  402. package/src/se/orgnr.ts +68 -0
  403. package/src/se/personnummer.spec.ts +45 -0
  404. package/src/se/personnummer.ts +143 -0
  405. package/src/se/vat.spec.ts +28 -0
  406. package/src/se/vat.ts +73 -0
  407. package/src/sg/index.ts +1 -0
  408. package/src/sg/uen.spec.ts +46 -0
  409. package/src/sg/uen.ts +209 -0
  410. package/src/si/ddv.spec.ts +28 -0
  411. package/src/si/ddv.ts +76 -0
  412. package/src/si/emso.spec.ts +15 -0
  413. package/src/si/emso.ts +27 -0
  414. package/src/si/index.ts +3 -0
  415. package/src/si/jmbg.ts +20 -0
  416. package/src/sk/dph.spec.ts +28 -0
  417. package/src/sk/dph.ts +71 -0
  418. package/src/sk/index.ts +2 -0
  419. package/src/sk/rc.ts +12 -0
  420. package/src/sm/coe.spec.ts +34 -0
  421. package/src/sm/coe.ts +80 -0
  422. package/src/sm/index.ts +1 -0
  423. package/src/sv/index.ts +1 -0
  424. package/src/sv/nit.spec.ts +34 -0
  425. package/src/sv/nit.ts +117 -0
  426. package/src/th/idnr.spec.ts +41 -0
  427. package/src/th/idnr.ts +80 -0
  428. package/src/th/index.ts +3 -0
  429. package/src/th/moa.spec.ts +62 -0
  430. package/src/th/moa.ts +85 -0
  431. package/src/th/tin.spec.ts +77 -0
  432. package/src/th/tin.ts +56 -0
  433. package/src/tn/index.ts +1 -0
  434. package/src/tn/mf.spec.ts +37 -0
  435. package/src/tn/mf.ts +169 -0
  436. package/src/tr/index.ts +2 -0
  437. package/src/tr/tckimlik.spec.ts +40 -0
  438. package/src/tr/tckimlik.ts +87 -0
  439. package/src/tr/vkn.spec.ts +28 -0
  440. package/src/tr/vkn.ts +87 -0
  441. package/src/tw/ban.spec.ts +28 -0
  442. package/src/tw/ban.ts +67 -0
  443. package/src/tw/index.ts +5 -0
  444. package/src/tw/natid.spec.ts +41 -0
  445. package/src/tw/natid.ts +109 -0
  446. package/src/tw/tax_code.spec.ts +34 -0
  447. package/src/tw/tax_code.ts +98 -0
  448. package/src/tw/ubn.spec.ts +28 -0
  449. package/src/tw/ubn.ts +80 -0
  450. package/src/tw/ui.spec.ts +49 -0
  451. package/src/tw/ui.ts +111 -0
  452. package/src/types.ts +82 -0
  453. package/src/ua/edrpou.spec.ts +28 -0
  454. package/src/ua/edrpou.ts +88 -0
  455. package/src/ua/index.ts +2 -0
  456. package/src/ua/rntrc.spec.ts +28 -0
  457. package/src/ua/rntrc.ts +77 -0
  458. package/src/us/ein.spec.ts +28 -0
  459. package/src/us/ein.ts +179 -0
  460. package/src/us/index.ts +2 -0
  461. package/src/us/ssn.spec.ts +28 -0
  462. package/src/us/ssn.ts +117 -0
  463. package/src/util/checksum.spec.ts +70 -0
  464. package/src/util/checksum.ts +258 -0
  465. package/src/util/index.ts +13 -0
  466. package/src/util/isValidDate.spec.ts +49 -0
  467. package/src/util/isValidDate.ts +87 -0
  468. package/src/util/iso7064.spec.ts +17 -0
  469. package/src/util/iso7064.ts +8 -0
  470. package/src/util/pymod.ts +8 -0
  471. package/src/util/strings/char.ts +18 -0
  472. package/src/util/strings/clean.spec.ts +15 -0
  473. package/src/util/strings/clean.ts +305 -0
  474. package/src/util/strings/format.ts +18 -0
  475. package/src/util/strings/index.ts +5 -0
  476. package/src/util/strings/reverseString.ts +3 -0
  477. package/src/util/strings/splitAt.spec.ts +15 -0
  478. package/src/util/strings/splitAt.ts +16 -0
  479. package/src/uy/cedula.spec.ts +28 -0
  480. package/src/uy/cedula.ts +74 -0
  481. package/src/uy/index.ts +3 -0
  482. package/src/uy/nie.spec.ts +28 -0
  483. package/src/uy/nie.ts +84 -0
  484. package/src/uy/rut.spec.ts +34 -0
  485. package/src/uy/rut.ts +99 -0
  486. package/src/ve/index.ts +1 -0
  487. package/src/ve/rif.spec.ts +38 -0
  488. package/src/ve/rif.ts +92 -0
  489. package/src/vn/index.ts +1 -0
  490. package/src/vn/mst.spec.ts +40 -0
  491. package/src/vn/mst.ts +100 -0
  492. package/src/za/idnr.spec.ts +28 -0
  493. package/src/za/idnr.ts +84 -0
  494. package/src/za/index.ts +2 -0
  495. package/src/za/tin.spec.ts +28 -0
  496. package/src/za/tin.ts +75 -0
@@ -0,0 +1,305 @@
1
+ // import PREFIXES from 'gb/nino-prefixes';
2
+ import * as exceptions from '../../exceptions';
3
+
4
+ // Map visually similar unicode values to ASCII
5
+ // - solves the cut-n-paste from PDF/Word
6
+ const mapped: Record<string, string> = {
7
+ '-': '-', // HYPHEN-MINUS
8
+ '\u{00AD}': '-', // SOFT HYPHEN
9
+ '\u{00AF}': '-', // MACRON
10
+ '\u{02D7}': '-', // MODIFIER LETTER MINUS SIGN
11
+ '\u{058A}': '-', // ARMENIAN HYPHEN
12
+ '\u{05BE}': '-', // HEBREW PUNCTUATION MAQAF
13
+ '\u{180A}': '-', // MONGOLIAN NIRUGU
14
+ '\u{2010}': '-', // HYPHEN
15
+ '\u{2011}': '-', // NON-BREAKING HYPHEN
16
+ '\u{2012}': '-', // FIGURE DASH
17
+ '\u{2013}': '-', // EN DASH
18
+ '\u{2014}': '-', // EM DASH
19
+ '\u{2015}': '-', // HORIZONTAL BAR
20
+ '\u{203E}': '-', // OVERLINE
21
+ '\u{2043}': '-', // HYPHEN BULLET
22
+ '\u{207B}': '-', // SUPERSCRIPT MINUS
23
+ '\u{208B}': '-', // SUBSCRIPT MINUS
24
+ '\u{2212}': '-', // MINUS SIGN
25
+ '\u{23AF}': '-', // HORIZONTAL LINE EXTENSION
26
+ '\u{23BA}': '-', // HORIZONTAL SCAN LINE-1
27
+ '\u{23BB}': '-', // HORIZONTAL SCAN LINE-3
28
+ '\u{23BC}': '-', // HORIZONTAL SCAN LINE-7
29
+ '\u{23BD}': '-', // HORIZONTAL SCAN LINE-9
30
+ '\u{23E4}': '-', // STRAIGHTNESS
31
+ '\u{FF0D}': '-', // FULLWIDTH HYPHEN-MINUS
32
+ '\u{FE63}': '-', // SMALL HYPHEN-MINUS
33
+ '\u{FFE3}': '-', // FULLWIDTH MACRON
34
+
35
+ '*': '*',
36
+ '\u{066D}': '*', // ARABIC FIVE POINTED STAR
37
+ '\u{070D}': '*', // SYRIAC HARKLEAN ASTERISCUS
38
+ '\u{2055}': '*', // FLOWER PUNCTUATION MARK
39
+ '\u{A60E}': '*', // VAI FULL STOP
40
+ '\u{2217}': '*', // ASTERISK OPERATOR
41
+ '\u{22C6}': '*', // STAR OPERATOR
42
+ '\u{204E}': '*', // LOW ASTERISK
43
+ '\u{2731}': '*', // HEAVY ASTERISK
44
+ '\u{2732}': '*', // OPEN CENTRE ASTERISK
45
+ '\u{2733}': '*', // EIGHT SPOKED ASTERISK
46
+ '\u{273A}': '*', // SIXTEEN POINTED ASTERISK
47
+ '\u{273B}': '*', // TEARDROP-SPOKED ASTERISK
48
+ '\u{273C}': '*', // OPEN CENTRE TEARDROP-SPOKED ASTERISK
49
+ '\u{273D}': '*', // HEAVY TEARDROP-SPOKED ASTERISK
50
+ '\u{2743}': '*', // HEAVY TEARDROP-PINWHEEL ASTERISK
51
+ '\u{2749}': '*', // BALLON-SPOKED ASTERISK
52
+ '\u{274A}': '*', // EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
53
+ '\u{274B}': '*', // HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
54
+ '\u{FE61}': '*', // SMALL ASTERISK
55
+ '\u{FF0A}': '*', // FULLWIDTH ASTERISK
56
+
57
+ ',': ',',
58
+ '\u{00B8}': ',', // CEDILLA
59
+ '\u{060C}': ',', // ARABIC COMMA
60
+ '\u{066B}': ',', // ARABIC DECIMAL SEPARATOR
61
+ '\u{066C}': ',', // ARABIC THOUSANDS SEPARATOR
62
+ '\u{201A}': ',', // SINGLE LOW-9 QUOTATION MARK
63
+ '\u{2032}': ',', // PRIME
64
+ '\u{2E34}': ',', // RAISED COMMA
65
+ '\u{3001}': ',', // IDEOGRAPHIC COMMA
66
+ '\u{FF0C}': ',', // FULLWIDTH COMMA
67
+ '\u{FE11}': ',', // PRESENTATION FORM FOR VERTICAL COMMA
68
+ '\u{FE50}': ',', // SMALL COMMA
69
+ '\u{FE51}': ',', // SMALL IDEOGRAPHIC COMMA
70
+ '\u{FF64}': ',', // HALFWIDTH IDEOGRAPHIC COMMA
71
+
72
+ '.': '.', // FULL STOP
73
+ '\u{00B7}': '.', // MIDDLE DOT
74
+ '\u{02D9}': '.', // DOT ABOVE
75
+ '\u{0387}': '.', // GREEK ANO TELEIA
76
+ '\u{06D4}': '.', // ARABIC FULL STOP
77
+ '\u{0701}': '.', // SYRIAC SUPRALINEAR FULL STOP
78
+ '\u{0702}': '.', // SYRIAC SUBLINEAR FULL STOP
79
+ '\u{0830}': '.', // SAMARITAN PUNCTUATION NEQUDAA
80
+ '\u{0F0B}': '.', // TIBETAN MARK INTERSYLLABIC TSHEG
81
+ '\u{0F0C}': '.', // TIBETAN MARK DELIMITER TSHEG BSTAR
82
+ // prettier-ignore
83
+ "\u{1427}": ".", // CANADIAN SYLLABICS FINAL MIDDLE DOT
84
+ '\u{16EB}': '.', // RUNIC SINGLE PUNCTUATION
85
+ '\u{2219}': '.', // BULLET OPERATOR
86
+ '\u{2022}': '.', // BULLET
87
+ '\u{2024}': '.', // ONE DOT LEADER
88
+ '\u{2027}': '.', // HYPHENATION POINT
89
+ '\u{22C5}': '.', // DOT OPERATOR
90
+ '\u{2E31}': '.', // WORD SEPARATOR MIDDLE DOT
91
+ '\u{2E33}': '.', // RAISED DOT
92
+ '\u{3002}': '.', // IDEOGRAPHIC FULL STOP
93
+ '\u{30FB}': '.', // KATAKANA MIDDLE DOT
94
+ '\u{FE52}': '.', // SMALL FULL STOP
95
+ '\u{FF0E}': '.', // FULLWIDTH FULL STOP
96
+ '\u{FF65}': '.', // HALFWIDTH KATAKANA MIDDLE DOT
97
+ '\u{FBB2}': '.', // ARABIC SYMBOL DOT ABOVE
98
+ '\u{FBB3}': '.', // ARABIC SYMBOL DOT BELOW
99
+ '\u{10101}': '.', // AEGEAN WORD SEPARATOR DOT
100
+ '\u{1091F}': '.', // PHOENICIAN WORD SEPARATOR
101
+ '\u{10A50}': '.', // KHAROSHTHI PUNCTUATION DOT
102
+
103
+ '/': '/',
104
+ '\u{2044}': '/', // FRACTION SLASH
105
+ '\u{2215}': '/', // DIVISION SLASH
106
+ '\u{29F8}': '/', // BIG SOLIDUS
107
+ '\u{FF0F}': '/', // FULLWIDTH SOLIDUS
108
+ '\u{083C}': '/', // SAMARITAN PUNCTUATION ARKAANU
109
+ '\u{27CB}': '/', // MATHEMATICAL RISING DIAGONAL
110
+
111
+ ':': ':',
112
+ '\u{1361}': ':', // ETHIOPIC WORDSPACE
113
+ '\u{16EC}': ':', // RUNIC MULTIPLE PUNCTUATION
114
+ '\u{1804}': ':', // MONGOLIAN COLON
115
+ '\u{FE13}': ':', // PRESENTATION FORM FOR VERTICAL COLON
116
+ '\u{FE30}': ':', // PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
117
+ '\u{FF1A}': ':', // FULLWIDTH COLON
118
+ '\u{FE55}': ':', // SMALL COLON
119
+
120
+ ' ': ' ',
121
+ '\u{0009}': ' ', // TAB
122
+ '\u{000B}': ' ', // VERTICAL TAB
123
+ '\u{000C}': ' ', // FORM FEED
124
+ '\u{00A0}': ' ', // NO-BREAK-SPACE
125
+ '\u{1680}': ' ', // Ogham Space Mark
126
+ '\u{2000}': ' ', // EN QUAD
127
+ '\u{2001}': ' ', // EM QUAD
128
+ '\u{2002}': ' ', // EN SPACE
129
+ '\u{2003}': ' ', // EM SPACE
130
+ '\u{2004}': ' ', // THREE-PER-EM SPACE
131
+ '\u{2005}': ' ', // FOUR-PER-EM SPACE
132
+ '\u{2006}': ' ', // SIX-PER-EM SPACE
133
+ '\u{2007}': ' ', // FIGURE SPACE
134
+ '\u{2008}': ' ', // PUNCTUATION SPACE
135
+ '\u{2009}': ' ', // THIN SPACE
136
+ '\u{200A}': ' ', // HAIR SPACE
137
+ '\u{2028}': ' ', // LINE SEPARATOR
138
+ '\u{2029}': ' ', // PARAGRAPH SEPARATOR
139
+ '\u{202F}': ' ', // NARROW NO-BREAK SPACE
140
+ '\u{205F}': ' ', // MEDIUM MATHEMATICAL SPACE
141
+ '\u{3000}': ' ', // IDEOGRAPHIC SPACE
142
+
143
+ "'": "'",
144
+ '\u{0060}': "'", // GRAVE ACCENT
145
+ '\u{00B4}': "'", // ACUTE ACCENT
146
+ // prettier-ignore
147
+ "\u{02BE}": "'", // MODIFIER LETTER RIGHT HALF RING
148
+ // prettier-ignore
149
+ "\u{02BF}": "'", // MODIFIER LETTER LEFT HALF RING
150
+ // prettier-ignore
151
+ "\u{02B9}": "'", // MODIFIER LETTER PRIME
152
+ // prettier-ignore
153
+ "\u{02BB}": "'", // MODIFIER LETTER TURNED COMMA
154
+ // prettier-ignore
155
+ "\u{02BC}": "'", // MODIFIER LETTER APOSTROPHE
156
+ // prettier-ignore
157
+ "\u{02C8}": "'", // MODIFIER LETTER VERTICAL LINE
158
+ // prettier-ignore
159
+ "\u{0300}":"'", // COMBINING GRAVE ACCENT
160
+ '\u{0301}': "'", // COMBINING ACUTE ACCENT
161
+ '\u{0312}': "'", // COMBINING TURNED COMMA ABOVE
162
+ '\u{0313}': "'", // COMBINING COMMA ABOVE
163
+ '\u{055A}': "'", // ARMENIAN APOSTROPHE
164
+ '\u{201B}': "'", // SINGLE HIGH-REVERSED-9 QUOTATION MARK
165
+ '\u{2018}': "'", // LEFT SINGLE QUOTATION MARK
166
+ '\u{2019}': "'", // RIGHT SINGLE QUOTATION MARK
167
+
168
+ '0': '0',
169
+ '\u{0660}': '0', // ARABIC-INDIC DIGIT ZERO
170
+ '\u{06F0}': '0', // EASTERN-ARABIC DIGIT ZERO
171
+ '\u{FF10}': '0', // FULLWIDTH DIGIT ZERO
172
+ '\u{1D7CE}': '0', // MATHEMATICAL BOLD DIGIT ZERO
173
+ '\u{1D7D8}': '0', // MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO
174
+ '\u{1D7E2}': '0', // MATHEMATICAL SANS-SERIF DIGIT ZERO
175
+ '\u{1D7EC}': '0', // MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO
176
+ '\u{1D7F6}': '0', // MATHEMATICAL MONOSPACE DIGIT ZERO
177
+
178
+ '1': '1',
179
+ '\u{0661}': '1', // ARABIC-INDIC DIGIT ONE
180
+ '\u{06F1}': '1', // EASTERN-ARABIC DIGIT ONE
181
+ '\u{FF11}': '1', // FULLWIDTH DIGIT ONE
182
+ '\u{1D7CF}': '1', // MATHEMATICAL BOLD DIGIT ONE
183
+ '\u{1D7D9}': '1', // MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
184
+ '\u{1D7E3}': '1', // MATHEMATICAL SANS-SERIF DIGIT ONE
185
+ '\u{1D7ED}': '1', // MATHEMATICAL SANS-SERIF BOLD DIGIT ONE
186
+ '\u{1D7F7}': '1', // MATHEMATICAL MONOSPACE DIGIT ONE
187
+
188
+ '2': '2',
189
+ '\u{06F2}': '2', // EASTERN-ARABIC DIGIT TWO
190
+ '\u{0662}': '2', // ARABIC-INDIC DIGIT TWO
191
+ '\u{FF12}': '2', // FULLWIDTH DIGIT TWO
192
+ '\u{1D7D0}': '2', // MATHEMATICAL BOLD DIGIT TWO
193
+ '\u{1D7DA}': '2', // MATHEMATICAL DOUBLE-STRUCK DIGIT TWO
194
+ '\u{1D7E4}': '2', // MATHEMATICAL SANS-SERIF DIGIT TWO
195
+ '\u{1D7EE}': '2', // MATHEMATICAL SANS-SERIF BOLD DIGIT TWO
196
+ '\u{1D7F8}': '2', // MATHEMATICAL MONOSPACE DIGIT TWO
197
+
198
+ '3': '3',
199
+ '\u{06F3}': '3', // EASTERN-ARABIC DIGIT THREE
200
+ '\u{0663}': '3', // ARABIC-INDIC DIGIT THREE
201
+ '\u{FF13}': '3', // FULLWIDTH DIGIT THREE
202
+ '\u{1D7D1}': '3', // MATHEMATICAL BOLD DIGIT THREE
203
+ '\u{1D7DB}': '3', // MATHEMATICAL DOUBLE-STRUCK DIGIT THREE
204
+ '\u{1D7E5}': '3', // MATHEMATICAL SANS-SERIF DIGIT THREE
205
+ '\u{1D7EF}': '3', // MATHEMATICAL SANS-SERIF BOLD DIGIT THREE
206
+ '\u{1D7F9}': '3', // MATHEMATICAL MONOSPACE DIGIT THREE
207
+
208
+ '4': '4',
209
+ '\u{06F4}': '4', // EASTERN-ARABIC DIGIT FOUR
210
+ '\u{0664}': '4', // ARABIC-INDIC DIGIT FOUR
211
+ '\u{FF14}': '4', // FULLWIDTH DIGIT FOUR
212
+ '\u{1D7D2}': '4', // MATHEMATICAL BOLD DIGIT FOUR
213
+ '\u{1D7DC}': '4', // MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR
214
+ '\u{1D7E6}': '4', // MATHEMATICAL SANS-SERIF DIGIT FOUR
215
+ '\u{1D7F0}': '4', // MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR
216
+ '\u{1D7FA}': '4', // MATHEMATICAL MONOSPACE DIGIT FOUR
217
+
218
+ '5': '5',
219
+ '\u{06F5}': '5', // EASTERN-ARABIC DIGIT FIVE
220
+ '\u{0665}': '5', // ARABIC-INDIC DIGIT FIVE
221
+ '\u{FF15}': '5', // FULLWIDTH DIGIT FIVE
222
+ '\u{1D7D3}': '5', // MATHEMATICAL BOLD DIGIT FIVE
223
+ '\u{1D7DD}': '5', // MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE
224
+ '\u{1D7E7}': '5', // MATHEMATICAL SANS-SERIF DIGIT FIVE
225
+ '\u{1D7F1}': '5', // MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE
226
+ '\u{1D7FB}': '5', // MATHEMATICAL MONOSPACE DIGIT FIVE
227
+
228
+ '6': '6',
229
+ '\u{06F6}': '6', // EASTERN-ARABIC DIGIT SIX
230
+ '\u{0666}': '6', // ARABIC-INDIC DIGIT SIX
231
+ '\u{FF16}': '6', // FULLWIDTH DIGIT SIX
232
+ '\u{1D7D4}': '6', // MATHEMATICAL BOLD DIGIT SIX
233
+ '\u{1D7DE}': '6', // MATHEMATICAL DOUBLE-STRUCK DIGIT SIX
234
+ '\u{1D7E8}': '6', // MATHEMATICAL SANS-SERIF DIGIT SIX
235
+ '\u{1D7F2}': '6', // MATHEMATICAL SANS-SERIF BOLD DIGIT SIX
236
+ '\u{1D7FC}': '6', // MATHEMATICAL MONOSPACE DIGIT SIX
237
+
238
+ '7': '7',
239
+ '\u{06F7}': '7', // EASTERN-ARABIC DIGIT SEVEN
240
+ '\u{0667}': '7', // ARABIC-INDIC DIGIT SEVEN
241
+ '\u{FF17}': '7', // FULLWIDTH DIGIT SEVEN
242
+ '\u{1D7D5}': '7', // MATHEMATICAL BOLD DIGIT SEVEN
243
+ '\u{1D7DF}': '7', // MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN
244
+ '\u{1D7E9}': '7', // MATHEMATICAL SANS-SERIF DIGIT SEVEN
245
+ '\u{1D7F3}': '7', // MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN
246
+ '\u{1D7FD}': '7', // MATHEMATICAL MONOSPACE DIGIT SEVEN
247
+
248
+ '8': '8',
249
+ '\u{06F8}': '8', // EASTERN-ARABIC DIGIT EIGHT
250
+ '\u{0668}': '8', // ARABIC-INDIC DIGIT EIGHT
251
+ '\u{FF18}': '8', // FULLWIDTH DIGIT EIGHT
252
+ '\u{1D7D6}': '8', // MATHEMATICAL BOLD DIGIT EIGHT
253
+ '\u{1D7E0}': '8', // MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT
254
+ '\u{1D7EA}': '8', // MATHEMATICAL SANS-SERIF DIGIT EIGHT
255
+ '\u{1D7F4}': '8', // MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT
256
+ '\u{1D7FE}': '8', // MATHEMATICAL MONOSPACE DIGIT EIGHT
257
+
258
+ // 9
259
+ '9': '9',
260
+ '\u{06F9}': '9', // EASTERN-ARABIC DIGIT NINE
261
+ '\u{0669}': '9', // ARABIC-INDIC DIGIT NINE
262
+ '\u{FF19}': '9', // FULLWIDTH DIGIT NINE
263
+ '\u{1D7D7}': '9', // MATHEMATICAL BOLD DIGIT NINE
264
+ '\u{1D7E1}': '9', // MATHEMATICAL DOUBLE-STRUCK DIGIT NINE
265
+ '\u{1D7EB}': '9', // MATHEMATICAL SANS-SERIF DIGIT NINE
266
+ '\u{1D7F5}': '9', // MATHEMATICAL SANS-SERIF BOLD DIGIT NINE
267
+ '\u{1D7FF}': '9', // MATHEMATICAL MONOSPACE DIGIT NINE
268
+ };
269
+
270
+ /**
271
+ * Clean up visually similar unicode values, by default
272
+ * trim whitespace
273
+ */
274
+ export function cleanUnicode(
275
+ value: string,
276
+ deletechars = ' ',
277
+ stripPrefix?: string | string[],
278
+ ): [string, exceptions.InvalidFormat | null] {
279
+ if (typeof value !== 'string') {
280
+ return ['', new exceptions.InvalidFormat()];
281
+ }
282
+
283
+ // Don't use value.split("") -- doesn't work for "high" unicode
284
+ const cleaned = [...value]
285
+ .map(c => mapped[c] ?? c)
286
+ .filter(c => !deletechars.includes(c))
287
+ .join('')
288
+ .toLocaleUpperCase();
289
+
290
+ if (stripPrefix && stripPrefix.length !== 0) {
291
+ let prefix;
292
+
293
+ if (Array.isArray(stripPrefix)) {
294
+ prefix = stripPrefix.find(p => cleaned.startsWith(p));
295
+ } else if (cleaned.startsWith(stripPrefix)) {
296
+ prefix = stripPrefix;
297
+ }
298
+
299
+ if (prefix !== undefined) {
300
+ return [cleaned.substring(prefix.length), null];
301
+ }
302
+ }
303
+
304
+ return [cleaned, null];
305
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Format in a standard format, substitue '?' for the input characters in order
3
+ * eg.
4
+ * "???-??-????", "99922333" => "999-22-3333"
5
+ */
6
+ export function formatPattern(pattern: string, input: string): string {
7
+ const values = input.split('');
8
+
9
+ return pattern
10
+ .split('')
11
+ .map(c => {
12
+ if (c === '?') {
13
+ return values.shift();
14
+ }
15
+ return c;
16
+ })
17
+ .join('');
18
+ }
@@ -0,0 +1,5 @@
1
+ export { isalpha, isalphanumeric, isdigits } from './char';
2
+ export { cleanUnicode } from './clean';
3
+ export { reverse } from './reverseString';
4
+ export { splitAt } from './splitAt';
5
+ export { formatPattern } from './format';
@@ -0,0 +1,3 @@
1
+ export function reverse(str: string): string {
2
+ return str.split('').reverse().join('');
3
+ }
@@ -0,0 +1,15 @@
1
+ import { splitAt } from './splitAt';
2
+
3
+ describe('splitAt', () => {
4
+ it('basic', () => {
5
+ expect(splitAt('abcdefghij', 3, 6)).toEqual(['abc', 'def', 'ghij']);
6
+ });
7
+
8
+ it('negative', () => {
9
+ expect(splitAt('abcdefghij', -6, -3)).toEqual(['abcd', 'efg', 'hij']);
10
+ });
11
+
12
+ it('short', () => {
13
+ expect(splitAt('abc', 3)).toEqual(['abc']);
14
+ });
15
+ });
@@ -0,0 +1,16 @@
1
+ /**
2
+ * split a string at the given indexes
3
+ *
4
+ * e.g. splitAt('abcdefghijklmnop', 3, 6, 9) => ['abc', 'def', 'ghijklmonop']
5
+ */
6
+ export function splitAt(value: string, ...points: number[]): string[] {
7
+ const parts = [0, ...points].map((p, idx) => {
8
+ const nvalue = idx >= points.length ? value.length : points[idx];
9
+ const np = nvalue < 0 ? value.length + nvalue : nvalue;
10
+ const pp = p < 0 ? value.length + p : p;
11
+
12
+ return value.substr(pp, np - pp);
13
+ });
14
+
15
+ return parts.filter(v => v.length !== 0);
16
+ }
@@ -0,0 +1,28 @@
1
+ import { validate, format } from './cedula';
2
+ import { InvalidLength, InvalidChecksum } from '../exceptions';
3
+
4
+ describe('uy/cedula', () => {
5
+ it('format:11211234', () => {
6
+ const result = format('11211234');
7
+
8
+ expect(result).toEqual('1.121.123-4');
9
+ });
10
+
11
+ it('validate:12345672', () => {
12
+ const result = validate('12345672');
13
+
14
+ expect(result.isValid && result.compact).toEqual('12345672');
15
+ });
16
+
17
+ it('validate:1121123', () => {
18
+ const result = validate('1121123');
19
+
20
+ expect(result.error).toBeInstanceOf(InvalidLength);
21
+ });
22
+
23
+ it('validate:12345673', () => {
24
+ const result = validate('12345673');
25
+
26
+ expect(result.error).toBeInstanceOf(InvalidChecksum);
27
+ });
28
+ });
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Cedula (Uruguayan Identity Card Number).
3
+ *
4
+ * PERSON
5
+ */
6
+
7
+ import * as exceptions from '../exceptions';
8
+ import { strings, weightedSum } from '../util';
9
+ import { Validator, ValidateReturn } from '../types';
10
+
11
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
12
+ return strings.cleanUnicode(input, ' -/');
13
+ }
14
+
15
+ const impl: Validator = {
16
+ name: 'Uruguayan Identity Card Number',
17
+ localName: 'Cédula de Identidad',
18
+ abbreviation: 'CI',
19
+ compact(input: string): string {
20
+ const [value, err] = clean(input);
21
+
22
+ if (err) {
23
+ throw err;
24
+ }
25
+
26
+ return value;
27
+ },
28
+
29
+ // 9dddddddd
30
+ // 123456789
31
+
32
+ format(input: string): string {
33
+ const [value] = clean(input);
34
+
35
+ const [a, b, c, d] = strings.splitAt(value, 1, 4, 7);
36
+
37
+ return `${a}.${b}.${c}-${d}`;
38
+ },
39
+
40
+ validate(input: string): ValidateReturn {
41
+ const [value, error] = clean(input);
42
+
43
+ if (error) {
44
+ return { isValid: false, error };
45
+ }
46
+ if (value.length !== 8) {
47
+ return { isValid: false, error: new exceptions.InvalidLength() };
48
+ }
49
+ if (!strings.isdigits(value)) {
50
+ return { isValid: false, error: new exceptions.InvalidFormat() };
51
+ }
52
+
53
+ const [front, check] = strings.splitAt(value, 7);
54
+
55
+ const sum = weightedSum(front, {
56
+ weights: [2, 9, 8, 7, 6, 3, 4],
57
+ modulus: 10,
58
+ });
59
+
60
+ if (check !== String((10 - sum) % 10)) {
61
+ return { isValid: false, error: new exceptions.InvalidChecksum() };
62
+ }
63
+
64
+ return {
65
+ isValid: true,
66
+ compact: value,
67
+ isIndividual: true,
68
+ isCompany: false,
69
+ };
70
+ },
71
+ };
72
+
73
+ export const { name, localName, abbreviation, validate, format, compact } =
74
+ impl;
@@ -0,0 +1,3 @@
1
+ export * as nie from './nie';
2
+ export * as cedula from './cedula';
3
+ export * as rut from './rut';
@@ -0,0 +1,28 @@
1
+ import { validate, format } from './nie';
2
+ import { InvalidLength, InvalidChecksum } from '../exceptions';
3
+
4
+ describe('uy/nie', () => {
5
+ it('format:911211234', () => {
6
+ const result = format('911211234');
7
+
8
+ expect(result).toEqual('91.121.123-4');
9
+ });
10
+
11
+ it('validate:912345670', () => {
12
+ const result = validate('912345670');
13
+
14
+ expect(result.isValid && result.compact).toEqual('912345670');
15
+ });
16
+
17
+ it('validate:1121123', () => {
18
+ const result = validate('1121123');
19
+
20
+ expect(result.error).toBeInstanceOf(InvalidLength);
21
+ });
22
+
23
+ it('validate:912345673', () => {
24
+ const result = validate('912345673');
25
+
26
+ expect(result.error).toBeInstanceOf(InvalidChecksum);
27
+ });
28
+ });
package/src/uy/nie.ts ADDED
@@ -0,0 +1,84 @@
1
+ /**
2
+ * NIE (Uruguay Foreigners Identification Number Número de Identidad de Extranjero).
3
+ *
4
+ * This number is formed by 9 digits, with the following definition:
5
+ * - 9NNNNNNN: is formed by eight digits containing a unique number.
6
+ * - D: is formed by one digit containing the verification digit for the full number.
7
+ *
8
+ * NOTE: Unable to find a checksum algorithm, assuming it's the same as Cedula
9
+ *
10
+ * Source
11
+ * https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Uruguay-TIN.pdf
12
+ *
13
+ * PERSON
14
+ */
15
+
16
+ import * as exceptions from '../exceptions';
17
+ import { strings, weightedSum } from '../util';
18
+ import { Validator, ValidateReturn } from '../types';
19
+
20
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
21
+ return strings.cleanUnicode(input, ' -');
22
+ }
23
+
24
+ const impl: Validator = {
25
+ name: 'Uruguayan Foreigners Identification Number',
26
+ localName: 'Número de Identidad de Extranjero',
27
+ abbreviation: 'NIE',
28
+ compact(input: string): string {
29
+ const [value, err] = clean(input);
30
+
31
+ if (err) {
32
+ throw err;
33
+ }
34
+
35
+ return value;
36
+ },
37
+
38
+ format(input: string): string {
39
+ const [value] = clean(input);
40
+
41
+ const [a, b, c, d] = strings.splitAt(value, 2, 5, 8);
42
+
43
+ return `${a}.${b}.${c}-${d}`;
44
+ },
45
+
46
+ validate(input: string): ValidateReturn {
47
+ const [value, error] = clean(input);
48
+
49
+ if (error) {
50
+ return { isValid: false, error };
51
+ }
52
+ if (value.length !== 9) {
53
+ return { isValid: false, error: new exceptions.InvalidLength() };
54
+ }
55
+ if (!strings.isdigits(value)) {
56
+ return { isValid: false, error: new exceptions.InvalidFormat() };
57
+ }
58
+
59
+ const [front, check] = strings.splitAt(value, 8);
60
+
61
+ const digit = String(
62
+ (11 -
63
+ weightedSum(front, {
64
+ weights: [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2],
65
+ modulus: 11,
66
+ })) %
67
+ 10,
68
+ );
69
+
70
+ if (check !== digit) {
71
+ return { isValid: false, error: new exceptions.InvalidChecksum() };
72
+ }
73
+
74
+ return {
75
+ isValid: true,
76
+ compact: value,
77
+ isIndividual: true,
78
+ isCompany: false,
79
+ };
80
+ },
81
+ };
82
+
83
+ export const { name, localName, abbreviation, validate, format, compact } =
84
+ impl;
@@ -0,0 +1,34 @@
1
+ import { validate, format } from './rut';
2
+ import { InvalidLength, InvalidChecksum } from '../exceptions';
3
+
4
+ describe('uy/rut', () => {
5
+ it('format:211003420017', () => {
6
+ const result = format('211003420017');
7
+
8
+ expect(result).toEqual('21-100342-001-7');
9
+ });
10
+
11
+ it('validate:21-100342-001-7', () => {
12
+ const result = validate('21-100342-001-7');
13
+
14
+ expect(result.isValid && result.compact).toEqual('211003420017');
15
+ });
16
+
17
+ it('validate:UY 21 140634 001 1', () => {
18
+ const result = validate('UY 21 140634 001 1');
19
+
20
+ expect(result.isValid && result.compact).toEqual('211406340011');
21
+ });
22
+
23
+ it('validate:12345678', () => {
24
+ const result = validate('12345678');
25
+
26
+ expect(result.error).toBeInstanceOf(InvalidLength);
27
+ });
28
+
29
+ it('validate:210303670014', () => {
30
+ const result = validate('210303670014');
31
+
32
+ expect(result.error).toBeInstanceOf(InvalidChecksum);
33
+ });
34
+ });