@stll/stdnum 0.0.1 → 2.0.0
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/LICENSE +1 -5
- package/README.md +28 -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 +5 -5
- 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.d.ts +13 -1
- package/dist/_util/generate.js +23 -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/mod.d.ts +3 -2
- package/dist/ad/nrt.d.ts +16 -2
- package/dist/ad/nrt.js +4 -16
- package/dist/ad/nrt.js.map +1 -1
- package/dist/ae/eid.d.ts +2 -3
- package/dist/ae/eid.js +2 -12
- package/dist/ae/eid.js.map +1 -1
- package/dist/ae/mod.d.ts +3 -2
- package/dist/ai/mod.d.ts +3 -2
- 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/mod.d.ts +3 -2
- 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/mod.d.ts +3 -2
- 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 -3
- package/dist/ar/cbu.js +2 -10
- package/dist/ar/cbu.js.map +1 -1
- package/dist/ar/cuit.d.ts +2 -3
- package/dist/ar/cuit.js +13 -29
- 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/ar/mod.d.ts +3 -2
- 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/mod.d.ts +3 -2
- package/dist/at/tin.d.ts +2 -3
- package/dist/at/tin.js +1 -11
- package/dist/at/tin.js.map +1 -1
- package/dist/at/uid.d.ts +2 -3
- package/dist/at/uid.js +2 -10
- package/dist/at/uid.js.map +1 -1
- package/dist/at/vnr.d.ts +5 -4
- package/dist/at/vnr.js +23 -16
- package/dist/at/vnr.js.map +1 -1
- package/dist/au/abn.d.ts +2 -3
- package/dist/au/abn.js +1 -10
- package/dist/au/abn.js.map +1 -1
- package/dist/au/acn.d.ts +2 -3
- package/dist/au/acn.js +1 -10
- package/dist/au/acn.js.map +1 -1
- package/dist/au/mod.d.ts +3 -2
- package/dist/au/tfn.d.ts +2 -3
- package/dist/au/tfn.js +1 -10
- package/dist/au/tfn.js.map +1 -1
- package/dist/az/mod.d.ts +3 -2
- package/dist/az/voen.d.ts +2 -3
- package/dist/az/voen.js +1 -14
- package/dist/az/voen.js.map +1 -1
- package/dist/ba/jmbg.d.ts +2 -3
- package/dist/ba/jmbg.js +4 -11
- package/dist/ba/jmbg.js.map +1 -1
- package/dist/ba/mod.d.ts +3 -2
- package/dist/bd/mod.d.ts +3 -2
- package/dist/bd/nid.d.ts +23 -2
- package/dist/bd/nid.js +11 -32
- package/dist/bd/nid.js.map +1 -1
- package/dist/be/bis.d.ts +2 -3
- package/dist/be/bis.js +1 -11
- package/dist/be/bis.js.map +1 -1
- package/dist/be/mod.d.ts +3 -2
- package/dist/be/nn.d.ts +2 -3
- package/dist/be/nn.js +1 -11
- package/dist/be/nn.js.map +1 -1
- package/dist/be/vat.d.ts +2 -3
- package/dist/be/vat.js +1 -9
- package/dist/be/vat.js.map +1 -1
- package/dist/bg/egn.d.ts +2 -3
- package/dist/bg/egn.js +5 -13
- package/dist/bg/egn.js.map +1 -1
- package/dist/bg/mod.d.ts +3 -2
- package/dist/bg/pnf.d.ts +2 -3
- package/dist/bg/pnf.js +1 -8
- package/dist/bg/pnf.js.map +1 -1
- package/dist/bg/vat.d.ts +2 -3
- package/dist/bg/vat.js +3 -9
- package/dist/bg/vat.js.map +1 -1
- package/dist/bh/cpr.d.ts +5 -4
- package/dist/bh/cpr.js +9 -19
- package/dist/bh/cpr.js.map +1 -1
- package/dist/bh/mod.d.ts +3 -2
- package/dist/bic.d.ts +13 -2
- package/dist/bic.js +14 -26
- package/dist/bic.js.map +1 -1
- package/dist/br/cnpj.d.ts +2 -3
- package/dist/br/cnpj.js +1 -20
- package/dist/br/cnpj.js.map +1 -1
- package/dist/br/cpf.d.ts +2 -3
- package/dist/br/cpf.js +1 -14
- package/dist/br/cpf.js.map +1 -1
- package/dist/br/mod.d.ts +3 -2
- package/dist/by/mod.d.ts +3 -2
- package/dist/by/unp.d.ts +2 -3
- package/dist/by/unp.js +9 -17
- package/dist/by/unp.js.map +1 -1
- package/dist/bz/mod.d.ts +3 -2
- package/dist/bz/tin.d.ts +5 -4
- package/dist/bz/tin.js +10 -27
- package/dist/bz/tin.js.map +1 -1
- package/dist/ca/bn.d.ts +2 -3
- package/dist/ca/bn.js +2 -10
- package/dist/ca/bn.js.map +1 -1
- package/dist/ca/mod.d.ts +3 -2
- package/dist/ca/sin.d.ts +2 -3
- package/dist/ca/sin.js +2 -10
- package/dist/ca/sin.js.map +1 -1
- package/dist/ch/mod.d.ts +3 -2
- package/dist/ch/ssn.d.ts +2 -3
- package/dist/ch/ssn.js +1 -9
- package/dist/ch/ssn.js.map +1 -1
- package/dist/ch/uid.d.ts +2 -3
- package/dist/ch/uid.js +1 -9
- package/dist/ch/uid.js.map +1 -1
- package/dist/ch/vat.d.ts +2 -3
- package/dist/ch/vat.js +1 -9
- package/dist/ch/vat.js.map +1 -1
- package/dist/cl/mod.d.ts +3 -2
- package/dist/cl/rut.d.ts +2 -3
- package/dist/cl/rut.js +2 -15
- package/dist/cl/rut.js.map +1 -1
- package/dist/cn/mod.d.ts +3 -2
- package/dist/cn/ric.d.ts +2 -3
- package/dist/cn/ric.js +4 -14
- package/dist/cn/ric.js.map +1 -1
- package/dist/cn/uscc.d.ts +2 -3
- package/dist/cn/uscc.js +8 -16
- package/dist/cn/uscc.js.map +1 -1
- package/dist/co/mod.d.ts +3 -2
- package/dist/co/nit.d.ts +2 -3
- package/dist/co/nit.js +6 -13
- package/dist/co/nit.js.map +1 -1
- package/dist/cr/cpf.d.ts +18 -2
- package/dist/cr/cpf.js +5 -19
- package/dist/cr/cpf.js.map +1 -1
- package/dist/cr/mod.d.ts +3 -2
- package/dist/creditcard.d.ts +2 -3
- package/dist/creditcard.js +5 -14
- package/dist/creditcard.js.map +1 -1
- package/dist/cu/mod.d.ts +3 -2
- package/dist/cu/ni.d.ts +5 -4
- package/dist/cu/ni.js +13 -18
- package/dist/cu/ni.js.map +1 -1
- package/dist/cy/mod.d.ts +3 -2
- package/dist/cy/vat.d.ts +2 -3
- package/dist/cy/vat.js +1 -8
- package/dist/cy/vat.js.map +1 -1
- package/dist/cz/dic.d.ts +2 -3
- package/dist/cz/dic.js +7 -13
- package/dist/cz/dic.js.map +1 -1
- package/dist/cz/ico.d.ts +2 -3
- package/dist/cz/ico.js +2 -10
- package/dist/cz/ico.js.map +1 -1
- package/dist/cz/mod.d.ts +3 -2
- package/dist/cz/rc.d.ts +2 -3
- package/dist/cz/rc.js +22 -21
- package/dist/cz/rc.js.map +1 -1
- package/dist/de/handelsreg.d.ts +19 -2
- package/dist/de/handelsreg.js +10 -26
- package/dist/de/handelsreg.js.map +1 -1
- package/dist/de/idnr.d.ts +2 -3
- package/dist/de/idnr.js +2 -12
- package/dist/de/idnr.js.map +1 -1
- package/dist/de/mod.d.ts +3 -2
- package/dist/de/stnr.d.ts +17 -3
- package/dist/de/stnr.js +1 -15
- package/dist/de/stnr.js.map +1 -1
- package/dist/de/svnr.d.ts +2 -3
- package/dist/de/svnr.js +4 -13
- package/dist/de/svnr.js.map +1 -1
- package/dist/de/vat.d.ts +2 -3
- package/dist/de/vat.js +2 -11
- package/dist/de/vat.js.map +1 -1
- package/dist/dk/cpr.d.ts +5 -4
- package/dist/dk/cpr.js +14 -12
- package/dist/dk/cpr.js.map +1 -1
- package/dist/dk/cvr.d.ts +2 -3
- package/dist/dk/cvr.js +2 -15
- package/dist/dk/cvr.js.map +1 -1
- package/dist/dk/mod.d.ts +3 -2
- package/dist/dk/vat.d.ts +2 -3
- package/dist/dk/vat.js +3 -13
- package/dist/dk/vat.js.map +1 -1
- package/dist/do/mod.d.ts +3 -2
- package/dist/do/rnc.d.ts +2 -3
- package/dist/do/rnc.js +3 -17
- package/dist/do/rnc.js.map +1 -1
- package/dist/ec/mod.d.ts +3 -2
- package/dist/ec/ruc.d.ts +2 -3
- package/dist/ec/ruc.js +2 -19
- package/dist/ec/ruc.js.map +1 -1
- package/dist/ee/ik.d.ts +2 -3
- package/dist/ee/ik.js +6 -15
- package/dist/ee/ik.js.map +1 -1
- package/dist/ee/mod.d.ts +3 -2
- package/dist/ee/registrikood.d.ts +2 -3
- package/dist/ee/registrikood.js +9 -15
- package/dist/ee/registrikood.js.map +1 -1
- package/dist/ee/vat.d.ts +2 -3
- package/dist/ee/vat.js +2 -10
- package/dist/ee/vat.js.map +1 -1
- package/dist/eg/mod.d.ts +3 -2
- 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 -3
- package/dist/es/cif.js +3 -12
- package/dist/es/cif.js.map +1 -1
- package/dist/es/dni.d.ts +2 -3
- package/dist/es/dni.js +1 -9
- package/dist/es/dni.js.map +1 -1
- package/dist/es/mod.d.ts +3 -2
- package/dist/es/nie.d.ts +2 -3
- package/dist/es/nie.js +14 -22
- package/dist/es/nie.js.map +1 -1
- package/dist/es/nss.d.ts +2 -3
- package/dist/es/nss.js +1 -16
- package/dist/es/nss.js.map +1 -1
- package/dist/es/vat.d.ts +2 -3
- package/dist/es/vat.js +5 -10
- package/dist/es/vat.js.map +1 -1
- package/dist/eu/mod.d.ts +3 -2
- package/dist/eu/vat.d.ts +5 -4
- package/dist/eu/vat.js +44 -2
- package/dist/eu/vat.js.map +1 -1
- package/dist/fi/hetu.d.ts +5 -4
- package/dist/fi/hetu.js +19 -12
- package/dist/fi/hetu.js.map +1 -1
- package/dist/fi/mod.d.ts +3 -2
- package/dist/fi/vat.d.ts +2 -3
- package/dist/fi/vat.js +3 -10
- package/dist/fi/vat.js.map +1 -1
- package/dist/fi/ytunnus.d.ts +2 -3
- package/dist/fi/ytunnus.js +2 -10
- package/dist/fi/ytunnus.js.map +1 -1
- package/dist/fr/mod.d.ts +3 -2
- package/dist/fr/nif.d.ts +2 -3
- package/dist/fr/nif.js +1 -9
- package/dist/fr/nif.js.map +1 -1
- package/dist/fr/nir.d.ts +2 -3
- package/dist/fr/nir.js +3 -14
- package/dist/fr/nir.js.map +1 -1
- package/dist/fr/siren.d.ts +2 -3
- package/dist/fr/siren.js +2 -10
- package/dist/fr/siren.js.map +1 -1
- package/dist/fr/siret.d.ts +2 -3
- package/dist/fr/siret.js +2 -11
- package/dist/fr/siret.js.map +1 -1
- package/dist/fr/tva.d.ts +2 -3
- package/dist/fr/tva.js +2 -12
- package/dist/fr/tva.js.map +1 -1
- package/dist/gb/mod.d.ts +3 -2
- package/dist/gb/nino.d.ts +12 -2
- package/dist/gb/nino.js +8 -17
- package/dist/gb/nino.js.map +1 -1
- package/dist/gb/sedol.d.ts +2 -3
- package/dist/gb/sedol.js +9 -18
- package/dist/gb/sedol.js.map +1 -1
- package/dist/gb/utr.d.ts +2 -3
- package/dist/gb/utr.js +2 -10
- package/dist/gb/utr.js.map +1 -1
- package/dist/gb/vat.d.ts +2 -3
- package/dist/gb/vat.js +2 -11
- package/dist/gb/vat.js.map +1 -1
- package/dist/ge/mod.d.ts +3 -2
- 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/mod.d.ts +3 -2
- package/dist/gh/tin.d.ts +2 -3
- package/dist/gh/tin.js +10 -24
- package/dist/gh/tin.js.map +1 -1
- package/dist/gr/amka.d.ts +2 -3
- package/dist/gr/amka.js +3 -11
- package/dist/gr/amka.js.map +1 -1
- package/dist/gr/mod.d.ts +3 -2
- package/dist/gr/vat.d.ts +2 -3
- package/dist/gr/vat.js +1 -10
- package/dist/gr/vat.js.map +1 -1
- package/dist/gt/mod.d.ts +3 -2
- package/dist/gt/nit.d.ts +2 -3
- package/dist/gt/nit.js +6 -14
- package/dist/gt/nit.js.map +1 -1
- package/dist/hk/hkid.d.ts +2 -3
- package/dist/hk/hkid.js +2 -10
- package/dist/hk/hkid.js.map +1 -1
- package/dist/hk/mod.d.ts +3 -2
- package/dist/hr/mod.d.ts +3 -2
- package/dist/hr/vat.d.ts +2 -3
- package/dist/hr/vat.js +2 -9
- package/dist/hr/vat.js.map +1 -1
- package/dist/hu/mod.d.ts +3 -2
- package/dist/hu/vat.d.ts +2 -3
- package/dist/hu/vat.js +3 -10
- package/dist/hu/vat.js.map +1 -1
- package/dist/iban.d.ts +2 -3
- package/dist/iban.js +2 -8
- package/dist/iban.js.map +1 -1
- package/dist/id/mod.d.ts +3 -2
- package/dist/id/npwp.d.ts +2 -3
- package/dist/id/npwp.js +3 -13
- package/dist/id/npwp.js.map +1 -1
- package/dist/ie/mod.d.ts +3 -2
- package/dist/ie/pps.d.ts +2 -3
- package/dist/ie/pps.js +1 -10
- package/dist/ie/pps.js.map +1 -1
- package/dist/ie/vat.d.ts +2 -3
- package/dist/ie/vat.js +1 -9
- package/dist/ie/vat.js.map +1 -1
- package/dist/il/idnr.d.ts +2 -3
- package/dist/il/idnr.js +2 -9
- package/dist/il/idnr.js.map +1 -1
- package/dist/il/mod.d.ts +3 -2
- package/dist/in/aadhaar.d.ts +2 -3
- package/dist/in/aadhaar.js +2 -12
- package/dist/in/aadhaar.js.map +1 -1
- package/dist/in/gstin.d.ts +2 -3
- package/dist/in/gstin.js +4 -11
- package/dist/in/gstin.js.map +1 -1
- package/dist/in/mod.d.ts +3 -2
- package/dist/in/pan.d.ts +15 -2
- package/dist/in/pan.js +3 -15
- package/dist/in/pan.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +6 -6
- package/dist/iq/mod.d.ts +3 -2
- 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/mod.d.ts +3 -2
- package/dist/ir/nid.d.ts +2 -3
- package/dist/ir/nid.js +2 -24
- package/dist/ir/nid.js.map +1 -1
- package/dist/is/kennitala.d.ts +2 -3
- package/dist/is/kennitala.js +2 -13
- package/dist/is/kennitala.js.map +1 -1
- package/dist/is/mod.d.ts +3 -2
- 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 -3
- package/dist/isin.js +11 -21
- package/dist/isin.js.map +1 -1
- package/dist/it/codicefiscale.d.ts +5 -4
- package/dist/it/codicefiscale.js +27 -23
- package/dist/it/codicefiscale.js.map +1 -1
- package/dist/it/iva.d.ts +2 -3
- package/dist/it/iva.js +2 -9
- package/dist/it/iva.js.map +1 -1
- package/dist/it/mod.d.ts +3 -2
- package/dist/jp/cn.d.ts +2 -3
- package/dist/jp/cn.js +1 -9
- package/dist/jp/cn.js.map +1 -1
- package/dist/jp/mod.d.ts +3 -2
- package/dist/jp/mynumber.d.ts +2 -3
- 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/mod.d.ts +3 -2
- package/dist/kr/rrn.d.ts +5 -4
- package/dist/kr/rrn.js +15 -13
- package/dist/kr/rrn.js.map +1 -1
- package/dist/kw/civil.d.ts +6 -5
- package/dist/kw/civil.js +20 -17
- package/dist/kw/civil.js.map +1 -1
- package/dist/kw/mod.d.ts +3 -2
- package/dist/kz/iin.d.ts +2 -3
- package/dist/kz/iin.js +4 -18
- package/dist/kz/iin.js.map +1 -1
- package/dist/kz/mod.d.ts +3 -2
- package/dist/lei.d.ts +2 -3
- package/dist/lei.js +2 -11
- package/dist/lei.js.map +1 -1
- package/dist/li/mod.d.ts +3 -2
- 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/mod.d.ts +3 -2
- package/dist/lk/nic.d.ts +5 -4
- package/dist/lk/nic.js +16 -16
- package/dist/lk/nic.js.map +1 -1
- package/dist/lt/asmens.d.ts +2 -3
- package/dist/lt/asmens.js +2 -1
- package/dist/lt/asmens.js.map +1 -1
- package/dist/lt/mod.d.ts +3 -2
- package/dist/lt/vat.d.ts +2 -3
- package/dist/lt/vat.js +2 -10
- package/dist/lt/vat.js.map +1 -1
- package/dist/lu/mod.d.ts +3 -2
- package/dist/lu/vat.d.ts +2 -3
- package/dist/lu/vat.js +2 -8
- package/dist/lu/vat.js.map +1 -1
- package/dist/luhn.d.ts +2 -3
- package/dist/luhn.js +9 -9
- package/dist/luhn.js.map +1 -1
- package/dist/lv/mod.d.ts +3 -2
- package/dist/lv/vat.d.ts +2 -3
- package/dist/lv/vat.js +19 -18
- package/dist/lv/vat.js.map +1 -1
- package/dist/ma/ice.d.ts +2 -3
- package/dist/ma/ice.js +2 -11
- package/dist/ma/ice.js.map +1 -1
- package/dist/ma/mod.d.ts +3 -2
- package/dist/mc/mod.d.ts +3 -2
- package/dist/mc/tva.d.ts +2 -3
- package/dist/mc/tva.js +1 -0
- package/dist/mc/tva.js.map +1 -1
- package/dist/md/idno.d.ts +2 -3
- package/dist/md/idno.js +1 -10
- package/dist/md/idno.js.map +1 -1
- package/dist/md/mod.d.ts +3 -2
- package/dist/me/mod.d.ts +3 -2
- package/dist/me/pib.d.ts +2 -3
- package/dist/me/pib.js +2 -10
- package/dist/me/pib.js.map +1 -1
- package/dist/mk/edb.d.ts +2 -3
- package/dist/mk/edb.js +2 -11
- package/dist/mk/edb.js.map +1 -1
- package/dist/mk/mod.d.ts +3 -2
- package/dist/mt/mod.d.ts +3 -2
- package/dist/mt/vat.d.ts +2 -3
- 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/mu/mod.d.ts +3 -2
- package/dist/mx/clabe.d.ts +2 -3
- package/dist/mx/clabe.js +1 -14
- package/dist/mx/clabe.js.map +1 -1
- package/dist/mx/curp.d.ts +5 -4
- package/dist/mx/curp.js +27 -19
- package/dist/mx/curp.js.map +1 -1
- package/dist/mx/mod.d.ts +3 -2
- package/dist/mx/rfc.d.ts +5 -4
- package/dist/mx/rfc.js +23 -20
- package/dist/mx/rfc.js.map +1 -1
- package/dist/my/mod.d.ts +3 -2
- package/dist/my/nric.d.ts +5 -4
- package/dist/my/nric.js +18 -16
- package/dist/my/nric.js.map +1 -1
- package/dist/ng/mod.d.ts +3 -2
- 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/mod.d.ts +3 -2
- package/dist/ni/ruc.d.ts +2 -3
- package/dist/ni/ruc.js +1 -23
- package/dist/ni/ruc.js.map +1 -1
- package/dist/nl/bsn.d.ts +2 -3
- 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/mod.d.ts +3 -2
- package/dist/nl/vat.d.ts +2 -3
- package/dist/nl/vat.js +4 -50
- package/dist/nl/vat.js.map +1 -1
- package/dist/no/fodselsnummer.d.ts +2 -3
- package/dist/no/fodselsnummer.js +3 -10
- package/dist/no/fodselsnummer.js.map +1 -1
- package/dist/no/mod.d.ts +3 -2
- package/dist/no/mva.d.ts +2 -3
- package/dist/no/mva.js +1 -8
- package/dist/no/mva.js.map +1 -1
- package/dist/no/orgnr.d.ts +2 -3
- package/dist/no/orgnr.js +2 -8
- package/dist/no/orgnr.js.map +1 -1
- package/dist/nz/ird.d.ts +2 -3
- package/dist/nz/ird.js +4 -13
- package/dist/nz/ird.js.map +1 -1
- package/dist/nz/mod.d.ts +3 -2
- package/dist/pa/mod.d.ts +3 -2
- package/dist/pa/ruc.d.ts +2 -3
- package/dist/pa/ruc.js +4 -19
- package/dist/pa/ruc.js.map +1 -1
- package/dist/patterns.d.ts +8 -10
- package/dist/patterns.js +83 -28
- package/dist/patterns.js.map +1 -1
- package/dist/pe/mod.d.ts +3 -2
- package/dist/pe/ruc.d.ts +2 -3
- package/dist/pe/ruc.js +10 -24
- package/dist/pe/ruc.js.map +1 -1
- package/dist/ph/mod.d.ts +3 -2
- 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/pk/mod.d.ts +3 -2
- package/dist/pl/mod.d.ts +3 -2
- package/dist/pl/nip.d.ts +2 -3
- package/dist/pl/nip.js +2 -10
- package/dist/pl/nip.js.map +1 -1
- package/dist/pl/pesel.d.ts +2 -3
- package/dist/pl/pesel.js +4 -13
- package/dist/pl/pesel.js.map +1 -1
- package/dist/pl/regon.d.ts +2 -3
- package/dist/pl/regon.js +2 -11
- package/dist/pl/regon.js.map +1 -1
- package/dist/pt/cc.d.ts +2 -3
- package/dist/pt/cc.js +7 -13
- package/dist/pt/cc.js.map +1 -1
- package/dist/pt/mod.d.ts +3 -2
- package/dist/pt/vat.d.ts +2 -3
- package/dist/pt/vat.js +3 -11
- package/dist/pt/vat.js.map +1 -1
- package/dist/ro/cnp.d.ts +2 -3
- package/dist/ro/cnp.js +5 -14
- package/dist/ro/cnp.js.map +1 -1
- package/dist/ro/mod.d.ts +3 -2
- package/dist/ro/vat.d.ts +2 -3
- package/dist/ro/vat.js +13 -11
- package/dist/ro/vat.js.map +1 -1
- package/dist/rs/mod.d.ts +3 -2
- package/dist/rs/pib.d.ts +2 -3
- package/dist/rs/pib.js +1 -9
- package/dist/rs/pib.js.map +1 -1
- package/dist/ru/inn.d.ts +2 -3
- package/dist/ru/inn.js +2 -12
- package/dist/ru/inn.js.map +1 -1
- package/dist/ru/mod.d.ts +3 -2
- package/dist/se/mod.d.ts +3 -2
- package/dist/se/orgnr.d.ts +2 -3
- package/dist/se/orgnr.js +2 -9
- package/dist/se/orgnr.js.map +1 -1
- package/dist/se/personnummer.d.ts +2 -3
- package/dist/se/personnummer.js +8 -15
- package/dist/se/personnummer.js.map +1 -1
- package/dist/se/vat.d.ts +2 -3
- package/dist/se/vat.js +3 -10
- package/dist/se/vat.js.map +1 -1
- package/dist/sg/mod.d.ts +3 -2
- package/dist/sg/uen.d.ts +2 -3
- package/dist/sg/uen.js +47 -70
- package/dist/sg/uen.js.map +1 -1
- package/dist/si/emso.d.ts +2 -3
- package/dist/si/emso.js +12 -14
- package/dist/si/emso.js.map +1 -1
- package/dist/si/mod.d.ts +3 -2
- package/dist/si/vat.d.ts +2 -3
- package/dist/si/vat.js +3 -12
- package/dist/si/vat.js.map +1 -1
- package/dist/sk/dic.d.ts +2 -3
- package/dist/sk/dic.js +1 -0
- package/dist/sk/dic.js.map +1 -1
- package/dist/sk/ico.d.ts +2 -3
- package/dist/sk/ico.js +1 -0
- package/dist/sk/ico.js.map +1 -1
- package/dist/sk/mod.d.ts +3 -2
- package/dist/sk/rc.d.ts +4 -5
- package/dist/sk/rc.js +6 -2
- package/dist/sk/rc.js.map +1 -1
- package/dist/th/mod.d.ts +3 -2
- package/dist/th/tin.d.ts +2 -3
- package/dist/th/tin.js +1 -11
- package/dist/th/tin.js.map +1 -1
- package/dist/tr/mod.d.ts +3 -2
- package/dist/tr/tckimlik.d.ts +2 -3
- package/dist/tr/tckimlik.js +1 -20
- package/dist/tr/tckimlik.js.map +1 -1
- package/dist/tr/vkn.d.ts +2 -3
- package/dist/tr/vkn.js +1 -20
- package/dist/tr/vkn.js.map +1 -1
- package/dist/tw/mod.d.ts +3 -2
- package/dist/tw/ubn.d.ts +2 -3
- package/dist/tw/ubn.js +2 -12
- package/dist/tw/ubn.js.map +1 -1
- package/dist/types.d.ts +56 -21
- package/dist/ua/edrpou.d.ts +2 -3
- package/dist/ua/edrpou.js +5 -12
- package/dist/ua/edrpou.js.map +1 -1
- package/dist/ua/mod.d.ts +3 -2
- package/dist/us/ein.d.ts +12 -2
- package/dist/us/ein.js +88 -97
- package/dist/us/ein.js.map +1 -1
- package/dist/us/itin.d.ts +13 -2
- package/dist/us/itin.js +4 -15
- package/dist/us/itin.js.map +1 -1
- package/dist/us/mod.d.ts +3 -2
- package/dist/us/rtn.d.ts +2 -3
- package/dist/us/rtn.js +11 -23
- 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/mod.d.ts +3 -2
- package/dist/uy/rut.d.ts +2 -3
- package/dist/uy/rut.js +2 -15
- package/dist/uy/rut.js.map +1 -1
- package/dist/ve/mod.d.ts +3 -2
- package/dist/ve/rif.d.ts +2 -3
- package/dist/ve/rif.js +13 -26
- package/dist/ve/rif.js.map +1 -1
- package/dist/vn/mod.d.ts +3 -2
- package/dist/vn/mst.d.ts +2 -3
- package/dist/vn/mst.js +1 -12
- package/dist/vn/mst.js.map +1 -1
- package/dist/za/idnr.d.ts +2 -3
- package/dist/za/idnr.js +4 -16
- package/dist/za/idnr.js.map +1 -1
- package/dist/za/mod.d.ts +3 -2
- package/package.json +34 -21
- package/src/_checksums/mod1110.ts +1 -1
- package/src/_checksums/mod112.ts +7 -6
- package/src/_util/generate.ts +38 -0
- package/src/ad/nrt.ts +19 -7
- 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 +9 -5
- package/src/ar/cuit.ts +22 -10
- 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 +62 -12
- 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 +9 -3
- package/src/ba/jmbg.ts +9 -7
- package/src/bd/nid.ts +11 -7
- 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 +19 -10
- package/src/bg/pnf.ts +7 -3
- package/src/bg/vat.ts +8 -3
- package/src/bh/cpr.ts +17 -4
- package/src/bic.ts +26 -20
- package/src/br/cnpj.ts +7 -3
- package/src/br/cpf.ts +7 -3
- package/src/by/unp.ts +19 -9
- package/src/bz/tin.ts +19 -4
- 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 +11 -5
- package/src/cn/ric.ts +11 -7
- package/src/cn/uscc.ts +27 -11
- package/src/co/nit.ts +14 -6
- package/src/cr/cpf.ts +11 -6
- package/src/creditcard.ts +10 -6
- package/src/cu/ni.ts +28 -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 +61 -29
- package/src/de/handelsreg.ts +21 -6
- package/src/de/idnr.ts +10 -3
- package/src/de/stnr.ts +11 -3
- package/src/de/svnr.ts +14 -5
- package/src/de/vat.ts +7 -3
- package/src/dk/cpr.ts +23 -8
- package/src/dk/cvr.ts +7 -3
- package/src/dk/vat.ts +8 -3
- package/src/do/rnc.ts +9 -5
- package/src/ec/ruc.ts +9 -5
- package/src/ee/ik.ts +21 -10
- package/src/ee/registrikood.ts +12 -7
- package/src/ee/vat.ts +7 -3
- package/src/eg/tn.ts +7 -3
- package/src/es/cif.ts +10 -7
- package/src/es/dni.ts +7 -3
- package/src/es/nie.ts +18 -9
- package/src/es/nss.ts +7 -3
- package/src/es/vat.ts +13 -5
- package/src/eu/vat.ts +55 -6
- package/src/fi/hetu.ts +26 -8
- 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 +9 -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 +18 -13
- package/src/gb/sedol.ts +21 -15
- 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 +11 -6
- package/src/gr/amka.ts +7 -3
- package/src/gr/vat.ts +7 -3
- package/src/gt/nit.ts +13 -6
- package/src/hk/hkid.ts +9 -4
- 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 +10 -4
- package/src/in/pan.ts +15 -6
- package/src/index.ts +6 -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 +17 -7
- package/src/it/codicefiscale.ts +49 -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 +27 -8
- package/src/kw/civil.ts +31 -14
- package/src/kz/iin.ts +9 -8
- package/src/lei.ts +7 -3
- package/src/li/peid.ts +7 -3
- package/src/lk/nic.ts +31 -8
- 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 +10 -3
- package/src/lv/vat.ts +53 -23
- 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 +47 -10
- package/src/mx/rfc.ts +42 -7
- package/src/my/nric.ts +33 -8
- 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 +18 -69
- package/src/no/fodselsnummer.ts +12 -7
- package/src/no/mva.ts +9 -5
- package/src/no/orgnr.ts +7 -3
- package/src/nz/ird.ts +12 -8
- package/src/pa/ruc.ts +39 -11
- package/src/patterns.ts +184 -46
- package/src/pe/ruc.ts +13 -10
- package/src/ph/philid.ts +7 -3
- package/src/pk/cnic.ts +9 -3
- package/src/pl/nip.ts +7 -3
- package/src/pl/pesel.ts +9 -7
- package/src/pl/regon.ts +7 -3
- package/src/pt/cc.ts +13 -7
- package/src/pt/vat.ts +8 -3
- package/src/ro/cnp.ts +16 -8
- package/src/ro/vat.ts +8 -3
- package/src/rs/pib.ts +7 -3
- package/src/ru/inn.ts +9 -5
- package/src/se/orgnr.ts +7 -3
- package/src/se/personnummer.ts +35 -32
- package/src/se/vat.ts +8 -3
- package/src/sg/uen.ts +44 -23
- package/src/si/emso.ts +37 -11
- 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 +17 -4
- 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 +9 -5
- package/src/types.ts +69 -7
- package/src/ua/edrpou.ts +10 -5
- package/src/us/ein.ts +95 -91
- package/src/us/itin.ts +14 -11
- package/src/us/rtn.ts +32 -19
- package/src/us/ssn.ts +7 -3
- package/src/uy/rut.ts +9 -5
- package/src/ve/rif.ts +19 -12
- package/src/vn/mst.ts +7 -3
- package/src/za/idnr.ts +9 -7
package/src/cu/ni.ts
CHANGED
|
@@ -15,16 +15,17 @@
|
|
|
15
15
|
* @see https://www.ecured.cu/Carnet_de_Identidad
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import { clean } from "#util/clean";
|
|
19
|
-
import { isValidDate } from "#util/date";
|
|
20
|
-
import { err } from "#util/result";
|
|
21
|
-
|
|
22
18
|
import type {
|
|
23
19
|
ParsedPersonId,
|
|
24
20
|
ValidateResult,
|
|
25
|
-
|
|
21
|
+
CountryValidator,
|
|
26
22
|
} from "../types";
|
|
27
23
|
|
|
24
|
+
import { clean } from "#util/clean";
|
|
25
|
+
import { isValidDate } from "#util/date";
|
|
26
|
+
import { randomDigits, randomInt } from "#util/generate";
|
|
27
|
+
import { err } from "#util/result";
|
|
28
|
+
|
|
28
29
|
const compact = (value: string): string =>
|
|
29
30
|
clean(value, " -").trim();
|
|
30
31
|
|
|
@@ -58,6 +59,8 @@ const validate = (value: string): ValidateResult => {
|
|
|
58
59
|
const yy = Number(v.slice(0, 2));
|
|
59
60
|
const mm = Number(v.slice(2, 4));
|
|
60
61
|
const dd = Number(v.slice(4, 6));
|
|
62
|
+
// SAFETY: regex check above guarantees v.length === 11.
|
|
63
|
+
// eslint-disable-next-line no-non-null-assertion
|
|
61
64
|
const year = centuryOffset(v[6]!) + yy;
|
|
62
65
|
|
|
63
66
|
if (!isValidDate(year, mm, dd)) {
|
|
@@ -84,6 +87,8 @@ const parse = (value: string): ParsedPersonId | null => {
|
|
|
84
87
|
const yy = Number(v.slice(0, 2));
|
|
85
88
|
const mm = Number(v.slice(2, 4));
|
|
86
89
|
const dd = Number(v.slice(4, 6));
|
|
90
|
+
// SAFETY: regex check above guarantees v.length === 11.
|
|
91
|
+
// eslint-disable-next-line no-non-null-assertion
|
|
87
92
|
const year = centuryOffset(v[6]!) + yy;
|
|
88
93
|
|
|
89
94
|
const genderDigit = Number(v[9]);
|
|
@@ -96,12 +101,25 @@ const parse = (value: string): ParsedPersonId | null => {
|
|
|
96
101
|
};
|
|
97
102
|
};
|
|
98
103
|
|
|
104
|
+
/** Generate a random valid Cuban NI. */
|
|
105
|
+
const generate = (): string => {
|
|
106
|
+
const year = randomInt(1950, 2024);
|
|
107
|
+
const month = String(randomInt(1, 12)).padStart(2, "0");
|
|
108
|
+
const day = String(randomInt(1, 28)).padStart(2, "0");
|
|
109
|
+
const yy = String(year % 100).padStart(2, "0");
|
|
110
|
+
const century =
|
|
111
|
+
year >= 2000
|
|
112
|
+
? String(randomInt(6, 8))
|
|
113
|
+
: String(randomInt(0, 5));
|
|
114
|
+
return `${yy}${month}${day}${century}${randomDigits(4)}`;
|
|
115
|
+
};
|
|
116
|
+
|
|
99
117
|
/**
|
|
100
118
|
* Cuban identity card number (NI).
|
|
101
119
|
*
|
|
102
120
|
* Examples sourced from python-stdnum test suite.
|
|
103
121
|
*/
|
|
104
|
-
const ni:
|
|
122
|
+
const ni: CountryValidator<"CU", ParsedPersonId> = {
|
|
105
123
|
name: "Cuban Identity Card Number",
|
|
106
124
|
localName: "Número de Identidad",
|
|
107
125
|
abbreviation: "NI",
|
|
@@ -111,15 +129,18 @@ const ni: Validator = {
|
|
|
111
129
|
"carnet de identidad",
|
|
112
130
|
] as const,
|
|
113
131
|
candidatePattern: "\\d{11}",
|
|
132
|
+
scope: "country",
|
|
114
133
|
country: "CU",
|
|
115
134
|
entityType: "person",
|
|
116
135
|
lengths: [11] as const,
|
|
117
136
|
examples: ["91021027775", "72062506561"] as const,
|
|
118
137
|
compact,
|
|
119
138
|
format,
|
|
139
|
+
parse,
|
|
120
140
|
validate,
|
|
141
|
+
generate,
|
|
121
142
|
sourceUrl: "https://www.ecured.cu/Carnet_de_Identidad",
|
|
122
143
|
};
|
|
123
144
|
|
|
124
145
|
export default ni;
|
|
125
|
-
export { compact, format, parse, validate };
|
|
146
|
+
export { compact, format, generate, parse, validate };
|
package/src/cy/vat.ts
CHANGED
|
@@ -7,13 +7,16 @@
|
|
|
7
7
|
* @see https://www.oecd.org/content/dam/oecd/en/topics/policy-issue-focus/aeoi/cyprus-tin.pdf
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import type {
|
|
11
|
+
ValidateResult,
|
|
12
|
+
CountryValidator,
|
|
13
|
+
} from "../types";
|
|
14
|
+
|
|
10
15
|
import { clean } from "#util/clean";
|
|
11
16
|
import { randomDigits } from "#util/generate";
|
|
12
17
|
import { err } from "#util/result";
|
|
13
18
|
import { isdigits } from "#util/strings";
|
|
14
19
|
|
|
15
|
-
import type { ValidateResult, Validator } from "../types";
|
|
16
|
-
|
|
17
20
|
const ODD_MAP: Record<number, number> = {
|
|
18
21
|
0: 1,
|
|
19
22
|
1: 0,
|
|
@@ -110,12 +113,13 @@ const generate = (): string => {
|
|
|
110
113
|
};
|
|
111
114
|
|
|
112
115
|
/** Cypriot VAT Number. */
|
|
113
|
-
const vat:
|
|
116
|
+
const vat: CountryValidator<"CY"> = {
|
|
114
117
|
name: "Cypriot VAT Number",
|
|
115
118
|
localName: "Αριθμός Εγγραφής Φ.Π.Α.",
|
|
116
119
|
abbreviation: "ΦΠΑ",
|
|
117
120
|
aliases: ["ΦΠΑ", "VAT CY"] as const,
|
|
118
121
|
candidatePattern: "CY\\d{8}[A-Z]",
|
|
122
|
+
scope: "country",
|
|
119
123
|
country: "CY",
|
|
120
124
|
entityType: "company",
|
|
121
125
|
sourceUrl: "https://www.mof.gov.cy/",
|
package/src/cz/dic.ts
CHANGED
|
@@ -11,15 +11,18 @@
|
|
|
11
11
|
* @see https://adisspr.mfcr.cz/dpr/DphReg
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
+
import type {
|
|
15
|
+
ValidateResult,
|
|
16
|
+
CountryValidator,
|
|
17
|
+
} from "../types";
|
|
18
|
+
import { validate as validateRc } from "./rc";
|
|
19
|
+
|
|
14
20
|
import { weightedSum } from "#checksums/weighted-sum";
|
|
15
21
|
import { clean } from "#util/clean";
|
|
16
22
|
import { randomDigits, randomInt } from "#util/generate";
|
|
17
23
|
import { err } from "#util/result";
|
|
18
24
|
import { isdigits } from "#util/strings";
|
|
19
25
|
|
|
20
|
-
import type { ValidateResult, Validator } from "../types";
|
|
21
|
-
import { validate as validateRc } from "./rc";
|
|
22
|
-
|
|
23
26
|
const ICO_WEIGHTS = [8, 7, 6, 5, 4, 3, 2] as const;
|
|
24
27
|
|
|
25
28
|
const compact = (value: string): string => {
|
|
@@ -115,15 +118,17 @@ const generate = (): string => {
|
|
|
115
118
|
};
|
|
116
119
|
|
|
117
120
|
/** Czech VAT Number. */
|
|
118
|
-
const dic:
|
|
121
|
+
const dic: CountryValidator<"CZ"> = {
|
|
119
122
|
name: "Czech VAT Number",
|
|
120
123
|
localName: "Daňové identifikační číslo",
|
|
121
124
|
abbreviation: "DIČ",
|
|
122
125
|
aliases: ["DIČ", "daňové identifikační číslo"] as const,
|
|
123
126
|
candidatePattern: "CZ\\d{8,10}",
|
|
127
|
+
scope: "country",
|
|
124
128
|
country: "CZ",
|
|
125
129
|
entityType: "any",
|
|
126
130
|
sourceUrl: "https://adisspr.mfcr.cz/dpr/DphReg",
|
|
131
|
+
lengths: [8, 9, 10] as const,
|
|
127
132
|
examples: ["25123891", "7103192745"] as const,
|
|
128
133
|
compact,
|
|
129
134
|
format,
|
package/src/cz/ico.ts
CHANGED
|
@@ -8,14 +8,17 @@
|
|
|
8
8
|
* @see https://www.czso.cz/
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import type {
|
|
12
|
+
ValidateResult,
|
|
13
|
+
CountryValidator,
|
|
14
|
+
} from "../types";
|
|
15
|
+
|
|
11
16
|
import { weightedSum } from "#checksums/weighted-sum";
|
|
12
17
|
import { clean } from "#util/clean";
|
|
13
18
|
import { randomDigits } from "#util/generate";
|
|
14
19
|
import { err } from "#util/result";
|
|
15
20
|
import { isdigits } from "#util/strings";
|
|
16
21
|
|
|
17
|
-
import type { ValidateResult, Validator } from "../types";
|
|
18
|
-
|
|
19
22
|
const WEIGHTS = [8, 7, 6, 5, 4, 3, 2] as const;
|
|
20
23
|
|
|
21
24
|
const compact = (value: string): string =>
|
|
@@ -59,12 +62,13 @@ const generate = (): string => {
|
|
|
59
62
|
};
|
|
60
63
|
|
|
61
64
|
/** Czech Company Identification Number. */
|
|
62
|
-
const ico:
|
|
65
|
+
const ico: CountryValidator<"CZ"> = {
|
|
63
66
|
name: "Czech Company ID",
|
|
64
67
|
localName: "Identifikační číslo osoby",
|
|
65
68
|
abbreviation: "IČO",
|
|
66
69
|
aliases: ["IČO", "IČ", "identifikační číslo"] as const,
|
|
67
70
|
candidatePattern: "\\d{8}",
|
|
71
|
+
scope: "country",
|
|
68
72
|
country: "CZ",
|
|
69
73
|
entityType: "company",
|
|
70
74
|
description:
|
package/src/cz/rc.ts
CHANGED
|
@@ -6,29 +6,57 @@
|
|
|
6
6
|
* and gender. 10-digit numbers (post-1954) must
|
|
7
7
|
* be divisible by 11.
|
|
8
8
|
*
|
|
9
|
-
* Women have 50 added to the month.
|
|
10
|
-
* an
|
|
11
|
-
* range is exhausted
|
|
9
|
+
* Women have 50 added to the month. For modern
|
|
10
|
+
* 10-digit numbers, an additional +20 offset may
|
|
11
|
+
* be used when the daily serial range is exhausted
|
|
12
|
+
* (+70 for women).
|
|
13
|
+
*
|
|
14
|
+
* Canonical source:
|
|
15
|
+
* - Czech Ministry of the Interior guidance on rodne
|
|
16
|
+
* cislo, with the modern overflow-month rules
|
|
17
|
+
*
|
|
18
|
+
* We use this to keep the 9-digit historical form
|
|
19
|
+
* valid while rejecting modern +20/+70 month offsets
|
|
20
|
+
* on 9-digit numbers. Those overflow offsets are a
|
|
21
|
+
* modern rule for 10-digit values.
|
|
12
22
|
*
|
|
13
23
|
* @see https://www.mvcr.cz/mvcren/docDetail.aspx?docid=21975362&doctype=ART
|
|
14
24
|
* @see Law 133/2000 Sb.
|
|
15
25
|
*/
|
|
16
26
|
|
|
27
|
+
import type {
|
|
28
|
+
ParsedPersonId,
|
|
29
|
+
ValidateResult,
|
|
30
|
+
CountryValidator,
|
|
31
|
+
} from "../types";
|
|
32
|
+
|
|
17
33
|
import { clean } from "#util/clean";
|
|
18
34
|
import { isValidDate } from "#util/date";
|
|
19
35
|
import { randomInt } from "#util/generate";
|
|
20
36
|
import { err } from "#util/result";
|
|
21
37
|
import { isdigits } from "#util/strings";
|
|
22
38
|
|
|
23
|
-
import type {
|
|
24
|
-
ParsedPersonId,
|
|
25
|
-
ValidateResult,
|
|
26
|
-
Validator,
|
|
27
|
-
} from "../types";
|
|
28
|
-
|
|
29
39
|
const compact = (value: string): string =>
|
|
30
40
|
clean(value, " /");
|
|
31
41
|
|
|
42
|
+
const decodeMonth = (
|
|
43
|
+
rawMonth: number,
|
|
44
|
+
year: number,
|
|
45
|
+
length: number,
|
|
46
|
+
): number | null => {
|
|
47
|
+
const candidates =
|
|
48
|
+
length === 10 && year >= 2004
|
|
49
|
+
? [0, 50, 20, 70]
|
|
50
|
+
: [0, 50];
|
|
51
|
+
for (const offset of candidates) {
|
|
52
|
+
const month = rawMonth - offset;
|
|
53
|
+
if (month >= 1 && month <= 12) {
|
|
54
|
+
return month;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
};
|
|
59
|
+
|
|
32
60
|
const validate = (value: string): ValidateResult => {
|
|
33
61
|
const v = compact(value);
|
|
34
62
|
if (v.length !== 9 && v.length !== 10) {
|
|
@@ -48,22 +76,6 @@ const validate = (value: string): ValidateResult => {
|
|
|
48
76
|
const mm = Number(v.slice(2, 4));
|
|
49
77
|
const dd = Number(v.slice(4, 6));
|
|
50
78
|
|
|
51
|
-
// Strip gender (+50) and overflow (+20) offsets
|
|
52
|
-
const month = (mm % 50) % 20 || mm % 50;
|
|
53
|
-
if (month < 1 || month > 12) {
|
|
54
|
-
return err(
|
|
55
|
-
"INVALID_COMPONENT",
|
|
56
|
-
"Birth number contains an invalid month",
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (dd < 1 || dd > 31) {
|
|
61
|
-
return err(
|
|
62
|
-
"INVALID_COMPONENT",
|
|
63
|
-
"Birth number contains an invalid day",
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
79
|
// Resolve full year
|
|
68
80
|
let year = yy + 1900;
|
|
69
81
|
if (v.length === 9) {
|
|
@@ -80,6 +92,21 @@ const validate = (value: string): ValidateResult => {
|
|
|
80
92
|
if (year < 1954) year += 100;
|
|
81
93
|
}
|
|
82
94
|
|
|
95
|
+
const month = decodeMonth(mm, year, v.length);
|
|
96
|
+
if (month === null) {
|
|
97
|
+
return err(
|
|
98
|
+
"INVALID_COMPONENT",
|
|
99
|
+
"Birth number contains an invalid month",
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (dd < 1 || dd > 31) {
|
|
104
|
+
return err(
|
|
105
|
+
"INVALID_COMPONENT",
|
|
106
|
+
"Birth number contains an invalid day",
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
83
110
|
// Validate the actual date
|
|
84
111
|
if (!isValidDate(year, month, dd)) {
|
|
85
112
|
return err(
|
|
@@ -122,13 +149,16 @@ const parse = (value: string): ParsedPersonId | null => {
|
|
|
122
149
|
const mm = Number(v.slice(2, 4));
|
|
123
150
|
const dd = Number(v.slice(4, 6));
|
|
124
151
|
|
|
125
|
-
const gender = mm
|
|
126
|
-
const month = (mm % 50) % 20 || mm % 50;
|
|
127
|
-
|
|
152
|
+
const gender = mm >= 50 ? "female" : "male";
|
|
128
153
|
let year = yy + 1900;
|
|
129
154
|
if (v.length === 10 && year < 1954) year += 100;
|
|
130
155
|
if (v.length === 9 && year >= 1980) year -= 100;
|
|
131
156
|
|
|
157
|
+
const month = decodeMonth(mm, year, v.length);
|
|
158
|
+
if (month === null) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
|
|
132
162
|
return {
|
|
133
163
|
birthDate: new Date(year, month - 1, dd),
|
|
134
164
|
gender,
|
|
@@ -166,12 +196,13 @@ const generate = (): string => {
|
|
|
166
196
|
};
|
|
167
197
|
|
|
168
198
|
/** Czech/Slovak Birth Number. */
|
|
169
|
-
const rc:
|
|
199
|
+
const rc: CountryValidator<"CZ", ParsedPersonId> = {
|
|
170
200
|
name: "Czech Birth Number",
|
|
171
201
|
localName: "Rodné číslo",
|
|
172
202
|
abbreviation: "RČ",
|
|
173
203
|
aliases: ["rodné číslo", "RČ", "birth number"] as const,
|
|
174
204
|
candidatePattern: "\\d{6}/\\d{3,4}",
|
|
205
|
+
scope: "country",
|
|
175
206
|
country: "CZ",
|
|
176
207
|
entityType: "person",
|
|
177
208
|
description:
|
|
@@ -182,6 +213,7 @@ const rc: Validator = {
|
|
|
182
213
|
examples: ["7103192745"] as const,
|
|
183
214
|
compact,
|
|
184
215
|
format,
|
|
216
|
+
parse,
|
|
185
217
|
validate,
|
|
186
218
|
generate,
|
|
187
219
|
};
|
package/src/de/handelsreg.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
|
+
const GENERATE_TYPES = [
|
|
2
|
+
"HRA",
|
|
3
|
+
"HRB",
|
|
4
|
+
"GNR",
|
|
5
|
+
"PR",
|
|
6
|
+
"VR",
|
|
7
|
+
] as const;
|
|
8
|
+
|
|
1
9
|
/** Generate a random valid Handelsregisternummer. */
|
|
2
10
|
const generate = (): string => {
|
|
3
|
-
const
|
|
4
|
-
const type = types[randomInt(0, types.length - 1)]!;
|
|
11
|
+
const type = randomPick(GENERATE_TYPES);
|
|
5
12
|
const number = randomDigits(5);
|
|
6
13
|
return `${type} ${number}`;
|
|
7
14
|
};
|
|
@@ -24,12 +31,15 @@ const generate = (): string => {
|
|
|
24
31
|
* @see https://de.wikipedia.org/wiki/Handelsregister_(Deutschland)
|
|
25
32
|
*/
|
|
26
33
|
|
|
34
|
+
import type {
|
|
35
|
+
ValidateResult,
|
|
36
|
+
CountryValidator,
|
|
37
|
+
} from "../types";
|
|
38
|
+
|
|
27
39
|
import { clean } from "#util/clean";
|
|
28
|
-
import { randomDigits,
|
|
40
|
+
import { randomDigits, randomPick } from "#util/generate";
|
|
29
41
|
import { err } from "#util/result";
|
|
30
42
|
|
|
31
|
-
import type { ValidateResult, Validator } from "../types";
|
|
32
|
-
|
|
33
43
|
const REGISTER_TYPES = new Set([
|
|
34
44
|
"HRA",
|
|
35
45
|
"HRB",
|
|
@@ -62,7 +72,11 @@ const validate = (value: string): ValidateResult => {
|
|
|
62
72
|
);
|
|
63
73
|
}
|
|
64
74
|
|
|
75
|
+
// SAFETY: both capture groups are required, so a
|
|
76
|
+
// successful match always populates [1] and [2].
|
|
77
|
+
// eslint-disable-next-line no-non-null-assertion
|
|
65
78
|
const type = match[1]!;
|
|
79
|
+
// eslint-disable-next-line no-non-null-assertion
|
|
66
80
|
const number = match[2]!;
|
|
67
81
|
|
|
68
82
|
if (!REGISTER_TYPES.has(type)) {
|
|
@@ -81,7 +95,7 @@ const validate = (value: string): ValidateResult => {
|
|
|
81
95
|
const format = (value: string): string => compact(value);
|
|
82
96
|
|
|
83
97
|
/** German Company Register Number. */
|
|
84
|
-
const handelsreg:
|
|
98
|
+
const handelsreg: CountryValidator<"DE"> = {
|
|
85
99
|
name: "German Company Register Number",
|
|
86
100
|
localName: "Handelsregisternummer",
|
|
87
101
|
abbreviation: "HReg",
|
|
@@ -92,6 +106,7 @@ const handelsreg: Validator = {
|
|
|
92
106
|
"HRA",
|
|
93
107
|
] as const,
|
|
94
108
|
candidatePattern: "(?:HRA|HRB|GnR|PR|VR)\\s*\\d{1,7}",
|
|
109
|
+
scope: "country",
|
|
95
110
|
country: "DE",
|
|
96
111
|
entityType: "company",
|
|
97
112
|
sourceUrl:
|
package/src/de/idnr.ts
CHANGED
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
* @see https://www.bzst.de/DE/Privatpersonen/SteuerlicheIdentifikationsnummer/steuerlicheidentifikationsnummer_node.html
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
+
import type {
|
|
14
|
+
ValidateResult,
|
|
15
|
+
CountryValidator,
|
|
16
|
+
} from "../types";
|
|
17
|
+
|
|
13
18
|
import {
|
|
14
19
|
mod1110validate,
|
|
15
20
|
mod1110checkDigit,
|
|
@@ -19,8 +24,6 @@ import { randomInt } from "#util/generate";
|
|
|
19
24
|
import { err } from "#util/result";
|
|
20
25
|
import { isdigits } from "#util/strings";
|
|
21
26
|
|
|
22
|
-
import type { ValidateResult, Validator } from "../types";
|
|
23
|
-
|
|
24
27
|
const compact = (value: string): string =>
|
|
25
28
|
clean(value, " -/");
|
|
26
29
|
|
|
@@ -103,6 +106,9 @@ const generate = (): string => {
|
|
|
103
106
|
while (pool.length < 10) pool.push(randomInt(0, 9));
|
|
104
107
|
for (let i = pool.length - 1; i > 0; i--) {
|
|
105
108
|
const j = randomInt(0, i);
|
|
109
|
+
// SAFETY: i and j are valid indices of `pool`
|
|
110
|
+
// (i > 0, j ∈ [0, i]).
|
|
111
|
+
// eslint-disable-next-line no-non-null-assertion
|
|
106
112
|
[pool[i], pool[j]] = [pool[j]!, pool[i]!];
|
|
107
113
|
}
|
|
108
114
|
if (pool[0] === 0) continue;
|
|
@@ -115,7 +121,7 @@ const generate = (): string => {
|
|
|
115
121
|
};
|
|
116
122
|
|
|
117
123
|
/** German Personal Tax ID. */
|
|
118
|
-
const idnr:
|
|
124
|
+
const idnr: CountryValidator<"DE"> = {
|
|
119
125
|
name: "German Tax ID",
|
|
120
126
|
localName: "Steuerliche Identifikationsnummer",
|
|
121
127
|
abbreviation: "IdNr",
|
|
@@ -125,6 +131,7 @@ const idnr: Validator = {
|
|
|
125
131
|
"Steuer-ID",
|
|
126
132
|
] as const,
|
|
127
133
|
candidatePattern: "\\d{2}\\s?\\d{3}\\s?\\d{3}\\s?\\d{3}",
|
|
134
|
+
scope: "country",
|
|
128
135
|
country: "DE",
|
|
129
136
|
entityType: "person",
|
|
130
137
|
sourceUrl:
|
package/src/de/stnr.ts
CHANGED
|
@@ -26,13 +26,16 @@ const generate = (): string => {
|
|
|
26
26
|
* @see https://de.wikipedia.org/wiki/Steuernummer
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
+
import type {
|
|
30
|
+
ValidateResult,
|
|
31
|
+
CountryValidator,
|
|
32
|
+
} from "../types";
|
|
33
|
+
|
|
29
34
|
import { clean } from "#util/clean";
|
|
30
35
|
import { randomDigits } from "#util/generate";
|
|
31
36
|
import { err } from "#util/result";
|
|
32
37
|
import { isdigits } from "#util/strings";
|
|
33
38
|
|
|
34
|
-
import type { ValidateResult, Validator } from "../types";
|
|
35
|
-
|
|
36
39
|
/**
|
|
37
40
|
* Format patterns per federal state.
|
|
38
41
|
* [0] = regional format, [1] = unified (federal) format.
|
|
@@ -166,9 +169,13 @@ const format = (value: string): string => {
|
|
|
166
169
|
// category: literal digits, F, B, U, P
|
|
167
170
|
const segments: string[] = [];
|
|
168
171
|
let segStart = 0;
|
|
172
|
+
// SAFETY: fmt is a non-empty literal from COMPILED.
|
|
173
|
+
// eslint-disable-next-line no-non-null-assertion
|
|
169
174
|
let prevCat = charCat(fmt[0]!);
|
|
170
175
|
|
|
171
176
|
for (let i = 1; i < fmt.length; i++) {
|
|
177
|
+
// SAFETY: i < fmt.length.
|
|
178
|
+
// eslint-disable-next-line no-non-null-assertion
|
|
172
179
|
const cat = charCat(fmt[i]!);
|
|
173
180
|
if (cat !== prevCat) {
|
|
174
181
|
segments.push(v.slice(segStart, i));
|
|
@@ -190,12 +197,13 @@ const charCat = (ch: string): string => {
|
|
|
190
197
|
};
|
|
191
198
|
|
|
192
199
|
/** German Tax Number (Steuernummer). */
|
|
193
|
-
const stnr:
|
|
200
|
+
const stnr: CountryValidator<"DE"> = {
|
|
194
201
|
name: "German Tax Number",
|
|
195
202
|
localName: "Steuernummer",
|
|
196
203
|
abbreviation: "StNr",
|
|
197
204
|
aliases: ["Steuernummer", "St.Nr."] as const,
|
|
198
205
|
candidatePattern: "\\d{2,4}/\\d{3,4}/\\d{4,5}",
|
|
206
|
+
scope: "country",
|
|
199
207
|
country: "DE",
|
|
200
208
|
entityType: "any",
|
|
201
209
|
description:
|
package/src/de/svnr.ts
CHANGED
|
@@ -9,6 +9,11 @@
|
|
|
9
9
|
* @see https://de.wikipedia.org/wiki/Sozialversicherungsnummer
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import type {
|
|
13
|
+
ValidateResult,
|
|
14
|
+
CountryValidator,
|
|
15
|
+
} from "../types";
|
|
16
|
+
|
|
12
17
|
import { clean } from "#util/clean";
|
|
13
18
|
import {
|
|
14
19
|
isValidDate,
|
|
@@ -17,8 +22,6 @@ import {
|
|
|
17
22
|
import { randomInt } from "#util/generate";
|
|
18
23
|
import { err } from "#util/result";
|
|
19
24
|
|
|
20
|
-
import type { ValidateResult, Validator } from "../types";
|
|
21
|
-
|
|
22
25
|
const letterValue = (ch: string): number => {
|
|
23
26
|
const code = ch.charCodeAt(0);
|
|
24
27
|
if (code >= 65 && code <= 90) return code - 64;
|
|
@@ -39,6 +42,8 @@ const computeCheck = (v: string): number => {
|
|
|
39
42
|
digits.push(Number(v[i]));
|
|
40
43
|
}
|
|
41
44
|
|
|
45
|
+
// SAFETY: caller guarantees v.length === 12.
|
|
46
|
+
// eslint-disable-next-line no-non-null-assertion
|
|
42
47
|
const lv = letterValue(v[8]!);
|
|
43
48
|
digits.push(Math.floor(lv / 10));
|
|
44
49
|
digits.push(lv % 10);
|
|
@@ -47,8 +52,11 @@ const computeCheck = (v: string): number => {
|
|
|
47
52
|
digits.push(Number(v[10]));
|
|
48
53
|
|
|
49
54
|
let sum = 0;
|
|
50
|
-
for (
|
|
51
|
-
|
|
55
|
+
for (const [i, weight] of WEIGHTS.entries()) {
|
|
56
|
+
// SAFETY: WEIGHTS.length === 12 and we just pushed
|
|
57
|
+
// 12 entries onto `digits`.
|
|
58
|
+
// eslint-disable-next-line no-non-null-assertion
|
|
59
|
+
const product = digits[i]! * weight;
|
|
52
60
|
if (product >= 10) {
|
|
53
61
|
sum += Math.floor(product / 10) + (product % 10);
|
|
54
62
|
} else {
|
|
@@ -132,7 +140,7 @@ const generate = (): string => {
|
|
|
132
140
|
};
|
|
133
141
|
|
|
134
142
|
/** German Social Insurance Number. */
|
|
135
|
-
const svnr:
|
|
143
|
+
const svnr: CountryValidator<"DE"> = {
|
|
136
144
|
name: "German Social Insurance Number",
|
|
137
145
|
localName: "Sozialversicherungsnummer",
|
|
138
146
|
abbreviation: "SVNR",
|
|
@@ -142,6 +150,7 @@ const svnr: Validator = {
|
|
|
142
150
|
"Versicherungsnummer",
|
|
143
151
|
] as const,
|
|
144
152
|
candidatePattern: "\\d{2}\\s?\\d{6}\\s?[A-Z]\\s?\\d{3}",
|
|
153
|
+
scope: "country",
|
|
145
154
|
country: "DE",
|
|
146
155
|
entityType: "person",
|
|
147
156
|
description:
|
package/src/de/vat.ts
CHANGED
|
@@ -9,6 +9,11 @@
|
|
|
9
9
|
* @see https://www.bzst.de/SharedDocs/Downloads/DE/Merkblaetter/ust_idnr_aufbau.pdf
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import type {
|
|
13
|
+
ValidateResult,
|
|
14
|
+
CountryValidator,
|
|
15
|
+
} from "../types";
|
|
16
|
+
|
|
12
17
|
import {
|
|
13
18
|
mod1110checkDigit,
|
|
14
19
|
mod1110validate,
|
|
@@ -18,8 +23,6 @@ import { randomDigits, randomInt } from "#util/generate";
|
|
|
18
23
|
import { err } from "#util/result";
|
|
19
24
|
import { isdigits } from "#util/strings";
|
|
20
25
|
|
|
21
|
-
import type { ValidateResult, Validator } from "../types";
|
|
22
|
-
|
|
23
26
|
const compact = (value: string): string => {
|
|
24
27
|
const v = clean(value, " -/");
|
|
25
28
|
if (v.startsWith("DE") || v.startsWith("de")) {
|
|
@@ -70,7 +73,7 @@ const generate = (): string => {
|
|
|
70
73
|
};
|
|
71
74
|
|
|
72
75
|
/** German VAT Identification Number. */
|
|
73
|
-
const vat:
|
|
76
|
+
const vat: CountryValidator<"DE"> = {
|
|
74
77
|
name: "German VAT Number",
|
|
75
78
|
localName: "Umsatzsteuer-Identifikationsnummer",
|
|
76
79
|
abbreviation: "USt-IdNr.",
|
|
@@ -80,6 +83,7 @@ const vat: Validator = {
|
|
|
80
83
|
"VAT DE",
|
|
81
84
|
] as const,
|
|
82
85
|
candidatePattern: "DE\\d{9}",
|
|
86
|
+
scope: "country",
|
|
83
87
|
country: "DE",
|
|
84
88
|
entityType: "company",
|
|
85
89
|
description:
|
package/src/dk/cpr.ts
CHANGED
|
@@ -8,17 +8,18 @@
|
|
|
8
8
|
* @see https://cpr.dk/
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import { clean } from "#util/clean";
|
|
12
|
-
import { isValidDate } from "#util/date";
|
|
13
|
-
import { err } from "#util/result";
|
|
14
|
-
import { isdigits } from "#util/strings";
|
|
15
|
-
|
|
16
11
|
import type {
|
|
17
12
|
ParsedPersonId,
|
|
18
13
|
ValidateResult,
|
|
19
|
-
|
|
14
|
+
CountryValidator,
|
|
20
15
|
} from "../types";
|
|
21
16
|
|
|
17
|
+
import { clean } from "#util/clean";
|
|
18
|
+
import { isValidDate } from "#util/date";
|
|
19
|
+
import { randomDigits, randomInt } from "#util/generate";
|
|
20
|
+
import { err } from "#util/result";
|
|
21
|
+
import { isdigits } from "#util/strings";
|
|
22
|
+
|
|
22
23
|
const compact = (value: string): string =>
|
|
23
24
|
clean(value, " -");
|
|
24
25
|
|
|
@@ -102,21 +103,35 @@ const parse = (value: string): ParsedPersonId | null => {
|
|
|
102
103
|
};
|
|
103
104
|
};
|
|
104
105
|
|
|
106
|
+
/** Generate a random valid Danish CPR. */
|
|
107
|
+
const generate = (): string => {
|
|
108
|
+
const year = randomInt(1900, 2024);
|
|
109
|
+
const month = String(randomInt(1, 12)).padStart(2, "0");
|
|
110
|
+
const day = String(randomInt(1, 28)).padStart(2, "0");
|
|
111
|
+
const yy = String(year % 100).padStart(2, "0");
|
|
112
|
+
const serialPrefix = String(randomInt(0, 3));
|
|
113
|
+
return `${day}${month}${yy}${serialPrefix}${randomDigits(3)}`;
|
|
114
|
+
};
|
|
115
|
+
|
|
105
116
|
/** Danish Personal Identification Number. */
|
|
106
|
-
const cpr:
|
|
117
|
+
const cpr: CountryValidator<"DK", ParsedPersonId> = {
|
|
107
118
|
name: "Danish Personal ID",
|
|
108
119
|
localName: "Det Centrale Personregister",
|
|
109
120
|
abbreviation: "CPR",
|
|
110
121
|
aliases: ["CPR-nummer", "personnummer", "CPR"] as const,
|
|
111
122
|
candidatePattern: "\\d{6}-?\\d{4}",
|
|
123
|
+
scope: "country",
|
|
112
124
|
country: "DK",
|
|
113
125
|
entityType: "person",
|
|
114
126
|
sourceUrl: "https://cpr.dk/",
|
|
127
|
+
lengths: [10] as const,
|
|
115
128
|
examples: ["2110625629"] as const,
|
|
116
129
|
compact,
|
|
117
130
|
format,
|
|
131
|
+
parse,
|
|
118
132
|
validate,
|
|
133
|
+
generate,
|
|
119
134
|
};
|
|
120
135
|
|
|
121
136
|
export default cpr;
|
|
122
|
-
export { compact, format, parse, validate };
|
|
137
|
+
export { compact, format, generate, parse, validate };
|