stdnum 1.10.0 → 1.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/lib/cjs/in/gstin.js +3 -3
- package/lib/cjs/no/fodselsnummer.js +2 -2
- package/lib/cjs/tw/natid.js +8 -5
- package/lib/cjs/tw/ui.js +8 -5
- package/lib/esm/in/gstin.js +3 -3
- package/lib/esm/no/fodselsnummer.js +2 -2
- package/lib/esm/tw/natid.js +8 -5
- package/lib/esm/tw/ui.js +8 -5
- 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 +41 -0
- package/src/tw/natid.ts +109 -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 +49 -0
- package/src/tw/ui.ts +111 -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,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aadhaar (Indian digital resident personal identity number)
|
|
3
|
+
*
|
|
4
|
+
* Aadhaar is a 12 digit identification number that can be obtained by Indian
|
|
5
|
+
* citizens, non-residents passport holders of India and resident foreign
|
|
6
|
+
* nationals. The number is issued by the Unique Identification Authority of
|
|
7
|
+
* India (UIDAI).
|
|
8
|
+
*
|
|
9
|
+
* Aadhaar is made up of 12 digits where the last digits is a check digit
|
|
10
|
+
* calculated using the Verhoeff algorithm. The numbers are generated in a
|
|
11
|
+
* random, non-repeating sequence and do not begin with 0 or 1.
|
|
12
|
+
*
|
|
13
|
+
* Aadhaar is a 12 digit unique identity number issued to all Indian residents.
|
|
14
|
+
* The number is assigned by the Unique Identification Authority of India
|
|
15
|
+
* (UIDAI).
|
|
16
|
+
*
|
|
17
|
+
* Source
|
|
18
|
+
* https://web.archive.org/web/20140611025606/http://uidai.gov.in/UID_PDF/Working_Papers/A_UID_Numbering_Scheme.pdf
|
|
19
|
+
* https://en.wikipedia.org/wiki/Aadhaar
|
|
20
|
+
*
|
|
21
|
+
* PERSON
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import * as exceptions from '../exceptions';
|
|
25
|
+
import { strings } from '../util';
|
|
26
|
+
import { Validator, ValidateReturn } from '../types';
|
|
27
|
+
import { verhoeffValidate } from '../util/checksum';
|
|
28
|
+
|
|
29
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
30
|
+
return strings.cleanUnicode(input, ' -');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const impl: Validator = {
|
|
34
|
+
name: 'Indian Digital Resident Personal Identity Number',
|
|
35
|
+
localName: 'Aadhaar',
|
|
36
|
+
compact(input: string): string {
|
|
37
|
+
const [value, err] = clean(input);
|
|
38
|
+
|
|
39
|
+
if (err) {
|
|
40
|
+
throw err;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return value;
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
format(input: string): string {
|
|
47
|
+
const [value] = clean(input);
|
|
48
|
+
|
|
49
|
+
return strings.splitAt(value, 4, 8).join(' ');
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
validate(input: string): ValidateReturn {
|
|
53
|
+
const [value, error] = clean(input);
|
|
54
|
+
|
|
55
|
+
if (error) {
|
|
56
|
+
return { isValid: false, error };
|
|
57
|
+
}
|
|
58
|
+
if (value.length !== 12) {
|
|
59
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
60
|
+
}
|
|
61
|
+
if (!strings.isdigits(value)) {
|
|
62
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
63
|
+
}
|
|
64
|
+
if (value[0] === '0' || value[0] === '1') {
|
|
65
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
66
|
+
}
|
|
67
|
+
if (value.split('').reverse().join('') === value) {
|
|
68
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (!verhoeffValidate(value)) {
|
|
72
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
isValid: true,
|
|
77
|
+
compact: value,
|
|
78
|
+
isIndividual: true,
|
|
79
|
+
isCompany: false,
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
85
|
+
impl;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { validate, format } from './epic';
|
|
2
|
+
import { InvalidLength, InvalidChecksum } from '../exceptions';
|
|
3
|
+
|
|
4
|
+
describe('in/epic', () => {
|
|
5
|
+
it('format:WKH1186253', () => {
|
|
6
|
+
const result = format('WKH1186253');
|
|
7
|
+
|
|
8
|
+
expect(result).toEqual('WKH1186253');
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('fvalidate:WKH1186253', () => {
|
|
12
|
+
const result = validate('WKH1186253');
|
|
13
|
+
|
|
14
|
+
expect(result.isValid && result.compact).toEqual('WKH1186253');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test.each(['WKH1186253'])('validate:%s', value => {
|
|
18
|
+
const result = validate(value);
|
|
19
|
+
|
|
20
|
+
expect(result.isValid).toEqual(true);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('validate:WKH118625', () => {
|
|
24
|
+
const result = validate('WKH118625');
|
|
25
|
+
|
|
26
|
+
expect(result.error).toBeInstanceOf(InvalidLength);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('validate:WKH1186254', () => {
|
|
30
|
+
const result = validate('WKH1186254');
|
|
31
|
+
|
|
32
|
+
expect(result.error).toBeInstanceOf(InvalidChecksum);
|
|
33
|
+
});
|
|
34
|
+
});
|
package/src/in/epic.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EPIC (Electoral Photo Identity Card, Indian Voter ID).
|
|
3
|
+
*
|
|
4
|
+
* The Electoral Photo Identity Card (EPIC) is an identity document issued by
|
|
5
|
+
* the Election Commission of India (ECI) only to the India citizens who have
|
|
6
|
+
* reached the age of 18.
|
|
7
|
+
*
|
|
8
|
+
* Each EPIC contains an unique 10 digit alphanumeric identifier known as EPIC
|
|
9
|
+
* number or Voter ID number.
|
|
10
|
+
*
|
|
11
|
+
* Every EPIC number begins with a Functional Unique Serial Number (FUSN), a 3
|
|
12
|
+
* letter unique identifier for each Assembly Constituency. FUSN is followed by
|
|
13
|
+
* a 6 digit serial number and 1 check digit of the serial number calculated
|
|
14
|
+
* using Luhn algorithm.
|
|
15
|
+
*
|
|
16
|
+
* Source
|
|
17
|
+
* https://en.wikipedia.org/wiki/Voter_ID_(India)
|
|
18
|
+
* https://www.kotaksecurities.com/ksweb/voter-id/serial-number-in-elctoral-roll
|
|
19
|
+
*
|
|
20
|
+
* PERSON
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import * as exceptions from '../exceptions';
|
|
24
|
+
import { strings } from '../util';
|
|
25
|
+
import { Validator, ValidateReturn } from '../types';
|
|
26
|
+
import { luhnChecksumValidate } from '../util/checksum';
|
|
27
|
+
|
|
28
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
29
|
+
return strings.cleanUnicode(input, ' -');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const validRe = /^[A-Z]{3}[0-9]{7}$/;
|
|
33
|
+
|
|
34
|
+
const impl: Validator = {
|
|
35
|
+
name: 'Electoral Photo Identity Card',
|
|
36
|
+
localName: '',
|
|
37
|
+
abbreviation: 'EPIC',
|
|
38
|
+
|
|
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 value;
|
|
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 !== 10) {
|
|
62
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (!validRe.test(value)) {
|
|
66
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const [, front] = strings.splitAt(value, 3);
|
|
70
|
+
|
|
71
|
+
if (!luhnChecksumValidate(front)) {
|
|
72
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
isValid: true,
|
|
77
|
+
compact: value,
|
|
78
|
+
isIndividual: true,
|
|
79
|
+
isCompany: false,
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
85
|
+
impl;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { validate, format } from './gstin';
|
|
2
|
+
import { InvalidLength, InvalidChecksum } from '../exceptions';
|
|
3
|
+
|
|
4
|
+
describe('in/gstin', () => {
|
|
5
|
+
it('format:27AAPFU0939F1ZV', () => {
|
|
6
|
+
const result = format('27AAPFU0939F1ZV');
|
|
7
|
+
|
|
8
|
+
expect(result).toEqual('27AAPFU0939F1ZV');
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('fvalidate:27AAPFU0939F1ZV', () => {
|
|
12
|
+
const result = validate('27AAPFU0939F1ZV');
|
|
13
|
+
|
|
14
|
+
expect(result.isValid && result.compact).toEqual('27AAPFU0939F1ZV');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test.each(['27AAPFU0939F1ZV', '29AAGCB7383J1Z4'])('validate:%s', value => {
|
|
18
|
+
const result = validate(value);
|
|
19
|
+
|
|
20
|
+
expect(result.isValid).toEqual(true);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('validate:27AAPFU0939F1Z', () => {
|
|
24
|
+
const result = validate('27AAPFU0939F1Z');
|
|
25
|
+
|
|
26
|
+
expect(result.error).toBeInstanceOf(InvalidLength);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('validate:27AAPFU0939F1Z0', () => {
|
|
30
|
+
const result = validate('27AAPFU0939F1Z0');
|
|
31
|
+
|
|
32
|
+
expect(result.error).toBeInstanceOf(InvalidChecksum);
|
|
33
|
+
});
|
|
34
|
+
});
|
package/src/in/gstin.ts
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GSTIN (Goods and Services Tax identification number, Indian VAT number).
|
|
3
|
+
*
|
|
4
|
+
* The Goods and Services Tax identification number (GSTIN) is a 15 digit unique
|
|
5
|
+
* identifier assigned to all business entities in India registered under the
|
|
6
|
+
* Goods and Services Tax (GST) Act, 2017.
|
|
7
|
+
*
|
|
8
|
+
* Each GSTIN begins with a 2 digit state code, the next 10 characters are the
|
|
9
|
+
* holder's PAN, the 13th character is an alphanumeric digit that represents the
|
|
10
|
+
* number of GSTIN registrations made in a state or union territory for same the
|
|
11
|
+
* PAN, the 14th character is 'Z' and the last character is an alphanumeric
|
|
12
|
+
* check digit calculated using Luhn mod 36 algorithm.
|
|
13
|
+
*
|
|
14
|
+
* DESCRIPTION
|
|
15
|
+
*
|
|
16
|
+
* Source
|
|
17
|
+
* https://bajajfinserv.in/insights/what-is-goods-and-service-tax-identification-number
|
|
18
|
+
* https://ddvat.gov.in/docs/List%20of%20State%20Code.pdf
|
|
19
|
+
* https://en.wikipedia.org/wiki/Goods_and_Services_Tax_(India)
|
|
20
|
+
*
|
|
21
|
+
* ENTITY
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import * as exceptions from '../exceptions';
|
|
25
|
+
import { strings } from '../util';
|
|
26
|
+
import { Validator, ValidateReturn } from '../types';
|
|
27
|
+
import { validate as panValidate } from './pan';
|
|
28
|
+
|
|
29
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
30
|
+
return strings.cleanUnicode(input, ' -');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const validRe = /^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z][0-9A-Z]{3}$/;
|
|
34
|
+
|
|
35
|
+
const ALPHABET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
36
|
+
|
|
37
|
+
const STATE_CODES: Record<string, string> = {
|
|
38
|
+
'01': 'Jammu and Kashmir',
|
|
39
|
+
'02': 'Himachal Pradesh',
|
|
40
|
+
'03': 'Punjab',
|
|
41
|
+
'04': 'Chandigarh',
|
|
42
|
+
'05': 'Uttarakhand',
|
|
43
|
+
'06': 'Haryana',
|
|
44
|
+
'07': 'Delhi',
|
|
45
|
+
'08': 'Rajasthan',
|
|
46
|
+
'09': 'Uttar Pradesh',
|
|
47
|
+
'10': 'Bihar',
|
|
48
|
+
'11': 'Sikkim',
|
|
49
|
+
'12': 'Arunachal Pradesh',
|
|
50
|
+
'13': 'Nagaland',
|
|
51
|
+
'14': 'Manipur',
|
|
52
|
+
'15': 'Mizoram',
|
|
53
|
+
'16': 'Tripura',
|
|
54
|
+
'17': 'Meghalaya',
|
|
55
|
+
'18': 'Assam',
|
|
56
|
+
'19': 'West Bengal',
|
|
57
|
+
'20': 'Jharkhand',
|
|
58
|
+
'21': 'Orissa',
|
|
59
|
+
'22': 'Chattisgarh',
|
|
60
|
+
'23': 'Madhya Pradesh',
|
|
61
|
+
'24': 'Gujarat',
|
|
62
|
+
'25': 'Daman and Diu',
|
|
63
|
+
'26': 'Dadar and Nagar Haveli',
|
|
64
|
+
'27': 'Maharashtra',
|
|
65
|
+
'28': 'Andhra Pradesh',
|
|
66
|
+
'29': 'Karnataka',
|
|
67
|
+
'30': 'Goa',
|
|
68
|
+
'31': 'Lakshadweep',
|
|
69
|
+
'32': 'Kerala',
|
|
70
|
+
'33': 'Tamil Nadu',
|
|
71
|
+
'34': 'Puducherry',
|
|
72
|
+
'35': 'Anadaman and Nicobar Islands',
|
|
73
|
+
'36': 'Telangana',
|
|
74
|
+
'37': 'Andhra Pradesh (New)',
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const VALID_STATE_CODES = Object.keys(STATE_CODES);
|
|
78
|
+
|
|
79
|
+
const impl: Validator = {
|
|
80
|
+
name: 'Indian VAT Number',
|
|
81
|
+
localName: 'Goods and Services Tax Identification Number',
|
|
82
|
+
abbreviation: 'GSTIN',
|
|
83
|
+
|
|
84
|
+
compact(input: string): string {
|
|
85
|
+
const [value, err] = clean(input);
|
|
86
|
+
|
|
87
|
+
if (err) {
|
|
88
|
+
throw err;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return value;
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
format(input: string): string {
|
|
95
|
+
const [value] = clean(input);
|
|
96
|
+
|
|
97
|
+
return value;
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
validate(input: string): ValidateReturn {
|
|
101
|
+
const [value, error] = clean(input);
|
|
102
|
+
|
|
103
|
+
if (error) {
|
|
104
|
+
return { isValid: false, error };
|
|
105
|
+
}
|
|
106
|
+
if (value.length !== 15) {
|
|
107
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (!validRe.test(value)) {
|
|
111
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const [state, panValue] = strings.splitAt(value, 2, 12);
|
|
115
|
+
if (!VALID_STATE_CODES.includes(state)) {
|
|
116
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
117
|
+
}
|
|
118
|
+
if (value[12] === '0' || value[13] !== 'Z') {
|
|
119
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
120
|
+
}
|
|
121
|
+
if (!panValidate(panValue).isValid) {
|
|
122
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const [first, check] = strings.splitAt(value, -1);
|
|
126
|
+
|
|
127
|
+
const sum = first
|
|
128
|
+
.split('')
|
|
129
|
+
.map((char, index) => {
|
|
130
|
+
const product = ALPHABET.indexOf(char) * (index % 2 !== 0 ? 2 : 1);
|
|
131
|
+
|
|
132
|
+
return (
|
|
133
|
+
Math.floor(product / ALPHABET.length) + (product % ALPHABET.length)
|
|
134
|
+
);
|
|
135
|
+
})
|
|
136
|
+
.reduce((prev, current) => {
|
|
137
|
+
return prev + current;
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
const checksum =
|
|
141
|
+
(ALPHABET.length - (sum % ALPHABET.length)) % ALPHABET.length;
|
|
142
|
+
if (ALPHABET[checksum] !== check) {
|
|
143
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return {
|
|
147
|
+
isValid: true,
|
|
148
|
+
compact: value,
|
|
149
|
+
isIndividual: false,
|
|
150
|
+
isCompany: true,
|
|
151
|
+
};
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
156
|
+
impl;
|
package/src/in/index.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { validate, format } from './pan';
|
|
2
|
+
import { InvalidLength, InvalidFormat, InvalidComponent } from '../exceptions';
|
|
3
|
+
|
|
4
|
+
describe('in/pan', () => {
|
|
5
|
+
it('format:AAPPV8261K', () => {
|
|
6
|
+
const result = format('AAPPV8261K');
|
|
7
|
+
|
|
8
|
+
expect(result).toEqual('AAPPV8261K');
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('validate:ACUPA7085R', () => {
|
|
12
|
+
const result = validate('ACUPA7085R');
|
|
13
|
+
|
|
14
|
+
expect(result.isValid && result.compact).toEqual('ACUPA7085R');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('validate:ABMPA32111', () => {
|
|
18
|
+
const result = validate('ABMPA32111');
|
|
19
|
+
|
|
20
|
+
expect(result.error).toBeInstanceOf(InvalidFormat);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('validate:ABMXA3211G', () => {
|
|
24
|
+
const result = validate('ABMXA3211G');
|
|
25
|
+
|
|
26
|
+
expect(result.error).toBeInstanceOf(InvalidComponent);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('validate:234123412347', () => {
|
|
30
|
+
const result = validate('234123412347');
|
|
31
|
+
|
|
32
|
+
expect(result.error).toBeInstanceOf(InvalidLength);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// it('validate:2449/494/16/0', () => {
|
|
36
|
+
// const result = validate('2449/494/16/0');
|
|
37
|
+
|
|
38
|
+
// expect(result.error).toBeInstanceOf(InvalidChecksum);
|
|
39
|
+
// });
|
|
40
|
+
});
|
package/src/in/pan.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PAN (Permanent Account Number, Indian income tax identifier).
|
|
3
|
+
*
|
|
4
|
+
* The Permanent Account Number (PAN) is a 10 digit alphanumeric identifier for
|
|
5
|
+
* Indian individuals, families and corporates for income tax purposes. It is
|
|
6
|
+
* also issued to foreign nationals subject to a valid visa.
|
|
7
|
+
*
|
|
8
|
+
* PAN is made up of 5 letters, 4 digits and 1 alphabetic check digit. The 4th
|
|
9
|
+
* character indicates the type of holder, the 5th character is either 1st
|
|
10
|
+
* letter of the holder's name or holder's surname in case of 'Individual' PAN,
|
|
11
|
+
* next 4 digits are serial numbers running from 0001 to 9999 and the last
|
|
12
|
+
* character is a check digit computed by an undocumented checksum algorithm
|
|
13
|
+
*
|
|
14
|
+
* More information:
|
|
15
|
+
* https://en.wikipedia.org/wiki/Permanent_account_number
|
|
16
|
+
*
|
|
17
|
+
* ENTITY
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import * as exceptions from '../exceptions';
|
|
21
|
+
import { strings } from '../util';
|
|
22
|
+
import { Validator, ValidateReturn } from '../types';
|
|
23
|
+
|
|
24
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
25
|
+
return strings.cleanUnicode(input, ' -');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const PAN_HOLDER_TYPES: Record<string, string> = {
|
|
29
|
+
A: 'Association of Persons (AOP)',
|
|
30
|
+
B: 'Body of Individuals (BOI)',
|
|
31
|
+
C: 'Company',
|
|
32
|
+
F: 'Firm/Limited Liability Partnership',
|
|
33
|
+
G: 'Government Agency',
|
|
34
|
+
H: 'Hindu Undivided Family (HUF)',
|
|
35
|
+
L: 'Local Authority',
|
|
36
|
+
J: 'Artificial Juridical Person',
|
|
37
|
+
P: 'Individual',
|
|
38
|
+
T: 'Trust',
|
|
39
|
+
K: 'Krish (Trust Krish)',
|
|
40
|
+
};
|
|
41
|
+
const VALID_PAN_HOLDERS = Object.keys(PAN_HOLDER_TYPES);
|
|
42
|
+
|
|
43
|
+
const impl: Validator = {
|
|
44
|
+
name: 'Indian Income Tax Identifier',
|
|
45
|
+
localName: 'Permanent Account Number',
|
|
46
|
+
abbreviation: 'PAN',
|
|
47
|
+
compact(input: string): string {
|
|
48
|
+
const [value, err] = clean(input);
|
|
49
|
+
|
|
50
|
+
if (err) {
|
|
51
|
+
throw err;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return value;
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
format(input: string): string {
|
|
58
|
+
const [value] = clean(input);
|
|
59
|
+
|
|
60
|
+
return value;
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
validate(input: string): ValidateReturn {
|
|
64
|
+
const [value, error] = clean(input);
|
|
65
|
+
|
|
66
|
+
if (error) {
|
|
67
|
+
return { isValid: false, error };
|
|
68
|
+
}
|
|
69
|
+
if (value.length !== 10) {
|
|
70
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
71
|
+
}
|
|
72
|
+
if (!/^[A-Z]{5}[0-9]{4}[A-Z]$/.test(value)) {
|
|
73
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
74
|
+
}
|
|
75
|
+
if (!VALID_PAN_HOLDERS.includes(value[3])) {
|
|
76
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
77
|
+
}
|
|
78
|
+
const [, foo] = strings.splitAt(value, 5, 9);
|
|
79
|
+
if (foo === '0000') {
|
|
80
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
isValid: true,
|
|
85
|
+
compact: value,
|
|
86
|
+
isIndividual: false,
|
|
87
|
+
isCompany: true,
|
|
88
|
+
};
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
93
|
+
impl;
|