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.
- package/lib/cjs/no/fodselsnummer.js +2 -2
- package/lib/esm/no/fodselsnummer.js +2 -2
- package/package.json +5 -2
- package/src/ad/index.ts +1 -0
- package/src/ad/nrt.spec.ts +36 -0
- package/src/ad/nrt.ts +87 -0
- package/src/al/index.ts +1 -0
- package/src/al/nipt.spec.ts +43 -0
- package/src/al/nipt.ts +111 -0
- package/src/ar/cbu.spec.ts +28 -0
- package/src/ar/cbu.ts +96 -0
- package/src/ar/cuit.spec.ts +28 -0
- package/src/ar/cuit.ts +102 -0
- package/src/ar/dni.spec.ts +22 -0
- package/src/ar/dni.ts +72 -0
- package/src/ar/index.ts +3 -0
- package/src/at/businessid.spec.ts +34 -0
- package/src/at/businessid.ts +73 -0
- package/src/at/index.ts +4 -0
- package/src/at/tin.spec.ts +173 -0
- package/src/at/tin.ts +140 -0
- package/src/at/uid.spec.ts +44 -0
- package/src/at/uid.ts +84 -0
- package/src/at/vnr.spec.ts +38 -0
- package/src/at/vnr.ts +84 -0
- package/src/au/abn.spec.ts +28 -0
- package/src/au/abn.ts +78 -0
- package/src/au/acn.spec.ts +34 -0
- package/src/au/acn.ts +76 -0
- package/src/au/index.ts +3 -0
- package/src/au/tfn.spec.ts +28 -0
- package/src/au/tfn.ts +79 -0
- package/src/az/index.ts +2 -0
- package/src/az/pin.spec.ts +16 -0
- package/src/az/pin.ts +61 -0
- package/src/az/tin.spec.ts +28 -0
- package/src/az/tin.ts +64 -0
- package/src/ba/index.ts +1 -0
- package/src/ba/jmbg.spec.ts +28 -0
- package/src/ba/jmbg.ts +85 -0
- package/src/be/bis.spec.ts +184 -0
- package/src/be/bis.ts +85 -0
- package/src/be/index.ts +4 -0
- package/src/be/insz.spec.ts +51 -0
- package/src/be/insz.ts +55 -0
- package/src/be/nn.spec.ts +117 -0
- package/src/be/nn.ts +77 -0
- package/src/be/personIdentifierHelpers.spec.ts +254 -0
- package/src/be/personIdentifierHelpers.ts +130 -0
- package/src/be/vat.spec.ts +46 -0
- package/src/be/vat.ts +84 -0
- package/src/bg/egn.spec.ts +28 -0
- package/src/bg/egn.ts +75 -0
- package/src/bg/index.ts +3 -0
- package/src/bg/pnf.spec.ts +28 -0
- package/src/bg/pnf.ts +73 -0
- package/src/bg/vat.spec.ts +34 -0
- package/src/bg/vat.ts +120 -0
- package/src/br/cnpj.spec.ts +34 -0
- package/src/br/cnpj.ts +89 -0
- package/src/br/cpf.spec.ts +34 -0
- package/src/br/cpf.ts +87 -0
- package/src/br/index.ts +2 -0
- package/src/by/index.ts +1 -0
- package/src/by/unp.spec.ts +34 -0
- package/src/by/unp.ts +108 -0
- package/src/bz/index.ts +1 -0
- package/src/bz/tin.spec.ts +28 -0
- package/src/bz/tin.ts +67 -0
- package/src/ca/bn.spec.ts +40 -0
- package/src/ca/bn.ts +88 -0
- package/src/ca/gst.spec.ts +34 -0
- package/src/ca/gst.ts +70 -0
- package/src/ca/index.ts +5 -0
- package/src/ca/pst.spec.ts +28 -0
- package/src/ca/pst.ts +71 -0
- package/src/ca/qst.spec.ts +47 -0
- package/src/ca/qst.ts +88 -0
- package/src/ca/sin.spec.ts +34 -0
- package/src/ca/sin.ts +72 -0
- package/src/ch/index.ts +3 -0
- package/src/ch/ssn.spec.ts +50 -0
- package/src/ch/ssn.ts +74 -0
- package/src/ch/uid.spec.ts +34 -0
- package/src/ch/uid.ts +82 -0
- package/src/ch/vat.spec.ts +28 -0
- package/src/ch/vat.ts +83 -0
- package/src/cl/index.ts +2 -0
- package/src/cl/run.ts +13 -0
- package/src/cl/rut.spec.ts +50 -0
- package/src/cl/rut.ts +97 -0
- package/src/cn/index.ts +2 -0
- package/src/cn/ric.spec.ts +34 -0
- package/src/cn/ric.ts +86 -0
- package/src/cn/uscc.spec.ts +34 -0
- package/src/cn/uscc.ts +110 -0
- package/src/co/index.ts +1 -0
- package/src/co/nit.spec.ts +40 -0
- package/src/co/nit.ts +85 -0
- package/src/cr/cpf.spec.ts +34 -0
- package/src/cr/cpf.ts +93 -0
- package/src/cr/cpj.spec.ts +28 -0
- package/src/cr/cpj.ts +111 -0
- package/src/cr/cr.spec.ts +28 -0
- package/src/cr/cr.ts +75 -0
- package/src/cr/index.ts +3 -0
- package/src/cu/index.ts +1 -0
- package/src/cu/ni.spec.ts +34 -0
- package/src/cu/ni.ts +74 -0
- package/src/cy/index.ts +1 -0
- package/src/cy/vat.spec.ts +28 -0
- package/src/cy/vat.ts +98 -0
- package/src/cz/dic.spec.ts +28 -0
- package/src/cz/dic.ts +127 -0
- package/src/cz/index.ts +2 -0
- package/src/cz/rc.spec.ts +44 -0
- package/src/cz/rc.ts +95 -0
- package/src/de/idnr.spec.ts +34 -0
- package/src/de/idnr.ts +91 -0
- package/src/de/index.ts +6 -0
- package/src/de/passport.spec.ts +31 -0
- package/src/de/passport.ts +86 -0
- package/src/de/pwnr.spec.ts +62 -0
- package/src/de/pwnr.ts +190 -0
- package/src/de/stnr.spec.ts +85 -0
- package/src/de/stnr.ts +193 -0
- package/src/de/svnr.spec.ts +56 -0
- package/src/de/svnr.ts +158 -0
- package/src/de/vat.spec.ts +28 -0
- package/src/de/vat.ts +74 -0
- package/src/dk/cpr.spec.ts +34 -0
- package/src/dk/cpr.ts +129 -0
- package/src/dk/cvr.spec.ts +28 -0
- package/src/dk/cvr.ts +81 -0
- package/src/dk/index.ts +2 -0
- package/src/do/cedula.spec.ts +34 -0
- package/src/do/cedula.ts +67 -0
- package/src/do/index.ts +3 -0
- package/src/do/ncf.spec.ts +34 -0
- package/src/do/ncf.ts +133 -0
- package/src/do/rnc.spec.ts +40 -0
- package/src/do/rnc.ts +74 -0
- package/src/dz/index.ts +1 -0
- package/src/dz/nif.spec.ts +39 -0
- package/src/dz/nif.ts +80 -0
- package/src/ec/ci.spec.ts +28 -0
- package/src/ec/ci.ts +92 -0
- package/src/ec/index.ts +2 -0
- package/src/ec/ruc.spec.ts +37 -0
- package/src/ec/ruc.ts +117 -0
- package/src/ee/ik.spec.ts +28 -0
- package/src/ee/ik.ts +114 -0
- package/src/ee/index.ts +3 -0
- package/src/ee/kmkr.spec.ts +28 -0
- package/src/ee/kmkr.ts +76 -0
- package/src/ee/registrikood.spec.ts +28 -0
- package/src/ee/registrikood.ts +80 -0
- package/src/eg/index.ts +1 -0
- package/src/eg/tn.spec.ts +44 -0
- package/src/eg/tn.ts +96 -0
- package/src/es/cif.spec.ts +43 -0
- package/src/es/cif.ts +84 -0
- package/src/es/dni.spec.ts +28 -0
- package/src/es/dni.ts +83 -0
- package/src/es/index.ts +5 -0
- package/src/es/nie.spec.ts +28 -0
- package/src/es/nie.ts +79 -0
- package/src/es/nif.spec.ts +52 -0
- package/src/es/nif.ts +95 -0
- package/src/es/nss.spec.ts +28 -0
- package/src/es/nss.ts +132 -0
- package/src/exceptions.ts +66 -0
- package/src/fi/alv.spec.ts +28 -0
- package/src/fi/alv.ts +76 -0
- package/src/fi/hetu.spec.ts +37 -0
- package/src/fi/hetu.ts +108 -0
- package/src/fi/index.ts +3 -0
- package/src/fi/ytunnus.spec.ts +28 -0
- package/src/fi/ytunnus.ts +49 -0
- package/src/fo/index.ts +1 -0
- package/src/fo/vn.spec.ts +34 -0
- package/src/fo/vn.ts +71 -0
- package/src/fr/index.ts +5 -0
- package/src/fr/nif.spec.ts +34 -0
- package/src/fr/nif.ts +82 -0
- package/src/fr/nir.spec.ts +36 -0
- package/src/fr/nir.ts +98 -0
- package/src/fr/siren.spec.ts +28 -0
- package/src/fr/siren.ts +68 -0
- package/src/fr/siret.spec.ts +38 -0
- package/src/fr/siret.ts +79 -0
- package/src/fr/tva.spec.ts +40 -0
- package/src/fr/tva.ts +125 -0
- package/src/gb/index.ts +3 -0
- package/src/gb/nino-prefixes.ts +245 -0
- package/src/gb/nino.spec.ts +80 -0
- package/src/gb/nino.ts +80 -0
- package/src/gb/utr.spec.ts +28 -0
- package/src/gb/utr.ts +76 -0
- package/src/gb/vat.spec.ts +40 -0
- package/src/gb/vat.ts +112 -0
- package/src/gen/ean.spec.ts +34 -0
- package/src/gen/ean.ts +71 -0
- package/src/gen/index.ts +1 -0
- package/src/gh/index.ts +1 -0
- package/src/gh/tin.spec.ts +42 -0
- package/src/gh/tin.ts +93 -0
- package/src/gn/index.ts +1 -0
- package/src/gn/nifp.spec.ts +40 -0
- package/src/gn/nifp.ts +72 -0
- package/src/gr/amka.spec.ts +28 -0
- package/src/gr/amka.ts +76 -0
- package/src/gr/index.ts +2 -0
- package/src/gr/vat.spec.ts +34 -0
- package/src/gr/vat.ts +84 -0
- package/src/gt/cui.spec.ts +34 -0
- package/src/gt/cui.ts +110 -0
- package/src/gt/index.ts +2 -0
- package/src/gt/nit.spec.ts +34 -0
- package/src/gt/nit.ts +86 -0
- package/src/hk/hkid.spec.ts +52 -0
- package/src/hk/hkid.ts +90 -0
- package/src/hk/index.ts +1 -0
- package/src/hr/index.ts +1 -0
- package/src/hr/oib.spec.ts +28 -0
- package/src/hr/oib.ts +67 -0
- package/src/hu/anum.spec.ts +28 -0
- package/src/hu/anum.ts +71 -0
- package/src/hu/index.ts +1 -0
- package/src/id/index.ts +1 -0
- package/src/id/npwp.spec.ts +34 -0
- package/src/id/npwp.ts +116 -0
- package/src/ie/index.ts +2 -0
- package/src/ie/pps.spec.ts +58 -0
- package/src/ie/pps.ts +81 -0
- package/src/ie/vat.spec.ts +40 -0
- package/src/ie/vat.ts +99 -0
- package/src/il/hp.spec.ts +38 -0
- package/src/il/hp.ts +75 -0
- package/src/il/idnr.spec.ts +28 -0
- package/src/il/idnr.ts +70 -0
- package/src/il/index.ts +2 -0
- package/src/in/aadhaar.spec.ts +40 -0
- package/src/in/aadhaar.ts +85 -0
- package/src/in/epic.spec.ts +34 -0
- package/src/in/epic.ts +85 -0
- package/src/in/gstin.spec.ts +34 -0
- package/src/in/gstin.ts +156 -0
- package/src/in/index.ts +4 -0
- package/src/in/pan.spec.ts +40 -0
- package/src/in/pan.ts +93 -0
- package/src/index.ts +404 -0
- package/src/is/index.ts +2 -0
- package/src/is/kennitala.spec.ts +46 -0
- package/src/is/kennitala.ts +80 -0
- package/src/is/vsk.spec.ts +22 -0
- package/src/is/vsk.ts +60 -0
- package/src/it/aic.spec.ts +40 -0
- package/src/it/aic.ts +97 -0
- package/src/it/codicefiscale.spec.ts +28 -0
- package/src/it/codicefiscale.ts +167 -0
- package/src/it/index.ts +3 -0
- package/src/it/iva.spec.ts +28 -0
- package/src/it/iva.ts +65 -0
- package/src/jp/cn.spec.ts +28 -0
- package/src/jp/cn.ts +77 -0
- package/src/jp/index.ts +1 -0
- package/src/ke/index.ts +1 -0
- package/src/ke/pin.spec.ts +34 -0
- package/src/ke/pin.ts +77 -0
- package/src/kr/brn.spec.ts +28 -0
- package/src/kr/brn.ts +91 -0
- package/src/kr/index.ts +2 -0
- package/src/kr/rrn.spec.ts +34 -0
- package/src/kr/rrn.ts +104 -0
- package/src/li/index.ts +1 -0
- package/src/li/peid.spec.ts +22 -0
- package/src/li/peid.ts +71 -0
- package/src/lt/asmens.spec.ts +28 -0
- package/src/lt/asmens.ts +73 -0
- package/src/lt/index.ts +2 -0
- package/src/lt/pvm.spec.ts +34 -0
- package/src/lt/pvm.ts +75 -0
- package/src/lu/index.ts +1 -0
- package/src/lu/tva.spec.ts +28 -0
- package/src/lu/tva.ts +70 -0
- package/src/lv/index.ts +1 -0
- package/src/lv/pvn.spec.ts +44 -0
- package/src/lv/pvn.ts +102 -0
- package/src/ma/ice.spec.ts +39 -0
- package/src/ma/ice.ts +72 -0
- package/src/ma/ice9.spec.ts +28 -0
- package/src/ma/ice9.ts +62 -0
- package/src/ma/index.ts +2 -0
- package/src/mc/index.ts +1 -0
- package/src/mc/tva.spec.ts +28 -0
- package/src/mc/tva.ts +67 -0
- package/src/md/idno.spec.ts +28 -0
- package/src/md/idno.ts +78 -0
- package/src/md/index.ts +1 -0
- package/src/me/index.ts +2 -0
- package/src/me/jmbg.ts +17 -0
- package/src/me/pib.spec.ts +158 -0
- package/src/me/pib.ts +77 -0
- package/src/mk/edb.spec.ts +50 -0
- package/src/mk/edb.ts +88 -0
- package/src/mk/index.ts +2 -0
- package/src/mk/jmbg.ts +17 -0
- package/src/mt/index.ts +1 -0
- package/src/mt/vat.spec.ts +28 -0
- package/src/mt/vat.ts +69 -0
- package/src/mu/index.ts +1 -0
- package/src/mu/nid.spec.ts +34 -0
- package/src/mu/nid.ts +89 -0
- package/src/mx/banks.ts +658 -0
- package/src/mx/clabe.spec.ts +68 -0
- package/src/mx/clabe.ts +105 -0
- package/src/mx/curp.spec.ts +28 -0
- package/src/mx/curp.ts +261 -0
- package/src/mx/index.ts +3 -0
- package/src/mx/rfc.spec.ts +69 -0
- package/src/mx/rfc.ts +193 -0
- package/src/my/index.ts +1 -0
- package/src/my/nric.spec.ts +40 -0
- package/src/my/nric.ts +91 -0
- package/src/nl/bsn.spec.ts +68 -0
- package/src/nl/bsn.ts +81 -0
- package/src/nl/btw.spec.ts +40 -0
- package/src/nl/btw.ts +95 -0
- package/src/nl/index.ts +3 -0
- package/src/nl/onderwijsnummer.spec.ts +34 -0
- package/src/nl/onderwijsnummer.ts +77 -0
- package/src/no/fodselsnummer.spec.ts +56 -0
- package/src/no/fodselsnummer.ts +118 -0
- package/src/no/index.ts +4 -0
- package/src/no/kontonr.spec.ts +34 -0
- package/src/no/kontonr.ts +84 -0
- package/src/no/mva.spec.ts +28 -0
- package/src/no/mva.ts +80 -0
- package/src/no/orgnr.spec.ts +28 -0
- package/src/no/orgnr.ts +75 -0
- package/src/nz/bank.spec.ts +28 -0
- package/src/nz/bank.ts +238 -0
- package/src/nz/index.ts +2 -0
- package/src/nz/ird.spec.ts +34 -0
- package/src/nz/ird.ts +102 -0
- package/src/pe/ce.spec.ts +46 -0
- package/src/pe/ce.ts +61 -0
- package/src/pe/cui.spec.ts +28 -0
- package/src/pe/cui.ts +85 -0
- package/src/pe/index.ts +3 -0
- package/src/pe/ruc.spec.ts +46 -0
- package/src/pe/ruc.ts +84 -0
- package/src/pk/cnic.spec.ts +34 -0
- package/src/pk/cnic.ts +97 -0
- package/src/pk/index.ts +2 -0
- package/src/pk/ntn.spec.ts +22 -0
- package/src/pk/ntn.ts +65 -0
- package/src/pl/index.ts +3 -0
- package/src/pl/nip.spec.ts +34 -0
- package/src/pl/nip.ts +74 -0
- package/src/pl/pesel.spec.ts +34 -0
- package/src/pl/pesel.ts +97 -0
- package/src/pl/regon.spec.ts +52 -0
- package/src/pl/regon.ts +88 -0
- package/src/pt/cc.spec.ts +43 -0
- package/src/pt/cc.ts +74 -0
- package/src/pt/index.ts +3 -0
- package/src/pt/nif.spec.ts +28 -0
- package/src/pt/nif.ts +78 -0
- package/src/pt/nipc.ts +27 -0
- package/src/py/cedula.spec.ts +46 -0
- package/src/py/cedula.ts +73 -0
- package/src/py/index.ts +2 -0
- package/src/py/ruc.spec.ts +40 -0
- package/src/py/ruc.ts +93 -0
- package/src/ro/cif.spec.ts +40 -0
- package/src/ro/cif.ts +62 -0
- package/src/ro/cnp.spec.ts +50 -0
- package/src/ro/cnp.ts +158 -0
- package/src/ro/cui.spec.ts +28 -0
- package/src/ro/cui.ts +83 -0
- package/src/ro/index.ts +4 -0
- package/src/ro/onrc.spec.ts +28 -0
- package/src/ro/onrc.ts +109 -0
- package/src/rs/index.ts +2 -0
- package/src/rs/jmbg.ts +16 -0
- package/src/rs/pib.spec.ts +28 -0
- package/src/rs/pib.ts +69 -0
- package/src/ru/index.ts +1 -0
- package/src/ru/inn.spec.ts +32 -0
- package/src/ru/inn.ts +106 -0
- package/src/se/index.ts +3 -0
- package/src/se/orgnr.spec.ts +28 -0
- package/src/se/orgnr.ts +68 -0
- package/src/se/personnummer.spec.ts +45 -0
- package/src/se/personnummer.ts +143 -0
- package/src/se/vat.spec.ts +28 -0
- package/src/se/vat.ts +73 -0
- package/src/sg/index.ts +1 -0
- package/src/sg/uen.spec.ts +46 -0
- package/src/sg/uen.ts +209 -0
- package/src/si/ddv.spec.ts +28 -0
- package/src/si/ddv.ts +76 -0
- package/src/si/emso.spec.ts +15 -0
- package/src/si/emso.ts +27 -0
- package/src/si/index.ts +3 -0
- package/src/si/jmbg.ts +20 -0
- package/src/sk/dph.spec.ts +28 -0
- package/src/sk/dph.ts +71 -0
- package/src/sk/index.ts +2 -0
- package/src/sk/rc.ts +12 -0
- package/src/sm/coe.spec.ts +34 -0
- package/src/sm/coe.ts +80 -0
- package/src/sm/index.ts +1 -0
- package/src/sv/index.ts +1 -0
- package/src/sv/nit.spec.ts +34 -0
- package/src/sv/nit.ts +117 -0
- package/src/th/idnr.spec.ts +41 -0
- package/src/th/idnr.ts +80 -0
- package/src/th/index.ts +3 -0
- package/src/th/moa.spec.ts +62 -0
- package/src/th/moa.ts +85 -0
- package/src/th/tin.spec.ts +77 -0
- package/src/th/tin.ts +56 -0
- package/src/tn/index.ts +1 -0
- package/src/tn/mf.spec.ts +37 -0
- package/src/tn/mf.ts +169 -0
- package/src/tr/index.ts +2 -0
- package/src/tr/tckimlik.spec.ts +40 -0
- package/src/tr/tckimlik.ts +87 -0
- package/src/tr/vkn.spec.ts +28 -0
- package/src/tr/vkn.ts +87 -0
- package/src/tw/ban.spec.ts +28 -0
- package/src/tw/ban.ts +67 -0
- package/src/tw/index.ts +5 -0
- package/src/tw/natid.spec.ts +28 -0
- package/src/tw/natid.ts +105 -0
- package/src/tw/tax_code.spec.ts +34 -0
- package/src/tw/tax_code.ts +98 -0
- package/src/tw/ubn.spec.ts +28 -0
- package/src/tw/ubn.ts +80 -0
- package/src/tw/ui.spec.ts +38 -0
- package/src/tw/ui.ts +107 -0
- package/src/types.ts +82 -0
- package/src/ua/edrpou.spec.ts +28 -0
- package/src/ua/edrpou.ts +88 -0
- package/src/ua/index.ts +2 -0
- package/src/ua/rntrc.spec.ts +28 -0
- package/src/ua/rntrc.ts +77 -0
- package/src/us/ein.spec.ts +28 -0
- package/src/us/ein.ts +179 -0
- package/src/us/index.ts +2 -0
- package/src/us/ssn.spec.ts +28 -0
- package/src/us/ssn.ts +117 -0
- package/src/util/checksum.spec.ts +70 -0
- package/src/util/checksum.ts +258 -0
- package/src/util/index.ts +13 -0
- package/src/util/isValidDate.spec.ts +49 -0
- package/src/util/isValidDate.ts +87 -0
- package/src/util/iso7064.spec.ts +17 -0
- package/src/util/iso7064.ts +8 -0
- package/src/util/pymod.ts +8 -0
- package/src/util/strings/char.ts +18 -0
- package/src/util/strings/clean.spec.ts +15 -0
- package/src/util/strings/clean.ts +305 -0
- package/src/util/strings/format.ts +18 -0
- package/src/util/strings/index.ts +5 -0
- package/src/util/strings/reverseString.ts +3 -0
- package/src/util/strings/splitAt.spec.ts +15 -0
- package/src/util/strings/splitAt.ts +16 -0
- package/src/uy/cedula.spec.ts +28 -0
- package/src/uy/cedula.ts +74 -0
- package/src/uy/index.ts +3 -0
- package/src/uy/nie.spec.ts +28 -0
- package/src/uy/nie.ts +84 -0
- package/src/uy/rut.spec.ts +34 -0
- package/src/uy/rut.ts +99 -0
- package/src/ve/index.ts +1 -0
- package/src/ve/rif.spec.ts +38 -0
- package/src/ve/rif.ts +92 -0
- package/src/vn/index.ts +1 -0
- package/src/vn/mst.spec.ts +40 -0
- package/src/vn/mst.ts +100 -0
- package/src/za/idnr.spec.ts +28 -0
- package/src/za/idnr.ts +84 -0
- package/src/za/index.ts +2 -0
- package/src/za/tin.spec.ts +28 -0
- 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,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
|
+
});
|
package/src/uy/cedula.ts
ADDED
|
@@ -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;
|
package/src/uy/index.ts
ADDED
|
@@ -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
|
+
});
|