@stll/stdnum 1.0.0 → 2.0.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/README.md +1 -4
- package/dist/_checksums/luhn.js.map +1 -1
- package/dist/_checksums/mod1110.js +1 -1
- package/dist/_checksums/mod1110.js.map +1 -1
- package/dist/_checksums/mod112.js.map +1 -1
- package/dist/_checksums/mod97.js.map +1 -1
- package/dist/_checksums/verhoeff.js.map +1 -1
- package/dist/_checksums/weighted-sum.js.map +1 -1
- package/dist/_util/arabic.js.map +1 -1
- package/dist/_util/clean.js.map +1 -1
- package/dist/_util/date.js.map +1 -1
- package/dist/_util/generate.js.map +1 -1
- package/dist/_util/result.js.map +1 -1
- package/dist/_util/strings.js.map +1 -1
- package/dist/ad/nrt.d.ts +16 -2
- package/dist/ad/nrt.js +1 -14
- package/dist/ad/nrt.js.map +1 -1
- package/dist/ae/eid.d.ts +2 -2
- package/dist/ae/eid.js +2 -12
- package/dist/ae/eid.js.map +1 -1
- package/dist/ai/tin.d.ts +20 -2
- package/dist/ai/tin.js +1 -18
- package/dist/ai/tin.js.map +1 -1
- package/dist/al/nipt.d.ts +13 -2
- package/dist/al/nipt.js +1 -11
- package/dist/al/nipt.js.map +1 -1
- package/dist/am/tin.d.ts +16 -2
- package/dist/am/tin.js +1 -14
- package/dist/am/tin.js.map +1 -1
- package/dist/ar/cbu.d.ts +2 -2
- package/dist/ar/cbu.js +1 -9
- package/dist/ar/cbu.js.map +1 -1
- package/dist/ar/cuit.d.ts +2 -2
- package/dist/ar/cuit.js +1 -17
- package/dist/ar/cuit.js.map +1 -1
- package/dist/ar/dni.d.ts +11 -2
- package/dist/ar/dni.js +1 -9
- package/dist/ar/dni.js.map +1 -1
- package/dist/at/businessid.d.ts +10 -2
- package/dist/at/businessid.js +1 -8
- package/dist/at/businessid.js.map +1 -1
- package/dist/at/tin.d.ts +2 -2
- package/dist/at/tin.js +1 -11
- package/dist/at/tin.js.map +1 -1
- package/dist/at/uid.d.ts +2 -2
- package/dist/at/uid.js +2 -10
- package/dist/at/uid.js.map +1 -1
- package/dist/at/vnr.d.ts +2 -2
- package/dist/at/vnr.js +4 -14
- package/dist/at/vnr.js.map +1 -1
- package/dist/au/abn.d.ts +2 -2
- package/dist/au/abn.js +1 -10
- package/dist/au/abn.js.map +1 -1
- package/dist/au/acn.d.ts +2 -2
- package/dist/au/acn.js +1 -10
- package/dist/au/acn.js.map +1 -1
- package/dist/au/tfn.d.ts +2 -2
- package/dist/au/tfn.js +1 -10
- package/dist/au/tfn.js.map +1 -1
- package/dist/az/voen.d.ts +2 -2
- package/dist/az/voen.js +1 -14
- package/dist/az/voen.js.map +1 -1
- package/dist/ba/jmbg.d.ts +2 -2
- package/dist/ba/jmbg.js +3 -11
- package/dist/ba/jmbg.js.map +1 -1
- package/dist/bd/nid.d.ts +23 -2
- package/dist/bd/nid.js +1 -21
- package/dist/bd/nid.js.map +1 -1
- package/dist/be/bis.d.ts +2 -2
- package/dist/be/bis.js +1 -11
- package/dist/be/bis.js.map +1 -1
- package/dist/be/nn.d.ts +2 -2
- package/dist/be/nn.js +1 -11
- package/dist/be/nn.js.map +1 -1
- package/dist/be/vat.d.ts +2 -2
- package/dist/be/vat.js +1 -9
- package/dist/be/vat.js.map +1 -1
- package/dist/bg/egn.d.ts +2 -2
- package/dist/bg/egn.js +3 -18
- package/dist/bg/egn.js.map +1 -1
- package/dist/bg/pnf.d.ts +2 -2
- package/dist/bg/pnf.js +1 -8
- package/dist/bg/pnf.js.map +1 -1
- package/dist/bg/vat.d.ts +2 -2
- package/dist/bg/vat.js +3 -9
- package/dist/bg/vat.js.map +1 -1
- package/dist/bh/cpr.d.ts +2 -2
- package/dist/bh/cpr.js +1 -17
- package/dist/bh/cpr.js.map +1 -1
- package/dist/bic.d.ts +13 -2
- package/dist/bic.js +1 -11
- package/dist/bic.js.map +1 -1
- package/dist/br/cnpj.d.ts +2 -2
- package/dist/br/cnpj.js +1 -20
- package/dist/br/cnpj.js.map +1 -1
- package/dist/br/cpf.d.ts +2 -2
- package/dist/br/cpf.js +1 -14
- package/dist/br/cpf.js.map +1 -1
- package/dist/by/unp.d.ts +2 -2
- package/dist/by/unp.js +3 -14
- package/dist/by/unp.js.map +1 -1
- package/dist/bz/tin.d.ts +2 -2
- package/dist/bz/tin.js +1 -26
- package/dist/bz/tin.js.map +1 -1
- package/dist/ca/bn.d.ts +2 -2
- package/dist/ca/bn.js +2 -10
- package/dist/ca/bn.js.map +1 -1
- package/dist/ca/sin.d.ts +2 -2
- package/dist/ca/sin.js +2 -10
- package/dist/ca/sin.js.map +1 -1
- package/dist/ch/ssn.d.ts +2 -2
- package/dist/ch/ssn.js +1 -9
- package/dist/ch/ssn.js.map +1 -1
- package/dist/ch/uid.d.ts +2 -2
- package/dist/ch/uid.js +1 -9
- package/dist/ch/uid.js.map +1 -1
- package/dist/ch/vat.d.ts +2 -2
- package/dist/ch/vat.js +1 -9
- package/dist/ch/vat.js.map +1 -1
- package/dist/cl/rut.d.ts +2 -2
- package/dist/cl/rut.js +1 -14
- package/dist/cl/rut.js.map +1 -1
- package/dist/cn/ric.d.ts +2 -2
- package/dist/cn/ric.js +3 -14
- package/dist/cn/ric.js.map +1 -1
- package/dist/cn/uscc.d.ts +2 -2
- package/dist/cn/uscc.js +1 -10
- package/dist/cn/uscc.js.map +1 -1
- package/dist/co/nit.d.ts +2 -2
- package/dist/co/nit.js +2 -12
- package/dist/co/nit.js.map +1 -1
- package/dist/cr/cpf.d.ts +18 -2
- package/dist/cr/cpf.js +1 -16
- package/dist/cr/cpf.js.map +1 -1
- package/dist/creditcard.d.ts +2 -2
- package/dist/creditcard.js +5 -14
- package/dist/creditcard.js.map +1 -1
- package/dist/cu/ni.d.ts +2 -2
- package/dist/cu/ni.js +2 -17
- package/dist/cu/ni.js.map +1 -1
- package/dist/cy/vat.d.ts +2 -2
- package/dist/cy/vat.js +1 -8
- package/dist/cy/vat.js.map +1 -1
- package/dist/cz/dic.d.ts +2 -2
- package/dist/cz/dic.js +7 -13
- package/dist/cz/dic.js.map +1 -1
- package/dist/cz/ico.d.ts +2 -2
- package/dist/cz/ico.js +2 -10
- package/dist/cz/ico.js.map +1 -1
- package/dist/cz/rc.d.ts +2 -2
- package/dist/cz/rc.js +2 -26
- package/dist/cz/rc.js.map +1 -1
- package/dist/de/handelsreg.d.ts +19 -2
- package/dist/de/handelsreg.js +1 -17
- package/dist/de/handelsreg.js.map +1 -1
- package/dist/de/idnr.d.ts +2 -2
- package/dist/de/idnr.js +2 -12
- package/dist/de/idnr.js.map +1 -1
- package/dist/de/stnr.d.ts +17 -2
- package/dist/de/stnr.js +1 -15
- package/dist/de/stnr.js.map +1 -1
- package/dist/de/svnr.d.ts +2 -2
- package/dist/de/svnr.js +2 -11
- package/dist/de/svnr.js.map +1 -1
- package/dist/de/vat.d.ts +2 -2
- package/dist/de/vat.js +2 -11
- package/dist/de/vat.js.map +1 -1
- package/dist/dk/cpr.d.ts +2 -2
- package/dist/dk/cpr.js +2 -10
- package/dist/dk/cpr.js.map +1 -1
- package/dist/dk/cvr.d.ts +2 -2
- package/dist/dk/cvr.js +2 -15
- package/dist/dk/cvr.js.map +1 -1
- package/dist/dk/vat.d.ts +2 -2
- package/dist/dk/vat.js +3 -13
- package/dist/dk/vat.js.map +1 -1
- package/dist/do/rnc.d.ts +2 -2
- package/dist/do/rnc.js +2 -16
- package/dist/do/rnc.js.map +1 -1
- package/dist/ec/ruc.d.ts +2 -2
- package/dist/ec/ruc.js +1 -18
- package/dist/ec/ruc.js.map +1 -1
- package/dist/ee/ik.d.ts +2 -2
- package/dist/ee/ik.js +3 -20
- package/dist/ee/ik.js.map +1 -1
- package/dist/ee/registrikood.d.ts +2 -2
- package/dist/ee/registrikood.js +1 -8
- package/dist/ee/registrikood.js.map +1 -1
- package/dist/ee/vat.d.ts +2 -2
- package/dist/ee/vat.js +2 -10
- package/dist/ee/vat.js.map +1 -1
- package/dist/eg/tn.d.ts +11 -2
- package/dist/eg/tn.js +1 -9
- package/dist/eg/tn.js.map +1 -1
- package/dist/es/cif.d.ts +2 -2
- package/dist/es/cif.js +1 -10
- package/dist/es/cif.js.map +1 -1
- package/dist/es/dni.d.ts +2 -2
- package/dist/es/dni.js +1 -9
- package/dist/es/dni.js.map +1 -1
- package/dist/es/nie.d.ts +2 -2
- package/dist/es/nie.js +1 -9
- package/dist/es/nie.js.map +1 -1
- package/dist/es/nss.d.ts +2 -2
- package/dist/es/nss.js +1 -16
- package/dist/es/nss.js.map +1 -1
- package/dist/es/vat.d.ts +2 -2
- package/dist/es/vat.js +5 -10
- package/dist/es/vat.js.map +1 -1
- package/dist/eu/vat.d.ts +2 -2
- package/dist/eu/vat.js +1 -0
- package/dist/eu/vat.js.map +1 -1
- package/dist/fi/hetu.d.ts +2 -2
- package/dist/fi/hetu.js +2 -10
- package/dist/fi/hetu.js.map +1 -1
- package/dist/fi/vat.d.ts +2 -2
- package/dist/fi/vat.js +3 -10
- package/dist/fi/vat.js.map +1 -1
- package/dist/fi/ytunnus.d.ts +2 -2
- package/dist/fi/ytunnus.js +2 -10
- package/dist/fi/ytunnus.js.map +1 -1
- package/dist/fr/nif.d.ts +2 -2
- package/dist/fr/nif.js +1 -9
- package/dist/fr/nif.js.map +1 -1
- package/dist/fr/nir.d.ts +2 -2
- package/dist/fr/nir.js +2 -14
- package/dist/fr/nir.js.map +1 -1
- package/dist/fr/siren.d.ts +2 -2
- package/dist/fr/siren.js +2 -10
- package/dist/fr/siren.js.map +1 -1
- package/dist/fr/siret.d.ts +2 -2
- package/dist/fr/siret.js +2 -11
- package/dist/fr/siret.js.map +1 -1
- package/dist/fr/tva.d.ts +2 -2
- package/dist/fr/tva.js +2 -12
- package/dist/fr/tva.js.map +1 -1
- package/dist/gb/nino.d.ts +12 -2
- package/dist/gb/nino.js +1 -10
- package/dist/gb/nino.js.map +1 -1
- package/dist/gb/sedol.d.ts +2 -2
- package/dist/gb/sedol.js +1 -11
- package/dist/gb/sedol.js.map +1 -1
- package/dist/gb/utr.d.ts +2 -2
- package/dist/gb/utr.js +2 -10
- package/dist/gb/utr.js.map +1 -1
- package/dist/gb/vat.d.ts +2 -2
- package/dist/gb/vat.js +2 -11
- package/dist/gb/vat.js.map +1 -1
- package/dist/ge/pin.d.ts +14 -2
- package/dist/ge/pin.js +1 -12
- package/dist/ge/pin.js.map +1 -1
- package/dist/gh/tin.d.ts +2 -2
- package/dist/gh/tin.js +1 -15
- package/dist/gh/tin.js.map +1 -1
- package/dist/gr/amka.d.ts +2 -2
- package/dist/gr/amka.js +3 -11
- package/dist/gr/amka.js.map +1 -1
- package/dist/gr/vat.d.ts +2 -2
- package/dist/gr/vat.js +1 -10
- package/dist/gr/vat.js.map +1 -1
- package/dist/gt/nit.d.ts +2 -2
- package/dist/gt/nit.js +1 -12
- package/dist/gt/nit.js.map +1 -1
- package/dist/hk/hkid.d.ts +2 -2
- package/dist/hk/hkid.js +1 -10
- package/dist/hk/hkid.js.map +1 -1
- package/dist/hr/vat.d.ts +2 -2
- package/dist/hr/vat.js +2 -9
- package/dist/hr/vat.js.map +1 -1
- package/dist/hu/vat.d.ts +2 -2
- package/dist/hu/vat.js +3 -10
- package/dist/hu/vat.js.map +1 -1
- package/dist/iban.d.ts +2 -2
- package/dist/iban.js +2 -8
- package/dist/iban.js.map +1 -1
- package/dist/id/npwp.d.ts +2 -2
- package/dist/id/npwp.js +3 -13
- package/dist/id/npwp.js.map +1 -1
- package/dist/ie/pps.d.ts +2 -2
- package/dist/ie/pps.js +1 -10
- package/dist/ie/pps.js.map +1 -1
- package/dist/ie/vat.d.ts +2 -2
- package/dist/ie/vat.js +1 -9
- package/dist/ie/vat.js.map +1 -1
- package/dist/il/idnr.d.ts +2 -2
- package/dist/il/idnr.js +2 -9
- package/dist/il/idnr.js.map +1 -1
- package/dist/in/aadhaar.d.ts +2 -2
- package/dist/in/aadhaar.js +2 -12
- package/dist/in/aadhaar.js.map +1 -1
- package/dist/in/gstin.d.ts +2 -2
- package/dist/in/gstin.js +1 -10
- package/dist/in/gstin.js.map +1 -1
- package/dist/in/pan.d.ts +15 -2
- package/dist/in/pan.js +1 -13
- package/dist/in/pan.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +6 -6
- package/dist/iq/nid.d.ts +16 -2
- package/dist/iq/nid.js +2 -15
- package/dist/iq/nid.js.map +1 -1
- package/dist/ir/nid.d.ts +2 -2
- package/dist/ir/nid.js +2 -24
- package/dist/ir/nid.js.map +1 -1
- package/dist/is/kennitala.d.ts +2 -2
- package/dist/is/kennitala.js +2 -13
- package/dist/is/kennitala.js.map +1 -1
- package/dist/is/vsk.d.ts +9 -2
- package/dist/is/vsk.js +1 -7
- package/dist/is/vsk.js.map +1 -1
- package/dist/isin.d.ts +2 -2
- package/dist/isin.js +2 -12
- package/dist/isin.js.map +1 -1
- package/dist/it/codicefiscale.d.ts +2 -2
- package/dist/it/codicefiscale.js +1 -21
- package/dist/it/codicefiscale.js.map +1 -1
- package/dist/it/iva.d.ts +2 -2
- package/dist/it/iva.js +2 -9
- package/dist/it/iva.js.map +1 -1
- package/dist/jp/cn.d.ts +2 -2
- package/dist/jp/cn.js +1 -9
- package/dist/jp/cn.js.map +1 -1
- package/dist/jp/mynumber.d.ts +2 -2
- package/dist/jp/mynumber.js +1 -10
- package/dist/jp/mynumber.js.map +1 -1
- package/dist/kr/brn.d.ts +11 -2
- package/dist/kr/brn.js +1 -9
- package/dist/kr/brn.js.map +1 -1
- package/dist/kr/rrn.d.ts +2 -2
- package/dist/kr/rrn.js +2 -11
- package/dist/kr/rrn.js.map +1 -1
- package/dist/kw/civil.d.ts +2 -2
- package/dist/kw/civil.js +2 -14
- package/dist/kw/civil.js.map +1 -1
- package/dist/kz/iin.d.ts +2 -2
- package/dist/kz/iin.js +3 -18
- package/dist/kz/iin.js.map +1 -1
- package/dist/lei.d.ts +2 -2
- package/dist/lei.js +2 -11
- package/dist/lei.js.map +1 -1
- package/dist/li/peid.d.ts +11 -2
- package/dist/li/peid.js +1 -9
- package/dist/li/peid.js.map +1 -1
- package/dist/lk/nic.d.ts +2 -2
- package/dist/lk/nic.js +2 -14
- package/dist/lk/nic.js.map +1 -1
- package/dist/lt/asmens.d.ts +2 -2
- package/dist/lt/asmens.js +2 -1
- package/dist/lt/asmens.js.map +1 -1
- package/dist/lt/vat.d.ts +2 -2
- package/dist/lt/vat.js +2 -10
- package/dist/lt/vat.js.map +1 -1
- package/dist/lu/vat.d.ts +2 -2
- package/dist/lu/vat.js +2 -8
- package/dist/lu/vat.js.map +1 -1
- package/dist/luhn.d.ts +2 -2
- package/dist/luhn.js +2 -9
- package/dist/luhn.js.map +1 -1
- package/dist/lv/vat.d.ts +2 -2
- package/dist/lv/vat.js +2 -28
- package/dist/lv/vat.js.map +1 -1
- package/dist/ma/ice.d.ts +2 -2
- package/dist/ma/ice.js +2 -11
- package/dist/ma/ice.js.map +1 -1
- package/dist/mc/tva.d.ts +2 -2
- package/dist/mc/tva.js +1 -0
- package/dist/mc/tva.js.map +1 -1
- package/dist/md/idno.d.ts +2 -2
- package/dist/md/idno.js +1 -10
- package/dist/md/idno.js.map +1 -1
- package/dist/me/pib.d.ts +2 -2
- package/dist/me/pib.js +2 -10
- package/dist/me/pib.js.map +1 -1
- package/dist/mk/edb.d.ts +2 -2
- package/dist/mk/edb.js +2 -11
- package/dist/mk/edb.js.map +1 -1
- package/dist/mt/vat.d.ts +2 -2
- package/dist/mt/vat.js +3 -10
- package/dist/mt/vat.js.map +1 -1
- package/dist/mu/brn.d.ts +23 -2
- package/dist/mu/brn.js +1 -21
- package/dist/mu/brn.js.map +1 -1
- package/dist/mx/clabe.d.ts +2 -2
- package/dist/mx/clabe.js +1 -14
- package/dist/mx/clabe.js.map +1 -1
- package/dist/mx/curp.d.ts +2 -2
- package/dist/mx/curp.js +3 -17
- package/dist/mx/curp.js.map +1 -1
- package/dist/mx/rfc.d.ts +2 -2
- package/dist/mx/rfc.js +3 -19
- package/dist/mx/rfc.js.map +1 -1
- package/dist/my/nric.d.ts +2 -2
- package/dist/my/nric.js +2 -14
- package/dist/my/nric.js.map +1 -1
- package/dist/ng/nin.d.ts +13 -2
- package/dist/ng/nin.js +1 -11
- package/dist/ng/nin.js.map +1 -1
- package/dist/ni/ruc.d.ts +2 -2
- package/dist/ni/ruc.js +1 -23
- package/dist/ni/ruc.js.map +1 -1
- package/dist/nl/bsn.d.ts +2 -2
- package/dist/nl/bsn.js +2 -10
- package/dist/nl/bsn.js.map +1 -1
- package/dist/nl/kvk.d.ts +9 -2
- package/dist/nl/kvk.js +1 -7
- package/dist/nl/kvk.js.map +1 -1
- package/dist/nl/vat.d.ts +2 -2
- package/dist/nl/vat.js +1 -13
- package/dist/nl/vat.js.map +1 -1
- package/dist/no/fodselsnummer.d.ts +2 -2
- package/dist/no/fodselsnummer.js +2 -10
- package/dist/no/fodselsnummer.js.map +1 -1
- package/dist/no/mva.d.ts +2 -2
- package/dist/no/mva.js +1 -8
- package/dist/no/mva.js.map +1 -1
- package/dist/no/orgnr.d.ts +2 -2
- package/dist/no/orgnr.js +2 -8
- package/dist/no/orgnr.js.map +1 -1
- package/dist/nz/ird.d.ts +2 -2
- package/dist/nz/ird.js +2 -11
- package/dist/nz/ird.js.map +1 -1
- package/dist/pa/ruc.d.ts +2 -2
- package/dist/pa/ruc.js +1 -18
- package/dist/pa/ruc.js.map +1 -1
- package/dist/patterns.d.ts +8 -7
- package/dist/patterns.js +3 -5
- package/dist/patterns.js.map +1 -1
- package/dist/pe/ruc.d.ts +2 -2
- package/dist/pe/ruc.js +1 -15
- package/dist/pe/ruc.js.map +1 -1
- package/dist/ph/philid.d.ts +14 -2
- package/dist/ph/philid.js +1 -12
- package/dist/ph/philid.js.map +1 -1
- package/dist/pk/cnic.d.ts +14 -2
- package/dist/pk/cnic.js +1 -12
- package/dist/pk/cnic.js.map +1 -1
- package/dist/pl/nip.d.ts +2 -2
- package/dist/pl/nip.js +2 -10
- package/dist/pl/nip.js.map +1 -1
- package/dist/pl/pesel.d.ts +2 -2
- package/dist/pl/pesel.js +3 -13
- package/dist/pl/pesel.js.map +1 -1
- package/dist/pl/regon.d.ts +2 -2
- package/dist/pl/regon.js +2 -11
- package/dist/pl/regon.js.map +1 -1
- package/dist/pt/cc.d.ts +2 -2
- package/dist/pt/cc.js +1 -9
- package/dist/pt/cc.js.map +1 -1
- package/dist/pt/vat.d.ts +2 -2
- package/dist/pt/vat.js +3 -11
- package/dist/pt/vat.js.map +1 -1
- package/dist/ro/cnp.d.ts +2 -2
- package/dist/ro/cnp.js +4 -14
- package/dist/ro/cnp.js.map +1 -1
- package/dist/ro/vat.d.ts +2 -2
- package/dist/ro/vat.js +13 -11
- package/dist/ro/vat.js.map +1 -1
- package/dist/rs/pib.d.ts +2 -2
- package/dist/rs/pib.js +1 -9
- package/dist/rs/pib.js.map +1 -1
- package/dist/ru/inn.d.ts +2 -2
- package/dist/ru/inn.js +1 -11
- package/dist/ru/inn.js.map +1 -1
- package/dist/se/orgnr.d.ts +2 -2
- package/dist/se/orgnr.js +2 -9
- package/dist/se/orgnr.js.map +1 -1
- package/dist/se/personnummer.d.ts +2 -2
- package/dist/se/personnummer.js +7 -15
- package/dist/se/personnummer.js.map +1 -1
- package/dist/se/vat.d.ts +2 -2
- package/dist/se/vat.js +3 -10
- package/dist/se/vat.js.map +1 -1
- package/dist/sg/uen.d.ts +2 -2
- package/dist/sg/uen.js +1 -15
- package/dist/sg/uen.js.map +1 -1
- package/dist/si/emso.d.ts +2 -2
- package/dist/si/emso.js +3 -18
- package/dist/si/emso.js.map +1 -1
- package/dist/si/vat.d.ts +2 -2
- package/dist/si/vat.js +3 -12
- package/dist/si/vat.js.map +1 -1
- package/dist/sk/dic.d.ts +2 -2
- package/dist/sk/dic.js +1 -0
- package/dist/sk/dic.js.map +1 -1
- package/dist/sk/ico.d.ts +2 -2
- package/dist/sk/ico.js +1 -0
- package/dist/sk/ico.js.map +1 -1
- package/dist/sk/rc.d.ts +2 -2
- package/dist/sk/rc.js +1 -0
- package/dist/sk/rc.js.map +1 -1
- package/dist/th/tin.d.ts +2 -2
- package/dist/th/tin.js +1 -11
- package/dist/th/tin.js.map +1 -1
- package/dist/tr/tckimlik.d.ts +2 -2
- package/dist/tr/tckimlik.js +1 -20
- package/dist/tr/tckimlik.js.map +1 -1
- package/dist/tr/vkn.d.ts +2 -2
- package/dist/tr/vkn.js +1 -20
- package/dist/tr/vkn.js.map +1 -1
- package/dist/tw/ubn.d.ts +2 -2
- package/dist/tw/ubn.js +1 -11
- package/dist/tw/ubn.js.map +1 -1
- package/dist/types.d.ts +26 -4
- package/dist/ua/edrpou.d.ts +2 -2
- package/dist/ua/edrpou.js +1 -11
- package/dist/ua/edrpou.js.map +1 -1
- package/dist/us/ein.d.ts +12 -2
- package/dist/us/ein.js +1 -10
- package/dist/us/ein.js.map +1 -1
- package/dist/us/itin.d.ts +13 -2
- package/dist/us/itin.js +1 -11
- package/dist/us/itin.js.map +1 -1
- package/dist/us/rtn.d.ts +2 -2
- package/dist/us/rtn.js +3 -18
- package/dist/us/rtn.js.map +1 -1
- package/dist/us/ssn.d.ts +13 -2
- package/dist/us/ssn.js +1 -11
- package/dist/us/ssn.js.map +1 -1
- package/dist/uy/rut.d.ts +2 -2
- package/dist/uy/rut.js +1 -14
- package/dist/uy/rut.js.map +1 -1
- package/dist/ve/rif.d.ts +2 -2
- package/dist/ve/rif.js +2 -15
- package/dist/ve/rif.js.map +1 -1
- package/dist/vn/mst.d.ts +2 -2
- package/dist/vn/mst.js +1 -12
- package/dist/vn/mst.js.map +1 -1
- package/dist/za/idnr.d.ts +2 -2
- package/dist/za/idnr.js +3 -16
- package/dist/za/idnr.js.map +1 -1
- package/package.json +22 -12
- package/src/_checksums/mod1110.ts +1 -1
- package/src/ad/nrt.ts +7 -3
- package/src/ae/eid.ts +7 -3
- package/src/ai/tin.ts +7 -3
- package/src/al/nipt.ts +7 -3
- package/src/am/tin.ts +7 -3
- package/src/ar/cbu.ts +7 -3
- package/src/ar/cuit.ts +7 -3
- package/src/ar/dni.ts +7 -3
- package/src/at/businessid.ts +7 -3
- package/src/at/tin.ts +7 -3
- package/src/at/uid.ts +7 -3
- package/src/at/vnr.ts +37 -9
- package/src/au/abn.ts +7 -3
- package/src/au/acn.ts +7 -3
- package/src/au/tfn.ts +7 -3
- package/src/az/voen.ts +7 -3
- package/src/ba/jmbg.ts +8 -7
- package/src/bd/nid.ts +7 -3
- package/src/be/bis.ts +8 -4
- package/src/be/nn.ts +7 -3
- package/src/be/vat.ts +7 -3
- package/src/bg/egn.ts +8 -7
- package/src/bg/pnf.ts +7 -3
- package/src/bg/vat.ts +8 -3
- package/src/bh/cpr.ts +7 -3
- package/src/bic.ts +7 -3
- package/src/br/cnpj.ts +7 -3
- package/src/br/cpf.ts +7 -3
- package/src/by/unp.ts +10 -5
- package/src/bz/tin.ts +7 -3
- package/src/ca/bn.ts +7 -3
- package/src/ca/sin.ts +7 -3
- package/src/ch/ssn.ts +7 -3
- package/src/ch/uid.ts +7 -3
- package/src/ch/vat.ts +9 -5
- package/src/cl/rut.ts +7 -3
- package/src/cn/ric.ts +8 -7
- package/src/cn/uscc.ts +7 -3
- package/src/co/nit.ts +8 -4
- package/src/cr/cpf.ts +7 -3
- package/src/creditcard.ts +10 -6
- package/src/cu/ni.ts +8 -7
- package/src/cy/vat.ts +7 -3
- package/src/cz/dic.ts +9 -4
- package/src/cz/ico.ts +7 -3
- package/src/cz/rc.ts +8 -7
- package/src/de/handelsreg.ts +7 -3
- package/src/de/idnr.ts +7 -3
- package/src/de/stnr.ts +7 -3
- package/src/de/svnr.ts +7 -3
- package/src/de/vat.ts +7 -3
- package/src/dk/cpr.ts +8 -7
- package/src/dk/cvr.ts +7 -3
- package/src/dk/vat.ts +8 -3
- package/src/do/rnc.ts +7 -3
- package/src/ec/ruc.ts +7 -3
- package/src/ee/ik.ts +8 -7
- package/src/ee/registrikood.ts +8 -4
- package/src/ee/vat.ts +7 -3
- package/src/eg/tn.ts +7 -3
- package/src/es/cif.ts +8 -4
- package/src/es/dni.ts +7 -3
- package/src/es/nie.ts +8 -4
- package/src/es/nss.ts +7 -3
- package/src/es/vat.ts +13 -5
- package/src/eu/vat.ts +10 -6
- package/src/fi/hetu.ts +8 -7
- package/src/fi/vat.ts +8 -3
- package/src/fi/ytunnus.ts +7 -3
- package/src/fr/nif.ts +7 -3
- package/src/fr/nir.ts +8 -7
- package/src/fr/siren.ts +7 -3
- package/src/fr/siret.ts +7 -3
- package/src/fr/tva.ts +7 -3
- package/src/gb/nino.ts +7 -3
- package/src/gb/sedol.ts +7 -3
- package/src/gb/utr.ts +7 -3
- package/src/gb/vat.ts +7 -3
- package/src/ge/pin.ts +7 -3
- package/src/gh/tin.ts +7 -3
- package/src/gr/amka.ts +7 -3
- package/src/gr/vat.ts +7 -3
- package/src/gt/nit.ts +7 -3
- package/src/hk/hkid.ts +7 -3
- package/src/hr/vat.ts +7 -3
- package/src/hu/vat.ts +8 -3
- package/src/iban.ts +7 -3
- package/src/id/npwp.ts +7 -3
- package/src/ie/pps.ts +7 -3
- package/src/ie/vat.ts +7 -3
- package/src/il/idnr.ts +7 -3
- package/src/in/aadhaar.ts +7 -3
- package/src/in/gstin.ts +7 -3
- package/src/in/pan.ts +7 -3
- package/src/index.ts +3 -0
- package/src/iq/nid.ts +7 -3
- package/src/ir/nid.ts +7 -3
- package/src/is/kennitala.ts +7 -3
- package/src/is/vsk.ts +7 -3
- package/src/isin.ts +7 -3
- package/src/it/codicefiscale.ts +11 -7
- package/src/it/iva.ts +7 -3
- package/src/jp/cn.ts +7 -3
- package/src/jp/mynumber.ts +7 -3
- package/src/kr/brn.ts +7 -3
- package/src/kr/rrn.ts +8 -7
- package/src/kw/civil.ts +8 -7
- package/src/kz/iin.ts +8 -8
- package/src/lei.ts +7 -3
- package/src/li/peid.ts +7 -3
- package/src/lk/nic.ts +8 -7
- package/src/lt/asmens.ts +8 -4
- package/src/lt/vat.ts +8 -3
- package/src/lu/vat.ts +8 -3
- package/src/luhn.ts +7 -3
- package/src/lv/vat.ts +7 -3
- package/src/ma/ice.ts +7 -3
- package/src/mc/tva.ts +9 -5
- package/src/md/idno.ts +7 -3
- package/src/me/pib.ts +7 -3
- package/src/mk/edb.ts +7 -3
- package/src/mt/vat.ts +8 -3
- package/src/mu/brn.ts +7 -3
- package/src/mx/clabe.ts +7 -3
- package/src/mx/curp.ts +9 -8
- package/src/mx/rfc.ts +8 -4
- package/src/my/nric.ts +8 -7
- package/src/ng/nin.ts +7 -3
- package/src/ni/ruc.ts +7 -3
- package/src/nl/bsn.ts +7 -3
- package/src/nl/kvk.ts +7 -3
- package/src/nl/vat.ts +7 -3
- package/src/no/fodselsnummer.ts +11 -7
- package/src/no/mva.ts +9 -5
- package/src/no/orgnr.ts +7 -3
- package/src/nz/ird.ts +8 -4
- package/src/pa/ruc.ts +7 -3
- package/src/patterns.ts +49 -18
- package/src/pe/ruc.ts +7 -3
- package/src/ph/philid.ts +7 -3
- package/src/pk/cnic.ts +7 -3
- package/src/pl/nip.ts +7 -3
- package/src/pl/pesel.ts +8 -7
- package/src/pl/regon.ts +7 -3
- package/src/pt/cc.ts +7 -3
- package/src/pt/vat.ts +8 -3
- package/src/ro/cnp.ts +15 -8
- package/src/ro/vat.ts +8 -3
- package/src/rs/pib.ts +7 -3
- package/src/ru/inn.ts +7 -3
- package/src/se/orgnr.ts +7 -3
- package/src/se/personnummer.ts +35 -33
- package/src/se/vat.ts +8 -3
- package/src/sg/uen.ts +7 -3
- package/src/si/emso.ts +8 -7
- package/src/si/vat.ts +8 -3
- package/src/sk/dic.ts +8 -4
- package/src/sk/ico.ts +3 -2
- package/src/sk/rc.ts +6 -2
- package/src/th/tin.ts +7 -3
- package/src/tr/tckimlik.ts +7 -3
- package/src/tr/vkn.ts +7 -3
- package/src/tw/ubn.ts +7 -3
- package/src/types.ts +34 -3
- package/src/ua/edrpou.ts +7 -3
- package/src/us/ein.ts +7 -3
- package/src/us/itin.ts +7 -3
- package/src/us/rtn.ts +16 -8
- package/src/us/ssn.ts +7 -3
- package/src/uy/rut.ts +7 -3
- package/src/ve/rif.ts +8 -6
- package/src/vn/mst.ts +7 -3
- package/src/za/idnr.ts +8 -7
package/dist/us/rtn.js
CHANGED
|
@@ -3,22 +3,6 @@ import { randomDigits, randomInt, randomPick } from "../_util/generate.js";
|
|
|
3
3
|
import { err } from "../_util/result.js";
|
|
4
4
|
import { isdigits } from "../_util/strings.js";
|
|
5
5
|
//#region src/us/rtn.ts
|
|
6
|
-
/**
|
|
7
|
-
* RTN (Routing Transit Number / ABA Number).
|
|
8
|
-
*
|
|
9
|
-
* 9-digit number used by U.S. financial institutions
|
|
10
|
-
* for routing wire transfers, ACH, and check
|
|
11
|
-
* processing. Uses a weighted checksum with weights
|
|
12
|
-
* [3, 7, 1] repeated three times.
|
|
13
|
-
*
|
|
14
|
-
* The first two digits identify the Federal Reserve
|
|
15
|
-
* district (01-12) or special ranges (21-32 for
|
|
16
|
-
* thrifts, 61-72 for electronic, 80 for traveler's
|
|
17
|
-
* cheques).
|
|
18
|
-
*
|
|
19
|
-
* @see https://en.wikipedia.org/wiki/ABA_routing_transit_number
|
|
20
|
-
* @see https://www.frbservices.org/
|
|
21
|
-
*/
|
|
22
6
|
const WEIGHTS = [
|
|
23
7
|
3,
|
|
24
8
|
7,
|
|
@@ -36,7 +20,7 @@ const validate = (value) => {
|
|
|
36
20
|
if (v.length !== 9) return err("INVALID_LENGTH", "RTN must be 9 digits");
|
|
37
21
|
if (!isdigits(v)) return err("INVALID_FORMAT", "RTN must contain only digits");
|
|
38
22
|
const prefix = Number(v.slice(0, 2));
|
|
39
|
-
if (!(prefix >=
|
|
23
|
+
if (!(prefix >= 0 && prefix <= 12 || prefix >= 21 && prefix <= 32 || prefix >= 61 && prefix <= 72 || prefix === 80)) return err("INVALID_COMPONENT", "RTN has an invalid Federal Reserve district");
|
|
40
24
|
let sum = 0;
|
|
41
25
|
for (const [i, weight] of WEIGHTS.entries()) sum += Number(v[i]) * weight;
|
|
42
26
|
if (sum % 10 !== 0) return err("INVALID_CHECKSUM", "RTN checksum is invalid");
|
|
@@ -48,7 +32,7 @@ const validate = (value) => {
|
|
|
48
32
|
const format = (value) => compact(value);
|
|
49
33
|
/** All valid Federal Reserve prefix ranges. */
|
|
50
34
|
const PREFIX_RANGES = [
|
|
51
|
-
[
|
|
35
|
+
[0, 12],
|
|
52
36
|
[21, 32],
|
|
53
37
|
[61, 72],
|
|
54
38
|
[80, 80]
|
|
@@ -78,6 +62,7 @@ const rtn = {
|
|
|
78
62
|
"Routing Transit Number"
|
|
79
63
|
],
|
|
80
64
|
candidatePattern: "\\d{9}",
|
|
65
|
+
scope: "country",
|
|
81
66
|
country: "US",
|
|
82
67
|
entityType: "company",
|
|
83
68
|
sourceUrl: "https://en.wikipedia.org/wiki/ABA_routing_transit_number",
|
package/dist/us/rtn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtn.js","names":[],"sources":["../../src/us/rtn.ts"],"sourcesContent":["/**\n * RTN (Routing Transit Number / ABA Number).\n *\n * 9-digit number used by U.S. financial institutions\n * for routing wire transfers, ACH, and check\n * processing. Uses a weighted checksum with weights\n * [3, 7, 1] repeated three times.\n *\n * The first two digits identify the Federal Reserve\n * district (01-12) or special ranges (21-32 for
|
|
1
|
+
{"version":3,"file":"rtn.js","names":[],"sources":["../../src/us/rtn.ts"],"sourcesContent":["/**\n * RTN (Routing Transit Number / ABA Number).\n *\n * 9-digit number used by U.S. financial institutions\n * for routing wire transfers, ACH, and check\n * processing. Uses a weighted checksum with weights\n * [3, 7, 1] repeated three times.\n *\n * The first two digits identify the Federal Reserve\n * district (01-12) or special ranges (00 for U.S.\n * Government, 21-32 for thrifts, 61-72 for electronic,\n * 80 for traveler's cheques).\n *\n * @see https://en.wikipedia.org/wiki/ABA_routing_transit_number\n * @see https://www.frbservices.org/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport {\n randomDigits,\n randomInt,\n randomPick,\n} from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [3, 7, 1, 3, 7, 1, 3, 7, 1] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -\").trim();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 9) {\n return err(\"INVALID_LENGTH\", \"RTN must be 9 digits\");\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"RTN must contain only digits\",\n );\n }\n\n // Validate Federal Reserve prefix (first 2 digits)\n const prefix = Number(v.slice(0, 2));\n const validPrefixRanges =\n // 00 is reserved for U.S. Government and federal\n // agencies per the ABA Routing Number Policy;\n // 01-12 are the 12 Federal Reserve districts.\n // @see https://en.wikipedia.org/wiki/ABA_routing_transit_number\n (prefix >= 0 && prefix <= 12) ||\n (prefix >= 21 && prefix <= 32) ||\n (prefix >= 61 && prefix <= 72) ||\n prefix === 80;\n if (!validPrefixRanges) {\n return err(\n \"INVALID_COMPONENT\",\n \"RTN has an invalid Federal Reserve district\",\n );\n }\n\n // Weighted checksum must be divisible by 10\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n sum += Number(v[i]) * weight;\n }\n if (sum % 10 !== 0) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RTN checksum is invalid\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** All valid Federal Reserve prefix ranges. */\nconst PREFIX_RANGES: readonly [number, number][] = [\n [0, 12],\n [21, 32],\n [61, 72],\n [80, 80],\n];\n\n/** Generate a random valid U.S. RTN. */\nconst generate = (): string => {\n const [low, high] = randomPick(PREFIX_RANGES);\n const prefix = String(randomInt(low, high)).padStart(\n 2,\n \"0\",\n );\n const mid = randomDigits(6);\n const body = prefix + mid;\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n if (i >= 8) break;\n sum += Number(body[i]) * weight;\n }\n const check = (10 - (sum % 10)) % 10;\n return body + String(check);\n};\n\n/** U.S. Routing Transit Number. */\nconst rtn: CountryValidator<\"US\"> = {\n name: \"Routing Transit Number\",\n localName: \"Routing Transit Number\",\n abbreviation: \"RTN\",\n aliases: [\n \"RTN\",\n \"ABA\",\n \"Routing Number\",\n \"ABA Routing Number\",\n \"Routing Transit Number\",\n ] as const,\n candidatePattern: \"\\\\d{9}\",\n scope: \"country\",\n country: \"US\",\n entityType: \"company\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/ABA_routing_transit_number\",\n lengths: [9] as const,\n examples: [\"111000025\", \"021000021\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default rtn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AA+BA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAE1C,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,EAAE,KAAK;AAE1B,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,GACf,OAAO,IAAI,kBAAkB,sBAAsB;CAGrD,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAIF,MAAM,SAAS,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAUnC,IAAI,EAJD,UAAU,KAAK,UAAU,MACzB,UAAU,MAAM,UAAU,MAC1B,UAAU,MAAM,UAAU,MAC3B,WAAW,KAEX,OAAO,IACL,qBACA,6CACF;CAIF,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GACxC,OAAO,OAAO,EAAE,EAAE,IAAI;CAExB,IAAI,MAAM,OAAO,GACf,OAAO,IACL,oBACA,yBACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,gBAA6C;CACjD,CAAC,GAAG,EAAE;CACN,CAAC,IAAI,EAAE;CACP,CAAC,IAAI,EAAE;CACP,CAAC,IAAI,EAAE;AACT;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,CAAC,KAAK,QAAQ,WAAW,aAAa;CAM5C,MAAM,OALS,OAAO,UAAU,KAAK,IAAI,CAAC,EAAE,SAC1C,GACA,GAGgB,IADN,aAAa,CACD;CACxB,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GAAG;EAC3C,IAAI,KAAK,GAAG;EACZ,OAAO,OAAO,KAAK,EAAE,IAAI;CAC3B;CACA,MAAM,SAAS,KAAM,MAAM,MAAO;CAClC,OAAO,OAAO,OAAO,KAAK;AAC5B;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,SAAS,CAAC,CAAC;CACX,UAAU,CAAC,aAAa,WAAW;CACnC;CACA;CACA;CACA;AACF"}
|
package/dist/us/ssn.d.ts
CHANGED
|
@@ -1,13 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CountryValidator, ValidateResult } from "../types.js";
|
|
2
2
|
|
|
3
3
|
//#region src/us/ssn.d.ts
|
|
4
4
|
/** Generate a random valid U.S. SSN. */
|
|
5
5
|
declare const generate: () => string;
|
|
6
|
+
/**
|
|
7
|
+
* SSN (U.S. Social Security Number).
|
|
8
|
+
*
|
|
9
|
+
* 9-digit identifier: 3-digit area, 2-digit group,
|
|
10
|
+
* 4-digit serial. No checksum. Area cannot be 000,
|
|
11
|
+
* 666, or 900-999; group cannot be 00; serial
|
|
12
|
+
* cannot be 0000.
|
|
13
|
+
*
|
|
14
|
+
* @see https://en.wikipedia.org/wiki/Social_Security_number
|
|
15
|
+
* @see https://www.ssa.gov/employer/verifySSN.htm
|
|
16
|
+
*/
|
|
6
17
|
declare const compact: (value: string) => string;
|
|
7
18
|
declare const validate: (value: string) => ValidateResult;
|
|
8
19
|
declare const format: (value: string) => string;
|
|
9
20
|
/** U.S. Social Security Number. */
|
|
10
|
-
declare const ssn:
|
|
21
|
+
declare const ssn: CountryValidator<"US">;
|
|
11
22
|
//#endregion
|
|
12
23
|
export { compact, ssn as default, format, generate, validate };
|
|
13
24
|
//# sourceMappingURL=ssn.d.ts.map
|
package/dist/us/ssn.js
CHANGED
|
@@ -3,17 +3,6 @@ import { randomInt } from "../_util/generate.js";
|
|
|
3
3
|
import { err } from "../_util/result.js";
|
|
4
4
|
import { isdigits } from "../_util/strings.js";
|
|
5
5
|
//#region src/us/ssn.ts
|
|
6
|
-
/**
|
|
7
|
-
* SSN (U.S. Social Security Number).
|
|
8
|
-
*
|
|
9
|
-
* 9-digit identifier: 3-digit area, 2-digit group,
|
|
10
|
-
* 4-digit serial. No checksum. Area cannot be 000,
|
|
11
|
-
* 666, or 900-999; group cannot be 00; serial
|
|
12
|
-
* cannot be 0000.
|
|
13
|
-
*
|
|
14
|
-
* @see https://en.wikipedia.org/wiki/Social_Security_number
|
|
15
|
-
* @see https://www.ssa.gov/employer/verifySSN.htm
|
|
16
|
-
*/
|
|
17
6
|
/** Generate a random valid U.S. SSN. */
|
|
18
7
|
const generate = () => {
|
|
19
8
|
for (;;) {
|
|
@@ -62,6 +51,7 @@ const ssn = {
|
|
|
62
51
|
abbreviation: "SSN",
|
|
63
52
|
aliases: ["SSN", "Social Security Number"],
|
|
64
53
|
candidatePattern: "\\d{3}-?\\d{2}-?\\d{4}",
|
|
54
|
+
scope: "country",
|
|
65
55
|
country: "US",
|
|
66
56
|
entityType: "person",
|
|
67
57
|
sourceUrl: "https://www.ssa.gov/employer/verifySSN.htm",
|
package/dist/us/ssn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssn.js","names":[],"sources":["../../src/us/ssn.ts"],"sourcesContent":["/** Generate a random valid U.S. SSN. */\nconst generate = (): string => {\n for (;;) {\n let area: string;\n do {\n area = String(randomInt(1, 899)).padStart(3, \"0\");\n } while (area === \"666\");\n const group = String(randomInt(1, 99)).padStart(2, \"0\");\n const serial = String(randomInt(1, 9999)).padStart(\n 4,\n \"0\",\n );\n const ssn = `${area}${group}${serial}`;\n if (!BLACKLIST.has(ssn)) return ssn;\n }\n};\n\n/**\n * SSN (U.S. Social Security Number).\n *\n * 9-digit identifier: 3-digit area, 2-digit group,\n * 4-digit serial. No checksum. Area cannot be 000,\n * 666, or 900-999; group cannot be 00; serial\n * cannot be 0000.\n *\n * @see https://en.wikipedia.org/wiki/Social_Security_number\n * @see https://www.ssa.gov/employer/verifySSN.htm\n */\n\nimport {
|
|
1
|
+
{"version":3,"file":"ssn.js","names":[],"sources":["../../src/us/ssn.ts"],"sourcesContent":["/** Generate a random valid U.S. SSN. */\nconst generate = (): string => {\n for (;;) {\n let area: string;\n do {\n area = String(randomInt(1, 899)).padStart(3, \"0\");\n } while (area === \"666\");\n const group = String(randomInt(1, 99)).padStart(2, \"0\");\n const serial = String(randomInt(1, 9999)).padStart(\n 4,\n \"0\",\n );\n const ssn = `${area}${group}${serial}`;\n if (!BLACKLIST.has(ssn)) return ssn;\n }\n};\n\n/**\n * SSN (U.S. Social Security Number).\n *\n * 9-digit identifier: 3-digit area, 2-digit group,\n * 4-digit serial. No checksum. Area cannot be 000,\n * 666, or 900-999; group cannot be 00; serial\n * cannot be 0000.\n *\n * @see https://en.wikipedia.org/wiki/Social_Security_number\n * @see https://www.ssa.gov/employer/verifySSN.htm\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\n/** Known-invalid SSNs used in advertisements. */\nconst BLACKLIST = new Set([\n \"078051120\",\n \"457555462\",\n \"219099999\",\n]);\n\nconst compact = (value: string): string =>\n clean(value, \" -\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"SSN must contain only digits\",\n );\n }\n if (v.length !== 9) {\n return err(\"INVALID_LENGTH\", \"SSN must be 9 digits\");\n }\n\n const area = v.slice(0, 3);\n const group = v.slice(3, 5);\n const serial = v.slice(5, 9);\n\n if (area === \"000\" || area === \"666\" || area[0] === \"9\") {\n return err(\n \"INVALID_COMPONENT\",\n \"SSN area number is invalid\",\n );\n }\n if (group === \"00\") {\n return err(\n \"INVALID_COMPONENT\",\n \"SSN group number cannot be 00\",\n );\n }\n if (serial === \"0000\") {\n return err(\n \"INVALID_COMPONENT\",\n \"SSN serial number cannot be 0000\",\n );\n }\n if (BLACKLIST.has(v)) {\n return err(\n \"INVALID_COMPONENT\",\n \"SSN is on the blacklist\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 9) {\n return `${v.slice(0, 3)}-${v.slice(3, 5)}-${v.slice(5)}`;\n }\n return v;\n};\n\n/** U.S. Social Security Number. */\nconst ssn: CountryValidator<\"US\"> = {\n name: \"Social Security Number\",\n localName: \"Social Security Number\",\n abbreviation: \"SSN\",\n aliases: [\"SSN\", \"Social Security Number\"] as const,\n candidatePattern: \"\\\\d{3}-?\\\\d{2}-?\\\\d{4}\",\n scope: \"country\",\n country: \"US\",\n entityType: \"person\",\n sourceUrl: \"https://www.ssa.gov/employer/verifySSN.htm\",\n examples: [\"536904399\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default ssn;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AACA,MAAM,iBAAyB;CAC7B,SAAS;EACP,IAAI;EACJ;GACE,OAAO,OAAO,UAAU,GAAG,GAAG,CAAC,EAAE,SAAS,GAAG,GAAG;SACzC,SAAS;EAClB,MAAM,QAAQ,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;EACtD,MAAM,SAAS,OAAO,UAAU,GAAG,IAAI,CAAC,EAAE,SACxC,GACA,GACF;EACA,MAAM,MAAM,GAAG,OAAO,QAAQ;EAC9B,IAAI,CAAC,UAAU,IAAI,GAAG,GAAG,OAAO;CAClC;AACF;;AAyBA,MAAM,YAAY,IAAI,IAAI;CACxB;CACA;CACA;AACF,CAAC;AAED,MAAM,WAAW,UACf,MAAM,OAAO,IAAI;AAEnB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAEF,IAAI,EAAE,WAAW,GACf,OAAO,IAAI,kBAAkB,sBAAsB;CAGrD,MAAM,OAAO,EAAE,MAAM,GAAG,CAAC;CACzB,MAAM,QAAQ,EAAE,MAAM,GAAG,CAAC;CAC1B,MAAM,SAAS,EAAE,MAAM,GAAG,CAAC;CAE3B,IAAI,SAAS,SAAS,SAAS,SAAS,KAAK,OAAO,KAClD,OAAO,IACL,qBACA,4BACF;CAEF,IAAI,UAAU,MACZ,OAAO,IACL,qBACA,+BACF;CAEF,IAAI,WAAW,QACb,OAAO,IACL,qBACA,kCACF;CAEF,IAAI,UAAU,IAAI,CAAC,GACjB,OAAO,IACL,qBACA,yBACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;CAEvD,OAAO;AACT;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,wBAAwB;CACzC,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,WAAW;CACtB;CACA;CACA;CACA;AACF"}
|
package/dist/uy/rut.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CountryValidator, ValidateResult } from "../types.js";
|
|
2
2
|
|
|
3
3
|
//#region src/uy/rut.d.ts
|
|
4
4
|
declare const compact: (value: string) => string;
|
|
@@ -11,7 +11,7 @@ declare const generate: () => string;
|
|
|
11
11
|
*
|
|
12
12
|
* Examples sourced from python-stdnum test suite.
|
|
13
13
|
*/
|
|
14
|
-
declare const rut:
|
|
14
|
+
declare const rut: CountryValidator<"UY">;
|
|
15
15
|
//#endregion
|
|
16
16
|
export { compact, rut as default, format, generate, validate };
|
|
17
17
|
//# sourceMappingURL=rut.d.ts.map
|
package/dist/uy/rut.js
CHANGED
|
@@ -3,20 +3,6 @@ import { randomDigits, randomInt } from "../_util/generate.js";
|
|
|
3
3
|
import { err } from "../_util/result.js";
|
|
4
4
|
import { isdigits } from "../_util/strings.js";
|
|
5
5
|
//#region src/uy/rut.ts
|
|
6
|
-
/**
|
|
7
|
-
* RUT (Registro Único Tributario).
|
|
8
|
-
*
|
|
9
|
-
* Uruguayan tax identification number issued by the
|
|
10
|
-
* DGI (Dirección General Impositiva). The number is
|
|
11
|
-
* 12 digits: 2-digit document type (01-22), 6-digit
|
|
12
|
-
* sequence, fixed "001" suffix, and a check digit
|
|
13
|
-
* computed via weighted sum mod 11 (Python-style
|
|
14
|
-
* modulo of the negated sum).
|
|
15
|
-
*
|
|
16
|
-
* Format: ############ (12 digits compact)
|
|
17
|
-
*
|
|
18
|
-
* @see https://www.agesic.gub.uy/
|
|
19
|
-
*/
|
|
20
6
|
const WEIGHTS = [
|
|
21
7
|
4,
|
|
22
8
|
3,
|
|
@@ -89,6 +75,7 @@ const rut = {
|
|
|
89
75
|
abbreviation: "RUT",
|
|
90
76
|
aliases: ["RUT", "Registro Único Tributario"],
|
|
91
77
|
candidatePattern: "\\d{12}",
|
|
78
|
+
scope: "country",
|
|
92
79
|
country: "UY",
|
|
93
80
|
entityType: "any",
|
|
94
81
|
lengths: [12],
|
package/dist/uy/rut.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rut.js","names":[],"sources":["../../src/uy/rut.ts"],"sourcesContent":["/**\n * RUT (Registro Único Tributario).\n *\n * Uruguayan tax identification number issued by the\n * DGI (Dirección General Impositiva). The number is\n * 12 digits: 2-digit document type (01-22), 6-digit\n * sequence, fixed \"001\" suffix, and a check digit\n * computed via weighted sum mod 11 (Python-style\n * modulo of the negated sum).\n *\n * Format: ############ (12 digits compact)\n *\n * @see https://www.agesic.gub.uy/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\
|
|
1
|
+
{"version":3,"file":"rut.js","names":[],"sources":["../../src/uy/rut.ts"],"sourcesContent":["/**\n * RUT (Registro Único Tributario).\n *\n * Uruguayan tax identification number issued by the\n * DGI (Dirección General Impositiva). The number is\n * 12 digits: 2-digit document type (01-22), 6-digit\n * sequence, fixed \"001\" suffix, and a check digit\n * computed via weighted sum mod 11 (Python-style\n * modulo of the negated sum).\n *\n * Format: ############ (12 digits compact)\n *\n * @see https://www.agesic.gub.uy/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\n\nconst compact = (value: string): string => {\n let v = clean(value, \" -\").trim();\n if (v.toUpperCase().startsWith(\"UY\")) {\n v = v.slice(2);\n }\n return v;\n};\n\n/**\n * Python-style modulo: always returns a non-negative\n * result for a positive divisor.\n */\nconst pymod = (a: number, b: number): number =>\n ((a % b) + b) % b;\n\nconst calcCheckDigit = (value: string): string | null => {\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n sum += Number(value[i]) * weight;\n }\n const result = pymod(-sum, 11);\n // A result of 10 means no valid single-digit check\n // digit exists; the DGI does not issue such numbers.\n if (result === 10) return null;\n return String(result);\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 12) {\n return err(\"INVALID_LENGTH\", \"RUT must be 12 digits\");\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"RUT must contain only digits\",\n );\n }\n\n // First 2 digits: document type (01-22)\n const docType = Number.parseInt(v.slice(0, 2), 10);\n if (docType < 1 || docType > 22) {\n return err(\n \"INVALID_COMPONENT\",\n \"RUT document type must be between 01 and 22\",\n );\n }\n\n // Digits 2-8: sequence (must not be all zeros)\n if (v.slice(2, 8) === \"000000\") {\n return err(\n \"INVALID_COMPONENT\",\n \"RUT sequence must not be all zeros\",\n );\n }\n\n // Digits 8-11: must be \"001\"\n if (v.slice(8, 11) !== \"001\") {\n return err(\n \"INVALID_COMPONENT\",\n \"RUT branch code must be 001\",\n );\n }\n\n const expected = calcCheckDigit(v);\n if (expected === null || v.at(-1) !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RUT check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v.slice(0, 2)}-${v.slice(2, 8)}-${v.slice(8, 11)}-${v.slice(11)}`;\n};\n\n/** Generate a random valid Uruguayan RUT. */\nconst generate = (): string => {\n for (;;) {\n const docType = String(randomInt(1, 22)).padStart(\n 2,\n \"0\",\n );\n const seq = randomDigits(6);\n if (seq === \"000000\") continue;\n const partial = `${docType}${seq}001`;\n const check = calcCheckDigit(partial);\n if (check === null) continue;\n return `${partial}${check}`;\n }\n};\n\n/**\n * Uruguayan RUT (tax identification number).\n *\n * Examples sourced from python-stdnum test suite.\n */\nconst rut: CountryValidator<\"UY\"> = {\n name: \"Uruguayan Tax ID\",\n localName: \"Registro Único Tributario\",\n abbreviation: \"RUT\",\n aliases: [\"RUT\", \"Registro Único Tributario\"] as const,\n candidatePattern: \"\\\\d{12}\",\n scope: \"country\",\n country: \"UY\",\n entityType: \"any\",\n lengths: [12] as const,\n examples: [\"010100010013\", \"102000010017\"] as const,\n compact,\n format,\n validate,\n sourceUrl: \"https://www.agesic.gub.uy/\",\n generate,\n};\n\nexport default rut;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAyBA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAEhD,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,IAAI,EAAE,KAAK;CAChC,IAAI,EAAE,YAAY,EAAE,WAAW,IAAI,GACjC,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO;AACT;;;;;AAMA,MAAM,SAAS,GAAW,OACtB,IAAI,IAAK,KAAK;AAElB,MAAM,kBAAkB,UAAiC;CACvD,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GACxC,OAAO,OAAO,MAAM,EAAE,IAAI;CAE5B,MAAM,SAAS,MAAM,CAAC,KAAK,EAAE;CAG7B,IAAI,WAAW,IAAI,OAAO;CAC1B,OAAO,OAAO,MAAM;AACtB;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,IACf,OAAO,IAAI,kBAAkB,uBAAuB;CAGtD,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAIF,MAAM,UAAU,OAAO,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;CACjD,IAAI,UAAU,KAAK,UAAU,IAC3B,OAAO,IACL,qBACA,6CACF;CAIF,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,UACpB,OAAO,IACL,qBACA,oCACF;CAIF,IAAI,EAAE,MAAM,GAAG,EAAE,MAAM,OACrB,OAAO,IACL,qBACA,6BACF;CAGF,MAAM,WAAW,eAAe,CAAC;CACjC,IAAI,aAAa,QAAQ,EAAE,GAAG,EAAE,MAAM,UACpC,OAAO,IACL,oBACA,gCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;AAC1E;;AAGA,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,UAAU,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SACvC,GACA,GACF;EACA,MAAM,MAAM,aAAa,CAAC;EAC1B,IAAI,QAAQ,UAAU;EACtB,MAAM,UAAU,GAAG,UAAU,IAAI;EACjC,MAAM,QAAQ,eAAe,OAAO;EACpC,IAAI,UAAU,MAAM;EACpB,OAAO,GAAG,UAAU;CACtB;AACF;;;;;;AAOA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,2BAA2B;CAC5C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,gBAAgB,cAAc;CACzC;CACA;CACA;CACA,WAAW;CACX;AACF"}
|
package/dist/ve/rif.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CountryValidator, ValidateResult } from "../types.js";
|
|
2
2
|
|
|
3
3
|
//#region src/ve/rif.d.ts
|
|
4
4
|
declare const compact: (value: string) => string;
|
|
@@ -11,7 +11,7 @@ declare const generate: () => string;
|
|
|
11
11
|
*
|
|
12
12
|
* Examples sourced from python-stdnum test suite.
|
|
13
13
|
*/
|
|
14
|
-
declare const rif:
|
|
14
|
+
declare const rif: CountryValidator<"VE">;
|
|
15
15
|
//#endregion
|
|
16
16
|
export { compact, rif as default, format, generate, validate };
|
|
17
17
|
//# sourceMappingURL=rif.d.ts.map
|
package/dist/ve/rif.js
CHANGED
|
@@ -4,20 +4,6 @@ import { err } from "../_util/result.js";
|
|
|
4
4
|
import { isdigits } from "../_util/strings.js";
|
|
5
5
|
//#region src/ve/rif.ts
|
|
6
6
|
/**
|
|
7
|
-
* RIF (Registro de Información Fiscal).
|
|
8
|
-
*
|
|
9
|
-
* Venezuelan tax identification number issued by the
|
|
10
|
-
* SENIAT. The number consists of 1 letter indicating
|
|
11
|
-
* the entity type (J=juridical, G=government,
|
|
12
|
-
* V=natural/Venezuelan, E=foreign, P=passport)
|
|
13
|
-
* followed by 8 digits and a check digit computed
|
|
14
|
-
* via weighted sum mod 11.
|
|
15
|
-
*
|
|
16
|
-
* Format: X-########-# or X######### (10 chars compact)
|
|
17
|
-
*
|
|
18
|
-
* @see https://en.wikipedia.org/wiki/Tax_Identification_Number#Venezuela
|
|
19
|
-
*/
|
|
20
|
-
/**
|
|
21
7
|
* Map prefix letter to its numeric offset used
|
|
22
8
|
* in the check digit computation.
|
|
23
9
|
*/
|
|
@@ -80,7 +66,7 @@ const GENERATE_TYPES = [
|
|
|
80
66
|
const generate = () => {
|
|
81
67
|
const prefix = randomPick(GENERATE_TYPES);
|
|
82
68
|
const body = randomDigits(8);
|
|
83
|
-
return prefix + body +
|
|
69
|
+
return prefix + body + calcCheckDigit(prefix, body);
|
|
84
70
|
};
|
|
85
71
|
/**
|
|
86
72
|
* Venezuelan RIF (tax identification number).
|
|
@@ -93,6 +79,7 @@ const rif = {
|
|
|
93
79
|
abbreviation: "RIF",
|
|
94
80
|
aliases: ["RIF", "Registro de Información Fiscal"],
|
|
95
81
|
candidatePattern: "[VEJPG]-?\\d{8}-?\\d",
|
|
82
|
+
scope: "country",
|
|
96
83
|
country: "VE",
|
|
97
84
|
entityType: "any",
|
|
98
85
|
lengths: [10],
|
package/dist/ve/rif.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rif.js","names":[],"sources":["../../src/ve/rif.ts"],"sourcesContent":["/**\n * RIF (Registro de Información Fiscal).\n *\n * Venezuelan tax identification number issued by the\n * SENIAT. The number consists of 1 letter indicating\n * the entity type (J=juridical, G=government,\n * V=natural/Venezuelan, E=foreign, P=passport)\n * followed by 8 digits and a check digit computed\n * via weighted sum mod 11.\n *\n * Format: X-########-# or X######### (10 chars compact)\n *\n * @see https://en.wikipedia.org/wiki/Tax_Identification_Number#Venezuela\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomPick } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\
|
|
1
|
+
{"version":3,"file":"rif.js","names":[],"sources":["../../src/ve/rif.ts"],"sourcesContent":["/**\n * RIF (Registro de Información Fiscal).\n *\n * Venezuelan tax identification number issued by the\n * SENIAT. The number consists of 1 letter indicating\n * the entity type (J=juridical, G=government,\n * V=natural/Venezuelan, E=foreign, P=passport)\n * followed by 8 digits and a check digit computed\n * via weighted sum mod 11.\n *\n * Format: X-########-# or X######### (10 chars compact)\n *\n * @see https://en.wikipedia.org/wiki/Tax_Identification_Number#Venezuela\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomPick } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\n/**\n * Map prefix letter to its numeric offset used\n * in the check digit computation.\n */\nconst PREFIX_VALUES: Record<string, number> = {\n V: 4,\n E: 8,\n J: 12,\n P: 16,\n G: 20,\n};\n\n/** Weights applied to the 8-digit body. */\nconst WEIGHTS = [3, 2, 7, 6, 5, 4, 3, 2] as const;\n\n/**\n * Lookup table for converting the mod 11 result\n * to the check character.\n */\nconst CHECK_LOOKUP = \"00987654321\";\n\nconst compact = (value: string): string =>\n clean(value, \" -.\").trim().toUpperCase();\n\nconst calcCheckDigit = (\n prefix: string,\n body: string,\n): string => {\n const pv = PREFIX_VALUES[prefix] ?? 0;\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n sum += Number(body[i]) * weight;\n }\n const digit = (pv + (sum % 11)) % 11;\n // SAFETY: digit ∈ [0, 10] and CHECK_LOOKUP has 11 chars.\n // eslint-disable-next-line no-non-null-assertion\n return CHECK_LOOKUP[digit]!;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"RIF must be 10 characters\",\n );\n }\n\n // SAFETY: length check above guarantees v[0] exists.\n // eslint-disable-next-line no-non-null-assertion\n const prefix = v[0]!;\n if (!(prefix in PREFIX_VALUES)) {\n return err(\n \"INVALID_COMPONENT\",\n \"RIF must start with V, E, J, P, or G\",\n );\n }\n\n const body = v.slice(1, 9);\n const check = v.slice(9);\n if (!isdigits(v.slice(1))) {\n return err(\n \"INVALID_FORMAT\",\n \"RIF body must contain only digits\",\n );\n }\n\n const expected = calcCheckDigit(prefix, body);\n if (check !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"RIF check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return `${v[0]}-${v.slice(1, 9)}-${v.slice(9)}`;\n};\n\nconst GENERATE_TYPES = [\"V\", \"E\", \"J\", \"P\", \"G\"] as const;\n\n/** Generate a random valid Venezuelan RIF. */\nconst generate = (): string => {\n const prefix = randomPick(GENERATE_TYPES);\n const body = randomDigits(8);\n return prefix + body + calcCheckDigit(prefix, body);\n};\n\n/**\n * Venezuelan RIF (tax identification number).\n *\n * Examples sourced from python-stdnum test suite.\n */\nconst rif: CountryValidator<\"VE\"> = {\n name: \"Venezuelan Tax ID\",\n localName: \"Registro de Información Fiscal\",\n abbreviation: \"RIF\",\n aliases: [\n \"RIF\",\n \"Registro de Información Fiscal\",\n ] as const,\n candidatePattern: \"[VEJPG]-?\\\\d{8}-?\\\\d\",\n scope: \"country\",\n country: \"VE\",\n entityType: \"any\",\n lengths: [10] as const,\n examples: [\"V309876543\", \"J309876546\"] as const,\n compact,\n format,\n validate,\n sourceUrl:\n \"https://en.wikipedia.org/wiki/Tax_Identification_Number#Venezuela\",\n generate,\n};\n\nexport default rif;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;;;;AA6BA,MAAM,gBAAwC;CAC5C,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;;AAGA,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;;;;;AAMvC,MAAM,eAAe;AAErB,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY;AAEzC,MAAM,kBACJ,QACA,SACW;CACX,MAAM,KAAK,cAAc,WAAW;CACpC,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GACxC,OAAO,OAAO,KAAK,EAAE,IAAI;CAK3B,OAAO,cAHQ,KAAM,MAAM,MAAO;AAIpC;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,2BACF;CAKF,MAAM,SAAS,EAAE;CACjB,IAAI,EAAE,UAAU,gBACd,OAAO,IACL,qBACA,sCACF;CAGF,MAAM,OAAO,EAAE,MAAM,GAAG,CAAC;CACzB,MAAM,QAAQ,EAAE,MAAM,CAAC;CACvB,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,GACtB,OAAO,IACL,kBACA,mCACF;CAIF,IAAI,UADa,eAAe,QAAQ,IACnB,GACnB,OAAO,IACL,oBACA,gCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;AAC9C;AAEA,MAAM,iBAAiB;CAAC;CAAK;CAAK;CAAK;CAAK;AAAG;;AAG/C,MAAM,iBAAyB;CAC7B,MAAM,SAAS,WAAW,cAAc;CACxC,MAAM,OAAO,aAAa,CAAC;CAC3B,OAAO,SAAS,OAAO,eAAe,QAAQ,IAAI;AACpD;;;;;;AAOA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CACP,OACA,gCACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,cAAc,YAAY;CACrC;CACA;CACA;CACA,WACE;CACF;AACF"}
|
package/dist/vn/mst.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CountryValidator, ValidateResult } from "../types.js";
|
|
2
2
|
|
|
3
3
|
//#region src/vn/mst.d.ts
|
|
4
4
|
declare const compact: (value: string) => string;
|
|
@@ -7,7 +7,7 @@ declare const format: (value: string) => string;
|
|
|
7
7
|
/** Generate a random valid Vietnamese MST. */
|
|
8
8
|
declare const generate: () => string;
|
|
9
9
|
/** Vietnamese Tax Number. */
|
|
10
|
-
declare const mst:
|
|
10
|
+
declare const mst: CountryValidator<"VN">;
|
|
11
11
|
//#endregion
|
|
12
12
|
export { compact, mst as default, format, generate, validate };
|
|
13
13
|
//# sourceMappingURL=mst.d.ts.map
|
package/dist/vn/mst.js
CHANGED
|
@@ -3,18 +3,6 @@ import { randomDigits, randomInt } from "../_util/generate.js";
|
|
|
3
3
|
import { err } from "../_util/result.js";
|
|
4
4
|
import { isdigits } from "../_util/strings.js";
|
|
5
5
|
//#region src/vn/mst.ts
|
|
6
|
-
/**
|
|
7
|
-
* MST (Mã số thuế, Vietnam tax number).
|
|
8
|
-
*
|
|
9
|
-
* 10 or 13 digits. The first two digits encode the province
|
|
10
|
-
* where the business was registered. Digits 3-9 are a
|
|
11
|
-
* sequential number (0000001-9999999). Digit 10 is a
|
|
12
|
-
* weighted mod-11 check digit. An optional 3-digit branch
|
|
13
|
-
* suffix (001-999) may follow, separated by a dash.
|
|
14
|
-
*
|
|
15
|
-
* @see https://vi.wikipedia.org/wiki/Thuế_Việt_Nam#Mã_số_thuế_(MST)_của_doanh_nghiệp
|
|
16
|
-
* @see https://easyinvoice.vn/ma-so-thue/
|
|
17
|
-
*/
|
|
18
6
|
const WEIGHTS = [
|
|
19
7
|
31,
|
|
20
8
|
29,
|
|
@@ -65,6 +53,7 @@ const mst = {
|
|
|
65
53
|
abbreviation: "MST",
|
|
66
54
|
aliases: ["MST", "mã số thuế"],
|
|
67
55
|
candidatePattern: "\\d{10}(-\\d{3})?",
|
|
56
|
+
scope: "country",
|
|
68
57
|
country: "VN",
|
|
69
58
|
entityType: "company",
|
|
70
59
|
description: "10- or 13-digit tax identifier for enterprises",
|
package/dist/vn/mst.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mst.js","names":[],"sources":["../../src/vn/mst.ts"],"sourcesContent":["/**\n * MST (Mã số thuế, Vietnam tax number).\n *\n * 10 or 13 digits. The first two digits encode the province\n * where the business was registered. Digits 3-9 are a\n * sequential number (0000001-9999999). Digit 10 is a\n * weighted mod-11 check digit. An optional 3-digit branch\n * suffix (001-999) may follow, separated by a dash.\n *\n * @see https://vi.wikipedia.org/wiki/Thuế_Việt_Nam#Mã_số_thuế_(MST)_của_doanh_nghiệp\n * @see https://easyinvoice.vn/ma-so-thue/\n */\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\
|
|
1
|
+
{"version":3,"file":"mst.js","names":[],"sources":["../../src/vn/mst.ts"],"sourcesContent":["/**\n * MST (Mã số thuế, Vietnam tax number).\n *\n * 10 or 13 digits. The first two digits encode the province\n * where the business was registered. Digits 3-9 are a\n * sequential number (0000001-9999999). Digit 10 is a\n * weighted mod-11 check digit. An optional 3-digit branch\n * suffix (001-999) may follow, separated by a dash.\n *\n * @see https://vi.wikipedia.org/wiki/Thuế_Việt_Nam#Mã_số_thuế_(MST)_của_doanh_nghiệp\n * @see https://easyinvoice.vn/ma-so-thue/\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS = [31, 29, 23, 19, 17, 13, 7, 5, 3] as const;\n\nconst calcCheckDigit = (number: string): string => {\n let total = 0;\n for (let i = 0; i < 9; i++) {\n total += (WEIGHTS[i] ?? 0) * Number(number.charAt(i));\n }\n const remainder = 10 - (total % 11);\n // When remainder is 10, the sequential part is\n // never issued by GDT. Returning \"0\" keeps the\n // function correct as a digit calculator (mod 10\n // wrap) while still rejecting these numbers since\n // no real MST will have this combination.\n return String(\n remainder >= 10 ? remainder - 10 : remainder,\n );\n};\n\nconst compact = (value: string): string =>\n clean(value, \" -.\");\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 10 && v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"MST must be 10 or 13 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"MST must contain only digits\",\n );\n }\n\n // Sequential part (digits 3-9) must not be all zeros\n if (v.slice(2, 9) === \"0000000\") {\n return err(\n \"INVALID_COMPONENT\",\n \"MST sequential part must not be 0000000\",\n );\n }\n\n // Branch suffix (last 3 digits) must not be 000\n if (v.length === 13 && v.slice(10) === \"000\") {\n return err(\n \"INVALID_COMPONENT\",\n \"MST branch suffix must not be 000\",\n );\n }\n\n // Check digit (position 10, index 9)\n if (v[9] !== calcCheckDigit(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"MST check digit does not match\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 13) {\n return `${v.slice(0, 10)}-${v.slice(10)}`;\n }\n return v;\n};\n\n/** Generate a random valid Vietnamese MST. */\nconst generate = (): string => {\n for (;;) {\n const province = String(randomInt(1, 99)).padStart(\n 2,\n \"0\",\n );\n const payload = province + randomDigits(7);\n const c = payload + calcCheckDigit(payload);\n if (validate(c).valid) return c;\n }\n};\n\n/** Vietnamese Tax Number. */\nconst mst: CountryValidator<\"VN\"> = {\n name: \"Vietnamese Tax Number\",\n localName: \"Mã số thuế\",\n abbreviation: \"MST\",\n aliases: [\"MST\", \"mã số thuế\"] as const,\n candidatePattern: \"\\\\d{10}(-\\\\d{3})?\",\n scope: \"country\",\n country: \"VN\",\n entityType: \"company\",\n description:\n \"10- or 13-digit tax identifier for enterprises\",\n sourceUrl:\n \"https://vi.wikipedia.org/wiki/Thu%E1%BA%BF_Vi%E1%BB%87t_Nam#M%C3%A3_s%E1%BB%91_thu%E1%BA%BF_(MST)_c%E1%BB%A7a_doanh_nghi%E1%BB%87p\",\n lengths: [10, 13] as const,\n examples: [\"0100233488\", \"0314409058002\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default mst;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAuBA,MAAM,UAAU;CAAC;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAG;CAAG;AAAC;AAEhD,MAAM,kBAAkB,WAA2B;CACjD,IAAI,QAAQ;CACZ,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,UAAU,QAAQ,MAAM,KAAK,OAAO,OAAO,OAAO,CAAC,CAAC;CAEtD,MAAM,YAAY,KAAM,QAAQ;CAMhC,OAAO,OACL,aAAa,KAAK,YAAY,KAAK,SACrC;AACF;AAEA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,MAAM,EAAE,WAAW,IAClC,OAAO,IACL,kBACA,6BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,8BACF;CAIF,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,WACpB,OAAO,IACL,qBACA,yCACF;CAIF,IAAI,EAAE,WAAW,MAAM,EAAE,MAAM,EAAE,MAAM,OACrC,OAAO,IACL,qBACA,mCACF;CAIF,IAAI,EAAE,OAAO,eAAe,CAAC,GAC3B,OAAO,IACL,oBACA,gCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;CAExC,OAAO;AACT;;AAGA,MAAM,iBAAyB;CAC7B,SAAS;EAKP,MAAM,UAJW,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SACxC,GACA,GAEqB,IAAI,aAAa,CAAC;EACzC,MAAM,IAAI,UAAU,eAAe,OAAO;EAC1C,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO;CAChC;AACF;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,YAAY;CAC7B,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,aACE;CACF,WACE;CACF,SAAS,CAAC,IAAI,EAAE;CAChB,UAAU,CAAC,cAAc,eAAe;CACxC;CACA;CACA;CACA;AACF"}
|
package/dist/za/idnr.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ParsedPersonId, ValidateResult
|
|
1
|
+
import { CountryValidator, ParsedPersonId, ValidateResult } from "../types.js";
|
|
2
2
|
|
|
3
3
|
//#region src/za/idnr.d.ts
|
|
4
4
|
declare const compact: (value: string) => string;
|
|
@@ -12,7 +12,7 @@ declare const parse: (value: string) => ParsedPersonId | null;
|
|
|
12
12
|
/** Generate a random valid South African ID. */
|
|
13
13
|
declare const generate: () => string;
|
|
14
14
|
/** South African Identity Number. */
|
|
15
|
-
declare const idnr:
|
|
15
|
+
declare const idnr: CountryValidator<"ZA", ParsedPersonId>;
|
|
16
16
|
//#endregion
|
|
17
17
|
export { compact, idnr as default, format, generate, parse, validate };
|
|
18
18
|
//# sourceMappingURL=idnr.d.ts.map
|
package/dist/za/idnr.js
CHANGED
|
@@ -1,24 +1,10 @@
|
|
|
1
|
+
import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
|
|
1
2
|
import { clean } from "../_util/clean.js";
|
|
3
|
+
import { isValidDate } from "../_util/date.js";
|
|
2
4
|
import { randomDigits, randomInt } from "../_util/generate.js";
|
|
3
5
|
import { err } from "../_util/result.js";
|
|
4
|
-
import { luhnChecksum, luhnValidate } from "../_checksums/luhn.js";
|
|
5
6
|
import { isdigits } from "../_util/strings.js";
|
|
6
|
-
import { isValidDate } from "../_util/date.js";
|
|
7
7
|
//#region src/za/idnr.ts
|
|
8
|
-
/**
|
|
9
|
-
* South African Identity Number.
|
|
10
|
-
*
|
|
11
|
-
* 13-digit number encoding date of birth, gender,
|
|
12
|
-
* citizenship, and a Luhn check digit.
|
|
13
|
-
* Format: YYMMDD SSSS C A Z
|
|
14
|
-
* - YYMMDD: date of birth
|
|
15
|
-
* - SSSS: sequence (0000-4999 female, 5000-9999 male)
|
|
16
|
-
* - C: citizenship (0 = citizen, 1 = permanent resident)
|
|
17
|
-
* - A: was used for race (now always 8 or 9)
|
|
18
|
-
* - Z: Luhn check digit
|
|
19
|
-
*
|
|
20
|
-
* @see https://en.wikipedia.org/wiki/South_African_identity_document
|
|
21
|
-
*/
|
|
22
8
|
const compact = (value) => clean(value, " ");
|
|
23
9
|
/**
|
|
24
10
|
* Resolve the birth date from the 2-digit year.
|
|
@@ -93,6 +79,7 @@ const idnr = {
|
|
|
93
79
|
abbreviation: "SA ID",
|
|
94
80
|
aliases: ["ID number", "RSA ID"],
|
|
95
81
|
candidatePattern: "\\d{13}",
|
|
82
|
+
scope: "country",
|
|
96
83
|
country: "ZA",
|
|
97
84
|
entityType: "person",
|
|
98
85
|
compact,
|
package/dist/za/idnr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idnr.js","names":[],"sources":["../../src/za/idnr.ts"],"sourcesContent":["/**\n * South African Identity Number.\n *\n * 13-digit number encoding date of birth, gender,\n * citizenship, and a Luhn check digit.\n * Format: YYMMDD SSSS C A Z\n * - YYMMDD: date of birth\n * - SSSS: sequence (0000-4999 female, 5000-9999 male)\n * - C: citizenship (0 = citizen, 1 = permanent resident)\n * - A: was used for race (now always 8 or 9)\n * - Z: Luhn check digit\n *\n * @see https://en.wikipedia.org/wiki/South_African_identity_document\n */\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\
|
|
1
|
+
{"version":3,"file":"idnr.js","names":[],"sources":["../../src/za/idnr.ts"],"sourcesContent":["/**\n * South African Identity Number.\n *\n * 13-digit number encoding date of birth, gender,\n * citizenship, and a Luhn check digit.\n * Format: YYMMDD SSSS C A Z\n * - YYMMDD: date of birth\n * - SSSS: sequence (0000-4999 female, 5000-9999 male)\n * - C: citizenship (0 = citizen, 1 = permanent resident)\n * - A: was used for race (now always 8 or 9)\n * - Z: Luhn check digit\n *\n * @see https://en.wikipedia.org/wiki/South_African_identity_document\n */\n\nimport type {\n ParsedPersonId,\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n luhnValidate,\n luhnChecksum,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\nimport { isValidDate } from \"#util/date\";\nimport { randomDigits, randomInt } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst compact = (value: string): string =>\n clean(value, \" \");\n\n/**\n * Resolve the birth date from the 2-digit year.\n * Years after the current year are assumed to be\n * in the previous century.\n */\nconst resolveBirthDate = (\n v: string,\n): { year: number; month: number; day: number } | null => {\n const today = new Date();\n const century = Math.floor(today.getFullYear() / 100);\n let year = century * 100 + Number(v.slice(0, 2));\n const month = Number(v.slice(2, 4));\n const day = Number(v.slice(4, 6));\n if (year > today.getFullYear()) {\n year -= 100;\n }\n if (!isValidDate(year, month, day)) return null;\n return { year, month, day };\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 13) {\n return err(\n \"INVALID_LENGTH\",\n \"SA ID must be exactly 13 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"SA ID must contain only digits\",\n );\n }\n if (resolveBirthDate(v) === null) {\n return err(\n \"INVALID_COMPONENT\",\n \"SA ID contains an invalid date of birth\",\n );\n }\n const citizenship = v[10];\n if (citizenship !== \"0\" && citizenship !== \"1\") {\n return err(\n \"INVALID_COMPONENT\",\n \"SA ID citizenship digit must be 0 or 1\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"SA ID Luhn check digit mismatch\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n if (v.length === 13) {\n return `${v.slice(0, 6)} ${v.slice(6, 10)} ${v.slice(10, 12)} ${v.slice(12)}`;\n }\n return v;\n};\n\n/**\n * Extract birth date and gender from a South African\n * ID number. Returns null if the value is not valid.\n */\nconst parse = (value: string): ParsedPersonId | null => {\n const result = validate(value);\n if (!result.valid) return null;\n\n const v = result.compact;\n const bd = resolveBirthDate(v);\n if (bd === null) return null;\n\n const sequence = Number(v.slice(6, 10));\n\n return {\n birthDate: new Date(bd.year, bd.month - 1, bd.day),\n gender: sequence < 5000 ? \"female\" : \"male\",\n };\n};\n\n/** Generate a random valid South African ID. */\nconst generate = (): string => {\n for (;;) {\n const yy = String(randomInt(50, 99)).padStart(2, \"0\");\n const mm = String(randomInt(1, 12)).padStart(2, \"0\");\n const dd = String(randomInt(1, 28)).padStart(2, \"0\");\n const serial = randomDigits(4);\n const citizen = String(randomInt(0, 1));\n const payload = yy + mm + dd + serial + citizen + \"8\";\n const cs = luhnChecksum(payload + \"0\");\n const c = payload + String((10 - cs) % 10);\n if (validate(c).valid) return c;\n }\n};\n\n/** South African Identity Number. */\nconst idnr: CountryValidator<\"ZA\", ParsedPersonId> = {\n name: \"South African Identity Number\",\n localName: \"South African Identity Number\",\n abbreviation: \"SA ID\",\n aliases: [\"ID number\", \"RSA ID\"] as const,\n candidatePattern: \"\\\\d{13}\",\n scope: \"country\",\n country: \"ZA\",\n entityType: \"person\",\n compact,\n format,\n parse,\n validate,\n description:\n \"South African personal identification number\",\n sourceUrl:\n \"https://en.wikipedia.org/wiki/\" +\n \"South_African_identity_document\",\n lengths: [13] as const,\n examples: [\"7503305044089\", \"8001015009087\"] as const,\n generate,\n};\n\nexport default idnr;\nexport { compact, format, parse, validate, generate };\n"],"mappings":";;;;;;;AA+BA,MAAM,WAAW,UACf,MAAM,OAAO,GAAG;;;;;;AAOlB,MAAM,oBACJ,MACwD;CACxD,MAAM,wBAAQ,IAAI,KAAK;CAEvB,IAAI,OADY,KAAK,MAAM,MAAM,YAAY,IAAI,GAChC,IAAI,MAAM,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAC/C,MAAM,QAAQ,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAClC,MAAM,MAAM,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;CAChC,IAAI,OAAO,MAAM,YAAY,GAC3B,QAAQ;CAEV,IAAI,CAAC,YAAY,MAAM,OAAO,GAAG,GAAG,OAAO;CAC3C,OAAO;EAAE;EAAM;EAAO;CAAI;AAC5B;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,iCACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,gCACF;CAEF,IAAI,iBAAiB,CAAC,MAAM,MAC1B,OAAO,IACL,qBACA,yCACF;CAEF,MAAM,cAAc,EAAE;CACtB,IAAI,gBAAgB,OAAO,gBAAgB,KACzC,OAAO,IACL,qBACA,wCACF;CAEF,IAAI,CAAC,aAAa,CAAC,GACjB,OAAO,IACL,oBACA,iCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;CAE5E,OAAO;AACT;;;;;AAMA,MAAM,SAAS,UAAyC;CACtD,MAAM,SAAS,SAAS,KAAK;CAC7B,IAAI,CAAC,OAAO,OAAO,OAAO;CAE1B,MAAM,IAAI,OAAO;CACjB,MAAM,KAAK,iBAAiB,CAAC;CAC7B,IAAI,OAAO,MAAM,OAAO;CAExB,MAAM,WAAW,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CAEtC,OAAO;EACL,WAAW,IAAI,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,GAAG,GAAG;EACjD,QAAQ,WAAW,MAAO,WAAW;CACvC;AACF;;AAGA,MAAM,iBAAyB;CAC7B,SAAS;EACP,MAAM,KAAK,OAAO,UAAU,IAAI,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;EACpD,MAAM,KAAK,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;EACnD,MAAM,KAAK,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG;EACnD,MAAM,SAAS,aAAa,CAAC;EAC7B,MAAM,UAAU,OAAO,UAAU,GAAG,CAAC,CAAC;EACtC,MAAM,UAAU,KAAK,KAAK,KAAK,SAAS,UAAU;EAClD,MAAM,KAAK,aAAa,UAAU,GAAG;EACrC,MAAM,IAAI,UAAU,QAAQ,KAAK,MAAM,EAAE;EACzC,IAAI,SAAS,CAAC,EAAE,OAAO,OAAO;CAChC;AACF;;AAGA,MAAM,OAA+C;CACnD,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,aAAa,QAAQ;CAC/B,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA;CACA,aACE;CACF,WACE;CAEF,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,iBAAiB,eAAe;CAC3C;AACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stll/stdnum",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Validate, compact, and format standard identifiers for Node.js and Bun. Pure TypeScript, zero dependencies, tree-shakeable per identifier.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"credit-card",
|
|
@@ -912,23 +912,33 @@
|
|
|
912
912
|
"oracle": "bun scripts/oracle.ts --mode=gate",
|
|
913
913
|
"oracle:gate": "bun scripts/oracle.ts --mode=gate",
|
|
914
914
|
"oracle:survey": "bun scripts/oracle.ts --mode=survey",
|
|
915
|
-
"lint": "oxlint . --deny-warnings",
|
|
916
|
-
"format": "oxfmt .",
|
|
917
|
-
"format:check": "oxfmt --check .",
|
|
918
|
-
"typecheck": "tsc -p tsconfig.json"
|
|
915
|
+
"lint": "bun --bun oxlint -c oxlint.config.ts --report-unused-disable-directives-severity=error --deny-warnings --type-aware .",
|
|
916
|
+
"format": "oxfmt . \"!.ai/**\" \"!.agents/**\" \"!.claude/**\" \"!AGENTS.md\" \"!CLAUDE.md\" \"!GEMINI.md\"",
|
|
917
|
+
"format:check": "oxfmt --check . \"!.ai/**\" \"!.agents/**\" \"!.claude/**\" \"!AGENTS.md\" \"!CLAUDE.md\" \"!GEMINI.md\"",
|
|
918
|
+
"typecheck": "tsc -p tsconfig.json",
|
|
919
|
+
"sync-ai:check": "bash scripts/sync-ai-skills.sh --check",
|
|
920
|
+
"lint:fix": "bun --bun oxlint -c oxlint.config.ts --type-aware --fix .",
|
|
921
|
+
"version:check": "node scripts/version-sync.mjs check",
|
|
922
|
+
"version:sync": "node scripts/version-sync.mjs sync"
|
|
919
923
|
},
|
|
920
924
|
"devDependencies": {
|
|
921
|
-
"
|
|
922
|
-
"
|
|
925
|
+
"@brazilian-utils/brazilian-utils": "^2.3.0",
|
|
926
|
+
"@stll/oxlint-config": "^0.3.0",
|
|
927
|
+
"@stll/typescript-config": "^0.3.0",
|
|
928
|
+
"@types/node": "^25.9.1",
|
|
929
|
+
"bun-types": "^1.3.14",
|
|
930
|
+
"fast-check": "^4.8.0",
|
|
923
931
|
"fast-luhn": "^2.0.2",
|
|
924
932
|
"iban": "^0.0.14",
|
|
925
|
-
"ibantools": "^4.5.
|
|
933
|
+
"ibantools": "^4.5.4",
|
|
926
934
|
"jsvat": "^2.5.4",
|
|
927
935
|
"luhn": "^2.4.1",
|
|
928
|
-
"oxfmt": "^0.
|
|
929
|
-
"oxlint": "^1.
|
|
930
|
-
"
|
|
931
|
-
"
|
|
936
|
+
"oxfmt": "^0.52.0",
|
|
937
|
+
"oxlint": "^1.67.0",
|
|
938
|
+
"oxlint-tsgolint": "^0.23.0",
|
|
939
|
+
"rut.js": "^2.1.0",
|
|
940
|
+
"stdnum": "^1.11.14",
|
|
941
|
+
"tsdown": "0.22.1",
|
|
932
942
|
"typescript": "^5.9.3",
|
|
933
943
|
"validate-polish": "^2.1.40"
|
|
934
944
|
},
|
|
@@ -19,6 +19,6 @@ export const mod1110checkDigit = (
|
|
|
19
19
|
/** Validate a string with a Mod 11,10 check digit. */
|
|
20
20
|
export const mod1110validate = (value: string): boolean => {
|
|
21
21
|
const payload = value.slice(0, -1);
|
|
22
|
-
const check = Number(value
|
|
22
|
+
const check = Number(value.at(-1));
|
|
23
23
|
return mod1110checkDigit(payload) === check;
|
|
24
24
|
};
|
package/src/ad/nrt.ts
CHANGED
|
@@ -25,6 +25,11 @@ const generate = (): string => {
|
|
|
25
25
|
* @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Andorra-TIN.pdf
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
|
+
import type {
|
|
29
|
+
ValidateResult,
|
|
30
|
+
CountryValidator,
|
|
31
|
+
} from "../types";
|
|
32
|
+
|
|
28
33
|
import { clean } from "#util/clean";
|
|
29
34
|
import {
|
|
30
35
|
randomChar,
|
|
@@ -34,8 +39,6 @@ import {
|
|
|
34
39
|
import { err } from "#util/result";
|
|
35
40
|
import { isdigits } from "#util/strings";
|
|
36
41
|
|
|
37
|
-
import type { ValidateResult, Validator } from "../types";
|
|
38
|
-
|
|
39
42
|
const VALID_PREFIXES = "ACDEFGLOPU";
|
|
40
43
|
|
|
41
44
|
const compact = (value: string): string =>
|
|
@@ -98,12 +101,13 @@ const format = (value: string): string => {
|
|
|
98
101
|
};
|
|
99
102
|
|
|
100
103
|
/** Andorra NRT (Número de Registre Tributari). */
|
|
101
|
-
const nrt:
|
|
104
|
+
const nrt: CountryValidator<"AD"> = {
|
|
102
105
|
name: "Andorra Tax Number",
|
|
103
106
|
localName: "Número de Registre Tributari",
|
|
104
107
|
abbreviation: "NRT",
|
|
105
108
|
aliases: ["NRT", "Número de Registre Tributari"] as const,
|
|
106
109
|
candidatePattern: "[A-Z]-?\\d{6}-?[A-Z]",
|
|
110
|
+
scope: "country",
|
|
107
111
|
country: "AD",
|
|
108
112
|
entityType: "any",
|
|
109
113
|
sourceUrl:
|