stdnum 1.9.16 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/at/vnr.js +2 -2
- package/lib/cjs/ba/jmbg.js +2 -2
- package/lib/cjs/cn/ric.js +2 -2
- package/lib/cjs/cu/ni.js +2 -2
- package/lib/cjs/cz/rc.js +2 -2
- package/lib/cjs/de/pwnr.js +2 -2
- package/lib/cjs/dk/cpr.js +7 -7
- package/lib/cjs/ee/ik.js +2 -2
- package/lib/cjs/fi/hetu.js +2 -3
- package/lib/cjs/gr/amka.js +2 -2
- package/lib/cjs/is/kennitala.js +2 -2
- package/lib/cjs/kr/rrn.js +2 -2
- package/lib/cjs/lv/pvn.js +2 -2
- package/lib/cjs/mx/curp.d.ts +1 -1
- package/lib/cjs/mx/curp.js +7 -11
- package/lib/cjs/mx/rfc.js +2 -2
- package/lib/cjs/my/nric.js +2 -2
- package/lib/cjs/no/fodselsnummer.js +3 -3
- package/lib/cjs/pl/pesel.js +2 -2
- package/lib/cjs/ro/cnp.js +2 -2
- package/lib/cjs/se/personnummer.js +34 -7
- package/lib/cjs/tw/tax_code.js +3 -3
- package/lib/cjs/util/index.d.ts +1 -1
- package/lib/cjs/util/index.js +4 -2
- package/lib/cjs/util/isValidDate.d.ts +6 -4
- package/lib/cjs/util/isValidDate.js +28 -12
- package/lib/cjs/za/idnr.js +2 -3
- package/lib/esm/at/vnr.js +2 -2
- package/lib/esm/ba/jmbg.js +3 -3
- package/lib/esm/cn/ric.js +2 -2
- package/lib/esm/cu/ni.js +3 -3
- package/lib/esm/cz/rc.js +3 -3
- package/lib/esm/de/pwnr.js +2 -2
- package/lib/esm/dk/cpr.js +8 -8
- package/lib/esm/ee/ik.js +2 -2
- package/lib/esm/fi/hetu.js +3 -4
- package/lib/esm/gr/amka.js +3 -3
- package/lib/esm/is/kennitala.js +3 -3
- package/lib/esm/kr/rrn.js +2 -2
- package/lib/esm/lv/pvn.js +3 -3
- package/lib/esm/mx/curp.d.ts +1 -1
- package/lib/esm/mx/curp.js +8 -12
- package/lib/esm/mx/rfc.js +2 -2
- package/lib/esm/my/nric.js +2 -2
- package/lib/esm/no/fodselsnummer.js +3 -3
- package/lib/esm/pl/pesel.js +2 -2
- package/lib/esm/ro/cnp.js +2 -2
- package/lib/esm/se/personnummer.js +35 -8
- package/lib/esm/tw/tax_code.js +3 -3
- package/lib/esm/util/index.d.ts +1 -1
- package/lib/esm/util/index.js +2 -2
- package/lib/esm/util/isValidDate.d.ts +6 -4
- package/lib/esm/util/isValidDate.js +25 -11
- package/lib/esm/za/idnr.js +3 -4
- 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
package/src/es/dni.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DNI (Documento Nacional de Identidad, Spanish personal identity codes).
|
|
3
|
+
*
|
|
4
|
+
* The DNI is a 9 digit number used to identify Spanish citizens. The last
|
|
5
|
+
* digit is a checksum letter.
|
|
6
|
+
*
|
|
7
|
+
* Foreign nationals, since 2010 are issued an NIE (Número de Identificación
|
|
8
|
+
* de Extranjeros, Foreigner's Identity Number) instead.
|
|
9
|
+
*
|
|
10
|
+
* Sources:
|
|
11
|
+
* https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/SPAIN-TIN.pdf
|
|
12
|
+
*
|
|
13
|
+
* PERSON
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import * as exceptions from '../exceptions';
|
|
17
|
+
import { strings } from '../util';
|
|
18
|
+
import { Validator, ValidateReturn } from '../types';
|
|
19
|
+
|
|
20
|
+
const checkDigits = 'TRWAGMYFPDXBNJZSQVHLCKE';
|
|
21
|
+
|
|
22
|
+
export function calcCheckDigit(value: string): string {
|
|
23
|
+
return checkDigits[parseInt(value.substr(0, 8), 10) % 23];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
27
|
+
return strings.cleanUnicode(input, ' -');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const impl: Validator = {
|
|
31
|
+
name: 'Spanish Personal Identify Code',
|
|
32
|
+
localName: 'Documento Nacional de Identidad',
|
|
33
|
+
abbreviation: 'DNI',
|
|
34
|
+
compact(input: string): string {
|
|
35
|
+
const [value, err] = clean(input);
|
|
36
|
+
|
|
37
|
+
if (err) {
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return value;
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
format(input: string): string {
|
|
45
|
+
const [value] = clean(input);
|
|
46
|
+
|
|
47
|
+
return strings.splitAt(value, 8).join('-');
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
validate(input: string): ValidateReturn {
|
|
51
|
+
const [value, error] = clean(input);
|
|
52
|
+
|
|
53
|
+
if (error) {
|
|
54
|
+
return { isValid: false, error };
|
|
55
|
+
}
|
|
56
|
+
if (value.length !== 9) {
|
|
57
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const [body, check] = strings.splitAt(value, 8);
|
|
61
|
+
|
|
62
|
+
if ('KLM'.includes(body[0]) && strings.isdigits(body.substring(1))) {
|
|
63
|
+
// Currently no test data for these cases, so
|
|
64
|
+
// we're assuming they're good based on format
|
|
65
|
+
} else if (!strings.isdigits(body)) {
|
|
66
|
+
// Not all digits in the body, it's not valid
|
|
67
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
68
|
+
} else if (calcCheckDigit(body) !== check) {
|
|
69
|
+
// Check the checksum on a non-[KLM] person
|
|
70
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
isValid: true,
|
|
75
|
+
compact: value,
|
|
76
|
+
isIndividual: true,
|
|
77
|
+
isCompany: false,
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
83
|
+
impl;
|
package/src/es/index.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { validate, format } from './nie';
|
|
2
|
+
import { InvalidLength, InvalidChecksum } from '../exceptions';
|
|
3
|
+
|
|
4
|
+
describe('es/nie', () => {
|
|
5
|
+
it('format:x-2482300w', () => {
|
|
6
|
+
const result = format('x-2482300w');
|
|
7
|
+
|
|
8
|
+
expect(result).toEqual('X-2482300-W');
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('validate:x-2482300w', () => {
|
|
12
|
+
const result = validate('x-2482300w');
|
|
13
|
+
|
|
14
|
+
expect(result.isValid && result.compact).toEqual('X2482300W');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('validate:X2482300', () => {
|
|
18
|
+
const result = validate('X2482300');
|
|
19
|
+
|
|
20
|
+
expect(result.error).toBeInstanceOf(InvalidLength);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('validate:x-2482300a', () => {
|
|
24
|
+
const result = validate('x-2482300a');
|
|
25
|
+
|
|
26
|
+
expect(result.error).toBeInstanceOf(InvalidChecksum);
|
|
27
|
+
});
|
|
28
|
+
});
|
package/src/es/nie.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NIE (Número de Identificación de Extranjero, Spanish foreigner number).
|
|
3
|
+
*
|
|
4
|
+
* The NIE is an identification number for foreigners. It is a 9 digit number
|
|
5
|
+
* where the first digit is either X, Y or Z and last digit is a checksum
|
|
6
|
+
* letter.
|
|
7
|
+
*
|
|
8
|
+
* Sources:
|
|
9
|
+
* https://es.wikipedia.org/wiki/N%C3%BAmero_de_identidad_de_extranjero
|
|
10
|
+
*
|
|
11
|
+
* PERSON
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import * as exceptions from '../exceptions';
|
|
15
|
+
import { strings } from '../util';
|
|
16
|
+
import * as dni from './dni';
|
|
17
|
+
import { Validator, ValidateReturn } from '../types';
|
|
18
|
+
|
|
19
|
+
const checkDigits = 'XYZ';
|
|
20
|
+
|
|
21
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
22
|
+
return strings.cleanUnicode(input, ' -');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const impl: Validator = {
|
|
26
|
+
name: 'Spanish Foreign Number',
|
|
27
|
+
localName: 'Número de Identificación de Extranjero',
|
|
28
|
+
abbreviation: 'NIE',
|
|
29
|
+
compact(input: string): string {
|
|
30
|
+
const [value, err] = clean(input);
|
|
31
|
+
|
|
32
|
+
if (err) {
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return value;
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
format(input: string): string {
|
|
40
|
+
const [value] = clean(input);
|
|
41
|
+
|
|
42
|
+
return strings.splitAt(value, 1, 8).join('-');
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
validate(input: string): ValidateReturn {
|
|
46
|
+
const [value, error] = clean(input);
|
|
47
|
+
|
|
48
|
+
if (error) {
|
|
49
|
+
return { isValid: false, error };
|
|
50
|
+
}
|
|
51
|
+
if (value.length !== 9) {
|
|
52
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const [first, body, check] = strings.splitAt(value, 1, 8);
|
|
56
|
+
|
|
57
|
+
if (
|
|
58
|
+
!strings.isdigits(body) ||
|
|
59
|
+
!checkDigits.includes(first) ||
|
|
60
|
+
strings.isdigits(check)
|
|
61
|
+
) {
|
|
62
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (dni.calcCheckDigit(`${checkDigits.indexOf(first)}${body}`) !== check) {
|
|
66
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
isValid: true,
|
|
71
|
+
compact: value,
|
|
72
|
+
isIndividual: true,
|
|
73
|
+
isCompany: false,
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
79
|
+
impl;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { validate, format } from './nif';
|
|
2
|
+
import { InvalidLength, InvalidChecksum } from '../exceptions';
|
|
3
|
+
|
|
4
|
+
describe('es/nif', () => {
|
|
5
|
+
it('format:ES B58378431', () => {
|
|
6
|
+
const result = format('ES B58378431');
|
|
7
|
+
|
|
8
|
+
expect(result).toEqual('B-58378431');
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('validate:ES B-58378431', () => {
|
|
12
|
+
const result = validate('ES B-58378431');
|
|
13
|
+
|
|
14
|
+
expect(result.isValid && result.compact).toEqual('B58378431');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('validate:B64717838', () => {
|
|
18
|
+
const result = validate('B64717838');
|
|
19
|
+
|
|
20
|
+
expect(result.isValid && result.compact).toEqual('B64717838');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('validate:54362315K', () => {
|
|
24
|
+
const result = validate('54362315K');
|
|
25
|
+
|
|
26
|
+
expect(result.isValid && result.compact).toEqual('54362315K');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('validate:X-5253868-R', () => {
|
|
30
|
+
const result = validate('X-5253868-R');
|
|
31
|
+
|
|
32
|
+
expect(result.isValid && result.compact).toEqual('X5253868R');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('validate:M-1234567-L', () => {
|
|
36
|
+
const result = validate('M-1234567-L');
|
|
37
|
+
|
|
38
|
+
expect(result.isValid && result.compact).toEqual('M1234567L');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('validate:B647178390', () => {
|
|
42
|
+
const result = validate('54362315');
|
|
43
|
+
|
|
44
|
+
expect(result.error).toBeInstanceOf(InvalidLength);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('validate:B64717839', () => {
|
|
48
|
+
const result = validate('B64717839');
|
|
49
|
+
|
|
50
|
+
expect(result.error).toBeInstanceOf(InvalidChecksum);
|
|
51
|
+
});
|
|
52
|
+
});
|
package/src/es/nif.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NIF (Número de Identificación Fiscal, Spanish VAT number).
|
|
3
|
+
*
|
|
4
|
+
* The Spanish VAT number is a 9-digit number where either the first, last
|
|
5
|
+
* digits or both can be letters.
|
|
6
|
+
* The number is either a DNI (Documento Nacional de Identidad, for
|
|
7
|
+
*
|
|
8
|
+
* Spaniards), a NIE (Número de Identificación de Extranjero, for
|
|
9
|
+
* foreigners) or a CIF (Código de Identificación Fiscal, for legal
|
|
10
|
+
* entities and others).
|
|
11
|
+
*
|
|
12
|
+
* VAT (PERSON/ENTITY)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import * as exceptions from '../exceptions';
|
|
16
|
+
import { strings } from '../util';
|
|
17
|
+
import { Validator, ValidateReturn } from '../types';
|
|
18
|
+
import * as nie from './nie';
|
|
19
|
+
import * as dni from './dni';
|
|
20
|
+
import * as cif from './cif';
|
|
21
|
+
|
|
22
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
23
|
+
const [value, err] = strings.cleanUnicode(input, ' -./');
|
|
24
|
+
|
|
25
|
+
if (err) {
|
|
26
|
+
return [value, err];
|
|
27
|
+
}
|
|
28
|
+
if (value.startsWith('ES')) {
|
|
29
|
+
return [value.substr(2), null];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return [value, null];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const impl: Validator = {
|
|
36
|
+
name: 'Spanish VAT Number',
|
|
37
|
+
localName: 'Número de Identificación Fiscal',
|
|
38
|
+
abbreviation: 'NIF',
|
|
39
|
+
compact(input: string): string {
|
|
40
|
+
const [value, err] = clean(input);
|
|
41
|
+
|
|
42
|
+
if (err) {
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return value;
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
format(input: string): string {
|
|
50
|
+
const [value] = clean(input);
|
|
51
|
+
|
|
52
|
+
return strings.splitAt(value, 1).join('-');
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
validate(input: string): ValidateReturn {
|
|
56
|
+
const [value, error] = clean(input);
|
|
57
|
+
|
|
58
|
+
if (error) {
|
|
59
|
+
return { isValid: false, error };
|
|
60
|
+
}
|
|
61
|
+
if (value.length !== 9) {
|
|
62
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if ('KLM'.includes(value[0])) {
|
|
66
|
+
// K: Spanish younger than 14 year old
|
|
67
|
+
// L: Spanish living outside Spain without DNI
|
|
68
|
+
// M: granted the tax to foreigners who have no NIE
|
|
69
|
+
// these use the old checkdigit algorithm (the DNI one)
|
|
70
|
+
if (value[value.length - 1] !== dni.calcCheckDigit(value.substr(1))) {
|
|
71
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
isValid: true,
|
|
75
|
+
compact: value,
|
|
76
|
+
isIndividual: true,
|
|
77
|
+
isCompany: false,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (strings.isdigits(value[0])) {
|
|
81
|
+
// Natural resident (DNI)
|
|
82
|
+
return dni.validate(value);
|
|
83
|
+
}
|
|
84
|
+
if ('XYZ'.includes(value[0])) {
|
|
85
|
+
// Foreign natural person (NIE)
|
|
86
|
+
return nie.validate(value);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Otherwise it has to be a (CIF)
|
|
90
|
+
return cif.validate(value);
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
95
|
+
impl;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { validate, format } from './nss';
|
|
2
|
+
import { InvalidLength, InvalidComponent } from '../exceptions';
|
|
3
|
+
|
|
4
|
+
describe('es/nss', () => {
|
|
5
|
+
it('format:281234567840', () => {
|
|
6
|
+
const result = format('281234567840');
|
|
7
|
+
|
|
8
|
+
expect('28-1234567840').toEqual(result);
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it.each(['281234567840'])('validate:%s', (value: string) => {
|
|
12
|
+
const result = validate(value);
|
|
13
|
+
|
|
14
|
+
expect(value).toEqual(result.isValid && result.compact);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('validate:77 12345678 40', () => {
|
|
18
|
+
const result = validate('77 12345678 40');
|
|
19
|
+
|
|
20
|
+
expect(result.error).toBeInstanceOf(InvalidComponent);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('validate:28 12345678 4', () => {
|
|
24
|
+
const result = validate('28 12345678 4');
|
|
25
|
+
|
|
26
|
+
expect(result.error).toBeInstanceOf(InvalidLength);
|
|
27
|
+
});
|
|
28
|
+
});
|
package/src/es/nss.ts
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NSS (El número de Seguridad Social, Social Security Number).
|
|
3
|
+
*
|
|
4
|
+
* The SSN is a tax identification number for individuals entities. It has 12 digits
|
|
5
|
+
* where where the first 2 digits indicate province, followed by 8 digits and
|
|
6
|
+
* a 2 digit checksum
|
|
7
|
+
*
|
|
8
|
+
* Sources:
|
|
9
|
+
* https://cis.ier.hit-u.ac.jp/English/society/conference1001/delgado-paper.pdf
|
|
10
|
+
* https://www.grupoalquerque.es/ferias/2012/archivos/digitos/codigo_seguridad_social.pdf
|
|
11
|
+
*
|
|
12
|
+
* TAX/PERSON
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import * as exceptions from '../exceptions';
|
|
16
|
+
import { strings } from '../util';
|
|
17
|
+
import { Validator, ValidateReturn } from '../types';
|
|
18
|
+
|
|
19
|
+
const PROVINCES = {
|
|
20
|
+
ÁLAVA: '01',
|
|
21
|
+
ALBACETE: '02',
|
|
22
|
+
ALICANTE: '03',
|
|
23
|
+
ALMERÍA: '04',
|
|
24
|
+
ASTURIAS: '33',
|
|
25
|
+
ÁVILA: '05',
|
|
26
|
+
BADAJOZ: '06',
|
|
27
|
+
BALEARES: '07',
|
|
28
|
+
BARCELONA: '08',
|
|
29
|
+
BURGOS: '09',
|
|
30
|
+
CÁCERES: '10',
|
|
31
|
+
CÁDIZ: '11',
|
|
32
|
+
CANTABRIA: '39',
|
|
33
|
+
CASTELLÓN: '12',
|
|
34
|
+
'CIUDAD REAL': '13',
|
|
35
|
+
CÓRDOBA: '14',
|
|
36
|
+
CORUÑA: '15',
|
|
37
|
+
CUENCA: '16',
|
|
38
|
+
GERONA: '17',
|
|
39
|
+
GRANADA: '18',
|
|
40
|
+
GUADALAJARA: '19',
|
|
41
|
+
GUIPÚZCOA: '20',
|
|
42
|
+
HUELVA: '21',
|
|
43
|
+
HUESCA: '22',
|
|
44
|
+
JAÉN: '23',
|
|
45
|
+
LEÓN: '24',
|
|
46
|
+
LÉRIDA: '25',
|
|
47
|
+
LUGO: '27',
|
|
48
|
+
MADRID: '28',
|
|
49
|
+
MÁLAGA: '29',
|
|
50
|
+
MURCIA: '30',
|
|
51
|
+
NAVARRA: '31',
|
|
52
|
+
ORENSE: '32',
|
|
53
|
+
PALENCIA: '34',
|
|
54
|
+
'PALMAS (LAS)': '35',
|
|
55
|
+
PONTEVEDRA: '36',
|
|
56
|
+
'RIOJA (LA)': '26',
|
|
57
|
+
SALAMANCA: '37',
|
|
58
|
+
'SANTA CRUZ DE TENERIFE': '38',
|
|
59
|
+
SEGOVIA: '40',
|
|
60
|
+
SEVILLA: '41',
|
|
61
|
+
SORIA: '42',
|
|
62
|
+
TARRAGONA: '43',
|
|
63
|
+
TERUEL: '44',
|
|
64
|
+
TOLEDO: '45',
|
|
65
|
+
VALENCIA: '46',
|
|
66
|
+
VALLADOLID: '47',
|
|
67
|
+
VIZCAYA: '48',
|
|
68
|
+
ZAMORA: '49',
|
|
69
|
+
ZARAGOZA: '50',
|
|
70
|
+
'OTROS TERRITORIOS': '53',
|
|
71
|
+
EXTRANJERO: '66',
|
|
72
|
+
};
|
|
73
|
+
const VALID_PROVINCES = Object.values(PROVINCES);
|
|
74
|
+
|
|
75
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
76
|
+
return strings.cleanUnicode(input, ' -/');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const impl: Validator = {
|
|
80
|
+
name: 'Spanish Social Security Number',
|
|
81
|
+
localName: 'Número de Seguridad Social',
|
|
82
|
+
abbreviation: 'NSS',
|
|
83
|
+
compact(input: string): string {
|
|
84
|
+
const [value, err] = clean(input);
|
|
85
|
+
|
|
86
|
+
if (err) {
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return value;
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
format(input: string): string {
|
|
94
|
+
const [value] = clean(input);
|
|
95
|
+
|
|
96
|
+
return strings.splitAt(value, 2).join('-');
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
validate(input: string): ValidateReturn {
|
|
100
|
+
const [value, error] = clean(input);
|
|
101
|
+
|
|
102
|
+
if (error) {
|
|
103
|
+
return { isValid: false, error };
|
|
104
|
+
}
|
|
105
|
+
if (value.length !== 12) {
|
|
106
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (!strings.isdigits(value)) {
|
|
110
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const [province, body, check] = strings.splitAt(value, 2, 10);
|
|
114
|
+
if (!VALID_PROVINCES.includes(province)) {
|
|
115
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (parseInt(province + body, 10) % 97 !== parseInt(check, 10)) {
|
|
119
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return {
|
|
123
|
+
isValid: true,
|
|
124
|
+
compact: value,
|
|
125
|
+
isIndividual: true,
|
|
126
|
+
isCompany: false,
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
132
|
+
impl;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/* eslint-disable max-classes-per-file */
|
|
2
|
+
/**
|
|
3
|
+
* Collection of exceptions.
|
|
4
|
+
* The validation functions of stdnum should raise one of the below exceptions
|
|
5
|
+
* when validation of the number fails.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Top-level error for validating numbers.
|
|
10
|
+
*
|
|
11
|
+
* This exception should normally not be raised, only subclasses of this
|
|
12
|
+
* exception.
|
|
13
|
+
*/
|
|
14
|
+
export class ValidationError extends Error {
|
|
15
|
+
constructor(msg: string) {
|
|
16
|
+
super(msg);
|
|
17
|
+
this.name = 'ValidationError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Something is wrong with the format of the number.
|
|
23
|
+
*
|
|
24
|
+
* This generally means characters or delimiters that are not allowed are
|
|
25
|
+
* part of the number or required parts are missing.
|
|
26
|
+
*/
|
|
27
|
+
export class InvalidFormat extends ValidationError {
|
|
28
|
+
constructor(msg = 'The number has an invlidad format.') {
|
|
29
|
+
super(msg);
|
|
30
|
+
this.name = 'InvalidFormat';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The number's internal checksum or check digit does not match.
|
|
36
|
+
*/
|
|
37
|
+
export class InvalidChecksum extends ValidationError {
|
|
38
|
+
constructor(msg = "The number number's checksum or check digit is invalid.") {
|
|
39
|
+
super(msg);
|
|
40
|
+
this.name = 'InvalidChecksum';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The length of the number is wrong
|
|
46
|
+
*/
|
|
47
|
+
export class InvalidLength extends ValidationError {
|
|
48
|
+
constructor(msg = 'The number has an invalid length.') {
|
|
49
|
+
super(msg);
|
|
50
|
+
this.name = 'InvalidLength';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* One of the parts of the number has an invalid reference.
|
|
56
|
+
*
|
|
57
|
+
* Some part of the number refers to some external entity like a country
|
|
58
|
+
* code, a date or a predefined collection of values. The number contains
|
|
59
|
+
* some invalid reference.
|
|
60
|
+
*/
|
|
61
|
+
export class InvalidComponent extends ValidationError {
|
|
62
|
+
constructor(msg = 'One of the parts of the number are invalid or unknown.') {
|
|
63
|
+
super(msg);
|
|
64
|
+
this.name = 'InvalidComponent';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { validate, format } from './alv';
|
|
2
|
+
import { InvalidLength, InvalidChecksum } from '../exceptions';
|
|
3
|
+
|
|
4
|
+
describe('fi/alv', () => {
|
|
5
|
+
it('format:FI 20774740', () => {
|
|
6
|
+
const result = format('FI 20774740');
|
|
7
|
+
|
|
8
|
+
expect(result).toEqual('20774740');
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('validate:FI 20774740', () => {
|
|
12
|
+
const result = validate('FI 20774740');
|
|
13
|
+
|
|
14
|
+
expect(result.isValid && result.compact).toEqual('20774740');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('validate:123458', () => {
|
|
18
|
+
const result = validate('123458');
|
|
19
|
+
|
|
20
|
+
expect(result.error).toBeInstanceOf(InvalidLength);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('validate:20774741', () => {
|
|
24
|
+
const result = validate('20774741');
|
|
25
|
+
|
|
26
|
+
expect(result.error).toBeInstanceOf(InvalidChecksum);
|
|
27
|
+
});
|
|
28
|
+
});
|
package/src/fi/alv.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ALV nro (Arvonlisäveronumero, Finnish VAT number).
|
|
3
|
+
*
|
|
4
|
+
* The number is an 8-digit code with a weighted checksum.
|
|
5
|
+
*
|
|
6
|
+
* ENTITY
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import * as exceptions from '../exceptions';
|
|
10
|
+
import { strings } from '../util';
|
|
11
|
+
import { Validator, ValidateReturn } from '../types';
|
|
12
|
+
import { weightedSum } from '../util/checksum';
|
|
13
|
+
|
|
14
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
15
|
+
const [value, err] = strings.cleanUnicode(input, ' ');
|
|
16
|
+
if (err !== null) {
|
|
17
|
+
return [value, err];
|
|
18
|
+
}
|
|
19
|
+
if (value.startsWith('FI')) {
|
|
20
|
+
return [value.substr(2), null];
|
|
21
|
+
}
|
|
22
|
+
return [value, null];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const impl: Validator = {
|
|
26
|
+
name: 'Finnish VAT Number',
|
|
27
|
+
localName: 'Arvonlisäveronumero Mervärdesskattenummer',
|
|
28
|
+
abbreviation: 'ALV nro',
|
|
29
|
+
compact(input: string): string {
|
|
30
|
+
const [value, err] = clean(input);
|
|
31
|
+
|
|
32
|
+
if (err) {
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return value;
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
format(input: string): string {
|
|
40
|
+
const [value] = clean(input);
|
|
41
|
+
|
|
42
|
+
return value;
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
validate(input: string): ValidateReturn {
|
|
46
|
+
const [value, error] = clean(input);
|
|
47
|
+
|
|
48
|
+
if (error) {
|
|
49
|
+
return { isValid: false, error };
|
|
50
|
+
}
|
|
51
|
+
if (value.length !== 8) {
|
|
52
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
53
|
+
}
|
|
54
|
+
if (!strings.isdigits(value)) {
|
|
55
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const sum = weightedSum(value, {
|
|
59
|
+
modulus: 11,
|
|
60
|
+
weights: [7, 9, 10, 5, 8, 4, 2, 1],
|
|
61
|
+
});
|
|
62
|
+
if (sum !== 0) {
|
|
63
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
isValid: true,
|
|
68
|
+
compact: value,
|
|
69
|
+
isIndividual: false,
|
|
70
|
+
isCompany: true,
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
76
|
+
impl;
|