stdnum 1.10.0 → 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 (489) hide show
  1. package/lib/cjs/no/fodselsnummer.js +2 -2
  2. package/lib/esm/no/fodselsnummer.js +2 -2
  3. package/package.json +5 -2
  4. package/src/ad/index.ts +1 -0
  5. package/src/ad/nrt.spec.ts +36 -0
  6. package/src/ad/nrt.ts +87 -0
  7. package/src/al/index.ts +1 -0
  8. package/src/al/nipt.spec.ts +43 -0
  9. package/src/al/nipt.ts +111 -0
  10. package/src/ar/cbu.spec.ts +28 -0
  11. package/src/ar/cbu.ts +96 -0
  12. package/src/ar/cuit.spec.ts +28 -0
  13. package/src/ar/cuit.ts +102 -0
  14. package/src/ar/dni.spec.ts +22 -0
  15. package/src/ar/dni.ts +72 -0
  16. package/src/ar/index.ts +3 -0
  17. package/src/at/businessid.spec.ts +34 -0
  18. package/src/at/businessid.ts +73 -0
  19. package/src/at/index.ts +4 -0
  20. package/src/at/tin.spec.ts +173 -0
  21. package/src/at/tin.ts +140 -0
  22. package/src/at/uid.spec.ts +44 -0
  23. package/src/at/uid.ts +84 -0
  24. package/src/at/vnr.spec.ts +38 -0
  25. package/src/at/vnr.ts +84 -0
  26. package/src/au/abn.spec.ts +28 -0
  27. package/src/au/abn.ts +78 -0
  28. package/src/au/acn.spec.ts +34 -0
  29. package/src/au/acn.ts +76 -0
  30. package/src/au/index.ts +3 -0
  31. package/src/au/tfn.spec.ts +28 -0
  32. package/src/au/tfn.ts +79 -0
  33. package/src/az/index.ts +2 -0
  34. package/src/az/pin.spec.ts +16 -0
  35. package/src/az/pin.ts +61 -0
  36. package/src/az/tin.spec.ts +28 -0
  37. package/src/az/tin.ts +64 -0
  38. package/src/ba/index.ts +1 -0
  39. package/src/ba/jmbg.spec.ts +28 -0
  40. package/src/ba/jmbg.ts +85 -0
  41. package/src/be/bis.spec.ts +184 -0
  42. package/src/be/bis.ts +85 -0
  43. package/src/be/index.ts +4 -0
  44. package/src/be/insz.spec.ts +51 -0
  45. package/src/be/insz.ts +55 -0
  46. package/src/be/nn.spec.ts +117 -0
  47. package/src/be/nn.ts +77 -0
  48. package/src/be/personIdentifierHelpers.spec.ts +254 -0
  49. package/src/be/personIdentifierHelpers.ts +130 -0
  50. package/src/be/vat.spec.ts +46 -0
  51. package/src/be/vat.ts +84 -0
  52. package/src/bg/egn.spec.ts +28 -0
  53. package/src/bg/egn.ts +75 -0
  54. package/src/bg/index.ts +3 -0
  55. package/src/bg/pnf.spec.ts +28 -0
  56. package/src/bg/pnf.ts +73 -0
  57. package/src/bg/vat.spec.ts +34 -0
  58. package/src/bg/vat.ts +120 -0
  59. package/src/br/cnpj.spec.ts +34 -0
  60. package/src/br/cnpj.ts +89 -0
  61. package/src/br/cpf.spec.ts +34 -0
  62. package/src/br/cpf.ts +87 -0
  63. package/src/br/index.ts +2 -0
  64. package/src/by/index.ts +1 -0
  65. package/src/by/unp.spec.ts +34 -0
  66. package/src/by/unp.ts +108 -0
  67. package/src/bz/index.ts +1 -0
  68. package/src/bz/tin.spec.ts +28 -0
  69. package/src/bz/tin.ts +67 -0
  70. package/src/ca/bn.spec.ts +40 -0
  71. package/src/ca/bn.ts +88 -0
  72. package/src/ca/gst.spec.ts +34 -0
  73. package/src/ca/gst.ts +70 -0
  74. package/src/ca/index.ts +5 -0
  75. package/src/ca/pst.spec.ts +28 -0
  76. package/src/ca/pst.ts +71 -0
  77. package/src/ca/qst.spec.ts +47 -0
  78. package/src/ca/qst.ts +88 -0
  79. package/src/ca/sin.spec.ts +34 -0
  80. package/src/ca/sin.ts +72 -0
  81. package/src/ch/index.ts +3 -0
  82. package/src/ch/ssn.spec.ts +50 -0
  83. package/src/ch/ssn.ts +74 -0
  84. package/src/ch/uid.spec.ts +34 -0
  85. package/src/ch/uid.ts +82 -0
  86. package/src/ch/vat.spec.ts +28 -0
  87. package/src/ch/vat.ts +83 -0
  88. package/src/cl/index.ts +2 -0
  89. package/src/cl/run.ts +13 -0
  90. package/src/cl/rut.spec.ts +50 -0
  91. package/src/cl/rut.ts +97 -0
  92. package/src/cn/index.ts +2 -0
  93. package/src/cn/ric.spec.ts +34 -0
  94. package/src/cn/ric.ts +86 -0
  95. package/src/cn/uscc.spec.ts +34 -0
  96. package/src/cn/uscc.ts +110 -0
  97. package/src/co/index.ts +1 -0
  98. package/src/co/nit.spec.ts +40 -0
  99. package/src/co/nit.ts +85 -0
  100. package/src/cr/cpf.spec.ts +34 -0
  101. package/src/cr/cpf.ts +93 -0
  102. package/src/cr/cpj.spec.ts +28 -0
  103. package/src/cr/cpj.ts +111 -0
  104. package/src/cr/cr.spec.ts +28 -0
  105. package/src/cr/cr.ts +75 -0
  106. package/src/cr/index.ts +3 -0
  107. package/src/cu/index.ts +1 -0
  108. package/src/cu/ni.spec.ts +34 -0
  109. package/src/cu/ni.ts +74 -0
  110. package/src/cy/index.ts +1 -0
  111. package/src/cy/vat.spec.ts +28 -0
  112. package/src/cy/vat.ts +98 -0
  113. package/src/cz/dic.spec.ts +28 -0
  114. package/src/cz/dic.ts +127 -0
  115. package/src/cz/index.ts +2 -0
  116. package/src/cz/rc.spec.ts +44 -0
  117. package/src/cz/rc.ts +95 -0
  118. package/src/de/idnr.spec.ts +34 -0
  119. package/src/de/idnr.ts +91 -0
  120. package/src/de/index.ts +6 -0
  121. package/src/de/passport.spec.ts +31 -0
  122. package/src/de/passport.ts +86 -0
  123. package/src/de/pwnr.spec.ts +62 -0
  124. package/src/de/pwnr.ts +190 -0
  125. package/src/de/stnr.spec.ts +85 -0
  126. package/src/de/stnr.ts +193 -0
  127. package/src/de/svnr.spec.ts +56 -0
  128. package/src/de/svnr.ts +158 -0
  129. package/src/de/vat.spec.ts +28 -0
  130. package/src/de/vat.ts +74 -0
  131. package/src/dk/cpr.spec.ts +34 -0
  132. package/src/dk/cpr.ts +129 -0
  133. package/src/dk/cvr.spec.ts +28 -0
  134. package/src/dk/cvr.ts +81 -0
  135. package/src/dk/index.ts +2 -0
  136. package/src/do/cedula.spec.ts +34 -0
  137. package/src/do/cedula.ts +67 -0
  138. package/src/do/index.ts +3 -0
  139. package/src/do/ncf.spec.ts +34 -0
  140. package/src/do/ncf.ts +133 -0
  141. package/src/do/rnc.spec.ts +40 -0
  142. package/src/do/rnc.ts +74 -0
  143. package/src/dz/index.ts +1 -0
  144. package/src/dz/nif.spec.ts +39 -0
  145. package/src/dz/nif.ts +80 -0
  146. package/src/ec/ci.spec.ts +28 -0
  147. package/src/ec/ci.ts +92 -0
  148. package/src/ec/index.ts +2 -0
  149. package/src/ec/ruc.spec.ts +37 -0
  150. package/src/ec/ruc.ts +117 -0
  151. package/src/ee/ik.spec.ts +28 -0
  152. package/src/ee/ik.ts +114 -0
  153. package/src/ee/index.ts +3 -0
  154. package/src/ee/kmkr.spec.ts +28 -0
  155. package/src/ee/kmkr.ts +76 -0
  156. package/src/ee/registrikood.spec.ts +28 -0
  157. package/src/ee/registrikood.ts +80 -0
  158. package/src/eg/index.ts +1 -0
  159. package/src/eg/tn.spec.ts +44 -0
  160. package/src/eg/tn.ts +96 -0
  161. package/src/es/cif.spec.ts +43 -0
  162. package/src/es/cif.ts +84 -0
  163. package/src/es/dni.spec.ts +28 -0
  164. package/src/es/dni.ts +83 -0
  165. package/src/es/index.ts +5 -0
  166. package/src/es/nie.spec.ts +28 -0
  167. package/src/es/nie.ts +79 -0
  168. package/src/es/nif.spec.ts +52 -0
  169. package/src/es/nif.ts +95 -0
  170. package/src/es/nss.spec.ts +28 -0
  171. package/src/es/nss.ts +132 -0
  172. package/src/exceptions.ts +66 -0
  173. package/src/fi/alv.spec.ts +28 -0
  174. package/src/fi/alv.ts +76 -0
  175. package/src/fi/hetu.spec.ts +37 -0
  176. package/src/fi/hetu.ts +108 -0
  177. package/src/fi/index.ts +3 -0
  178. package/src/fi/ytunnus.spec.ts +28 -0
  179. package/src/fi/ytunnus.ts +49 -0
  180. package/src/fo/index.ts +1 -0
  181. package/src/fo/vn.spec.ts +34 -0
  182. package/src/fo/vn.ts +71 -0
  183. package/src/fr/index.ts +5 -0
  184. package/src/fr/nif.spec.ts +34 -0
  185. package/src/fr/nif.ts +82 -0
  186. package/src/fr/nir.spec.ts +36 -0
  187. package/src/fr/nir.ts +98 -0
  188. package/src/fr/siren.spec.ts +28 -0
  189. package/src/fr/siren.ts +68 -0
  190. package/src/fr/siret.spec.ts +38 -0
  191. package/src/fr/siret.ts +79 -0
  192. package/src/fr/tva.spec.ts +40 -0
  193. package/src/fr/tva.ts +125 -0
  194. package/src/gb/index.ts +3 -0
  195. package/src/gb/nino-prefixes.ts +245 -0
  196. package/src/gb/nino.spec.ts +80 -0
  197. package/src/gb/nino.ts +80 -0
  198. package/src/gb/utr.spec.ts +28 -0
  199. package/src/gb/utr.ts +76 -0
  200. package/src/gb/vat.spec.ts +40 -0
  201. package/src/gb/vat.ts +112 -0
  202. package/src/gen/ean.spec.ts +34 -0
  203. package/src/gen/ean.ts +71 -0
  204. package/src/gen/index.ts +1 -0
  205. package/src/gh/index.ts +1 -0
  206. package/src/gh/tin.spec.ts +42 -0
  207. package/src/gh/tin.ts +93 -0
  208. package/src/gn/index.ts +1 -0
  209. package/src/gn/nifp.spec.ts +40 -0
  210. package/src/gn/nifp.ts +72 -0
  211. package/src/gr/amka.spec.ts +28 -0
  212. package/src/gr/amka.ts +76 -0
  213. package/src/gr/index.ts +2 -0
  214. package/src/gr/vat.spec.ts +34 -0
  215. package/src/gr/vat.ts +84 -0
  216. package/src/gt/cui.spec.ts +34 -0
  217. package/src/gt/cui.ts +110 -0
  218. package/src/gt/index.ts +2 -0
  219. package/src/gt/nit.spec.ts +34 -0
  220. package/src/gt/nit.ts +86 -0
  221. package/src/hk/hkid.spec.ts +52 -0
  222. package/src/hk/hkid.ts +90 -0
  223. package/src/hk/index.ts +1 -0
  224. package/src/hr/index.ts +1 -0
  225. package/src/hr/oib.spec.ts +28 -0
  226. package/src/hr/oib.ts +67 -0
  227. package/src/hu/anum.spec.ts +28 -0
  228. package/src/hu/anum.ts +71 -0
  229. package/src/hu/index.ts +1 -0
  230. package/src/id/index.ts +1 -0
  231. package/src/id/npwp.spec.ts +34 -0
  232. package/src/id/npwp.ts +116 -0
  233. package/src/ie/index.ts +2 -0
  234. package/src/ie/pps.spec.ts +58 -0
  235. package/src/ie/pps.ts +81 -0
  236. package/src/ie/vat.spec.ts +40 -0
  237. package/src/ie/vat.ts +99 -0
  238. package/src/il/hp.spec.ts +38 -0
  239. package/src/il/hp.ts +75 -0
  240. package/src/il/idnr.spec.ts +28 -0
  241. package/src/il/idnr.ts +70 -0
  242. package/src/il/index.ts +2 -0
  243. package/src/in/aadhaar.spec.ts +40 -0
  244. package/src/in/aadhaar.ts +85 -0
  245. package/src/in/epic.spec.ts +34 -0
  246. package/src/in/epic.ts +85 -0
  247. package/src/in/gstin.spec.ts +34 -0
  248. package/src/in/gstin.ts +156 -0
  249. package/src/in/index.ts +4 -0
  250. package/src/in/pan.spec.ts +40 -0
  251. package/src/in/pan.ts +93 -0
  252. package/src/index.ts +404 -0
  253. package/src/is/index.ts +2 -0
  254. package/src/is/kennitala.spec.ts +46 -0
  255. package/src/is/kennitala.ts +80 -0
  256. package/src/is/vsk.spec.ts +22 -0
  257. package/src/is/vsk.ts +60 -0
  258. package/src/it/aic.spec.ts +40 -0
  259. package/src/it/aic.ts +97 -0
  260. package/src/it/codicefiscale.spec.ts +28 -0
  261. package/src/it/codicefiscale.ts +167 -0
  262. package/src/it/index.ts +3 -0
  263. package/src/it/iva.spec.ts +28 -0
  264. package/src/it/iva.ts +65 -0
  265. package/src/jp/cn.spec.ts +28 -0
  266. package/src/jp/cn.ts +77 -0
  267. package/src/jp/index.ts +1 -0
  268. package/src/ke/index.ts +1 -0
  269. package/src/ke/pin.spec.ts +34 -0
  270. package/src/ke/pin.ts +77 -0
  271. package/src/kr/brn.spec.ts +28 -0
  272. package/src/kr/brn.ts +91 -0
  273. package/src/kr/index.ts +2 -0
  274. package/src/kr/rrn.spec.ts +34 -0
  275. package/src/kr/rrn.ts +104 -0
  276. package/src/li/index.ts +1 -0
  277. package/src/li/peid.spec.ts +22 -0
  278. package/src/li/peid.ts +71 -0
  279. package/src/lt/asmens.spec.ts +28 -0
  280. package/src/lt/asmens.ts +73 -0
  281. package/src/lt/index.ts +2 -0
  282. package/src/lt/pvm.spec.ts +34 -0
  283. package/src/lt/pvm.ts +75 -0
  284. package/src/lu/index.ts +1 -0
  285. package/src/lu/tva.spec.ts +28 -0
  286. package/src/lu/tva.ts +70 -0
  287. package/src/lv/index.ts +1 -0
  288. package/src/lv/pvn.spec.ts +44 -0
  289. package/src/lv/pvn.ts +102 -0
  290. package/src/ma/ice.spec.ts +39 -0
  291. package/src/ma/ice.ts +72 -0
  292. package/src/ma/ice9.spec.ts +28 -0
  293. package/src/ma/ice9.ts +62 -0
  294. package/src/ma/index.ts +2 -0
  295. package/src/mc/index.ts +1 -0
  296. package/src/mc/tva.spec.ts +28 -0
  297. package/src/mc/tva.ts +67 -0
  298. package/src/md/idno.spec.ts +28 -0
  299. package/src/md/idno.ts +78 -0
  300. package/src/md/index.ts +1 -0
  301. package/src/me/index.ts +2 -0
  302. package/src/me/jmbg.ts +17 -0
  303. package/src/me/pib.spec.ts +158 -0
  304. package/src/me/pib.ts +77 -0
  305. package/src/mk/edb.spec.ts +50 -0
  306. package/src/mk/edb.ts +88 -0
  307. package/src/mk/index.ts +2 -0
  308. package/src/mk/jmbg.ts +17 -0
  309. package/src/mt/index.ts +1 -0
  310. package/src/mt/vat.spec.ts +28 -0
  311. package/src/mt/vat.ts +69 -0
  312. package/src/mu/index.ts +1 -0
  313. package/src/mu/nid.spec.ts +34 -0
  314. package/src/mu/nid.ts +89 -0
  315. package/src/mx/banks.ts +658 -0
  316. package/src/mx/clabe.spec.ts +68 -0
  317. package/src/mx/clabe.ts +105 -0
  318. package/src/mx/curp.spec.ts +28 -0
  319. package/src/mx/curp.ts +261 -0
  320. package/src/mx/index.ts +3 -0
  321. package/src/mx/rfc.spec.ts +69 -0
  322. package/src/mx/rfc.ts +193 -0
  323. package/src/my/index.ts +1 -0
  324. package/src/my/nric.spec.ts +40 -0
  325. package/src/my/nric.ts +91 -0
  326. package/src/nl/bsn.spec.ts +68 -0
  327. package/src/nl/bsn.ts +81 -0
  328. package/src/nl/btw.spec.ts +40 -0
  329. package/src/nl/btw.ts +95 -0
  330. package/src/nl/index.ts +3 -0
  331. package/src/nl/onderwijsnummer.spec.ts +34 -0
  332. package/src/nl/onderwijsnummer.ts +77 -0
  333. package/src/no/fodselsnummer.spec.ts +56 -0
  334. package/src/no/fodselsnummer.ts +118 -0
  335. package/src/no/index.ts +4 -0
  336. package/src/no/kontonr.spec.ts +34 -0
  337. package/src/no/kontonr.ts +84 -0
  338. package/src/no/mva.spec.ts +28 -0
  339. package/src/no/mva.ts +80 -0
  340. package/src/no/orgnr.spec.ts +28 -0
  341. package/src/no/orgnr.ts +75 -0
  342. package/src/nz/bank.spec.ts +28 -0
  343. package/src/nz/bank.ts +238 -0
  344. package/src/nz/index.ts +2 -0
  345. package/src/nz/ird.spec.ts +34 -0
  346. package/src/nz/ird.ts +102 -0
  347. package/src/pe/ce.spec.ts +46 -0
  348. package/src/pe/ce.ts +61 -0
  349. package/src/pe/cui.spec.ts +28 -0
  350. package/src/pe/cui.ts +85 -0
  351. package/src/pe/index.ts +3 -0
  352. package/src/pe/ruc.spec.ts +46 -0
  353. package/src/pe/ruc.ts +84 -0
  354. package/src/pk/cnic.spec.ts +34 -0
  355. package/src/pk/cnic.ts +97 -0
  356. package/src/pk/index.ts +2 -0
  357. package/src/pk/ntn.spec.ts +22 -0
  358. package/src/pk/ntn.ts +65 -0
  359. package/src/pl/index.ts +3 -0
  360. package/src/pl/nip.spec.ts +34 -0
  361. package/src/pl/nip.ts +74 -0
  362. package/src/pl/pesel.spec.ts +34 -0
  363. package/src/pl/pesel.ts +97 -0
  364. package/src/pl/regon.spec.ts +52 -0
  365. package/src/pl/regon.ts +88 -0
  366. package/src/pt/cc.spec.ts +43 -0
  367. package/src/pt/cc.ts +74 -0
  368. package/src/pt/index.ts +3 -0
  369. package/src/pt/nif.spec.ts +28 -0
  370. package/src/pt/nif.ts +78 -0
  371. package/src/pt/nipc.ts +27 -0
  372. package/src/py/cedula.spec.ts +46 -0
  373. package/src/py/cedula.ts +73 -0
  374. package/src/py/index.ts +2 -0
  375. package/src/py/ruc.spec.ts +40 -0
  376. package/src/py/ruc.ts +93 -0
  377. package/src/ro/cif.spec.ts +40 -0
  378. package/src/ro/cif.ts +62 -0
  379. package/src/ro/cnp.spec.ts +50 -0
  380. package/src/ro/cnp.ts +158 -0
  381. package/src/ro/cui.spec.ts +28 -0
  382. package/src/ro/cui.ts +83 -0
  383. package/src/ro/index.ts +4 -0
  384. package/src/ro/onrc.spec.ts +28 -0
  385. package/src/ro/onrc.ts +109 -0
  386. package/src/rs/index.ts +2 -0
  387. package/src/rs/jmbg.ts +16 -0
  388. package/src/rs/pib.spec.ts +28 -0
  389. package/src/rs/pib.ts +69 -0
  390. package/src/ru/index.ts +1 -0
  391. package/src/ru/inn.spec.ts +32 -0
  392. package/src/ru/inn.ts +106 -0
  393. package/src/se/index.ts +3 -0
  394. package/src/se/orgnr.spec.ts +28 -0
  395. package/src/se/orgnr.ts +68 -0
  396. package/src/se/personnummer.spec.ts +45 -0
  397. package/src/se/personnummer.ts +143 -0
  398. package/src/se/vat.spec.ts +28 -0
  399. package/src/se/vat.ts +73 -0
  400. package/src/sg/index.ts +1 -0
  401. package/src/sg/uen.spec.ts +46 -0
  402. package/src/sg/uen.ts +209 -0
  403. package/src/si/ddv.spec.ts +28 -0
  404. package/src/si/ddv.ts +76 -0
  405. package/src/si/emso.spec.ts +15 -0
  406. package/src/si/emso.ts +27 -0
  407. package/src/si/index.ts +3 -0
  408. package/src/si/jmbg.ts +20 -0
  409. package/src/sk/dph.spec.ts +28 -0
  410. package/src/sk/dph.ts +71 -0
  411. package/src/sk/index.ts +2 -0
  412. package/src/sk/rc.ts +12 -0
  413. package/src/sm/coe.spec.ts +34 -0
  414. package/src/sm/coe.ts +80 -0
  415. package/src/sm/index.ts +1 -0
  416. package/src/sv/index.ts +1 -0
  417. package/src/sv/nit.spec.ts +34 -0
  418. package/src/sv/nit.ts +117 -0
  419. package/src/th/idnr.spec.ts +41 -0
  420. package/src/th/idnr.ts +80 -0
  421. package/src/th/index.ts +3 -0
  422. package/src/th/moa.spec.ts +62 -0
  423. package/src/th/moa.ts +85 -0
  424. package/src/th/tin.spec.ts +77 -0
  425. package/src/th/tin.ts +56 -0
  426. package/src/tn/index.ts +1 -0
  427. package/src/tn/mf.spec.ts +37 -0
  428. package/src/tn/mf.ts +169 -0
  429. package/src/tr/index.ts +2 -0
  430. package/src/tr/tckimlik.spec.ts +40 -0
  431. package/src/tr/tckimlik.ts +87 -0
  432. package/src/tr/vkn.spec.ts +28 -0
  433. package/src/tr/vkn.ts +87 -0
  434. package/src/tw/ban.spec.ts +28 -0
  435. package/src/tw/ban.ts +67 -0
  436. package/src/tw/index.ts +5 -0
  437. package/src/tw/natid.spec.ts +28 -0
  438. package/src/tw/natid.ts +105 -0
  439. package/src/tw/tax_code.spec.ts +34 -0
  440. package/src/tw/tax_code.ts +98 -0
  441. package/src/tw/ubn.spec.ts +28 -0
  442. package/src/tw/ubn.ts +80 -0
  443. package/src/tw/ui.spec.ts +38 -0
  444. package/src/tw/ui.ts +107 -0
  445. package/src/types.ts +82 -0
  446. package/src/ua/edrpou.spec.ts +28 -0
  447. package/src/ua/edrpou.ts +88 -0
  448. package/src/ua/index.ts +2 -0
  449. package/src/ua/rntrc.spec.ts +28 -0
  450. package/src/ua/rntrc.ts +77 -0
  451. package/src/us/ein.spec.ts +28 -0
  452. package/src/us/ein.ts +179 -0
  453. package/src/us/index.ts +2 -0
  454. package/src/us/ssn.spec.ts +28 -0
  455. package/src/us/ssn.ts +117 -0
  456. package/src/util/checksum.spec.ts +70 -0
  457. package/src/util/checksum.ts +258 -0
  458. package/src/util/index.ts +13 -0
  459. package/src/util/isValidDate.spec.ts +49 -0
  460. package/src/util/isValidDate.ts +87 -0
  461. package/src/util/iso7064.spec.ts +17 -0
  462. package/src/util/iso7064.ts +8 -0
  463. package/src/util/pymod.ts +8 -0
  464. package/src/util/strings/char.ts +18 -0
  465. package/src/util/strings/clean.spec.ts +15 -0
  466. package/src/util/strings/clean.ts +305 -0
  467. package/src/util/strings/format.ts +18 -0
  468. package/src/util/strings/index.ts +5 -0
  469. package/src/util/strings/reverseString.ts +3 -0
  470. package/src/util/strings/splitAt.spec.ts +15 -0
  471. package/src/util/strings/splitAt.ts +16 -0
  472. package/src/uy/cedula.spec.ts +28 -0
  473. package/src/uy/cedula.ts +74 -0
  474. package/src/uy/index.ts +3 -0
  475. package/src/uy/nie.spec.ts +28 -0
  476. package/src/uy/nie.ts +84 -0
  477. package/src/uy/rut.spec.ts +34 -0
  478. package/src/uy/rut.ts +99 -0
  479. package/src/ve/index.ts +1 -0
  480. package/src/ve/rif.spec.ts +38 -0
  481. package/src/ve/rif.ts +92 -0
  482. package/src/vn/index.ts +1 -0
  483. package/src/vn/mst.spec.ts +40 -0
  484. package/src/vn/mst.ts +100 -0
  485. package/src/za/idnr.spec.ts +28 -0
  486. package/src/za/idnr.ts +84 -0
  487. package/src/za/index.ts +2 -0
  488. package/src/za/tin.spec.ts +28 -0
  489. package/src/za/tin.ts +75 -0
package/src/us/ssn.ts ADDED
@@ -0,0 +1,117 @@
1
+ /**
2
+ * SSN (U.S. Social Security Number).
3
+ *
4
+ * The Social Security Number is used to identify individuals for taxation
5
+ * purposes. It is a 9-digit number that consists of a 3-digit area number, a
6
+ * 2-digit group number and a 4-digit serial number. The number does not use a
7
+ * check digit.
8
+ *
9
+ * Sources:
10
+ * https://en.wikipedia.org/wiki/Social_Security_number
11
+ * https://www.ssa.gov/employer/verifySSN.htm
12
+ *
13
+ * INDIVIDUAL
14
+ */
15
+
16
+ import * as exceptions from '../exceptions';
17
+ import { strings } from '../util';
18
+ import { Validator, ValidateReturn } from '../types';
19
+
20
+ const invalidSSN = [
21
+ '111111111',
22
+ '222222222',
23
+ '333333333',
24
+ '444444444',
25
+ '555555555',
26
+ '777777777',
27
+ '888888888',
28
+ '999999999',
29
+ '123123123',
30
+ '999999999',
31
+ // Used in Advertising and known "invalid"
32
+ '002281852',
33
+ '042103580',
34
+ '062360749',
35
+ '078051120',
36
+ '095073645',
37
+ '128036045',
38
+ '135016629',
39
+ '141186941',
40
+ '165167999',
41
+ '165187999',
42
+ '165207999',
43
+ '165227999',
44
+ '165247999',
45
+ '189092294',
46
+ '212097694',
47
+ '212099999',
48
+ '219099999',
49
+ '306302348',
50
+ '308125070',
51
+ '457555462',
52
+ '468288779',
53
+ '549241889',
54
+ ];
55
+
56
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
57
+ return strings.cleanUnicode(input, '- ');
58
+ }
59
+
60
+ const impl: Validator = {
61
+ name: 'U.S. Social Security Number',
62
+ localName: 'Social Security Number',
63
+ abbreviation: 'SSN',
64
+ compact(input: string): string {
65
+ const [value, err] = clean(input);
66
+
67
+ if (err) {
68
+ throw err;
69
+ }
70
+
71
+ return value;
72
+ },
73
+
74
+ format(input: string): string {
75
+ const [value] = clean(input);
76
+
77
+ return strings.splitAt(value, 3, 5).join('-');
78
+ },
79
+
80
+ /**
81
+ * Check if the number is a valid SSN number.
82
+ * This checks the length, formatting and other contraints. It does not check
83
+ * for control letter.
84
+ */
85
+ validate(input: string): ValidateReturn {
86
+ const [value, error] = clean(input);
87
+
88
+ if (error) {
89
+ return { isValid: false, error };
90
+ }
91
+ if (value.length !== 9) {
92
+ return { isValid: false, error: new exceptions.InvalidLength() };
93
+ }
94
+ if (!strings.isdigits(value)) {
95
+ return { isValid: false, error: new exceptions.InvalidComponent() };
96
+ }
97
+ if (invalidSSN.includes(value)) {
98
+ return { isValid: false, error: new exceptions.InvalidComponent() };
99
+ }
100
+ if (/^(000|666|9)\d+/.test(value)) {
101
+ return { isValid: false, error: new exceptions.InvalidComponent() };
102
+ }
103
+ if (/^\d{3}00\d{4}/.test(value)) {
104
+ return { isValid: false, error: new exceptions.InvalidComponent() };
105
+ }
106
+
107
+ return {
108
+ isValid: true,
109
+ compact: value,
110
+ isIndividual: true,
111
+ isCompany: false,
112
+ };
113
+ },
114
+ };
115
+
116
+ export const { name, localName, abbreviation, validate, format, compact } =
117
+ impl;
@@ -0,0 +1,70 @@
1
+ import {
2
+ luhnChecksumDigit,
3
+ luhnChecksumValue,
4
+ mod11mod10Validate,
5
+ mod97base10Validate,
6
+ } from './checksum';
7
+
8
+ describe('util/checksum', () => {
9
+ describe('luhnChecksumValue', () => {
10
+ it('basic', () => {
11
+ expect(luhnChecksumValue('7894')).toEqual(6);
12
+ });
13
+ });
14
+
15
+ describe('luhnChecksumDigit', () => {
16
+ it.each([
17
+ ['7894', '9'],
18
+ ['8667046', '0'],
19
+ ])(
20
+ 'luhnChecksumDigit %s should return %s',
21
+ (digits: string, expectedResult: string) => {
22
+ expect(luhnChecksumDigit(digits)).toEqual(expectedResult);
23
+ },
24
+ );
25
+ });
26
+
27
+ describe('mod97base10Validate', () => {
28
+ test.each(['9999123456789012141490', '08686001256515001121751'])(
29
+ 'value:%s',
30
+ value => {
31
+ expect(mod97base10Validate(value)).toBe(true);
32
+ },
33
+ );
34
+ });
35
+
36
+ describe('mod11mod10Validate', () => {
37
+ test.each([
38
+ '07945',
39
+ '794623',
40
+ '002006673085',
41
+ '65112243004304827',
42
+ '532668787803570012647762156873137851288684',
43
+ '0032',
44
+ '78463064456075552581616161662',
45
+ '8615430533535456311886713716284873171332581774130',
46
+ '45557738808',
47
+ '710652041271831466162726767146582126527534',
48
+ '47166',
49
+ '680584514238577341080173637733642828500321',
50
+ '46746786646531',
51
+ '423280260',
52
+ '5003002243435846626846005060042255674451267241175',
53
+ '654280720481568053641275304858644021632559',
54
+ '3086551843863',
55
+ '43177541563430485407585286786376851344',
56
+ '46000342367741',
57
+ '13858121045117455586725505241387248109',
58
+ '15631047568645066248754360824525460366184664246',
59
+ '716606185585077454311714605',
60
+ '36760125602740581257256826035731224471746311354',
61
+ '8537',
62
+ ])('validate:%s', value => {
63
+ expect(mod11mod10Validate(value)).toBe(true);
64
+ });
65
+
66
+ test.each(['17945', '17944'])('invalid:%s', value => {
67
+ expect(mod11mod10Validate(value)).toBe(false);
68
+ });
69
+ });
70
+ });
@@ -0,0 +1,258 @@
1
+ /**
2
+ * From stack overflow
3
+ * - Add all digits of a given number
4
+ * - https://stackoverflow.com/questions/38334652/sum-all-the-digits-of-a-number-javascript
5
+ */
6
+ function sumAllDigits(value: number) {
7
+ let localValue = value;
8
+ let sum = 0;
9
+
10
+ while (localValue) {
11
+ sum += localValue % 10;
12
+ localValue = Math.floor(localValue / 10);
13
+ }
14
+
15
+ return sum;
16
+ }
17
+
18
+ /**
19
+ * Compute the weighted sum of a string
20
+ * @param {boolean} sumByDigit - ex) if checksum entry is 18, add 9 (sum of digits) to the sum (instead of 18).
21
+ */
22
+ export function weightedSum(
23
+ value: string,
24
+ {
25
+ alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
26
+ reverse = false,
27
+ weights = [1],
28
+ modulus = 0,
29
+ sumByDigit = false,
30
+ }: {
31
+ alphabet?: string;
32
+ reverse?: boolean;
33
+ modulus: number;
34
+ weights?: number[];
35
+ sumByDigit?: boolean;
36
+ },
37
+ ): number {
38
+ const wlen = weights.length;
39
+ const numbers = value.split('').map(v => alphabet.indexOf(v));
40
+ const weighted = (reverse ? numbers.reverse() : numbers).map(
41
+ (v, idx) => v * weights[idx % wlen],
42
+ );
43
+
44
+ return weighted.reduce((acc, v) => {
45
+ let vv = v;
46
+ while (vv < 0) {
47
+ vv += modulus;
48
+ }
49
+
50
+ if (sumByDigit && vv > 9) {
51
+ return (acc + sumAllDigits(vv)) % modulus;
52
+ }
53
+
54
+ return (acc + vv) % modulus;
55
+ }, 0);
56
+ }
57
+
58
+ export function luhnChecksum(value: string, alphabet = '0123456789'): number {
59
+ const parity = value.length % 2;
60
+
61
+ const sum = value
62
+ .split('')
63
+ .reverse()
64
+ .map(v => alphabet.indexOf(v))
65
+ .reduce((acc, val, idx) => {
66
+ const v = idx % 2 === parity ? val * 2 : val;
67
+
68
+ return acc + (v > 9 ? v - 9 : v);
69
+ }, 0);
70
+
71
+ // return sum % 10 === 0;
72
+ return sum % alphabet.length;
73
+ }
74
+
75
+ export function luhnChecksumValidate(
76
+ value: string,
77
+ alphabet = '0123456789',
78
+ ): boolean {
79
+ const parity = value.length % 2;
80
+
81
+ const sum = value
82
+ .split('')
83
+ // .reverse()
84
+ .map(v => alphabet.indexOf(v))
85
+ .reduce((acc, val, idx) => {
86
+ let v = val;
87
+ if (idx % 2 === parity) {
88
+ v = val * 2;
89
+ if (v > 9) {
90
+ v -= 9;
91
+ }
92
+ }
93
+
94
+ return acc + v;
95
+ }, 0);
96
+
97
+ return sum % 10 === 0;
98
+ }
99
+
100
+ /**
101
+ * Compute the Luhn checksum over the provider number. The checksum is returned as
102
+ * a Number. Valid numbers should be equal to 0
103
+ */
104
+ export function luhnChecksumValue(
105
+ value: string,
106
+ alphabet = '0123456789',
107
+ ): number {
108
+ const alen = alphabet.length;
109
+
110
+ return value
111
+ .split('')
112
+ .reverse()
113
+ .map(v => alphabet.indexOf(v))
114
+ .reduce((acc, v, idx) => {
115
+ if (idx % 2 === 0) {
116
+ return (acc + v) % alen;
117
+ }
118
+
119
+ return (acc + Math.floor((v * 2) / alen) + ((v * 2) % alen)) % alen;
120
+ });
121
+ }
122
+
123
+ /**
124
+ * Compute the checksum digit that should be provided given the alphabet
125
+ * (e.g. calc_check_digit)
126
+ */
127
+ export function luhnChecksumDigit(
128
+ value: string,
129
+ alphabet = '0123456789',
130
+ ): string {
131
+ const cs = luhnChecksumValue(`${value}${alphabet[0]}`);
132
+
133
+ return alphabet[(alphabet.length - cs) % alphabet.length];
134
+ }
135
+
136
+ /*
137
+ For more info on the algorithm: http://en.wikipedia.org/wiki/Verhoeff_algorithm
138
+ by Sergey Petushkov, 2014
139
+ */
140
+
141
+ // multiplication table d
142
+ const verhoeffD = [
143
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
144
+ [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],
145
+ [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],
146
+ [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],
147
+ [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],
148
+ [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],
149
+ [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],
150
+ [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],
151
+ [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],
152
+ [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],
153
+ ];
154
+
155
+ // permutation table p
156
+ const verhoeffP = [
157
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
158
+ [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],
159
+ [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],
160
+ [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],
161
+ [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],
162
+ [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],
163
+ [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],
164
+ [7, 0, 4, 6, 9, 1, 3, 2, 5, 8],
165
+ ];
166
+
167
+ // inverse table inv
168
+ const verhoeffInv = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9];
169
+
170
+ // converts string or number to an array and inverts it
171
+ function invArray(array: string): number[] {
172
+ return array
173
+ .split('')
174
+ .map(v => parseInt(v, 10))
175
+ .reverse();
176
+ }
177
+
178
+ // generates checksum
179
+ export function verhoeffGenerate(array: string): number {
180
+ const invertedArray = invArray(array);
181
+
182
+ const value = invertedArray.reduce(
183
+ (c, v, idx) => verhoeffD[c][verhoeffP[(idx + 1) % 8][v]],
184
+ 0,
185
+ );
186
+
187
+ return verhoeffInv[value];
188
+ }
189
+
190
+ // validates checksum
191
+ export function verhoeffValidate(array: string): boolean {
192
+ const invertedArray = invArray(array);
193
+
194
+ const sum = invertedArray.reduce(
195
+ (c, v, idx) => verhoeffD[c][verhoeffP[idx % 8][v]],
196
+ 0,
197
+ );
198
+
199
+ return sum === 0;
200
+ }
201
+
202
+ // From stackover flow
203
+ // https://stackoverflow.com/questions/929910/modulo-in-javascript-large-number
204
+ function modulo(dividentIn: string, divisor: number) {
205
+ let divident = dividentIn;
206
+ const partLength = 10;
207
+
208
+ while (divident.length > partLength) {
209
+ const part = divident.substring(0, partLength);
210
+ divident = (parseInt(part, 10) % divisor) + divident.substring(partLength);
211
+ }
212
+
213
+ return parseInt(divident, 10) % divisor;
214
+ }
215
+
216
+ /**
217
+ * The ISO 7064 Mod 97, 10 algorithm.
218
+ *
219
+ * The Mod 97, 10 algorithm evaluates the whole number as an integer which is
220
+ * valid if the number modulo 97 is 1. As such it has two check digits.
221
+ */
222
+ export function mod97base10Validate(value: string, expect = 1): boolean {
223
+ const alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
224
+ let fail = false;
225
+
226
+ const bigValue = value
227
+ .split('')
228
+ .map(c => {
229
+ const idx = alphabet.indexOf(c);
230
+ if (idx === -1) {
231
+ fail = true;
232
+ return '';
233
+ }
234
+ return String(idx);
235
+ })
236
+ .join('');
237
+
238
+ if (fail) {
239
+ return false;
240
+ }
241
+
242
+ return modulo(bigValue, 97) === expect;
243
+ }
244
+
245
+ /**
246
+ * The ISO 7064 Mod 11, 10 algorithm.
247
+ *
248
+ * The Mod 11, 10 algorithm uses a number of calculations modulo 11 and 10 to
249
+ * determine a checksum.
250
+ */
251
+ export function mod11mod10Validate(value: string): boolean {
252
+ const sum = value
253
+ .split('')
254
+ .map(v => parseInt(v, 10))
255
+ .reduce((acc, n) => ((((acc === 0 ? 10 : acc) * 2) % 11) + n) % 10, 5);
256
+
257
+ return sum === 1;
258
+ }
@@ -0,0 +1,13 @@
1
+ import * as strings from './strings';
2
+
3
+ export { weightedSum, mod97base10Validate } from './checksum';
4
+ export {
5
+ buildDate,
6
+ validBirthdate,
7
+ isValidDate,
8
+ isValidDateCompactYYYYMMDD,
9
+ isValidDateCompactYYMMDD,
10
+ isValidDateCompactDDMMYY,
11
+ } from './isValidDate';
12
+
13
+ export { strings };
@@ -0,0 +1,49 @@
1
+ import { isValidDate, validBirthdate } from './isValidDate';
2
+
3
+ describe('isValidDate', () => {
4
+ it('2020-01-02', () => {
5
+ expect(isValidDate('2020', '01', '02')).toEqual(true);
6
+ });
7
+
8
+ it('2020-01-40', () => {
9
+ expect(isValidDate('2020', '01', '40')).toEqual(false);
10
+ });
11
+
12
+ it('19-02-29', () => {
13
+ expect(isValidDate('19', '02', '29')).toEqual(false);
14
+ });
15
+
16
+ it('20-02-29', () => {
17
+ expect(isValidDate('20', '02', '29')).toEqual(true);
18
+ });
19
+
20
+ describe('birthdates', () => {
21
+ describe('validBirthdate', () => {
22
+ it('today', () => {
23
+ const now = new Date();
24
+ // remove those pesky minutes...
25
+ const date = new Date(now.toISOString().substring(0, 10));
26
+ expect(validBirthdate(date)).toEqual(true);
27
+ });
28
+
29
+ it('tomorrow', () => {
30
+ const now = new Date();
31
+ now.setDate(now.getDate() + 1);
32
+ const date = new Date(now.toISOString().substring(0, 10));
33
+ expect(validBirthdate(date)).toEqual(false);
34
+ });
35
+
36
+ it('2010-01-01', () => {
37
+ expect(validBirthdate(new Date('2010-01-01'))).toEqual(true);
38
+ });
39
+
40
+ it('2030-01-01', () => {
41
+ expect(validBirthdate(new Date('2030-01-01'))).toEqual(false);
42
+ });
43
+ });
44
+
45
+ it('2090-02-29', () => {
46
+ expect(isValidDate('2090', '02', '29', true)).toEqual(false);
47
+ });
48
+ });
49
+ });
@@ -0,0 +1,87 @@
1
+ import { splitAt } from './strings';
2
+
3
+ export function validBirthdate(date: Date | null): boolean {
4
+ if (date === null) {
5
+ return false;
6
+ }
7
+
8
+ const now = new Date();
9
+ return date.getTime() <= now.getTime();
10
+ }
11
+
12
+ export function buildDate(yy: string, mm: string, dd: string): Date | null {
13
+ const yyN = parseInt(yy, 10);
14
+ const mmN = parseInt(mm, 10) - 1;
15
+ const ddN = parseInt(dd, 10);
16
+
17
+ if (Number.isNaN(yyN) || Number.isNaN(mmN) || Number.isNaN(ddN)) {
18
+ return null;
19
+ }
20
+
21
+ let d;
22
+ if (yyN < 20) {
23
+ d = new Date(2000 + yyN, mmN, ddN);
24
+ } else if (yyN < 100) {
25
+ d = new Date(1900 + yyN, mmN, ddN);
26
+ } else {
27
+ d = new Date(yyN, mmN, ddN);
28
+ }
29
+
30
+ if (Number.isNaN(d.getFullYear())) {
31
+ return null;
32
+ }
33
+
34
+ // Date will convert Jan 30 -> Feb 9, make sure this didn't happen
35
+ if (d.getDate() !== ddN || d.getMonth() !== mmN) {
36
+ return null;
37
+ }
38
+
39
+ return d;
40
+ }
41
+
42
+ /** Check to make sure this is a valid date
43
+ * isBefore checks to make sure that the date is today or before, this
44
+ * typically is used for birtdays (you could be born today)
45
+ */
46
+ export function isValidDate(
47
+ yy: string,
48
+ mm: string,
49
+ dd: string,
50
+ isBefore = false,
51
+ ): boolean {
52
+ const d = buildDate(yy, mm, dd);
53
+
54
+ if (d === null) {
55
+ return false;
56
+ }
57
+
58
+ return isBefore ? validBirthdate(d) : true;
59
+ }
60
+
61
+ /** Check to make sure this is a valid date */
62
+ export function isValidDateCompactYYMMDD(
63
+ yymmdd: string,
64
+ isBefore = false,
65
+ ): boolean {
66
+ const [year, mon, day] = splitAt(yymmdd, 2, 4);
67
+
68
+ return isValidDate(year, mon, day, isBefore);
69
+ }
70
+
71
+ export function isValidDateCompactDDMMYY(
72
+ ddmmyy: string,
73
+ isBefore = false,
74
+ ): boolean {
75
+ const [day, mon, year] = splitAt(ddmmyy, 2, 4);
76
+
77
+ return isValidDate(year, mon, day, isBefore);
78
+ }
79
+
80
+ export function isValidDateCompactYYYYMMDD(
81
+ yyyymmdd: string,
82
+ isBefore = false,
83
+ ): boolean {
84
+ const [year, mon, day] = splitAt(yyyymmdd, 4, 6);
85
+
86
+ return isValidDate(year, mon, day, isBefore);
87
+ }
@@ -0,0 +1,17 @@
1
+ import { iso7064mod10x11validate } from './iso7064';
2
+
3
+ describe('iso7064', () => {
4
+ describe('iso7064mod10x11validate', () => {
5
+ it('794623', () => {
6
+ expect(iso7064mod10x11validate('794623')).toEqual(true);
7
+ });
8
+
9
+ it('002006673085', () => {
10
+ expect(iso7064mod10x11validate('002006673085')).toEqual(true);
11
+ });
12
+
13
+ it('00200667308', () => {
14
+ expect(iso7064mod10x11validate('00200667308')).toEqual(false);
15
+ });
16
+ });
17
+ });
@@ -0,0 +1,8 @@
1
+ export function iso7064mod10x11validate(value: string): boolean {
2
+ const check = value
3
+ .split('')
4
+ .map(v => parseInt(v, 10))
5
+ .reduce((acc, v) => ((((acc === 0 ? 10 : acc) * 2) % 11) + v) % 10, 5);
6
+
7
+ return check === 1;
8
+ }
@@ -0,0 +1,8 @@
1
+ ///
2
+ // Match pythons handling of negative modulus math (e.g. -1 % 7 === 6)
3
+ //
4
+ // https://stackoverflow.com/questions/41239190/result-of-17-is-different-in-javascript-1-and-python6
5
+ //
6
+ export function pymod(value: number, modulus: number): number {
7
+ return ((value % modulus) + modulus) % modulus;
8
+ }
@@ -0,0 +1,18 @@
1
+ const alphanumericRE = /^[A-Za-z0-9]+$/;
2
+ const digitRE = /^[0-9]+$/;
3
+ const alphaRE = /^[A-Za-z]+$/;
4
+
5
+ /**
6
+ * Alpha numeric check A-Za-z0-9
7
+ */
8
+ export function isalphanumeric(value: string): boolean {
9
+ return alphanumericRE.test(value);
10
+ }
11
+
12
+ export function isdigits(value: string): boolean {
13
+ return digitRE.test(value);
14
+ }
15
+
16
+ export function isalpha(value: string): boolean {
17
+ return alphaRE.test(value);
18
+ }
@@ -0,0 +1,15 @@
1
+ import { cleanUnicode } from './clean';
2
+
3
+ describe('clean', () => {
4
+ it('basic', () => {
5
+ expect(cleanUnicode('123', '2')[0]).toEqual('13');
6
+ });
7
+
8
+ it('unicode-9', () => {
9
+ expect(cleanUnicode('\u{1D7FF}9')[0]).toEqual('99');
10
+ });
11
+
12
+ it('simple whitespace', () => {
13
+ expect(cleanUnicode('8\t\xA08')[0]).toEqual('88');
14
+ });
15
+ });