stdnum 1.10.7 → 1.11.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/README.md +3 -2
- package/lib/cjs/ad/index.js +18 -8
- package/lib/cjs/ad/nrt.js +18 -8
- package/lib/cjs/al/index.js +18 -8
- package/lib/cjs/al/nipt.js +18 -8
- package/lib/cjs/ar/cbu.js +18 -8
- package/lib/cjs/ar/cuit.js +18 -8
- package/lib/cjs/ar/dni.js +18 -8
- package/lib/cjs/ar/index.js +18 -8
- package/lib/cjs/at/businessid.js +18 -8
- package/lib/cjs/at/index.js +18 -8
- package/lib/cjs/at/tin.js +18 -8
- package/lib/cjs/at/uid.js +18 -8
- package/lib/cjs/at/vnr.js +18 -8
- package/lib/cjs/au/abn.js +18 -8
- package/lib/cjs/au/acn.js +18 -8
- package/lib/cjs/au/index.js +18 -8
- package/lib/cjs/au/tfn.js +18 -8
- package/lib/cjs/az/index.js +18 -8
- package/lib/cjs/az/pin.js +18 -8
- package/lib/cjs/az/tin.js +18 -8
- package/lib/cjs/ba/index.js +18 -8
- package/lib/cjs/ba/jmbg.js +18 -8
- package/lib/cjs/be/bis.js +18 -8
- package/lib/cjs/be/index.js +18 -8
- package/lib/cjs/be/nn.js +18 -8
- package/lib/cjs/be/personIdentifierHelpers.js +4 -5
- package/lib/cjs/be/vat.js +18 -8
- package/lib/cjs/bg/egn.js +18 -8
- package/lib/cjs/bg/index.js +18 -8
- package/lib/cjs/bg/pnf.js +18 -8
- package/lib/cjs/bg/vat.js +18 -8
- package/lib/cjs/br/cnpj.js +18 -8
- package/lib/cjs/br/cpf.js +18 -8
- package/lib/cjs/br/index.js +18 -8
- package/lib/cjs/by/index.js +18 -8
- package/lib/cjs/by/unp.js +18 -8
- package/lib/cjs/bz/index.js +18 -8
- package/lib/cjs/bz/tin.js +18 -8
- package/lib/cjs/ca/bc_bhn.d.ts +2 -0
- package/lib/cjs/ca/bc_bhn.js +89 -0
- package/lib/cjs/ca/bn.js +18 -8
- package/lib/cjs/ca/gst.js +18 -8
- package/lib/cjs/ca/index.d.ts +1 -0
- package/lib/cjs/ca/index.js +20 -9
- package/lib/cjs/ca/pst.js +18 -8
- package/lib/cjs/ca/qst.js +18 -8
- package/lib/cjs/ca/sin.js +18 -8
- package/lib/cjs/ch/index.js +18 -8
- package/lib/cjs/ch/ssn.js +18 -8
- package/lib/cjs/ch/uid.js +18 -8
- package/lib/cjs/ch/vat.js +18 -8
- package/lib/cjs/cl/index.js +18 -8
- package/lib/cjs/cl/run.js +18 -8
- package/lib/cjs/cl/rut.js +18 -8
- package/lib/cjs/cn/index.js +18 -8
- package/lib/cjs/cn/ric.js +18 -8
- package/lib/cjs/cn/uscc.js +18 -8
- package/lib/cjs/co/index.js +18 -8
- package/lib/cjs/co/nit.js +18 -8
- package/lib/cjs/cr/cpf.js +18 -8
- package/lib/cjs/cr/cpj.js +18 -8
- package/lib/cjs/cr/cr.js +18 -8
- package/lib/cjs/cr/index.js +18 -8
- package/lib/cjs/cu/index.js +18 -8
- package/lib/cjs/cu/ni.js +18 -8
- package/lib/cjs/cy/index.js +18 -8
- package/lib/cjs/cy/vat.js +18 -8
- package/lib/cjs/cz/dic.js +18 -8
- package/lib/cjs/cz/index.js +18 -8
- package/lib/cjs/cz/rc.js +18 -8
- package/lib/cjs/de/idnr.js +18 -8
- package/lib/cjs/de/index.js +18 -8
- package/lib/cjs/de/passport.js +18 -8
- package/lib/cjs/de/pwnr.js +21 -11
- package/lib/cjs/de/stnr.js +18 -8
- package/lib/cjs/de/svnr.js +18 -8
- package/lib/cjs/de/vat.js +18 -8
- package/lib/cjs/dk/cpr.js +20 -10
- package/lib/cjs/dk/cvr.js +18 -8
- package/lib/cjs/dk/index.js +18 -8
- package/lib/cjs/do/cedula.js +18 -8
- package/lib/cjs/do/index.js +18 -8
- package/lib/cjs/do/ncf.js +18 -8
- package/lib/cjs/do/rnc.js +18 -8
- package/lib/cjs/dz/index.js +18 -8
- package/lib/cjs/dz/nif.js +18 -8
- package/lib/cjs/ec/ci.js +20 -10
- package/lib/cjs/ec/index.js +18 -8
- package/lib/cjs/ec/ruc.js +18 -8
- package/lib/cjs/ee/ik.js +21 -11
- package/lib/cjs/ee/index.js +18 -8
- package/lib/cjs/ee/kmkr.js +18 -8
- package/lib/cjs/ee/registrikood.js +18 -8
- package/lib/cjs/eg/index.js +18 -8
- package/lib/cjs/eg/tn.js +18 -8
- package/lib/cjs/es/cif.js +18 -8
- package/lib/cjs/es/dni.js +20 -10
- package/lib/cjs/es/index.js +18 -8
- package/lib/cjs/es/nie.js +18 -8
- package/lib/cjs/es/nif.js +18 -8
- package/lib/cjs/es/nss.js +18 -8
- package/lib/cjs/exceptions.js +2 -2
- package/lib/cjs/fi/alv.js +18 -8
- package/lib/cjs/fi/hetu.js +18 -8
- package/lib/cjs/fi/index.js +18 -8
- package/lib/cjs/fo/index.js +18 -8
- package/lib/cjs/fo/vn.js +18 -8
- package/lib/cjs/fr/index.js +18 -8
- package/lib/cjs/fr/nif.js +18 -8
- package/lib/cjs/fr/nir.js +18 -8
- package/lib/cjs/fr/siren.js +18 -8
- package/lib/cjs/fr/siret.js +18 -8
- package/lib/cjs/fr/tva.js +18 -8
- package/lib/cjs/gb/index.js +18 -8
- package/lib/cjs/gb/nino.js +18 -8
- package/lib/cjs/gb/utr.js +18 -8
- package/lib/cjs/gb/vat.js +18 -8
- package/lib/cjs/gen/ean.js +18 -8
- package/lib/cjs/gen/index.js +18 -8
- package/lib/cjs/gh/index.js +18 -8
- package/lib/cjs/gh/tin.js +18 -8
- package/lib/cjs/gn/index.js +18 -8
- package/lib/cjs/gn/nifp.js +18 -8
- package/lib/cjs/gr/amka.js +18 -8
- package/lib/cjs/gr/index.js +18 -8
- package/lib/cjs/gr/vat.js +18 -8
- package/lib/cjs/gt/cui.js +18 -8
- package/lib/cjs/gt/index.js +18 -8
- package/lib/cjs/gt/nit.js +18 -8
- package/lib/cjs/hk/hkid.js +18 -8
- package/lib/cjs/hk/index.js +18 -8
- package/lib/cjs/hr/index.js +18 -8
- package/lib/cjs/hr/oib.js +18 -8
- package/lib/cjs/hu/anum.js +18 -8
- package/lib/cjs/hu/index.js +18 -8
- package/lib/cjs/id/index.js +18 -8
- package/lib/cjs/id/npwp.js +18 -8
- package/lib/cjs/ie/index.js +18 -8
- package/lib/cjs/ie/pps.js +18 -8
- package/lib/cjs/ie/vat.js +20 -10
- package/lib/cjs/il/hp.js +18 -8
- package/lib/cjs/il/idnr.js +18 -8
- package/lib/cjs/il/index.js +18 -8
- package/lib/cjs/in/aadhaar.js +18 -8
- package/lib/cjs/in/epic.js +18 -8
- package/lib/cjs/in/gstin.js +18 -8
- package/lib/cjs/in/index.d.ts +1 -0
- package/lib/cjs/in/index.js +20 -9
- package/lib/cjs/in/pan.js +18 -8
- package/lib/cjs/in/vid.d.ts +2 -0
- package/lib/cjs/in/vid.js +87 -0
- package/lib/cjs/index.js +21 -11
- package/lib/cjs/is/index.js +18 -8
- package/lib/cjs/is/kennitala.js +18 -8
- package/lib/cjs/is/vsk.js +18 -8
- package/lib/cjs/it/aic.js +18 -8
- package/lib/cjs/it/codicefiscale.js +18 -8
- package/lib/cjs/it/index.js +18 -8
- package/lib/cjs/it/iva.js +18 -8
- package/lib/cjs/jp/cn.js +18 -8
- package/lib/cjs/jp/index.js +18 -8
- package/lib/cjs/ke/index.js +18 -8
- package/lib/cjs/ke/pin.js +18 -8
- package/lib/cjs/kr/brn.js +18 -8
- package/lib/cjs/kr/index.js +18 -8
- package/lib/cjs/kr/rrn.js +18 -8
- package/lib/cjs/li/index.js +18 -8
- package/lib/cjs/li/peid.js +18 -8
- package/lib/cjs/lk/index.js +18 -8
- package/lib/cjs/lk/nic.js +18 -8
- package/lib/cjs/lt/asmens.js +18 -8
- package/lib/cjs/lt/index.js +18 -8
- package/lib/cjs/lt/pvm.js +18 -8
- package/lib/cjs/lu/index.js +18 -8
- package/lib/cjs/lu/tva.js +18 -8
- package/lib/cjs/lv/index.js +18 -8
- package/lib/cjs/lv/pvn.js +18 -8
- package/lib/cjs/ma/ice.js +18 -8
- package/lib/cjs/ma/ice9.js +18 -8
- package/lib/cjs/ma/index.js +18 -8
- package/lib/cjs/mc/index.js +18 -8
- package/lib/cjs/mc/tva.js +18 -8
- package/lib/cjs/md/idno.js +18 -8
- package/lib/cjs/md/index.js +18 -8
- package/lib/cjs/me/index.js +18 -8
- package/lib/cjs/me/jmbg.js +18 -8
- package/lib/cjs/me/pib.js +18 -8
- package/lib/cjs/mk/edb.js +18 -8
- package/lib/cjs/mk/index.js +18 -8
- package/lib/cjs/mk/jmbg.js +18 -8
- package/lib/cjs/mt/index.js +18 -8
- package/lib/cjs/mt/vat.js +18 -8
- package/lib/cjs/mu/index.js +18 -8
- package/lib/cjs/mu/nid.js +18 -8
- package/lib/cjs/mx/clabe.js +18 -8
- package/lib/cjs/mx/curp.js +21 -11
- package/lib/cjs/mx/index.js +18 -8
- package/lib/cjs/mx/rfc.js +18 -8
- package/lib/cjs/my/index.js +18 -8
- package/lib/cjs/my/nric.js +18 -8
- package/lib/cjs/nl/bsn.js +18 -8
- package/lib/cjs/nl/btw.js +18 -8
- package/lib/cjs/nl/index.js +18 -8
- package/lib/cjs/nl/onderwijsnummer.js +18 -8
- package/lib/cjs/no/fodselsnummer.js +18 -8
- package/lib/cjs/no/index.js +18 -8
- package/lib/cjs/no/kontonr.js +18 -8
- package/lib/cjs/no/mva.js +18 -8
- package/lib/cjs/no/orgnr.js +18 -8
- package/lib/cjs/nz/bank.js +18 -8
- package/lib/cjs/nz/index.js +18 -8
- package/lib/cjs/nz/ird.js +18 -8
- package/lib/cjs/pe/ce.js +18 -8
- package/lib/cjs/pe/cui.js +18 -8
- package/lib/cjs/pe/index.js +18 -8
- package/lib/cjs/pe/ruc.js +18 -8
- package/lib/cjs/pk/cnic.js +18 -8
- package/lib/cjs/pk/index.js +18 -8
- package/lib/cjs/pk/ntn.js +18 -8
- package/lib/cjs/pl/index.js +18 -8
- package/lib/cjs/pl/nip.js +18 -8
- package/lib/cjs/pl/pesel.js +18 -8
- package/lib/cjs/pl/regon.js +18 -8
- package/lib/cjs/pt/cc.js +18 -8
- package/lib/cjs/pt/index.js +18 -8
- package/lib/cjs/pt/nif.js +18 -8
- package/lib/cjs/pt/nipc.js +18 -8
- package/lib/cjs/py/cedula.js +18 -8
- package/lib/cjs/py/index.js +18 -8
- package/lib/cjs/py/ruc.js +18 -8
- package/lib/cjs/ro/cif.js +18 -8
- package/lib/cjs/ro/cnp.js +18 -8
- package/lib/cjs/ro/cui.js +18 -8
- package/lib/cjs/ro/index.js +18 -8
- package/lib/cjs/ro/onrc.js +18 -8
- package/lib/cjs/rs/index.js +18 -8
- package/lib/cjs/rs/jmbg.js +18 -8
- package/lib/cjs/rs/pib.js +18 -8
- package/lib/cjs/ru/index.js +18 -8
- package/lib/cjs/ru/inn.js +18 -8
- package/lib/cjs/se/index.js +18 -8
- package/lib/cjs/se/orgnr.js +18 -8
- package/lib/cjs/se/personnummer.js +18 -8
- package/lib/cjs/se/vat.js +18 -8
- package/lib/cjs/sg/index.js +18 -8
- package/lib/cjs/sg/uen.js +18 -8
- package/lib/cjs/si/ddv.js +18 -8
- package/lib/cjs/si/emso.js +18 -8
- package/lib/cjs/si/index.js +18 -8
- package/lib/cjs/si/jmbg.js +18 -8
- package/lib/cjs/sk/dph.js +18 -8
- package/lib/cjs/sk/index.js +18 -8
- package/lib/cjs/sk/rc.js +18 -8
- package/lib/cjs/sm/coe.js +18 -8
- package/lib/cjs/sm/index.js +18 -8
- package/lib/cjs/sv/index.js +18 -8
- package/lib/cjs/sv/nit.js +18 -8
- package/lib/cjs/th/idnr.js +18 -8
- package/lib/cjs/th/index.js +18 -8
- package/lib/cjs/th/moa.js +18 -8
- package/lib/cjs/th/tin.js +18 -8
- package/lib/cjs/tn/index.js +18 -8
- package/lib/cjs/tn/mf.js +18 -8
- package/lib/cjs/tr/index.js +18 -8
- package/lib/cjs/tr/tckimlik.js +18 -8
- package/lib/cjs/tr/vkn.js +18 -8
- package/lib/cjs/tw/ban.js +18 -8
- package/lib/cjs/tw/index.js +18 -8
- package/lib/cjs/tw/natid.js +18 -8
- package/lib/cjs/tw/tax_code.js +18 -8
- package/lib/cjs/tw/ubn.js +18 -8
- package/lib/cjs/tw/ui.js +18 -8
- package/lib/cjs/ua/edrpou.js +19 -9
- package/lib/cjs/ua/index.js +18 -8
- package/lib/cjs/ua/rntrc.js +18 -8
- package/lib/cjs/us/ein.js +18 -8
- package/lib/cjs/us/index.js +18 -8
- package/lib/cjs/us/ssn.js +18 -8
- package/lib/cjs/util/checksum.js +10 -11
- package/lib/cjs/util/index.js +18 -8
- package/lib/cjs/util/isValidDate.js +7 -8
- package/lib/cjs/util/iso7064.js +2 -3
- package/lib/cjs/util/pymod.js +2 -3
- package/lib/cjs/util/strings/char.js +4 -5
- package/lib/cjs/util/strings/clean.js +19 -10
- package/lib/cjs/util/strings/format.js +2 -3
- package/lib/cjs/util/strings/reverseString.js +2 -3
- package/lib/cjs/util/strings/splitAt.js +2 -3
- package/lib/cjs/uy/cedula.js +18 -8
- package/lib/cjs/uy/index.js +18 -8
- package/lib/cjs/uy/nie.js +18 -8
- package/lib/cjs/uy/rut.js +18 -8
- package/lib/cjs/ve/index.js +18 -8
- package/lib/cjs/ve/rif.js +18 -8
- package/lib/cjs/vn/index.js +18 -8
- package/lib/cjs/vn/mst.js +18 -8
- package/lib/cjs/za/idnr.js +18 -8
- package/lib/cjs/za/index.js +18 -8
- package/lib/cjs/za/tin.js +18 -8
- package/lib/esm/ca/bc_bhn.d.ts +2 -0
- package/lib/esm/ca/bc_bhn.js +53 -0
- package/lib/esm/ca/index.d.ts +1 -0
- package/lib/esm/ca/index.js +3 -1
- package/lib/esm/exceptions.js +2 -2
- package/lib/esm/in/index.d.ts +1 -0
- package/lib/esm/in/index.js +3 -1
- package/lib/esm/in/vid.d.ts +2 -0
- package/lib/esm/in/vid.js +51 -0
- package/lib/esm/ua/edrpou.js +2 -2
- package/package.json +9 -12
- package/src/be/personIdentifierHelpers.ts +4 -4
- package/src/ca/bc_bhn.spec.ts +38 -0
- package/src/ca/bc_bhn.ts +88 -0
- package/src/ca/index.ts +1 -0
- package/src/de/vat.ts +1 -1
- package/src/exceptions.ts +1 -2
- package/src/fr/nif.spec.ts +13 -4
- package/src/in/index.ts +1 -0
- package/src/in/vid.spec.ts +34 -0
- package/src/in/vid.ts +84 -0
- package/src/ua/edrpou.spec.ts +8 -5
- package/src/ua/edrpou.ts +1 -1
- package/src/za/idnr.ts +1 -1
package/lib/esm/in/index.js
CHANGED
|
@@ -2,8 +2,10 @@ import * as aadhaar_1 from './aadhaar';
|
|
|
2
2
|
export { aadhaar_1 as aadhaar };
|
|
3
3
|
import * as pan_1 from './pan';
|
|
4
4
|
export { pan_1 as pan };
|
|
5
|
+
import * as vid_1 from './vid';
|
|
6
|
+
export { vid_1 as vid };
|
|
5
7
|
import * as epic_1 from './epic';
|
|
6
8
|
export { epic_1 as epic };
|
|
7
9
|
import * as gstin_1 from './gstin';
|
|
8
10
|
export { gstin_1 as gstin };
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjJCQUF5QixXQUFXO3NCQUF4QixPQUFPO3VCQUNFLE9BQU87a0JBQWhCLEdBQUc7dUJBQ00sT0FBTztrQkFBaEIsR0FBRzt3QkFDTyxRQUFRO21CQUFsQixJQUFJO3lCQUNPLFNBQVM7b0JBQXBCLEtBQUsifQ==
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as exceptions from '../exceptions';
|
|
2
|
+
import { strings } from '../util';
|
|
3
|
+
import { verhoeffValidate } from '../util/checksum';
|
|
4
|
+
function clean(input) {
|
|
5
|
+
return strings.cleanUnicode(input, ' -');
|
|
6
|
+
}
|
|
7
|
+
const validRE = /^[2-9][0-9]{15}$/;
|
|
8
|
+
const impl = {
|
|
9
|
+
name: 'Indian personal virtual identity number',
|
|
10
|
+
localName: 'Indian personal virtual identity number',
|
|
11
|
+
abbreviation: 'VIN',
|
|
12
|
+
compact(input) {
|
|
13
|
+
const [value, err] = clean(input);
|
|
14
|
+
if (err) {
|
|
15
|
+
throw err;
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
},
|
|
19
|
+
format(input) {
|
|
20
|
+
const [value] = clean(input);
|
|
21
|
+
return strings.splitAt(value, 4, 8, 12).join(' ');
|
|
22
|
+
},
|
|
23
|
+
validate(input) {
|
|
24
|
+
const [value, error] = clean(input);
|
|
25
|
+
if (error) {
|
|
26
|
+
return { isValid: false, error };
|
|
27
|
+
}
|
|
28
|
+
if (value.length !== 16) {
|
|
29
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
30
|
+
}
|
|
31
|
+
if (!validRE.test(value)) {
|
|
32
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
33
|
+
}
|
|
34
|
+
const r = value.split('');
|
|
35
|
+
r.reverse();
|
|
36
|
+
if (value === r.join('')) {
|
|
37
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
38
|
+
}
|
|
39
|
+
if (!verhoeffValidate(value)) {
|
|
40
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
isValid: true,
|
|
44
|
+
compact: value,
|
|
45
|
+
isIndividual: true,
|
|
46
|
+
isCompany: false,
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
export const { name, localName, abbreviation, validate, format, compact } = impl;
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2luL3ZpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxLQUFLLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVsQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRCxTQUFTLEtBQUssQ0FBQyxLQUFhO0lBQzFCLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUdELE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDO0FBRW5DLE1BQU0sSUFBSSxHQUFjO0lBQ3RCLElBQUksRUFBRSx5Q0FBeUM7SUFDL0MsU0FBUyxFQUFFLHlDQUF5QztJQUNwRCxZQUFZLEVBQUUsS0FBSztJQUNuQixPQUFPLENBQUMsS0FBYTtRQUNuQixNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWE7UUFDbEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYTtRQUNwQixNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN4QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDWixJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7UUFDbkUsQ0FBQztRQUdELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLFVBQVUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1FBQ3JFLENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsS0FBSztZQUNkLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFNBQVMsRUFBRSxLQUFLO1NBQ2pCLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FDdkUsSUFBSSxDQUFDIn0=
|
package/lib/esm/ua/edrpou.js
CHANGED
|
@@ -43,7 +43,7 @@ const impl = {
|
|
|
43
43
|
modulus: 11,
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
|
-
if (String(sum) !== check) {
|
|
46
|
+
if (String(sum % 10) !== check) {
|
|
47
47
|
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
48
48
|
}
|
|
49
49
|
return {
|
|
@@ -55,4 +55,4 @@ const impl = {
|
|
|
55
55
|
},
|
|
56
56
|
};
|
|
57
57
|
export const { name, localName, abbreviation, validate, format, compact } = impl;
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRycG91LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3VhL2VkcnBvdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFlQSxPQUFPLEtBQUssVUFBVSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUcvQyxTQUFTLEtBQUssQ0FBQyxLQUFhO0lBQzFCLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELE1BQU0sSUFBSSxHQUFjO0lBQ3RCLElBQUksRUFBRSxtRUFBbUU7SUFDekUsU0FBUyxFQUFFLCtEQUErRDtJQUMxRSxZQUFZLEVBQUUsUUFBUTtJQUN0QixPQUFPLENBQUMsS0FBYTtRQUNuQixNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWE7UUFDbEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYTtRQUNwQixNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBRUQsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUxQixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFO1lBQzNCLE9BQU87WUFDUCxPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUMsQ0FBQztRQUVILElBQUksR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ2YsR0FBRyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3ZCLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxFQUFFLEVBQUU7YUFDWixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQy9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLFVBQVUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1FBQ3JFLENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsS0FBSztZQUNkLFlBQVksRUFBRSxLQUFLO1lBQ25CLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FDdkUsSUFBSSxDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stdnum",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"description": "Standard Number Validation",
|
|
5
5
|
"files": [
|
|
6
6
|
"README.md",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"scripts": {
|
|
39
39
|
"format": "prettier --write \"src/**/*.ts\"",
|
|
40
|
-
"lint": "eslint
|
|
40
|
+
"lint": "eslint src",
|
|
41
41
|
"test": "jest",
|
|
42
42
|
"build": "tsc",
|
|
43
43
|
"prepublishOnly:esm": "tsc -p tsconfig.json",
|
|
@@ -75,20 +75,17 @@
|
|
|
75
75
|
},
|
|
76
76
|
"license": "MIT",
|
|
77
77
|
"devDependencies": {
|
|
78
|
+
"@eslint/js": "^9.18.0",
|
|
78
79
|
"@semantic-release/changelog": "^6.0.3",
|
|
79
80
|
"@semantic-release/git": "^10.0.1",
|
|
80
81
|
"@types/jest": "^29.5.0",
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"eslint": "^8.22.0",
|
|
84
|
-
"eslint-config-airbnb-base": "^15.0.0",
|
|
85
|
-
"eslint-config-airbnb-typescript": "^18.0.0",
|
|
86
|
-
"eslint-config-prettier": "^9.0.0",
|
|
87
|
-
"eslint-plugin-import": "^2.22.1",
|
|
88
|
-
"eslint-plugin-prettier": "^5.0.0",
|
|
82
|
+
"eslint": "^9.18.0",
|
|
83
|
+
"eslint-config-prettier": "^10.0.1",
|
|
89
84
|
"jest": "^29.5.0",
|
|
90
|
-
"prettier": "^3.
|
|
85
|
+
"prettier": "^3.4.2",
|
|
86
|
+
"prettier-eslint": "^16.3.0",
|
|
91
87
|
"ts-jest": "^29.1.0",
|
|
92
|
-
"typescript": "^5.
|
|
88
|
+
"typescript": "^5.7.3",
|
|
89
|
+
"typescript-eslint": "^8.20.0"
|
|
93
90
|
}
|
|
94
91
|
}
|
|
@@ -34,7 +34,7 @@ export function toDateArray(number: string): string[] {
|
|
|
34
34
|
return [yy, mm, dd];
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
function getValidPastDates(yymmdd: string):
|
|
37
|
+
function getValidPastDates(yymmdd: string): string[] {
|
|
38
38
|
const [yy, mm, dd] = toDateArray(yymmdd);
|
|
39
39
|
|
|
40
40
|
return getFullYears(yy)
|
|
@@ -81,7 +81,7 @@ export function validStructure(
|
|
|
81
81
|
return isValidFirstSix(firstSix, toDob);
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
function getChecksumBasesUnknownDob(baseNumber: string):
|
|
84
|
+
function getChecksumBasesUnknownDob(baseNumber: string): number[] {
|
|
85
85
|
const firstSix = getFirstSix(baseNumber);
|
|
86
86
|
const [yy] = toDateArray(firstSix);
|
|
87
87
|
|
|
@@ -93,7 +93,7 @@ function getChecksumBasesUnknownDob(baseNumber: string): Array<number> {
|
|
|
93
93
|
function getChecksumBasesForStandardDob(
|
|
94
94
|
baseNumber: string,
|
|
95
95
|
toDob: typeof defaultToDob,
|
|
96
|
-
):
|
|
96
|
+
): number[] {
|
|
97
97
|
const firstSix = getFirstSix(baseNumber);
|
|
98
98
|
const dob = toDob(firstSix);
|
|
99
99
|
const validPastDates = getValidPastDates(dob);
|
|
@@ -106,7 +106,7 @@ function getChecksumBasesForStandardDob(
|
|
|
106
106
|
function getChecksumBases(
|
|
107
107
|
number: string,
|
|
108
108
|
toDob: typeof defaultToDob,
|
|
109
|
-
):
|
|
109
|
+
): number[] {
|
|
110
110
|
const firstSix = getFirstSix(number);
|
|
111
111
|
const dob = toDob(firstSix);
|
|
112
112
|
const baseNumber = getBaseNumber(number);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { validate, format } from './bc_bhn';
|
|
2
|
+
import {
|
|
3
|
+
InvalidChecksum,
|
|
4
|
+
InvalidComponent,
|
|
5
|
+
InvalidFormat,
|
|
6
|
+
} from '../exceptions';
|
|
7
|
+
|
|
8
|
+
describe('ca/bc_bhn', () => {
|
|
9
|
+
it('format:9698658215', () => {
|
|
10
|
+
const result = format('9698658215');
|
|
11
|
+
|
|
12
|
+
expect(result).toEqual('9698 658 215');
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test.each(['9698 658 215'])('validate:%s', value => {
|
|
16
|
+
const result = validate(value);
|
|
17
|
+
|
|
18
|
+
expect(result.isValid).toEqual(true);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('validate:9736A04212', () => {
|
|
22
|
+
const result = validate('9736A04212');
|
|
23
|
+
|
|
24
|
+
expect(result.error).toBeInstanceOf(InvalidFormat);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('validate:5736504210', () => {
|
|
28
|
+
const result = validate('5736504210');
|
|
29
|
+
|
|
30
|
+
expect(result.error).toBeInstanceOf(InvalidComponent);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('validate:9698648215', () => {
|
|
34
|
+
const result = validate('9698648215');
|
|
35
|
+
|
|
36
|
+
expect(result.error).toBeInstanceOf(InvalidChecksum);
|
|
37
|
+
});
|
|
38
|
+
});
|
package/src/ca/bc_bhn.ts
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BC PHN (British Columbia Personal Health Number).
|
|
3
|
+
*
|
|
4
|
+
* A unique, numerical, lifetime identifier used in the specific identification
|
|
5
|
+
* of an individual client or patient who has had any interaction with the
|
|
6
|
+
* British Columbia health system. It is assigned only to and used by one person
|
|
7
|
+
* and will not be assigned to any other person.
|
|
8
|
+
* The existence of a PHN does not imply eligibility for health care services in
|
|
9
|
+
* BC or provide any indication of an individual’s benefit status.
|
|
10
|
+
*
|
|
11
|
+
* The PNH is a 10-digit number where the first digit is always 9, and the last
|
|
12
|
+
* digit is a MOD-11 check digit.
|
|
13
|
+
*
|
|
14
|
+
* Source:
|
|
15
|
+
* https://www2.gov.bc.ca/gov/content/health/health-drug-coverage/msp/bc-residents/personal-health-identification
|
|
16
|
+
* https://www2.gov.bc.ca/assets/gov/health/practitioner-pro/software-development-guidelines/conformance-standards/vol-4b-app-rules-client-registry.pdf
|
|
17
|
+
*
|
|
18
|
+
* PERSON
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import * as exceptions from '../exceptions';
|
|
22
|
+
import { strings, weightedSum } from '../util';
|
|
23
|
+
import { Validator, ValidateReturn } from '../types';
|
|
24
|
+
import { isdigits, splitAt } from '../util/strings';
|
|
25
|
+
|
|
26
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
27
|
+
return strings.cleanUnicode(input, ' -');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const impl: Validator = {
|
|
31
|
+
name: 'British Columbia Personal Health Number',
|
|
32
|
+
localName: 'British Columbia Personal Health Number',
|
|
33
|
+
abbreviation: 'BC_BHN',
|
|
34
|
+
|
|
35
|
+
compact(input: string): string {
|
|
36
|
+
const [value, err] = clean(input);
|
|
37
|
+
|
|
38
|
+
if (err) {
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return value;
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
format(input: string): string {
|
|
46
|
+
const [value] = clean(input);
|
|
47
|
+
|
|
48
|
+
return splitAt(value, 4, 7).join(' ');
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
validate(input: string): ValidateReturn {
|
|
52
|
+
const [value, error] = clean(input);
|
|
53
|
+
|
|
54
|
+
if (error) {
|
|
55
|
+
return { isValid: false, error };
|
|
56
|
+
}
|
|
57
|
+
if (value.length !== 10) {
|
|
58
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
59
|
+
}
|
|
60
|
+
if (value[0] !== '9') {
|
|
61
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
62
|
+
}
|
|
63
|
+
if (!isdigits(value)) {
|
|
64
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const [, front, check] = strings.splitAt(value, 1, -1);
|
|
68
|
+
|
|
69
|
+
const sum = weightedSum(front, {
|
|
70
|
+
weights: [2, 4, 8, 5, 10, 9, 7, 3],
|
|
71
|
+
modulus: 11,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
if (String((11 - sum) % 11) !== check) {
|
|
75
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
isValid: true,
|
|
80
|
+
compact: value,
|
|
81
|
+
isIndividual: true,
|
|
82
|
+
isCompany: false,
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
88
|
+
impl;
|
package/src/ca/index.ts
CHANGED
package/src/de/vat.ts
CHANGED
package/src/exceptions.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* eslint-disable max-classes-per-file */
|
|
2
1
|
/**
|
|
3
2
|
* Collection of exceptions.
|
|
4
3
|
* The validation functions of stdnum should raise one of the below exceptions
|
|
@@ -35,7 +34,7 @@ export class InvalidFormat extends ValidationError {
|
|
|
35
34
|
* The number's internal checksum or check digit does not match.
|
|
36
35
|
*/
|
|
37
36
|
export class InvalidChecksum extends ValidationError {
|
|
38
|
-
constructor(msg =
|
|
37
|
+
constructor(msg = 'The number checksum or check digit is invalid.') {
|
|
39
38
|
super(msg);
|
|
40
39
|
this.name = 'InvalidChecksum';
|
|
41
40
|
}
|
package/src/fr/nif.spec.ts
CHANGED
|
@@ -8,13 +8,22 @@ describe('fr/nif', () => {
|
|
|
8
8
|
expect(result).toEqual('07 01 987 765 432');
|
|
9
9
|
});
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
const result =
|
|
11
|
+
it('format:3023217600053', () => {
|
|
12
|
+
const result = format('3023217600053');
|
|
13
13
|
|
|
14
|
-
expect(result
|
|
14
|
+
expect(result).toEqual('30 23 217 600 053');
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
test.each(['
|
|
17
|
+
test.each(['3023217600053', '0701987765493', '3023217600053'])(
|
|
18
|
+
'validate:%s',
|
|
19
|
+
value => {
|
|
20
|
+
const result = validate(value);
|
|
21
|
+
|
|
22
|
+
expect(result.isValid && result.compact).toEqual(value);
|
|
23
|
+
},
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
test.each(['0000000000000', '3023217600054'])('validate:%s', value => {
|
|
18
27
|
const result = validate(value);
|
|
19
28
|
|
|
20
29
|
expect(result.isValid).toEqual(false);
|
package/src/in/index.ts
CHANGED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { validate, format } from './vid';
|
|
2
|
+
import { InvalidLength, InvalidFormat, InvalidChecksum } from '../exceptions';
|
|
3
|
+
|
|
4
|
+
describe('in/vid', () => {
|
|
5
|
+
it('format:2341234123412342', () => {
|
|
6
|
+
const result = format('2341234123412342');
|
|
7
|
+
|
|
8
|
+
expect(result).toEqual('2341 2341 2341 2342');
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
test.each(['2341234123412341'])('validate:%s', value => {
|
|
12
|
+
const result = validate(value);
|
|
13
|
+
|
|
14
|
+
expect(result.isValid).toEqual(true);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test.each(['13'])('validate:%s', value => {
|
|
18
|
+
const result = validate(value);
|
|
19
|
+
|
|
20
|
+
expect(result.error).toBeInstanceOf(InvalidLength);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test.each(['1341234123412341', '2222222222222222'])('validate:%s', value => {
|
|
24
|
+
const result = validate(value);
|
|
25
|
+
|
|
26
|
+
expect(result.error).toBeInstanceOf(InvalidFormat);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test.each(['2341234123412342'])('validate:%s', value => {
|
|
30
|
+
const result = validate(value);
|
|
31
|
+
|
|
32
|
+
expect(result.error).toBeInstanceOf(InvalidChecksum);
|
|
33
|
+
});
|
|
34
|
+
});
|
package/src/in/vid.ts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VID (Indian personal virtual identity number).
|
|
3
|
+
*
|
|
4
|
+
* VID is a temporary, revocable 16-digit random number mapped with the Aadhaar number.
|
|
5
|
+
* VID is used in lieu of Aadhaar number whenever authentication or e-KYC services
|
|
6
|
+
* are performed.
|
|
7
|
+
* VID is made up of 16 digits where the last digits is a check digit
|
|
8
|
+
* calculated using the Verhoeff algorithm. The numbers are generated in a
|
|
9
|
+
* random, non-repeating sequence and do not begin with 0 or 1.
|
|
10
|
+
*
|
|
11
|
+
* Source:
|
|
12
|
+
* https://uidai.gov.in/en/contact-support/have-any-question/284-faqs/aadhaar-online-services/virtual-id-vid.html
|
|
13
|
+
* https://uidai.gov.in/images/resource/UIDAI_Circular_11012018.pdf
|
|
14
|
+
*
|
|
15
|
+
* PERSON
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import * as exceptions from '../exceptions';
|
|
19
|
+
import { strings } from '../util';
|
|
20
|
+
import { Validator, ValidateReturn } from '../types';
|
|
21
|
+
import { verhoeffValidate } from '../util/checksum';
|
|
22
|
+
|
|
23
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
24
|
+
return strings.cleanUnicode(input, ' -');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Regular expression used to check syntax of VID numbers.
|
|
28
|
+
const validRE = /^[2-9][0-9]{15}$/;
|
|
29
|
+
|
|
30
|
+
const impl: Validator = {
|
|
31
|
+
name: 'Indian personal virtual identity number',
|
|
32
|
+
localName: 'Indian personal virtual identity number',
|
|
33
|
+
abbreviation: 'VIN',
|
|
34
|
+
compact(input: string): string {
|
|
35
|
+
const [value, err] = clean(input);
|
|
36
|
+
|
|
37
|
+
if (err) {
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return value;
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
format(input: string): string {
|
|
45
|
+
const [value] = clean(input);
|
|
46
|
+
|
|
47
|
+
return strings.splitAt(value, 4, 8, 12).join(' ');
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
validate(input: string): ValidateReturn {
|
|
51
|
+
const [value, error] = clean(input);
|
|
52
|
+
|
|
53
|
+
if (error) {
|
|
54
|
+
return { isValid: false, error };
|
|
55
|
+
}
|
|
56
|
+
if (value.length !== 16) {
|
|
57
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
58
|
+
}
|
|
59
|
+
if (!validRE.test(value)) {
|
|
60
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
61
|
+
}
|
|
62
|
+
// Value cannot be a palindrome
|
|
63
|
+
const r = value.split('');
|
|
64
|
+
r.reverse();
|
|
65
|
+
if (value === r.join('')) {
|
|
66
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// checksum check
|
|
70
|
+
if (!verhoeffValidate(value)) {
|
|
71
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
isValid: true,
|
|
76
|
+
compact: value,
|
|
77
|
+
isIndividual: true,
|
|
78
|
+
isCompany: false,
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
84
|
+
impl;
|
package/src/ua/edrpou.spec.ts
CHANGED
|
@@ -8,11 +8,14 @@ describe('ua/edrpou', () => {
|
|
|
8
8
|
expect(result).toEqual('32855961');
|
|
9
9
|
});
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
test.each(['32855961', '23226362', '23246880', '25083040'])(
|
|
12
|
+
'validate:%s',
|
|
13
|
+
value => {
|
|
14
|
+
const result = validate(value);
|
|
15
|
+
|
|
16
|
+
expect(result.isValid && result.compact).toEqual(value);
|
|
17
|
+
},
|
|
18
|
+
);
|
|
16
19
|
|
|
17
20
|
it('validate:12345', () => {
|
|
18
21
|
const result = validate('12345');
|
package/src/ua/edrpou.ts
CHANGED