@stll/stdnum 2.0.0 → 2.1.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 +12 -13
- package/dist/_checksums/keccak.d.ts +5 -0
- package/dist/_checksums/keccak.js +118 -0
- package/dist/_checksums/keccak.js.map +1 -0
- package/dist/_checksums/mod112.js.map +1 -1
- package/dist/_checksums/sha256.d.ts +5 -0
- package/dist/_checksums/sha256.js +164 -0
- package/dist/_checksums/sha256.js.map +1 -0
- package/dist/_checksums/verhoeff.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/ad/nrt.js.map +1 -1
- package/dist/ae/eid.js.map +1 -1
- package/dist/ai/tin.js.map +1 -1
- package/dist/al/nipt.js.map +1 -1
- package/dist/am/tin.js.map +1 -1
- package/dist/ar/cbu.js.map +1 -1
- package/dist/ar/cuit.js.map +1 -1
- package/dist/ar/dni.js.map +1 -1
- package/dist/at/businessid.js.map +1 -1
- package/dist/at/vnr.js.map +1 -1
- package/dist/au/abn.js.map +1 -1
- package/dist/au/tfn.js.map +1 -1
- package/dist/az/voen.js.map +1 -1
- package/dist/ba/jmbg.js.map +1 -1
- package/dist/be/bis.js.map +1 -1
- package/dist/be/nn.js.map +1 -1
- package/dist/be/vat.js.map +1 -1
- package/dist/bg/egn.js.map +1 -1
- package/dist/bg/vat.js.map +1 -1
- package/dist/bh/cpr.js.map +1 -1
- package/dist/bic.js.map +1 -1
- package/dist/br/cnpj.js.map +1 -1
- package/dist/br/cpf.js.map +1 -1
- package/dist/by/unp.js.map +1 -1
- package/dist/bz/tin.js.map +1 -1
- package/dist/ch/uid.js.map +1 -1
- package/dist/ch/vat.js.map +1 -1
- package/dist/cl/rut.js.map +1 -1
- package/dist/cn/ric.js.map +1 -1
- package/dist/cn/uscc.js.map +1 -1
- package/dist/cr/cpf.js.map +1 -1
- package/dist/crypto/btcbase58.d.ts +11 -0
- package/dist/crypto/btcbase58.js +76 -0
- package/dist/crypto/btcbase58.js.map +1 -0
- package/dist/crypto/btcbech32.d.ts +19 -0
- package/dist/crypto/btcbech32.js +145 -0
- package/dist/crypto/btcbech32.js.map +1 -0
- package/dist/crypto/eth.d.ts +11 -0
- package/dist/crypto/eth.js +63 -0
- package/dist/crypto/eth.js.map +1 -0
- package/dist/crypto/mod.d.ts +12 -0
- package/dist/crypto/mod.js +16 -0
- package/dist/crypto/mod.js.map +1 -0
- package/dist/crypto/wallet.d.ts +10 -0
- package/dist/crypto/wallet.js +55 -0
- package/dist/crypto/wallet.js.map +1 -0
- package/dist/cu/ni.js.map +1 -1
- package/dist/cz/rc.js.map +1 -1
- package/dist/de/handelsreg.js.map +1 -1
- package/dist/de/idnr.js.map +1 -1
- package/dist/de/stnr.js.map +1 -1
- package/dist/de/svnr.js.map +1 -1
- package/dist/dk/cpr.js.map +1 -1
- package/dist/dk/cvr.js.map +1 -1
- package/dist/dk/vat.js.map +1 -1
- package/dist/do/rnc.js.map +1 -1
- package/dist/ec/ruc.js.map +1 -1
- package/dist/ee/ik.js.map +1 -1
- package/dist/ee/vat.js.map +1 -1
- package/dist/eg/tn.js.map +1 -1
- package/dist/es/dni.js.map +1 -1
- package/dist/es/nie.js.map +1 -1
- package/dist/es/nss.js.map +1 -1
- package/dist/eu/vat.js.map +1 -1
- package/dist/fi/hetu.js.map +1 -1
- package/dist/fi/vat.js.map +1 -1
- package/dist/fi/ytunnus.js.map +1 -1
- package/dist/fr/nif.js.map +1 -1
- package/dist/fr/nir.js.map +1 -1
- package/dist/fr/tva.js.map +1 -1
- package/dist/gb/mod.d.ts +3 -2
- package/dist/gb/mod.js +3 -1
- package/dist/gb/mod.js.map +1 -1
- package/dist/gb/nhs.d.ts +11 -0
- package/dist/gb/nhs.js +51 -0
- package/dist/gb/nhs.js.map +1 -0
- package/dist/gb/nino.js.map +1 -1
- package/dist/gb/sedol.js.map +1 -1
- package/dist/gb/utr.js.map +1 -1
- package/dist/gb/vat.js.map +1 -1
- package/dist/ge/pin.js.map +1 -1
- package/dist/gh/tin.js.map +1 -1
- package/dist/gr/amka.js.map +1 -1
- package/dist/gt/nit.js.map +1 -1
- package/dist/hk/hkid.js.map +1 -1
- package/dist/hu/vat.js.map +1 -1
- package/dist/iban.js.map +1 -1
- package/dist/id/npwp.js.map +1 -1
- package/dist/ie/pps.js.map +1 -1
- package/dist/ie/vat.js.map +1 -1
- package/dist/il/idnr.js.map +1 -1
- package/dist/in/aadhaar.js.map +1 -1
- package/dist/in/gstin.js.map +1 -1
- package/dist/in/pan.js.map +1 -1
- package/dist/index.d.ts +76 -75
- package/dist/index.js +2 -1
- package/dist/ir/nid.js.map +1 -1
- package/dist/is/kennitala.js.map +1 -1
- package/dist/isin.js.map +1 -1
- package/dist/it/codicefiscale.js.map +1 -1
- package/dist/it/iva.js.map +1 -1
- package/dist/kr/rrn.js.map +1 -1
- package/dist/kw/civil.js.map +1 -1
- package/dist/kz/iin.js.map +1 -1
- package/dist/lei.js.map +1 -1
- package/dist/li/peid.js.map +1 -1
- package/dist/lk/nic.js.map +1 -1
- package/dist/lt/asmens.js.map +1 -1
- package/dist/lt/vat.js.map +1 -1
- package/dist/lu/vat.js.map +1 -1
- package/dist/lv/vat.js.map +1 -1
- package/dist/ma/ice.js.map +1 -1
- package/dist/mc/tva.js.map +1 -1
- package/dist/mt/vat.js.map +1 -1
- package/dist/mu/brn.js.map +1 -1
- package/dist/mx/clabe.js.map +1 -1
- package/dist/mx/curp.js.map +1 -1
- package/dist/mx/rfc.js.map +1 -1
- package/dist/my/nric.js.map +1 -1
- package/dist/ni/ruc.js.map +1 -1
- package/dist/nl/bsn.js.map +1 -1
- package/dist/nl/vat.js.map +1 -1
- package/dist/no/fodselsnummer.js.map +1 -1
- package/dist/no/mva.js.map +1 -1
- package/dist/no/orgnr.js.map +1 -1
- package/dist/nz/ird.js.map +1 -1
- package/dist/pa/ruc.js.map +1 -1
- package/dist/patterns.js.map +1 -1
- package/dist/pe/ruc.js.map +1 -1
- package/dist/pl/pesel.js.map +1 -1
- package/dist/pl/regon.js.map +1 -1
- package/dist/pt/cc.js.map +1 -1
- package/dist/ro/cnp.js.map +1 -1
- package/dist/ro/vat.js.map +1 -1
- package/dist/rs/pib.js.map +1 -1
- package/dist/ru/inn.js.map +1 -1
- package/dist/se/personnummer.js.map +1 -1
- package/dist/sg/uen.js.map +1 -1
- package/dist/si/emso.js.map +1 -1
- package/dist/si/vat.js.map +1 -1
- package/dist/sk/dic.js.map +1 -1
- package/dist/tw/ubn.js.map +1 -1
- package/dist/ua/edrpou.js.map +1 -1
- package/dist/us/itin.js.map +1 -1
- package/dist/us/rtn.js.map +1 -1
- package/dist/us/ssn.js.map +1 -1
- package/dist/uy/rut.js.map +1 -1
- package/dist/ve/rif.js.map +1 -1
- package/dist/vn/mst.js.map +1 -1
- package/dist/za/idnr.js.map +1 -1
- package/package.json +31 -6
- package/src/_checksums/keccak.ts +145 -0
- package/src/_checksums/sha256.ts +125 -0
- package/src/crypto/btcbase58.ts +144 -0
- package/src/crypto/btcbech32.ts +210 -0
- package/src/crypto/eth.ts +114 -0
- package/src/crypto/mod.ts +4 -0
- package/src/crypto/wallet.ts +67 -0
- package/src/gb/mod.ts +1 -0
- package/src/gb/nhs.ts +92 -0
- package/src/index.ts +1 -0
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src=".github/assets/banner.png" alt="
|
|
2
|
+
<img src=".github/assets/banner.png" alt="stella" width="100%" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
# @stll/stdnum
|
|
@@ -19,9 +19,6 @@ npm install @stll/stdnum
|
|
|
19
19
|
bun add @stll/stdnum
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
Tagged releases are published from GitHub Actions
|
|
23
|
-
with npm provenance enabled.
|
|
24
|
-
|
|
25
22
|
## Usage
|
|
26
23
|
|
|
27
24
|
```typescript
|
|
@@ -70,15 +67,16 @@ runtime against coverage.
|
|
|
70
67
|
|
|
71
68
|
### International
|
|
72
69
|
|
|
73
|
-
| Identifier | Module
|
|
74
|
-
| ------------------ |
|
|
75
|
-
| BIC (ISO 9362) | `bic`
|
|
76
|
-
| Credit Card (Luhn) | `creditcard`
|
|
77
|
-
|
|
|
78
|
-
|
|
|
79
|
-
|
|
|
80
|
-
|
|
|
81
|
-
|
|
|
70
|
+
| Identifier | Module | Type |
|
|
71
|
+
| ------------------ | --------------- | ------- |
|
|
72
|
+
| BIC (ISO 9362) | `bic` | company |
|
|
73
|
+
| Credit Card (Luhn) | `creditcard` | any |
|
|
74
|
+
| Crypto Wallet | `crypto/wallet` | any |
|
|
75
|
+
| IBAN | `iban` | any |
|
|
76
|
+
| ISIN (ISO 6166) | `isin` | any |
|
|
77
|
+
| LEI | `lei` | company |
|
|
78
|
+
| Luhn | `luhn` | any |
|
|
79
|
+
| EU VAT | `eu/vat` | company |
|
|
82
80
|
|
|
83
81
|
### Countries
|
|
84
82
|
|
|
@@ -159,6 +157,7 @@ runtime against coverage.
|
|
|
159
157
|
| | `fr/siret` | SIRET |
|
|
160
158
|
| | `fr/tva` | TVA |
|
|
161
159
|
| GB United Kingdom | `gb/nino` | NINO |
|
|
160
|
+
| | `gb/nhs` | NHS |
|
|
162
161
|
| | `gb/sedol` | SEDOL |
|
|
163
162
|
| | `gb/utr` | UTR |
|
|
164
163
|
| | `gb/vat` | VAT |
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
//#region src/_checksums/keccak.ts
|
|
2
|
+
const MASK_64 = (1n << 64n) - 1n;
|
|
3
|
+
const ROUND_CONSTANTS = [
|
|
4
|
+
1n,
|
|
5
|
+
32898n,
|
|
6
|
+
9223372036854808714n,
|
|
7
|
+
9223372039002292224n,
|
|
8
|
+
32907n,
|
|
9
|
+
2147483649n,
|
|
10
|
+
9223372039002292353n,
|
|
11
|
+
9223372036854808585n,
|
|
12
|
+
138n,
|
|
13
|
+
136n,
|
|
14
|
+
2147516425n,
|
|
15
|
+
2147483658n,
|
|
16
|
+
2147516555n,
|
|
17
|
+
9223372036854775947n,
|
|
18
|
+
9223372036854808713n,
|
|
19
|
+
9223372036854808579n,
|
|
20
|
+
9223372036854808578n,
|
|
21
|
+
9223372036854775936n,
|
|
22
|
+
32778n,
|
|
23
|
+
9223372039002259466n,
|
|
24
|
+
9223372039002292353n,
|
|
25
|
+
9223372036854808704n,
|
|
26
|
+
2147483649n,
|
|
27
|
+
9223372039002292232n
|
|
28
|
+
];
|
|
29
|
+
const ROTATION_OFFSETS = [
|
|
30
|
+
0,
|
|
31
|
+
1,
|
|
32
|
+
62,
|
|
33
|
+
28,
|
|
34
|
+
27,
|
|
35
|
+
36,
|
|
36
|
+
44,
|
|
37
|
+
6,
|
|
38
|
+
55,
|
|
39
|
+
20,
|
|
40
|
+
3,
|
|
41
|
+
10,
|
|
42
|
+
43,
|
|
43
|
+
25,
|
|
44
|
+
39,
|
|
45
|
+
41,
|
|
46
|
+
45,
|
|
47
|
+
15,
|
|
48
|
+
21,
|
|
49
|
+
8,
|
|
50
|
+
18,
|
|
51
|
+
2,
|
|
52
|
+
61,
|
|
53
|
+
56,
|
|
54
|
+
14
|
|
55
|
+
];
|
|
56
|
+
const RATE_BYTES = 136;
|
|
57
|
+
const rotl64 = (value, shift) => {
|
|
58
|
+
if (shift === 0) return value & MASK_64;
|
|
59
|
+
const bigShift = BigInt(shift);
|
|
60
|
+
return (value << bigShift | value >> 64n - bigShift) & MASK_64;
|
|
61
|
+
};
|
|
62
|
+
const keccakF1600 = (state) => {
|
|
63
|
+
const c = Array.from({ length: 5 }, () => 0n);
|
|
64
|
+
const d = Array.from({ length: 5 }, () => 0n);
|
|
65
|
+
const b = Array.from({ length: 25 }, () => 0n);
|
|
66
|
+
for (const roundConstant of ROUND_CONSTANTS) {
|
|
67
|
+
for (let x = 0; x < 5; x += 1) c[x] = (state[x] ?? 0n) ^ (state[x + 5] ?? 0n) ^ (state[x + 10] ?? 0n) ^ (state[x + 15] ?? 0n) ^ (state[x + 20] ?? 0n);
|
|
68
|
+
for (let x = 0; x < 5; x += 1) d[x] = (c[(x + 4) % 5] ?? 0n) ^ rotl64(c[(x + 1) % 5] ?? 0n, 1);
|
|
69
|
+
for (let y = 0; y < 5; y += 1) for (let x = 0; x < 5; x += 1) {
|
|
70
|
+
const index = x + 5 * y;
|
|
71
|
+
state[index] = ((state[index] ?? 0n) ^ (d[x] ?? 0n)) & MASK_64;
|
|
72
|
+
}
|
|
73
|
+
for (let y = 0; y < 5; y += 1) for (let x = 0; x < 5; x += 1) {
|
|
74
|
+
const sourceIndex = x + 5 * y;
|
|
75
|
+
const targetIndex = y + 5 * ((2 * x + 3 * y) % 5);
|
|
76
|
+
b[targetIndex] = rotl64(state[sourceIndex] ?? 0n, ROTATION_OFFSETS[sourceIndex] ?? 0);
|
|
77
|
+
}
|
|
78
|
+
for (let y = 0; y < 5; y += 1) for (let x = 0; x < 5; x += 1) {
|
|
79
|
+
const index = x + 5 * y;
|
|
80
|
+
state[index] = ((b[index] ?? 0n) ^ ~(b[(x + 1) % 5 + 5 * y] ?? 0n) & (b[(x + 2) % 5 + 5 * y] ?? 0n)) & MASK_64;
|
|
81
|
+
}
|
|
82
|
+
state[0] = ((state[0] ?? 0n) ^ roundConstant) & MASK_64;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const keccak256 = (bytes) => {
|
|
86
|
+
const state = Array.from({ length: 25 }, () => 0n);
|
|
87
|
+
let offset = 0;
|
|
88
|
+
while (offset + RATE_BYTES <= bytes.length) {
|
|
89
|
+
for (let i = 0; i < RATE_BYTES; i += 1) {
|
|
90
|
+
const lane = Math.floor(i / 8);
|
|
91
|
+
const shift = BigInt(i % 8 * 8);
|
|
92
|
+
state[lane] = ((state[lane] ?? 0n) ^ BigInt(bytes[offset + i] ?? 0) << shift) & MASK_64;
|
|
93
|
+
}
|
|
94
|
+
keccakF1600(state);
|
|
95
|
+
offset += RATE_BYTES;
|
|
96
|
+
}
|
|
97
|
+
const block = new Uint8Array(RATE_BYTES);
|
|
98
|
+
block.set(bytes.slice(offset));
|
|
99
|
+
block[bytes.length - offset] = 1;
|
|
100
|
+
block[RATE_BYTES - 1] = (block[RATE_BYTES - 1] ?? 0) ^ 128;
|
|
101
|
+
for (let i = 0; i < RATE_BYTES; i += 1) {
|
|
102
|
+
const lane = Math.floor(i / 8);
|
|
103
|
+
const shift = BigInt(i % 8 * 8);
|
|
104
|
+
state[lane] = ((state[lane] ?? 0n) ^ BigInt(block[i] ?? 0) << shift) & MASK_64;
|
|
105
|
+
}
|
|
106
|
+
keccakF1600(state);
|
|
107
|
+
const digest = new Uint8Array(32);
|
|
108
|
+
for (let i = 0; i < digest.length; i += 1) {
|
|
109
|
+
const lane = Math.floor(i / 8);
|
|
110
|
+
const shift = BigInt(i % 8 * 8);
|
|
111
|
+
digest[i] = Number((state[lane] ?? 0n) >> shift & 255n);
|
|
112
|
+
}
|
|
113
|
+
return digest;
|
|
114
|
+
};
|
|
115
|
+
//#endregion
|
|
116
|
+
export { keccak256 };
|
|
117
|
+
|
|
118
|
+
//# sourceMappingURL=keccak.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keccak.js","names":[],"sources":["../../src/_checksums/keccak.ts"],"sourcesContent":["const MASK_64 = (1n << 64n) - 1n;\n\nconst ROUND_CONSTANTS = [\n 0x0000000000000001n,\n 0x0000000000008082n,\n 0x800000000000808an,\n 0x8000000080008000n,\n 0x000000000000808bn,\n 0x0000000080000001n,\n 0x8000000080008081n,\n 0x8000000000008009n,\n 0x000000000000008an,\n 0x0000000000000088n,\n 0x0000000080008009n,\n 0x000000008000000an,\n 0x000000008000808bn,\n 0x800000000000008bn,\n 0x8000000000008089n,\n 0x8000000000008003n,\n 0x8000000000008002n,\n 0x8000000000000080n,\n 0x000000000000800an,\n 0x800000008000000an,\n 0x8000000080008081n,\n 0x8000000000008080n,\n 0x0000000080000001n,\n 0x8000000080008008n,\n] as const;\n\nconst ROTATION_OFFSETS = [\n 0, 1, 62, 28, 27, 36, 44, 6, 55, 20, 3, 10, 43, 25, 39,\n 41, 45, 15, 21, 8, 18, 2, 61, 56, 14,\n] as const;\n\nconst RATE_BYTES = 136;\n\nconst rotl64 = (value: bigint, shift: number): bigint => {\n if (shift === 0) return value & MASK_64;\n const bigShift = BigInt(shift);\n return (\n ((value << bigShift) | (value >> (64n - bigShift))) &\n MASK_64\n );\n};\n\nconst keccakF1600 = (state: bigint[]): void => {\n const c = Array.from({ length: 5 }, () => 0n);\n const d = Array.from({ length: 5 }, () => 0n);\n const b = Array.from({ length: 25 }, () => 0n);\n\n for (const roundConstant of ROUND_CONSTANTS) {\n for (let x = 0; x < 5; x += 1) {\n c[x] =\n (state[x] ?? 0n) ^\n (state[x + 5] ?? 0n) ^\n (state[x + 10] ?? 0n) ^\n (state[x + 15] ?? 0n) ^\n (state[x + 20] ?? 0n);\n }\n\n for (let x = 0; x < 5; x += 1) {\n d[x] =\n (c[(x + 4) % 5] ?? 0n) ^\n rotl64(c[(x + 1) % 5] ?? 0n, 1);\n }\n\n for (let y = 0; y < 5; y += 1) {\n for (let x = 0; x < 5; x += 1) {\n const index = x + 5 * y;\n state[index] =\n ((state[index] ?? 0n) ^ (d[x] ?? 0n)) & MASK_64;\n }\n }\n\n for (let y = 0; y < 5; y += 1) {\n for (let x = 0; x < 5; x += 1) {\n const sourceIndex = x + 5 * y;\n const targetIndex = y + 5 * ((2 * x + 3 * y) % 5);\n b[targetIndex] = rotl64(\n state[sourceIndex] ?? 0n,\n ROTATION_OFFSETS[sourceIndex] ?? 0,\n );\n }\n }\n\n for (let y = 0; y < 5; y += 1) {\n for (let x = 0; x < 5; x += 1) {\n const index = x + 5 * y;\n state[index] =\n ((b[index] ?? 0n) ^\n (~(b[((x + 1) % 5) + 5 * y] ?? 0n) &\n (b[((x + 2) % 5) + 5 * y] ?? 0n))) &\n MASK_64;\n }\n }\n\n state[0] = ((state[0] ?? 0n) ^ roundConstant) & MASK_64;\n }\n};\n\nexport const keccak256 = (\n bytes: Uint8Array,\n): Uint8Array => {\n const state = Array.from({ length: 25 }, () => 0n);\n let offset = 0;\n\n while (offset + RATE_BYTES <= bytes.length) {\n for (let i = 0; i < RATE_BYTES; i += 1) {\n const lane = Math.floor(i / 8);\n const shift = BigInt((i % 8) * 8);\n state[lane] =\n ((state[lane] ?? 0n) ^\n (BigInt(bytes[offset + i] ?? 0) << shift)) &\n MASK_64;\n }\n keccakF1600(state);\n offset += RATE_BYTES;\n }\n\n const block = new Uint8Array(RATE_BYTES);\n block.set(bytes.slice(offset));\n block[bytes.length - offset] = 0x01;\n block[RATE_BYTES - 1] =\n (block[RATE_BYTES - 1] ?? 0) ^ 0x80;\n\n for (let i = 0; i < RATE_BYTES; i += 1) {\n const lane = Math.floor(i / 8);\n const shift = BigInt((i % 8) * 8);\n state[lane] =\n ((state[lane] ?? 0n) ^\n (BigInt(block[i] ?? 0) << shift)) &\n MASK_64;\n }\n keccakF1600(state);\n\n const digest = new Uint8Array(32);\n for (let i = 0; i < digest.length; i += 1) {\n const lane = Math.floor(i / 8);\n const shift = BigInt((i % 8) * 8);\n digest[i] = Number(\n ((state[lane] ?? 0n) >> shift) & 0xffn,\n );\n }\n return digest;\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod112.js","names":[],"sources":["../../src/_checksums/mod112.ts"],"sourcesContent":["/**\n * ISO 7064 Mod 11,2 check character algorithm.\n * Used by CN RIC (Resident Identity Card).\n *\n * Weights are powers of 2 modulo 11\n * (2^17 mod 11 ... 2^1 mod 11), applied\n * left-to-right across the 17-character payload.\n * The check character is looked up from\n * \"10X98765432\".\n */\n\nconst WEIGHTS = [\n 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,\n] as const;\n\nconst CHECK_CHARS = \"10X98765432\";\n\n/**\n * Compute the ISO 7064 Mod 11,2 check character\n * for a 17-character payload.\n */\nexport const mod112checkChar = (\n payload: string,\n): string => {\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n sum += Number(payload[i]) * weight;\n }\n // SAFETY: sum % 11 is in 0..10 and CHECK_CHARS has 11 chars.\n return CHECK_CHARS[sum % 11] ?? \"\";\n};\n\n/**\n * Validate an 18-character string with a Mod 11,2\n * check character (last char is 0-9 or X).\n */\nexport const mod112validate = (value: string): boolean => {\n const check = value[17]?.toUpperCase();\n if (check === undefined) return false;\n return mod112checkChar(value.slice(0, 17)) === check;\n};\n"],"mappings":";;;;;;;;;;;AAWA,MAAM,UAAU;CACd;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;AACpD;AAEA,MAAM,cAAc;;;;;AAMpB,MAAa,mBACX,YACW;CACX,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GACxC,OAAO,OAAO,QAAQ,EAAE,IAAI;CAG9B,OAAO,YAAY,MAAM,OAAO;AAClC;;;;;AAMA,MAAa,kBAAkB,UAA2B;CACxD,MAAM,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"mod112.js","names":[],"sources":["../../src/_checksums/mod112.ts"],"sourcesContent":["/**\n * ISO 7064 Mod 11,2 check character algorithm.\n * Used by CN RIC (Resident Identity Card).\n *\n * Weights are powers of 2 modulo 11\n * (2^17 mod 11 ... 2^1 mod 11), applied\n * left-to-right across the 17-character payload.\n * The check character is looked up from\n * \"10X98765432\".\n */\n\nconst WEIGHTS = [\n 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,\n] as const;\n\nconst CHECK_CHARS = \"10X98765432\";\n\n/**\n * Compute the ISO 7064 Mod 11,2 check character\n * for a 17-character payload.\n */\nexport const mod112checkChar = (\n payload: string,\n): string => {\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n sum += Number(payload[i]) * weight;\n }\n // SAFETY: sum % 11 is in 0..10 and CHECK_CHARS has 11 chars.\n return CHECK_CHARS[sum % 11] ?? \"\";\n};\n\n/**\n * Validate an 18-character string with a Mod 11,2\n * check character (last char is 0-9 or X).\n */\nexport const mod112validate = (value: string): boolean => {\n const check = value[17]?.toUpperCase();\n if (check === undefined) return false;\n return mod112checkChar(value.slice(0, 17)) === check;\n};\n"],"mappings":";;;;;;;;;;;AAWA,MAAM,UAAU;CACd;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;AACpD;AAEA,MAAM,cAAc;;;;;AAMpB,MAAa,mBACX,YACW;CACX,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GACxC,OAAO,OAAO,QAAQ,EAAE,IAAI;CAG9B,OAAO,YAAY,MAAM,OAAO;AAClC;;;;;AAMA,MAAa,kBAAkB,UAA2B;CACxD,MAAM,QAAQ,MAAM,GAAG,EAAE,YAAY;CACrC,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,OAAO,gBAAgB,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM;AACjD"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
//#region src/_checksums/sha256.ts
|
|
2
|
+
const K = new Uint32Array([
|
|
3
|
+
1116352408,
|
|
4
|
+
1899447441,
|
|
5
|
+
3049323471,
|
|
6
|
+
3921009573,
|
|
7
|
+
961987163,
|
|
8
|
+
1508970993,
|
|
9
|
+
2453635748,
|
|
10
|
+
2870763221,
|
|
11
|
+
3624381080,
|
|
12
|
+
310598401,
|
|
13
|
+
607225278,
|
|
14
|
+
1426881987,
|
|
15
|
+
1925078388,
|
|
16
|
+
2162078206,
|
|
17
|
+
2614888103,
|
|
18
|
+
3248222580,
|
|
19
|
+
3835390401,
|
|
20
|
+
4022224774,
|
|
21
|
+
264347078,
|
|
22
|
+
604807628,
|
|
23
|
+
770255983,
|
|
24
|
+
1249150122,
|
|
25
|
+
1555081692,
|
|
26
|
+
1996064986,
|
|
27
|
+
2554220882,
|
|
28
|
+
2821834349,
|
|
29
|
+
2952996808,
|
|
30
|
+
3210313671,
|
|
31
|
+
3336571891,
|
|
32
|
+
3584528711,
|
|
33
|
+
113926993,
|
|
34
|
+
338241895,
|
|
35
|
+
666307205,
|
|
36
|
+
773529912,
|
|
37
|
+
1294757372,
|
|
38
|
+
1396182291,
|
|
39
|
+
1695183700,
|
|
40
|
+
1986661051,
|
|
41
|
+
2177026350,
|
|
42
|
+
2456956037,
|
|
43
|
+
2730485921,
|
|
44
|
+
2820302411,
|
|
45
|
+
3259730800,
|
|
46
|
+
3345764771,
|
|
47
|
+
3516065817,
|
|
48
|
+
3600352804,
|
|
49
|
+
4094571909,
|
|
50
|
+
275423344,
|
|
51
|
+
430227734,
|
|
52
|
+
506948616,
|
|
53
|
+
659060556,
|
|
54
|
+
883997877,
|
|
55
|
+
958139571,
|
|
56
|
+
1322822218,
|
|
57
|
+
1537002063,
|
|
58
|
+
1747873779,
|
|
59
|
+
1955562222,
|
|
60
|
+
2024104815,
|
|
61
|
+
2227730452,
|
|
62
|
+
2361852424,
|
|
63
|
+
2428436474,
|
|
64
|
+
2756734187,
|
|
65
|
+
3204031479,
|
|
66
|
+
3329325298
|
|
67
|
+
]);
|
|
68
|
+
const rotr = (value, bits) => value >>> bits | value << 32 - bits;
|
|
69
|
+
const sha256 = (bytes) => {
|
|
70
|
+
const bitLength = bytes.length * 8;
|
|
71
|
+
const messageLength = bytes.length + 1;
|
|
72
|
+
const totalLength = messageLength + (64 - (messageLength + 8) % 64) % 64 + 8;
|
|
73
|
+
const message = new Uint8Array(totalLength);
|
|
74
|
+
message.set(bytes);
|
|
75
|
+
message[bytes.length] = 128;
|
|
76
|
+
const high = Math.floor(bitLength / 4294967296);
|
|
77
|
+
const low = bitLength >>> 0;
|
|
78
|
+
message[totalLength - 8] = high >>> 24;
|
|
79
|
+
message[totalLength - 7] = high >>> 16;
|
|
80
|
+
message[totalLength - 6] = high >>> 8;
|
|
81
|
+
message[totalLength - 5] = high;
|
|
82
|
+
message[totalLength - 4] = low >>> 24;
|
|
83
|
+
message[totalLength - 3] = low >>> 16;
|
|
84
|
+
message[totalLength - 2] = low >>> 8;
|
|
85
|
+
message[totalLength - 1] = low;
|
|
86
|
+
let h0 = 1779033703;
|
|
87
|
+
let h1 = 3144134277;
|
|
88
|
+
let h2 = 1013904242;
|
|
89
|
+
let h3 = 2773480762;
|
|
90
|
+
let h4 = 1359893119;
|
|
91
|
+
let h5 = 2600822924;
|
|
92
|
+
let h6 = 528734635;
|
|
93
|
+
let h7 = 1541459225;
|
|
94
|
+
const words = new Uint32Array(64);
|
|
95
|
+
for (let offset = 0; offset < totalLength; offset += 64) {
|
|
96
|
+
for (let i = 0; i < 16; i += 1) {
|
|
97
|
+
const j = offset + i * 4;
|
|
98
|
+
words[i] = (message[j] ?? 0) << 24 | (message[j + 1] ?? 0) << 16 | (message[j + 2] ?? 0) << 8 | (message[j + 3] ?? 0);
|
|
99
|
+
}
|
|
100
|
+
for (let i = 16; i < 64; i += 1) {
|
|
101
|
+
const w2 = words[i - 2] ?? 0;
|
|
102
|
+
const w7 = words[i - 7] ?? 0;
|
|
103
|
+
const w15 = words[i - 15] ?? 0;
|
|
104
|
+
const w16 = words[i - 16] ?? 0;
|
|
105
|
+
const s0 = rotr(w15, 7) ^ rotr(w15, 18) ^ w15 >>> 3;
|
|
106
|
+
const s1 = rotr(w2, 17) ^ rotr(w2, 19) ^ w2 >>> 10;
|
|
107
|
+
words[i] = w16 + s0 + w7 + s1 >>> 0;
|
|
108
|
+
}
|
|
109
|
+
let a = h0;
|
|
110
|
+
let b = h1;
|
|
111
|
+
let c = h2;
|
|
112
|
+
let d = h3;
|
|
113
|
+
let e = h4;
|
|
114
|
+
let f = h5;
|
|
115
|
+
let g = h6;
|
|
116
|
+
let h = h7;
|
|
117
|
+
for (let i = 0; i < 64; i += 1) {
|
|
118
|
+
const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);
|
|
119
|
+
const ch = e & f ^ ~e & g;
|
|
120
|
+
const temp1 = h + s1 + ch + (K[i] ?? 0) + (words[i] ?? 0) >>> 0;
|
|
121
|
+
const temp2 = (rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)) + (a & b ^ a & c ^ b & c) >>> 0;
|
|
122
|
+
h = g;
|
|
123
|
+
g = f;
|
|
124
|
+
f = e;
|
|
125
|
+
e = d + temp1 >>> 0;
|
|
126
|
+
d = c;
|
|
127
|
+
c = b;
|
|
128
|
+
b = a;
|
|
129
|
+
a = temp1 + temp2 >>> 0;
|
|
130
|
+
}
|
|
131
|
+
h0 = h0 + a >>> 0;
|
|
132
|
+
h1 = h1 + b >>> 0;
|
|
133
|
+
h2 = h2 + c >>> 0;
|
|
134
|
+
h3 = h3 + d >>> 0;
|
|
135
|
+
h4 = h4 + e >>> 0;
|
|
136
|
+
h5 = h5 + f >>> 0;
|
|
137
|
+
h6 = h6 + g >>> 0;
|
|
138
|
+
h7 = h7 + h >>> 0;
|
|
139
|
+
}
|
|
140
|
+
const digest = new Uint8Array(32);
|
|
141
|
+
const hash = [
|
|
142
|
+
h0,
|
|
143
|
+
h1,
|
|
144
|
+
h2,
|
|
145
|
+
h3,
|
|
146
|
+
h4,
|
|
147
|
+
h5,
|
|
148
|
+
h6,
|
|
149
|
+
h7
|
|
150
|
+
];
|
|
151
|
+
for (let i = 0; i < hash.length; i += 1) {
|
|
152
|
+
const value = hash[i] ?? 0;
|
|
153
|
+
const j = i * 4;
|
|
154
|
+
digest[j] = value >>> 24;
|
|
155
|
+
digest[j + 1] = value >>> 16;
|
|
156
|
+
digest[j + 2] = value >>> 8;
|
|
157
|
+
digest[j + 3] = value;
|
|
158
|
+
}
|
|
159
|
+
return digest;
|
|
160
|
+
};
|
|
161
|
+
//#endregion
|
|
162
|
+
export { sha256 };
|
|
163
|
+
|
|
164
|
+
//# sourceMappingURL=sha256.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sha256.js","names":[],"sources":["../../src/_checksums/sha256.ts"],"sourcesContent":["const K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nconst rotr = (value: number, bits: number): number =>\n (value >>> bits) | (value << (32 - bits));\n\nexport const sha256 = (bytes: Uint8Array): Uint8Array => {\n const bitLength = bytes.length * 8;\n const messageLength = bytes.length + 1;\n const paddingLength =\n (64 - ((messageLength + 8) % 64)) % 64;\n const totalLength = messageLength + paddingLength + 8;\n const message = new Uint8Array(totalLength);\n message.set(bytes);\n message[bytes.length] = 0x80;\n\n const high = Math.floor(bitLength / 0x1_0000_0000);\n const low = bitLength >>> 0;\n message[totalLength - 8] = high >>> 24;\n message[totalLength - 7] = high >>> 16;\n message[totalLength - 6] = high >>> 8;\n message[totalLength - 5] = high;\n message[totalLength - 4] = low >>> 24;\n message[totalLength - 3] = low >>> 16;\n message[totalLength - 2] = low >>> 8;\n message[totalLength - 1] = low;\n\n let h0 = 0x6a09e667;\n let h1 = 0xbb67ae85;\n let h2 = 0x3c6ef372;\n let h3 = 0xa54ff53a;\n let h4 = 0x510e527f;\n let h5 = 0x9b05688c;\n let h6 = 0x1f83d9ab;\n let h7 = 0x5be0cd19;\n\n const words = new Uint32Array(64);\n\n for (let offset = 0; offset < totalLength; offset += 64) {\n for (let i = 0; i < 16; i += 1) {\n const j = offset + i * 4;\n words[i] =\n ((message[j] ?? 0) << 24) |\n ((message[j + 1] ?? 0) << 16) |\n ((message[j + 2] ?? 0) << 8) |\n (message[j + 3] ?? 0);\n }\n\n for (let i = 16; i < 64; i += 1) {\n const w2 = words[i - 2] ?? 0;\n const w7 = words[i - 7] ?? 0;\n const w15 = words[i - 15] ?? 0;\n const w16 = words[i - 16] ?? 0;\n const s0 = rotr(w15, 7) ^ rotr(w15, 18) ^ (w15 >>> 3);\n const s1 = rotr(w2, 17) ^ rotr(w2, 19) ^ (w2 >>> 10);\n words[i] = (w16 + s0 + w7 + s1) >>> 0;\n }\n\n let a = h0;\n let b = h1;\n let c = h2;\n let d = h3;\n let e = h4;\n let f = h5;\n let g = h6;\n let h = h7;\n\n for (let i = 0; i < 64; i += 1) {\n const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);\n const ch = (e & f) ^ (~e & g);\n const temp1 =\n (h + s1 + ch + (K[i] ?? 0) + (words[i] ?? 0)) >>> 0;\n const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (s0 + maj) >>> 0;\n\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n h0 = (h0 + a) >>> 0;\n h1 = (h1 + b) >>> 0;\n h2 = (h2 + c) >>> 0;\n h3 = (h3 + d) >>> 0;\n h4 = (h4 + e) >>> 0;\n h5 = (h5 + f) >>> 0;\n h6 = (h6 + g) >>> 0;\n h7 = (h7 + h) >>> 0;\n }\n\n const digest = new Uint8Array(32);\n const hash = [h0, h1, h2, h3, h4, h5, h6, h7];\n for (let i = 0; i < hash.length; i += 1) {\n const value = hash[i] ?? 0;\n const j = i * 4;\n digest[j] = value >>> 24;\n digest[j + 1] = value >>> 16;\n digest[j + 2] = value >>> 8;\n digest[j + 3] = value;\n }\n\n return digest;\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verhoeff.js","names":[],"sources":["../../src/_checksums/verhoeff.ts"],"sourcesContent":["/**\n * Verhoeff checksum algorithm.\n *\n * Uses three tables (d, p, inv) to detect all\n * single-digit and adjacent-transposition errors.\n * Used by Indian Aadhaar numbers.\n *\n * @see https://en.wikipedia.org/wiki/Verhoeff_algorithm\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\n// Dihedral group D5 multiplication table\nconst D: readonly (readonly number[])[] = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],\n [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],\n [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],\n [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],\n [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],\n [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],\n [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],\n [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],\n [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],\n];\n\n// Permutation table\nconst P: readonly (readonly number[])[] = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],\n [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],\n [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],\n [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],\n [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],\n [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],\n [7, 0, 4, 6, 9, 1, 3, 2, 5, 8],\n];\n\n// Inverse table\nconst INV = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9] as const;\n\n/** Compute the Verhoeff checksum of a digit string. */\nexport const verhoeffChecksum = (value: string): number => {\n let c = 0;\n for (let i = value.length - 1; i >= 0; i--) {\n const pos = (value.length - 1 - i) % 8;\n const digit = Number(value[i]);\n c = D[c]![P[pos]![digit]!]!;\n }\n return c;\n};\n\n/** Validate a digit string using Verhoeff. */\nexport const verhoeffValidate = (value: string): boolean =>\n verhoeffChecksum(value) === 0;\n\n/**\n * Calculate the Verhoeff check digit for a\n * digit string (without the check digit).\n */\nexport const verhoeffCheckDigit = (\n value: string,\n): number => {\n let c = 0;\n for (let i = value.length - 1; i >= 0; i--) {\n const pos = (value.length - i) % 8;\n const digit = Number(value[i]);\n c = D[c]![P[pos]![digit]!]!;\n }\n return INV[c]!;\n};\n"],"mappings":";;;;;;;;;;AAaA,MAAM,IAAoC;CACxC;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;AAC/B;AAGA,MAAM,IAAoC;CACxC;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;AAC/B;AAGA,MAAM,MAAM;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;;AAGzC,MAAa,oBAAoB,UAA0B;CACzD,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,MAAM,OAAO,MAAM,SAAS,IAAI,KAAK;EACrC,MAAM,QAAQ,OAAO,MAAM,EAAE;EAC7B,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"verhoeff.js","names":[],"sources":["../../src/_checksums/verhoeff.ts"],"sourcesContent":["/**\n * Verhoeff checksum algorithm.\n *\n * Uses three tables (d, p, inv) to detect all\n * single-digit and adjacent-transposition errors.\n * Used by Indian Aadhaar numbers.\n *\n * @see https://en.wikipedia.org/wiki/Verhoeff_algorithm\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\n// Dihedral group D5 multiplication table\nconst D: readonly (readonly number[])[] = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],\n [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],\n [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],\n [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],\n [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],\n [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],\n [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],\n [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],\n [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],\n];\n\n// Permutation table\nconst P: readonly (readonly number[])[] = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],\n [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],\n [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],\n [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],\n [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],\n [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],\n [7, 0, 4, 6, 9, 1, 3, 2, 5, 8],\n];\n\n// Inverse table\nconst INV = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9] as const;\n\n/** Compute the Verhoeff checksum of a digit string. */\nexport const verhoeffChecksum = (value: string): number => {\n let c = 0;\n for (let i = value.length - 1; i >= 0; i--) {\n const pos = (value.length - 1 - i) % 8;\n const digit = Number(value[i]);\n c = D[c]![P[pos]![digit]!]!;\n }\n return c;\n};\n\n/** Validate a digit string using Verhoeff. */\nexport const verhoeffValidate = (value: string): boolean =>\n verhoeffChecksum(value) === 0;\n\n/**\n * Calculate the Verhoeff check digit for a\n * digit string (without the check digit).\n */\nexport const verhoeffCheckDigit = (\n value: string,\n): number => {\n let c = 0;\n for (let i = value.length - 1; i >= 0; i--) {\n const pos = (value.length - i) % 8;\n const digit = Number(value[i]);\n c = D[c]![P[pos]![digit]!]!;\n }\n return INV[c]!;\n};\n"],"mappings":";;;;;;;;;;AAaA,MAAM,IAAoC;CACxC;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;AAC/B;AAGA,MAAM,IAAoC;CACxC;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;CAC7B;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAAC;AAC/B;AAGA,MAAM,MAAM;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;;AAGzC,MAAa,oBAAoB,UAA0B;CACzD,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,MAAM,OAAO,MAAM,SAAS,IAAI,KAAK;EACrC,MAAM,QAAQ,OAAO,MAAM,EAAE;EAC7B,IAAI,EAAE,EAAE,CAAE,EAAE,IAAI,CAAE;CACpB;CACA,OAAO;AACT;;AAGA,MAAa,oBAAoB,UAC/B,iBAAiB,KAAK,MAAM;;;;;AAM9B,MAAa,sBACX,UACW;CACX,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,MAAM,OAAO,MAAM,SAAS,KAAK;EACjC,MAAM,QAAQ,OAAO,MAAM,EAAE;EAC7B,IAAI,EAAE,EAAE,CAAE,EAAE,IAAI,CAAE;CACpB;CACA,OAAO,IAAI;AACb"}
|
package/dist/_util/arabic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arabic.js","names":[],"sources":["../../src/_util/arabic.ts"],"sourcesContent":["/**\n * Shared Arabic-Indic and Extended Arabic-Indic digit\n * normalization utilities.\n *\n * Arabic-Indic (U+0660..U+0669) and Extended Arabic-Indic\n * (U+06F0..U+06F9, used for Persian/Dari) digits are\n * mapped to ASCII 0-9.\n */\n\nexport const ARABIC_DIGITS: Record<string, string> = {\n \"\\u0660\": \"0\", // ٠\n \"\\u0661\": \"1\", // ١\n \"\\u0662\": \"2\", // ٢\n \"\\u0663\": \"3\", // ٣\n \"\\u0664\": \"4\", // ٤\n \"\\u0665\": \"5\", // ٥\n \"\\u0666\": \"6\", // ٦\n \"\\u0667\": \"7\", // ٧\n \"\\u0668\": \"8\", // ٨\n \"\\u0669\": \"9\", // ٩\n \"\\u06F0\": \"0\", // ۰\n \"\\u06F1\": \"1\", // ۱\n \"\\u06F2\": \"2\", // ۲\n \"\\u06F3\": \"3\", // ۳\n \"\\u06F4\": \"4\", // ۴\n \"\\u06F5\": \"5\", // ۵\n \"\\u06F6\": \"6\", // ۶\n \"\\u06F7\": \"7\", // ۷\n \"\\u06F8\": \"8\", // ۸\n \"\\u06F9\": \"9\", // ۹\n};\n\nexport const ARABIC_REGEX = new RegExp(\n `[${Object.keys(ARABIC_DIGITS).join(\"\")}]`,\n \"g\",\n);\n\n/**\n * Replace Arabic-Indic and Extended Arabic-Indic digits\n * with their ASCII equivalents.\n */\nexport const normalizeArabicDigits = (\n value: string,\n): string =>\n value.replace(\n ARABIC_REGEX,\n (ch) => ARABIC_DIGITS[ch] ?? ch,\n );\n"],"mappings":";;;;;;;;;AASA,MAAa,gBAAwC;CACnD,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;AACZ;AAEA,MAAa,eAAe,IAAI,OAC9B,IAAI,OAAO,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"arabic.js","names":[],"sources":["../../src/_util/arabic.ts"],"sourcesContent":["/**\n * Shared Arabic-Indic and Extended Arabic-Indic digit\n * normalization utilities.\n *\n * Arabic-Indic (U+0660..U+0669) and Extended Arabic-Indic\n * (U+06F0..U+06F9, used for Persian/Dari) digits are\n * mapped to ASCII 0-9.\n */\n\nexport const ARABIC_DIGITS: Record<string, string> = {\n \"\\u0660\": \"0\", // ٠\n \"\\u0661\": \"1\", // ١\n \"\\u0662\": \"2\", // ٢\n \"\\u0663\": \"3\", // ٣\n \"\\u0664\": \"4\", // ٤\n \"\\u0665\": \"5\", // ٥\n \"\\u0666\": \"6\", // ٦\n \"\\u0667\": \"7\", // ٧\n \"\\u0668\": \"8\", // ٨\n \"\\u0669\": \"9\", // ٩\n \"\\u06F0\": \"0\", // ۰\n \"\\u06F1\": \"1\", // ۱\n \"\\u06F2\": \"2\", // ۲\n \"\\u06F3\": \"3\", // ۳\n \"\\u06F4\": \"4\", // ۴\n \"\\u06F5\": \"5\", // ۵\n \"\\u06F6\": \"6\", // ۶\n \"\\u06F7\": \"7\", // ۷\n \"\\u06F8\": \"8\", // ۸\n \"\\u06F9\": \"9\", // ۹\n};\n\nexport const ARABIC_REGEX = new RegExp(\n `[${Object.keys(ARABIC_DIGITS).join(\"\")}]`,\n \"g\",\n);\n\n/**\n * Replace Arabic-Indic and Extended Arabic-Indic digits\n * with their ASCII equivalents.\n */\nexport const normalizeArabicDigits = (\n value: string,\n): string =>\n value.replace(\n ARABIC_REGEX,\n (ch) => ARABIC_DIGITS[ch] ?? ch,\n );\n"],"mappings":";;;;;;;;;AASA,MAAa,gBAAwC;CACnD,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;AACZ;AAEA,MAAa,eAAe,IAAI,OAC9B,IAAI,OAAO,KAAK,aAAa,CAAC,CAAC,KAAK,EAAE,EAAE,IACxC,GACF;;;;;AAMA,MAAa,yBACX,UAEA,MAAM,QACJ,eACC,OAAO,cAAc,OAAO,EAC/B"}
|
package/dist/_util/clean.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clean.js","names":[],"sources":["../../src/_util/clean.ts"],"sourcesContent":["/**\n * Unicode normalization map for common OCR, PDF\n * extraction, and copy-paste artifacts.\n *\n * Maps fullwidth digits, various dashes, dots,\n * spaces, and quotes to their ASCII equivalents.\n * Ported from python-stdnum's util.py _char_map.\n */\nconst CHAR_MAP: Record<string, string> = {\n // Fullwidth digits\n \"\\uFF10\": \"0\",\n \"\\uFF11\": \"1\",\n \"\\uFF12\": \"2\",\n \"\\uFF13\": \"3\",\n \"\\uFF14\": \"4\",\n \"\\uFF15\": \"5\",\n \"\\uFF16\": \"6\",\n \"\\uFF17\": \"7\",\n \"\\uFF18\": \"8\",\n \"\\uFF19\": \"9\",\n // Dashes and hyphens\n \"\\u2010\": \"-\", // hyphen\n \"\\u2011\": \"-\", // non-breaking hyphen\n \"\\u2012\": \"-\", // figure dash\n \"\\u2013\": \"-\", // en dash\n \"\\u2014\": \"-\", // em dash\n \"\\u2015\": \"-\", // horizontal bar\n \"\\u2212\": \"-\", // minus sign\n \"\\uFE58\": \"-\", // small em dash\n \"\\uFE63\": \"-\", // small hyphen-minus\n \"\\uFF0D\": \"-\", // fullwidth hyphen-minus\n // Dots and periods\n \"\\u2024\": \".\", // one dot leader\n \"\\uFE52\": \".\", // small full stop\n \"\\uFF0E\": \".\", // fullwidth full stop\n // Spaces\n \"\\u00A0\": \" \", // non-breaking space\n \"\\u2000\": \" \", // en quad\n \"\\u2001\": \" \", // em quad\n \"\\u2002\": \" \", // en space\n \"\\u2003\": \" \", // em space\n \"\\u2004\": \" \", // three-per-em space\n \"\\u2005\": \" \", // four-per-em space\n \"\\u2006\": \" \", // six-per-em space\n \"\\u2007\": \" \", // figure space\n \"\\u2008\": \" \", // punctuation space\n \"\\u2009\": \" \", // thin space\n \"\\u200A\": \" \", // hair space\n \"\\u200B\": \"\", // zero-width space (remove)\n \"\\u202F\": \" \", // narrow no-break space\n \"\\u205F\": \" \", // medium mathematical space\n \"\\u3000\": \" \", // ideographic space\n \"\\uFEFF\": \"\", // BOM / zero-width no-break\n // Slashes\n \"\\uFF0F\": \"/\", // fullwidth solidus\n \"\\u2044\": \"/\", // fraction slash\n};\n\nconst CHAR_REGEX = new RegExp(\n `[${Object.keys(CHAR_MAP).join(\"\")}]`,\n \"g\",\n);\n\n/**\n * Normalize Unicode artifacts to ASCII\n * equivalents and strip the given characters.\n *\n * @param value - The input string\n * @param strip - Characters to remove\n * (e.g. \" -/\" to strip spaces, dashes, slashes)\n */\nexport const clean = (\n value: string,\n strip: string = \"\",\n): string => {\n let result = value.replace(\n CHAR_REGEX,\n (ch) => CHAR_MAP[ch] ?? ch,\n );\n if (strip) {\n for (const ch of strip) {\n result = result.replaceAll(ch, \"\");\n }\n }\n return result;\n};\n"],"mappings":";;;;;;;;;AAQA,MAAM,WAAmC;CAEvC,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,QAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,KAAU;CACV,KAAU;AACZ;AAEA,MAAM,aAAa,IAAI,OACrB,IAAI,OAAO,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"clean.js","names":[],"sources":["../../src/_util/clean.ts"],"sourcesContent":["/**\n * Unicode normalization map for common OCR, PDF\n * extraction, and copy-paste artifacts.\n *\n * Maps fullwidth digits, various dashes, dots,\n * spaces, and quotes to their ASCII equivalents.\n * Ported from python-stdnum's util.py _char_map.\n */\nconst CHAR_MAP: Record<string, string> = {\n // Fullwidth digits\n \"\\uFF10\": \"0\",\n \"\\uFF11\": \"1\",\n \"\\uFF12\": \"2\",\n \"\\uFF13\": \"3\",\n \"\\uFF14\": \"4\",\n \"\\uFF15\": \"5\",\n \"\\uFF16\": \"6\",\n \"\\uFF17\": \"7\",\n \"\\uFF18\": \"8\",\n \"\\uFF19\": \"9\",\n // Dashes and hyphens\n \"\\u2010\": \"-\", // hyphen\n \"\\u2011\": \"-\", // non-breaking hyphen\n \"\\u2012\": \"-\", // figure dash\n \"\\u2013\": \"-\", // en dash\n \"\\u2014\": \"-\", // em dash\n \"\\u2015\": \"-\", // horizontal bar\n \"\\u2212\": \"-\", // minus sign\n \"\\uFE58\": \"-\", // small em dash\n \"\\uFE63\": \"-\", // small hyphen-minus\n \"\\uFF0D\": \"-\", // fullwidth hyphen-minus\n // Dots and periods\n \"\\u2024\": \".\", // one dot leader\n \"\\uFE52\": \".\", // small full stop\n \"\\uFF0E\": \".\", // fullwidth full stop\n // Spaces\n \"\\u00A0\": \" \", // non-breaking space\n \"\\u2000\": \" \", // en quad\n \"\\u2001\": \" \", // em quad\n \"\\u2002\": \" \", // en space\n \"\\u2003\": \" \", // em space\n \"\\u2004\": \" \", // three-per-em space\n \"\\u2005\": \" \", // four-per-em space\n \"\\u2006\": \" \", // six-per-em space\n \"\\u2007\": \" \", // figure space\n \"\\u2008\": \" \", // punctuation space\n \"\\u2009\": \" \", // thin space\n \"\\u200A\": \" \", // hair space\n \"\\u200B\": \"\", // zero-width space (remove)\n \"\\u202F\": \" \", // narrow no-break space\n \"\\u205F\": \" \", // medium mathematical space\n \"\\u3000\": \" \", // ideographic space\n \"\\uFEFF\": \"\", // BOM / zero-width no-break\n // Slashes\n \"\\uFF0F\": \"/\", // fullwidth solidus\n \"\\u2044\": \"/\", // fraction slash\n};\n\nconst CHAR_REGEX = new RegExp(\n `[${Object.keys(CHAR_MAP).join(\"\")}]`,\n \"g\",\n);\n\n/**\n * Normalize Unicode artifacts to ASCII\n * equivalents and strip the given characters.\n *\n * @param value - The input string\n * @param strip - Characters to remove\n * (e.g. \" -/\" to strip spaces, dashes, slashes)\n */\nexport const clean = (\n value: string,\n strip: string = \"\",\n): string => {\n let result = value.replace(\n CHAR_REGEX,\n (ch) => CHAR_MAP[ch] ?? ch,\n );\n if (strip) {\n for (const ch of strip) {\n result = result.replaceAll(ch, \"\");\n }\n }\n return result;\n};\n"],"mappings":";;;;;;;;;AAQA,MAAM,WAAmC;CAEvC,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,QAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CACV,KAAU;CAEV,KAAU;CACV,KAAU;AACZ;AAEA,MAAM,aAAa,IAAI,OACrB,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,IACnC,GACF;;;;;;;;;AAUA,MAAa,SACX,OACA,QAAgB,OACL;CACX,IAAI,SAAS,MAAM,QACjB,aACC,OAAO,SAAS,OAAO,EAC1B;CACA,IAAI,OACF,KAAK,MAAM,MAAM,OACf,SAAS,OAAO,WAAW,IAAI,EAAE;CAGrC,OAAO;AACT"}
|
package/dist/_util/date.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.js","names":[],"sources":["../../src/_util/date.ts"],"sourcesContent":["/** Validate a calendar date via Date round-trip. */\nexport const isValidDate = (\n year: number,\n month: number,\n day: number,\n): boolean => {\n const d = new Date(year, month - 1, day);\n return (\n d.getFullYear() === year &&\n d.getMonth() === month - 1 &&\n d.getDate() === day\n );\n};\n\n/**\n * Resolve a 2-digit year to a 4-digit year using a\n * rolling pivot: years after the current year are\n * assumed to be in the previous century.\n */\nexport const resolveTwoDigitYear = (yy: number): number => {\n const y = 2000 + yy;\n return y > new Date().getFullYear() ? y - 100 : y;\n};\n"],"mappings":";;AACA,MAAa,eACX,MACA,OACA,QACY;CACZ,MAAM,IAAI,IAAI,KAAK,MAAM,QAAQ,GAAG,GAAG;CACvC,OACE,EAAE,YAAY,MAAM,QACpB,EAAE,SAAS,MAAM,QAAQ,KACzB,EAAE,QAAQ,MAAM;AAEpB;;;;;;AAOA,MAAa,uBAAuB,OAAuB;CACzD,MAAM,IAAI,MAAO;CACjB,OAAO,qBAAI,IAAI,KAAK,
|
|
1
|
+
{"version":3,"file":"date.js","names":[],"sources":["../../src/_util/date.ts"],"sourcesContent":["/** Validate a calendar date via Date round-trip. */\nexport const isValidDate = (\n year: number,\n month: number,\n day: number,\n): boolean => {\n const d = new Date(year, month - 1, day);\n return (\n d.getFullYear() === year &&\n d.getMonth() === month - 1 &&\n d.getDate() === day\n );\n};\n\n/**\n * Resolve a 2-digit year to a 4-digit year using a\n * rolling pivot: years after the current year are\n * assumed to be in the previous century.\n */\nexport const resolveTwoDigitYear = (yy: number): number => {\n const y = 2000 + yy;\n return y > new Date().getFullYear() ? y - 100 : y;\n};\n"],"mappings":";;AACA,MAAa,eACX,MACA,OACA,QACY;CACZ,MAAM,IAAI,IAAI,KAAK,MAAM,QAAQ,GAAG,GAAG;CACvC,OACE,EAAE,YAAY,MAAM,QACpB,EAAE,SAAS,MAAM,QAAQ,KACzB,EAAE,QAAQ,MAAM;AAEpB;;;;;;AAOA,MAAa,uBAAuB,OAAuB;CACzD,MAAM,IAAI,MAAO;CACjB,OAAO,qBAAI,IAAI,KAAK,EAAA,CAAE,YAAY,IAAI,IAAI,MAAM;AAClD"}
|
package/dist/ad/nrt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nrt.js","names":[],"sources":["../../src/ad/nrt.ts"],"sourcesContent":["const NRT_PREFIXES = \"CDEGOPU\";\n\n/** Generate a random valid Andorra NRT. */\nconst generate = (): string => {\n const prefix = randomChar(NRT_PREFIXES);\n const digits = randomDigits(6);\n const suffix = String.fromCodePoint(\n 65 + randomInt(0, 25),\n );\n return `${prefix}${digits}${suffix}`;\n};\n\n/**\n * NRT (Número de Registre Tributari, Andorra tax number).\n *\n * The NRT identifies legal and natural entities for tax\n * purposes. It consists of one letter indicating entity\n * type, six digits, and a check letter.\n *\n * Entity type prefixes:\n * F — companies (digits <= 699999)\n * A, L — other entities (digits 700000-799999)\n * C, D, E, G, O, P, U — other types\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Andorra-TIN.pdf\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport {\n randomChar,\n randomDigits,\n randomInt,\n} from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst VALID_PREFIXES = \"ACDEFGLOPU\";\n\nconst compact = (value: string): string =>\n clean(value, \" -.\").toUpperCase().trim();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"Andorra NRT must be 8 characters\",\n );\n }\n // SAFETY: v.length === 8 guarantees both positions\n // exist; oxlint cannot see the length guard.\n // eslint-disable-next-line no-non-null-assertion\n const prefix = v[0]!;\n // eslint-disable-next-line no-non-null-assertion\n const tail = v[7]!;\n const digits = v.slice(1, 7);\n if (!/^[A-Z]$/.test(prefix) || !/^[A-Z]$/.test(tail)) {\n return err(\n \"INVALID_FORMAT\",\n \"Andorra NRT must start and end with a letter\",\n );\n }\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"Andorra NRT must have 6 digits in the middle\",\n );\n }\n if (!VALID_PREFIXES.includes(prefix)) {\n return err(\n \"INVALID_COMPONENT\",\n \"Andorra NRT has an invalid entity type prefix\",\n );\n }\n if (prefix === \"F\" && digits > \"699999\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Andorra NRT F-type digits must be <= 699999\",\n );\n }\n if (\n (prefix === \"A\" || prefix === \"L\") &&\n !(\"699999\" < digits && digits < \"800000\")\n ) {\n return err(\n \"INVALID_COMPONENT\",\n \"Andorra NRT A/L-type digits must be 700000-799999\",\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, 7)}-${v[7]}`;\n};\n\n/** Andorra NRT (Número de Registre Tributari). */\nconst nrt: CountryValidator<\"AD\"> = {\n name: \"Andorra Tax Number\",\n localName: \"Número de Registre Tributari\",\n abbreviation: \"NRT\",\n aliases: [\"NRT\", \"Número de Registre Tributari\"] as const,\n candidatePattern: \"[A-Z]-?\\\\d{6}-?[A-Z]\",\n scope: \"country\",\n country: \"AD\",\n entityType: \"any\",\n sourceUrl:\n \"https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Andorra-TIN.pdf\",\n examples: [\"U132950X\", \"D059888N\", \"F123456M\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nrt;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAAA,MAAM,eAAe;;AAGrB,MAAM,iBAAyB;CAM7B,OAAO,GALQ,WAAW,YAKX,IAJA,aAAa,CAIJ,IAHT,OAAO,cACpB,KAAK,UAAU,GAAG,EAAE,CAEW;AACnC;AA+BA,MAAM,iBAAiB;AAEvB,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"nrt.js","names":[],"sources":["../../src/ad/nrt.ts"],"sourcesContent":["const NRT_PREFIXES = \"CDEGOPU\";\n\n/** Generate a random valid Andorra NRT. */\nconst generate = (): string => {\n const prefix = randomChar(NRT_PREFIXES);\n const digits = randomDigits(6);\n const suffix = String.fromCodePoint(\n 65 + randomInt(0, 25),\n );\n return `${prefix}${digits}${suffix}`;\n};\n\n/**\n * NRT (Número de Registre Tributari, Andorra tax number).\n *\n * The NRT identifies legal and natural entities for tax\n * purposes. It consists of one letter indicating entity\n * type, six digits, and a check letter.\n *\n * Entity type prefixes:\n * F — companies (digits <= 699999)\n * A, L — other entities (digits 700000-799999)\n * C, D, E, G, O, P, U — other types\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Andorra-TIN.pdf\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport {\n randomChar,\n randomDigits,\n randomInt,\n} from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst VALID_PREFIXES = \"ACDEFGLOPU\";\n\nconst compact = (value: string): string =>\n clean(value, \" -.\").toUpperCase().trim();\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"Andorra NRT must be 8 characters\",\n );\n }\n // SAFETY: v.length === 8 guarantees both positions\n // exist; oxlint cannot see the length guard.\n // eslint-disable-next-line no-non-null-assertion\n const prefix = v[0]!;\n // eslint-disable-next-line no-non-null-assertion\n const tail = v[7]!;\n const digits = v.slice(1, 7);\n if (!/^[A-Z]$/.test(prefix) || !/^[A-Z]$/.test(tail)) {\n return err(\n \"INVALID_FORMAT\",\n \"Andorra NRT must start and end with a letter\",\n );\n }\n if (!isdigits(digits)) {\n return err(\n \"INVALID_FORMAT\",\n \"Andorra NRT must have 6 digits in the middle\",\n );\n }\n if (!VALID_PREFIXES.includes(prefix)) {\n return err(\n \"INVALID_COMPONENT\",\n \"Andorra NRT has an invalid entity type prefix\",\n );\n }\n if (prefix === \"F\" && digits > \"699999\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Andorra NRT F-type digits must be <= 699999\",\n );\n }\n if (\n (prefix === \"A\" || prefix === \"L\") &&\n !(\"699999\" < digits && digits < \"800000\")\n ) {\n return err(\n \"INVALID_COMPONENT\",\n \"Andorra NRT A/L-type digits must be 700000-799999\",\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, 7)}-${v[7]}`;\n};\n\n/** Andorra NRT (Número de Registre Tributari). */\nconst nrt: CountryValidator<\"AD\"> = {\n name: \"Andorra Tax Number\",\n localName: \"Número de Registre Tributari\",\n abbreviation: \"NRT\",\n aliases: [\"NRT\", \"Número de Registre Tributari\"] as const,\n candidatePattern: \"[A-Z]-?\\\\d{6}-?[A-Z]\",\n scope: \"country\",\n country: \"AD\",\n entityType: \"any\",\n sourceUrl:\n \"https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Andorra-TIN.pdf\",\n examples: [\"U132950X\", \"D059888N\", \"F123456M\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nrt;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAAA,MAAM,eAAe;;AAGrB,MAAM,iBAAyB;CAM7B,OAAO,GALQ,WAAW,YAKX,IAJA,aAAa,CAIJ,IAHT,OAAO,cACpB,KAAK,UAAU,GAAG,EAAE,CAEW;AACnC;AA+BA,MAAM,iBAAiB;AAEvB,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,KAAK;AAEzC,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,kCACF;CAKF,MAAM,SAAS,EAAE;CAEjB,MAAM,OAAO,EAAE;CACf,MAAM,SAAS,EAAE,MAAM,GAAG,CAAC;CAC3B,IAAI,CAAC,UAAU,KAAK,MAAM,KAAK,CAAC,UAAU,KAAK,IAAI,GACjD,OAAO,IACL,kBACA,8CACF;CAEF,IAAI,CAAC,SAAS,MAAM,GAClB,OAAO,IACL,kBACA,8CACF;CAEF,IAAI,CAAC,eAAe,SAAS,MAAM,GACjC,OAAO,IACL,qBACA,+CACF;CAEF,IAAI,WAAW,OAAO,SAAS,UAC7B,OAAO,IACL,qBACA,6CACF;CAEF,KACG,WAAW,OAAO,WAAW,QAC9B,EAAE,WAAW,UAAU,SAAS,WAEhC,OAAO,IACL,qBACA,mDACF;CAEF,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;AACvC;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,8BAA8B;CAC/C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,UAAU;EAAC;EAAY;EAAY;CAAU;CAC7C;CACA;CACA;CACA;AACF"}
|
package/dist/ae/eid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eid.js","names":[],"sources":["../../src/ae/eid.ts"],"sourcesContent":["/**\n * Emirates ID (رقم الهوية, UAE).\n *\n * 15 digits: 784-YYYY-NNNNNNN-C where 784 is the\n * ISO 3166-1 numeric code for the UAE, YYYY is the\n * year of birth, NNNNNNN is a serial number, and C\n * is a Luhn check digit.\n *\n * @see https://en.wikipedia.org/wiki/National_identification_number#United_Arab_Emirates\n * @see https://u.ae/en/information-and-services/visa-and-emirates-id/emirates-id\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n luhnChecksum,\n luhnValidate,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\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\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 15) {\n return err(\n \"INVALID_LENGTH\",\n \"Emirates ID must be 15 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Emirates ID must contain only digits\",\n );\n }\n if (!v.startsWith(\"784\")) {\n return err(\n \"INVALID_COMPONENT\",\n \"Emirates ID must start with 784\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Emirates ID Luhn check digit is invalid\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return [\n v.slice(0, 3),\n v.slice(3, 7),\n v.slice(7, 14),\n v.slice(14),\n ].join(\"-\");\n};\n\n/**\n * Generate a random valid Emirates ID in compact\n * form. NOT cryptographically secure.\n */\nconst generate = (): string => {\n const yyyy = String(randomInt(1950, 2010));\n const serial = randomDigits(7);\n const partial = `784${yyyy}${serial}0`;\n const remainder = luhnChecksum(partial);\n const check = (10 - remainder) % 10;\n return `784${yyyy}${serial}${String(check)}`;\n};\n\n/** UAE Emirates ID. */\nconst eid: CountryValidator<\"AE\"> = {\n name: \"Emirates ID\",\n localName: \"رقم الهوية\",\n abbreviation: \"EID\",\n aliases: [\"EID\", \"Emirates ID\", \"رقم الهوية\"] as const,\n candidatePattern: \"784-\\\\d{4}-\\\\d{7}-\\\\d\",\n scope: \"country\",\n country: \"AE\",\n entityType: \"person\",\n lengths: [15],\n examples: [\n \"784198012345678\",\n \"784197912345671\",\n \"784195204640486\",\n \"784196865703050\",\n ] as const,\n description:\n \"15-digit identity number issued to UAE residents\",\n sourceUrl:\n \"https://u.ae/en/information-and-services/visa-and-emirates-id/emirates-id\",\n compact,\n format,\n validate,\n generate,\n};\n\nexport default eid;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;AA0BA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,+BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,sCACF;CAEF,IAAI,CAAC,EAAE,WAAW,KAAK,GACrB,OAAO,IACL,qBACA,iCACF;CAEF,IAAI,CAAC,aAAa,CAAC,GACjB,OAAO,IACL,oBACA,yCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO;EACL,EAAE,MAAM,GAAG,CAAC;EACZ,EAAE,MAAM,GAAG,CAAC;EACZ,EAAE,MAAM,GAAG,EAAE;EACb,EAAE,MAAM,EAAE;CACZ,
|
|
1
|
+
{"version":3,"file":"eid.js","names":[],"sources":["../../src/ae/eid.ts"],"sourcesContent":["/**\n * Emirates ID (رقم الهوية, UAE).\n *\n * 15 digits: 784-YYYY-NNNNNNN-C where 784 is the\n * ISO 3166-1 numeric code for the UAE, YYYY is the\n * year of birth, NNNNNNN is a serial number, and C\n * is a Luhn check digit.\n *\n * @see https://en.wikipedia.org/wiki/National_identification_number#United_Arab_Emirates\n * @see https://u.ae/en/information-and-services/visa-and-emirates-id/emirates-id\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport {\n luhnChecksum,\n luhnValidate,\n} from \"#checksums/luhn\";\nimport { clean } from \"#util/clean\";\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\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 15) {\n return err(\n \"INVALID_LENGTH\",\n \"Emirates ID must be 15 digits\",\n );\n }\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Emirates ID must contain only digits\",\n );\n }\n if (!v.startsWith(\"784\")) {\n return err(\n \"INVALID_COMPONENT\",\n \"Emirates ID must start with 784\",\n );\n }\n if (!luhnValidate(v)) {\n return err(\n \"INVALID_CHECKSUM\",\n \"Emirates ID Luhn check digit is invalid\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => {\n const v = compact(value);\n return [\n v.slice(0, 3),\n v.slice(3, 7),\n v.slice(7, 14),\n v.slice(14),\n ].join(\"-\");\n};\n\n/**\n * Generate a random valid Emirates ID in compact\n * form. NOT cryptographically secure.\n */\nconst generate = (): string => {\n const yyyy = String(randomInt(1950, 2010));\n const serial = randomDigits(7);\n const partial = `784${yyyy}${serial}0`;\n const remainder = luhnChecksum(partial);\n const check = (10 - remainder) % 10;\n return `784${yyyy}${serial}${String(check)}`;\n};\n\n/** UAE Emirates ID. */\nconst eid: CountryValidator<\"AE\"> = {\n name: \"Emirates ID\",\n localName: \"رقم الهوية\",\n abbreviation: \"EID\",\n aliases: [\"EID\", \"Emirates ID\", \"رقم الهوية\"] as const,\n candidatePattern: \"784-\\\\d{4}-\\\\d{7}-\\\\d\",\n scope: \"country\",\n country: \"AE\",\n entityType: \"person\",\n lengths: [15],\n examples: [\n \"784198012345678\",\n \"784197912345671\",\n \"784195204640486\",\n \"784196865703050\",\n ] as const,\n description:\n \"15-digit identity number issued to UAE residents\",\n sourceUrl:\n \"https://u.ae/en/information-and-services/visa-and-emirates-id/emirates-id\",\n compact,\n format,\n validate,\n generate,\n};\n\nexport default eid;\nexport { compact, format, generate, validate };\n"],"mappings":";;;;;;AA0BA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK;AAEpB,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,+BACF;CAEF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,sCACF;CAEF,IAAI,CAAC,EAAE,WAAW,KAAK,GACrB,OAAO,IACL,qBACA,iCACF;CAEF,IAAI,CAAC,aAAa,CAAC,GACjB,OAAO,IACL,oBACA,yCACF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B;CACxC,MAAM,IAAI,QAAQ,KAAK;CACvB,OAAO;EACL,EAAE,MAAM,GAAG,CAAC;EACZ,EAAE,MAAM,GAAG,CAAC;EACZ,EAAE,MAAM,GAAG,EAAE;EACb,EAAE,MAAM,EAAE;CACZ,CAAC,CAAC,KAAK,GAAG;AACZ;;;;;AAMA,MAAM,iBAAyB;CAC7B,MAAM,OAAO,OAAO,UAAU,MAAM,IAAI,CAAC;CACzC,MAAM,SAAS,aAAa,CAAC;CAG7B,MAAM,SAAS,KADG,aAAa,MADT,OAAO,OAAO,EAER,KAAK;CACjC,OAAO,MAAM,OAAO,SAAS,OAAO,KAAK;AAC3C;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EAAC;EAAO;EAAe;CAAY;CAC5C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,UAAU;EACR;EACA;EACA;EACA;CACF;CACA,aACE;CACF,WACE;CACF;CACA;CACA;CACA;AACF"}
|
package/dist/ai/tin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tin.js","names":[],"sources":["../../src/ai/tin.ts"],"sourcesContent":["/** Generate a random valid Anguilla TIN. */\nconst generate = (): string => {\n const prefix = Math.random() < 0.5 ? \"1\" : \"2\";\n return prefix + randomDigits(9);\n};\n\n/**\n * TIN (Anguilla Tax Identification Number).\n *\n * Issued by the Inland Revenue Department (IRD) to\n * individuals and entities for tax purposes. The\n * number consists of 10 digits including a prefix\n * digit and check digit:\n * - Prefix 1: individual TIN\n * - Prefix 2: non-individual (business) TIN\n *\n * Formatted as XXXXX-XXXXX.\n *\n * Source: OECD CRS TIN information sheet.\n *\n * PERSON/ENTITY\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Anguilla-TIN.pdf\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nconst compact = (value: string): string => {\n return clean(value, \" -\").trim();\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 \"Anguilla TIN must be 10 digits\",\n );\n }\n\n if (!/^\\d{10}$/.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Anguilla TIN must contain only digits\",\n );\n }\n\n const prefix = v[0];\n\n if (prefix !== \"1\" && prefix !== \"2\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Anguilla TIN must start with 1 (individual) or 2 (business)\",\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, 5)}-${v.slice(5)}`;\n};\n\n/**\n * Anguilla Tax Identification Number.\n *\n * Examples derived from stdnum-js test suite\n * (format-only validation, no published check\n * digit algorithm).\n */\nconst tin: CountryValidator<\"AI\"> = {\n name: \"Anguilla Tax Identification Number\",\n localName: \"Tax Identification Number\",\n abbreviation: \"TIN\",\n aliases: [\"TIN\"] as const,\n candidatePattern: \"\\\\d{11}\",\n scope: \"country\",\n country: \"AI\",\n entityType: \"any\",\n lengths: [10] as const,\n examples: [\"1234567890\", \"2345678901\"] as const,\n compact,\n format,\n validate,\n description:\n \"Anguilla tax number issued by the Inland Revenue Department\",\n sourceUrl:\n \"https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Anguilla-TIN.pdf\",\n generate,\n};\n\nexport default tin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AACA,MAAM,iBAAyB;CAE7B,QADe,KAAK,OAAO,IAAI,KAAM,MAAM,OAC3B,aAAa,CAAC;AAChC;AA8BA,MAAM,WAAW,UAA0B;CACzC,OAAO,MAAM,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"tin.js","names":[],"sources":["../../src/ai/tin.ts"],"sourcesContent":["/** Generate a random valid Anguilla TIN. */\nconst generate = (): string => {\n const prefix = Math.random() < 0.5 ? \"1\" : \"2\";\n return prefix + randomDigits(9);\n};\n\n/**\n * TIN (Anguilla Tax Identification Number).\n *\n * Issued by the Inland Revenue Department (IRD) to\n * individuals and entities for tax purposes. The\n * number consists of 10 digits including a prefix\n * digit and check digit:\n * - Prefix 1: individual TIN\n * - Prefix 2: non-individual (business) TIN\n *\n * Formatted as XXXXX-XXXXX.\n *\n * Source: OECD CRS TIN information sheet.\n *\n * PERSON/ENTITY\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Anguilla-TIN.pdf\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\n\nconst compact = (value: string): string => {\n return clean(value, \" -\").trim();\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 \"Anguilla TIN must be 10 digits\",\n );\n }\n\n if (!/^\\d{10}$/.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Anguilla TIN must contain only digits\",\n );\n }\n\n const prefix = v[0];\n\n if (prefix !== \"1\" && prefix !== \"2\") {\n return err(\n \"INVALID_COMPONENT\",\n \"Anguilla TIN must start with 1 (individual) or 2 (business)\",\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, 5)}-${v.slice(5)}`;\n};\n\n/**\n * Anguilla Tax Identification Number.\n *\n * Examples derived from stdnum-js test suite\n * (format-only validation, no published check\n * digit algorithm).\n */\nconst tin: CountryValidator<\"AI\"> = {\n name: \"Anguilla Tax Identification Number\",\n localName: \"Tax Identification Number\",\n abbreviation: \"TIN\",\n aliases: [\"TIN\"] as const,\n candidatePattern: \"\\\\d{11}\",\n scope: \"country\",\n country: \"AI\",\n entityType: \"any\",\n lengths: [10] as const,\n examples: [\"1234567890\", \"2345678901\"] as const,\n compact,\n format,\n validate,\n description:\n \"Anguilla tax number issued by the Inland Revenue Department\",\n sourceUrl:\n \"https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Anguilla-TIN.pdf\",\n generate,\n};\n\nexport default tin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AACA,MAAM,iBAAyB;CAE7B,QADe,KAAK,OAAO,IAAI,KAAM,MAAM,OAC3B,aAAa,CAAC;AAChC;AA8BA,MAAM,WAAW,UAA0B;CACzC,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC,KAAK;AACjC;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,gCACF;CAGF,IAAI,CAAC,WAAW,KAAK,CAAC,GACpB,OAAO,IACL,kBACA,uCACF;CAGF,MAAM,SAAS,EAAE;CAEjB,IAAI,WAAW,OAAO,WAAW,KAC/B,OAAO,IACL,qBACA,6DACF;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,CAAC;AACtC;;;;;;;;AASA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,KAAK;CACf,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,cAAc,YAAY;CACrC;CACA;CACA;CACA,aACE;CACF,WACE;CACF;AACF"}
|
package/dist/al/nipt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nipt.js","names":[],"sources":["../../src/al/nipt.ts"],"sourcesContent":["/** Generate a random valid Albanian NIPT. */\nconst generate = (): string => {\n const first = String.fromCodePoint(65 + randomInt(0, 12)); // A-M\n const digits = randomDigits(8);\n const last = String.fromCodePoint(65 + randomInt(0, 25)); // A-Z\n return `${first}${digits}${last}`;\n};\n\n/**\n * NIPT (Numri i Identifikimit për Personin e Tatueshëm,\n * Albanian tax number).\n *\n * 10 characters: a letter (A-M) indicating the decade or\n * birth decade, 8 digits encoding year/month/day/serial,\n * and a trailing check letter. The check digit algorithm\n * is undocumented.\n *\n * @see https://www.tatime.gov.al/eng/c/4/103/business-lifecycle\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\";\n\nconst NIPT_RE = /^[A-M]\\d{8}[A-Z]$/;\n\nconst compact = (value: string): string => {\n let v = clean(value, \" \").toUpperCase().trim();\n if (v.startsWith(\"(AL)\")) {\n v = v.slice(4);\n } else if (v.startsWith(\"AL\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Albanian NIPT must be 10 characters\",\n );\n }\n if (!NIPT_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Albanian NIPT must be letter + 8 digits + letter\" +\n \" (first letter A-M)\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Albanian NIPT (tax identification number). */\nconst nipt: CountryValidator<\"AL\"> = {\n name: \"Albanian Tax Number\",\n localName:\n \"Numri i Identifikimit për Personin e Tatueshëm\",\n abbreviation: \"NIPT\",\n aliases: [\"NIPT\", \"NUIS\"] as const,\n candidatePattern: \"[A-Z]\\\\d{8}[A-Z]\",\n scope: \"country\",\n country: \"AL\",\n entityType: \"any\",\n sourceUrl: \"https://www.tatime.gov.al/\",\n examples: [\"J91402501L\", \"K22218003V\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nipt;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AACA,MAAM,iBAAyB;CAI7B,OAAO,GAHO,OAAO,cAAc,KAAK,UAAU,GAAG,EAAE,CAGzC,IAFC,aAAa,CAEL,IADV,OAAO,cAAc,KAAK,UAAU,GAAG,EAAE,CACxB;AAChC;AAuBA,MAAM,UAAU;AAEhB,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"nipt.js","names":[],"sources":["../../src/al/nipt.ts"],"sourcesContent":["/** Generate a random valid Albanian NIPT. */\nconst generate = (): string => {\n const first = String.fromCodePoint(65 + randomInt(0, 12)); // A-M\n const digits = randomDigits(8);\n const last = String.fromCodePoint(65 + randomInt(0, 25)); // A-Z\n return `${first}${digits}${last}`;\n};\n\n/**\n * NIPT (Numri i Identifikimit për Personin e Tatueshëm,\n * Albanian tax number).\n *\n * 10 characters: a letter (A-M) indicating the decade or\n * birth decade, 8 digits encoding year/month/day/serial,\n * and a trailing check letter. The check digit algorithm\n * is undocumented.\n *\n * @see https://www.tatime.gov.al/eng/c/4/103/business-lifecycle\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\";\n\nconst NIPT_RE = /^[A-M]\\d{8}[A-Z]$/;\n\nconst compact = (value: string): string => {\n let v = clean(value, \" \").toUpperCase().trim();\n if (v.startsWith(\"(AL)\")) {\n v = v.slice(4);\n } else if (v.startsWith(\"AL\")) {\n v = v.slice(2);\n }\n return v;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n if (v.length !== 10) {\n return err(\n \"INVALID_LENGTH\",\n \"Albanian NIPT must be 10 characters\",\n );\n }\n if (!NIPT_RE.test(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Albanian NIPT must be letter + 8 digits + letter\" +\n \" (first letter A-M)\",\n );\n }\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Albanian NIPT (tax identification number). */\nconst nipt: CountryValidator<\"AL\"> = {\n name: \"Albanian Tax Number\",\n localName:\n \"Numri i Identifikimit për Personin e Tatueshëm\",\n abbreviation: \"NIPT\",\n aliases: [\"NIPT\", \"NUIS\"] as const,\n candidatePattern: \"[A-Z]\\\\d{8}[A-Z]\",\n scope: \"country\",\n country: \"AL\",\n entityType: \"any\",\n sourceUrl: \"https://www.tatime.gov.al/\",\n examples: [\"J91402501L\", \"K22218003V\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default nipt;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AACA,MAAM,iBAAyB;CAI7B,OAAO,GAHO,OAAO,cAAc,KAAK,UAAU,GAAG,EAAE,CAGzC,IAFC,aAAa,CAEL,IADV,OAAO,cAAc,KAAK,UAAU,GAAG,EAAE,CACxB;AAChC;AAuBA,MAAM,UAAU;AAEhB,MAAM,WAAW,UAA0B;CACzC,IAAI,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,KAAK;CAC7C,IAAI,EAAE,WAAW,MAAM,GACrB,IAAI,EAAE,MAAM,CAAC;MACR,IAAI,EAAE,WAAW,IAAI,GAC1B,IAAI,EAAE,MAAM,CAAC;CAEf,OAAO;AACT;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CACvB,IAAI,EAAE,WAAW,IACf,OAAO,IACL,kBACA,qCACF;CAEF,IAAI,CAAC,QAAQ,KAAK,CAAC,GACjB,OAAO,IACL,kBACA,qEAEF;CAEF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,OAA+B;CACnC,MAAM;CACN,WACE;CACF,cAAc;CACd,SAAS,CAAC,QAAQ,MAAM;CACxB,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,UAAU,CAAC,cAAc,YAAY;CACrC;CACA;CACA;CACA;AACF"}
|
package/dist/am/tin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tin.js","names":[],"sources":["../../src/am/tin.ts"],"sourcesContent":["/** Generate a random valid Armenian TIN. */\nconst generate = (): string => randomDigits(8);\n\n/**\n * TIN (Tax Identification Number, ՀԾՀ).\n *\n * Armenian taxpayer identification number issued by the\n * State Revenue Committee (SRC). 8 digits; the 8th digit\n * is a check digit calculated from the first 7. The\n * checksum algorithm is not publicly documented, so only\n * format validation is performed.\n *\n * Issued to both individuals and entities.\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Armenia-TIN.pdf\n * @see https://www.src.am/en/taxpayerSearchSystemPage/112\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\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 !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"Armenian TIN must be 8 digits\",\n );\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Armenian TIN must contain only digits\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Armenian Tax Identification Number. */\nconst tin: CountryValidator<\"AM\"> = {\n name: \"Armenian Tax ID\",\n localName: \"Հարկ վճարողի հաշվառման համար\",\n abbreviation: \"TIN\",\n aliases: [\"ՀՎՀՀ\", \"TIN\"] as const,\n candidatePattern: \"\\\\d{8}\",\n scope: \"country\",\n country: \"AM\",\n entityType: \"any\",\n lengths: [8] as const,\n examples: [\"01234561\", \"10048376\"] as const,\n compact,\n format,\n validate,\n sourceUrl:\n \"https://www.oecd.org/tax/automatic-exchange/\" +\n \"crs-implementation-and-assistance/\" +\n \"tax-identification-numbers/Armenia-TIN.pdf\",\n generate,\n};\n\nexport default tin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AACA,MAAM,iBAAyB,aAAa,CAAC;AA2B7C,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"tin.js","names":[],"sources":["../../src/am/tin.ts"],"sourcesContent":["/** Generate a random valid Armenian TIN. */\nconst generate = (): string => randomDigits(8);\n\n/**\n * TIN (Tax Identification Number, ՀԾՀ).\n *\n * Armenian taxpayer identification number issued by the\n * State Revenue Committee (SRC). 8 digits; the 8th digit\n * is a check digit calculated from the first 7. The\n * checksum algorithm is not publicly documented, so only\n * format validation is performed.\n *\n * Issued to both individuals and entities.\n *\n * @see https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Armenia-TIN.pdf\n * @see https://www.src.am/en/taxpayerSearchSystemPage/112\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\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 !== 8) {\n return err(\n \"INVALID_LENGTH\",\n \"Armenian TIN must be 8 digits\",\n );\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"Armenian TIN must contain only digits\",\n );\n }\n\n return { valid: true, compact: v };\n};\n\nconst format = (value: string): string => compact(value);\n\n/** Armenian Tax Identification Number. */\nconst tin: CountryValidator<\"AM\"> = {\n name: \"Armenian Tax ID\",\n localName: \"Հարկ վճարողի հաշվառման համար\",\n abbreviation: \"TIN\",\n aliases: [\"ՀՎՀՀ\", \"TIN\"] as const,\n candidatePattern: \"\\\\d{8}\",\n scope: \"country\",\n country: \"AM\",\n entityType: \"any\",\n lengths: [8] as const,\n examples: [\"01234561\", \"10048376\"] as const,\n compact,\n format,\n validate,\n sourceUrl:\n \"https://www.oecd.org/tax/automatic-exchange/\" +\n \"crs-implementation-and-assistance/\" +\n \"tax-identification-numbers/Armenia-TIN.pdf\",\n generate,\n};\n\nexport default tin;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;;AACA,MAAM,iBAAyB,aAAa,CAAC;AA2B7C,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,CAAC,CAAC,KAAK;AAE1B,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,GACf,OAAO,IACL,kBACA,+BACF;CAGF,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,uCACF;CAGF,OAAO;EAAE,OAAO;EAAM,SAAS;CAAE;AACnC;AAEA,MAAM,UAAU,UAA0B,QAAQ,KAAK;;AAGvD,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,QAAQ,KAAK;CACvB,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS,CAAC,CAAC;CACX,UAAU,CAAC,YAAY,UAAU;CACjC;CACA;CACA;CACA,WACE;CAGF;AACF"}
|
package/dist/ar/cbu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cbu.js","names":[],"sources":["../../src/ar/cbu.ts"],"sourcesContent":["/**\n * CBU (Clave Bancaria Uniforme).\n *\n * Argentine bank account number used for electronic\n * transfers. 22 digits: 3-digit bank + 4-digit branch\n * + 1 check digit + 13-digit account + 1 check digit.\n *\n * @see https://es.wikipedia.org/wiki/Clave_bancaria_uniforme\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS_BLOCK1 = [7, 1, 3, 9, 7, 1, 3];\nconst WEIGHTS_BLOCK2 = [\n 3, 9, 7, 1, 3, 9, 7, 1, 3, 9, 7, 1, 3,\n];\n\nconst compact = (value: string): string =>\n clean(value, \" -\").trim();\n\nconst calcCheck = (\n digits: string,\n weights: readonly number[],\n): number => {\n let sum = 0;\n for (const [i, weight] of weights.entries()) {\n sum += Number(digits[i]) * weight;\n }\n return (10 - (sum % 10)) % 10;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 22) {\n return err(\"INVALID_LENGTH\", \"CBU must be 22 digits\");\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CBU must contain only digits\",\n );\n }\n\n // First block: digits 0-6, check digit at 7\n const check1 = calcCheck(v.slice(0, 7), WEIGHTS_BLOCK1);\n if (check1 !== Number(v[7])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CBU first check digit mismatch\",\n );\n }\n\n // Second block: digits 8-20, check digit at 21\n const check2 = calcCheck(v.slice(8, 21), WEIGHTS_BLOCK2);\n if (check2 !== Number(v[21])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CBU second check digit mismatch\",\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, 8)} ${v.slice(8)}`;\n};\n\n/** Generate a random valid CBU. */\nconst generate = (): string => {\n const block1 = randomDigits(7);\n const check1 = calcCheck(block1, WEIGHTS_BLOCK1);\n const block2 = randomDigits(13);\n const check2 = calcCheck(block2, WEIGHTS_BLOCK2);\n return block1 + String(check1) + block2 + String(check2);\n};\n\n/** Argentine Uniform Bank Key. */\nconst cbu: CountryValidator<\"AR\"> = {\n name: \"Argentine Bank Account Number\",\n localName: \"Clave Bancaria Uniforme\",\n abbreviation: \"CBU\",\n aliases: [\"CBU\", \"Clave Bancaria Uniforme\"] as const,\n candidatePattern: \"\\\\d{22}\",\n scope: \"country\",\n country: \"AR\",\n entityType: \"any\",\n sourceUrl:\n \"https://es.wikipedia.org/wiki/Clave_bancaria_uniforme\",\n lengths: [22] as const,\n examples: [\"2850590940090418135201\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cbu;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAoBA,MAAM,iBAAiB;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAC3C,MAAM,iBAAiB;CACrB;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AACtC;AAEA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"cbu.js","names":[],"sources":["../../src/ar/cbu.ts"],"sourcesContent":["/**\n * CBU (Clave Bancaria Uniforme).\n *\n * Argentine bank account number used for electronic\n * transfers. 22 digits: 3-digit bank + 4-digit branch\n * + 1 check digit + 13-digit account + 1 check digit.\n *\n * @see https://es.wikipedia.org/wiki/Clave_bancaria_uniforme\n */\n\nimport type {\n ValidateResult,\n CountryValidator,\n} from \"../types\";\n\nimport { clean } from \"#util/clean\";\nimport { randomDigits } from \"#util/generate\";\nimport { err } from \"#util/result\";\nimport { isdigits } from \"#util/strings\";\n\nconst WEIGHTS_BLOCK1 = [7, 1, 3, 9, 7, 1, 3];\nconst WEIGHTS_BLOCK2 = [\n 3, 9, 7, 1, 3, 9, 7, 1, 3, 9, 7, 1, 3,\n];\n\nconst compact = (value: string): string =>\n clean(value, \" -\").trim();\n\nconst calcCheck = (\n digits: string,\n weights: readonly number[],\n): number => {\n let sum = 0;\n for (const [i, weight] of weights.entries()) {\n sum += Number(digits[i]) * weight;\n }\n return (10 - (sum % 10)) % 10;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 22) {\n return err(\"INVALID_LENGTH\", \"CBU must be 22 digits\");\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CBU must contain only digits\",\n );\n }\n\n // First block: digits 0-6, check digit at 7\n const check1 = calcCheck(v.slice(0, 7), WEIGHTS_BLOCK1);\n if (check1 !== Number(v[7])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CBU first check digit mismatch\",\n );\n }\n\n // Second block: digits 8-20, check digit at 21\n const check2 = calcCheck(v.slice(8, 21), WEIGHTS_BLOCK2);\n if (check2 !== Number(v[21])) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CBU second check digit mismatch\",\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, 8)} ${v.slice(8)}`;\n};\n\n/** Generate a random valid CBU. */\nconst generate = (): string => {\n const block1 = randomDigits(7);\n const check1 = calcCheck(block1, WEIGHTS_BLOCK1);\n const block2 = randomDigits(13);\n const check2 = calcCheck(block2, WEIGHTS_BLOCK2);\n return block1 + String(check1) + block2 + String(check2);\n};\n\n/** Argentine Uniform Bank Key. */\nconst cbu: CountryValidator<\"AR\"> = {\n name: \"Argentine Bank Account Number\",\n localName: \"Clave Bancaria Uniforme\",\n abbreviation: \"CBU\",\n aliases: [\"CBU\", \"Clave Bancaria Uniforme\"] as const,\n candidatePattern: \"\\\\d{22}\",\n scope: \"country\",\n country: \"AR\",\n entityType: \"any\",\n sourceUrl:\n \"https://es.wikipedia.org/wiki/Clave_bancaria_uniforme\",\n lengths: [22] as const,\n examples: [\"2850590940090418135201\"] as const,\n compact,\n format,\n validate,\n generate,\n};\n\nexport default cbu;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AAoBA,MAAM,iBAAiB;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAC3C,MAAM,iBAAiB;CACrB;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AACtC;AAEA,MAAM,WAAW,UACf,MAAM,OAAO,IAAI,CAAC,CAAC,KAAK;AAE1B,MAAM,aACJ,QACA,YACW;CACX,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GACxC,OAAO,OAAO,OAAO,EAAE,IAAI;CAE7B,QAAQ,KAAM,MAAM,MAAO;AAC7B;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;CAKF,IADe,UAAU,EAAE,MAAM,GAAG,CAAC,GAAG,cAC/B,MAAM,OAAO,EAAE,EAAE,GACxB,OAAO,IACL,oBACA,gCACF;CAKF,IADe,UAAU,EAAE,MAAM,GAAG,EAAE,GAAG,cAChC,MAAM,OAAO,EAAE,GAAG,GACzB,OAAO,IACL,oBACA,iCACF;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,CAAC;AACtC;;AAGA,MAAM,iBAAyB;CAC7B,MAAM,SAAS,aAAa,CAAC;CAC7B,MAAM,SAAS,UAAU,QAAQ,cAAc;CAC/C,MAAM,SAAS,aAAa,EAAE;CAC9B,MAAM,SAAS,UAAU,QAAQ,cAAc;CAC/C,OAAO,SAAS,OAAO,MAAM,IAAI,SAAS,OAAO,MAAM;AACzD;;AAGA,MAAM,MAA8B;CAClC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS,CAAC,OAAO,yBAAyB;CAC1C,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WACE;CACF,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,wBAAwB;CACnC;CACA;CACA;CACA;AACF"}
|
package/dist/ar/cuit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cuit.js","names":[],"sources":["../../src/ar/cuit.ts"],"sourcesContent":["/**\n * CUIT (Clave Única de Identificación Tributaria).\n *\n * Argentine tax identification number assigned by AFIP\n * (Administración Federal de Ingresos Públicos). The\n * number consists of 11 digits: a 2-digit type code,\n * an 8-digit DNI number, and a single check digit\n * computed using a weighted modulo 11 algorithm.\n *\n * Type codes: 20/23/24/27 = person, 30/33/34 = company,\n * 50/51/55 = international.\n *\n * Format: XX-XXXXXXXX-X (11 digits).\n *\n * @see https://www.afip.gob.ar/\n * @see https://en.wikipedia.org/wiki/CUIT_(Argentina)\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\nconst VALID_TYPES = new Set([\n \"20\",\n \"23\",\n \"24\",\n \"27\",\n \"30\",\n \"33\",\n \"34\",\n \"50\",\n \"51\",\n \"55\",\n]);\n\nconst WEIGHTS = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2] as const;\n\nconst GENERATE_TYPES = [\n \"20\",\n \"23\",\n \"24\",\n \"27\",\n \"30\",\n \"33\",\n \"34\",\n] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -.\").trim();\n\n/**\n * Compute the CUIT check digit using weighted sum\n * mod 11. Weights: [5, 4, 3, 2, 7, 6, 5, 4, 3, 2].\n *\n * check = 11 - (sum % 11); if 11 -> 0, if 10 -> 9.\n */\nconst calcCheckDigit = (body: string): number => {\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n sum += Number(body[i]) * weight;\n }\n const remainder = 11 - (sum % 11);\n if (remainder === 11) return 0;\n if (remainder === 10) return 9;\n return remainder;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 11) {\n return err(\"INVALID_LENGTH\", \"CUIT must be 11 digits\");\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CUIT must contain only digits\",\n );\n }\n\n const typeCode = v.slice(0, 2);\n if (!VALID_TYPES.has(typeCode)) {\n return err(\n \"INVALID_COMPONENT\",\n \"CUIT has an invalid type code\",\n );\n }\n\n const expected = calcCheckDigit(v.slice(0, 10));\n if (Number(v[10]) !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CUIT 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, 10)}-${v.slice(10)}`;\n};\n\n/** Generate a random valid CUIT. */\nconst generate = (): string => {\n const type = randomPick(GENERATE_TYPES);\n const body = type + randomDigits(8);\n const check = calcCheckDigit(body);\n return body + String(check);\n};\n\n/**\n * Argentine CUIT (tax identification number).\n *\n * Examples sourced from python-stdnum test suite\n * (ar.cuit module).\n */\nconst cuit: CountryValidator<\"AR\"> = {\n name: \"Argentine Tax ID\",\n localName: \"Clave Única de Identificación Tributaria\",\n abbreviation: \"CUIT\",\n aliases: [\n \"CUIT\",\n \"CUIL\",\n \"Clave Única de Identificación Tributaria\",\n ] as const,\n candidatePattern: \"\\\\d{2}-?\\\\d{8}-?\\\\d\",\n scope: \"country\",\n country: \"AR\",\n entityType: \"any\",\n compact,\n format,\n validate,\n sourceUrl: \"https://www.afip.gob.ar/\",\n lengths: [11] as const,\n examples: [\"20267565393\", \"20055361682\"] as const,\n generate,\n};\n\nexport default cuit;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AA4BA,MAAM,cAAc,IAAI,IAAI;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAE7C,MAAM,iBAAiB;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"cuit.js","names":[],"sources":["../../src/ar/cuit.ts"],"sourcesContent":["/**\n * CUIT (Clave Única de Identificación Tributaria).\n *\n * Argentine tax identification number assigned by AFIP\n * (Administración Federal de Ingresos Públicos). The\n * number consists of 11 digits: a 2-digit type code,\n * an 8-digit DNI number, and a single check digit\n * computed using a weighted modulo 11 algorithm.\n *\n * Type codes: 20/23/24/27 = person, 30/33/34 = company,\n * 50/51/55 = international.\n *\n * Format: XX-XXXXXXXX-X (11 digits).\n *\n * @see https://www.afip.gob.ar/\n * @see https://en.wikipedia.org/wiki/CUIT_(Argentina)\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\nconst VALID_TYPES = new Set([\n \"20\",\n \"23\",\n \"24\",\n \"27\",\n \"30\",\n \"33\",\n \"34\",\n \"50\",\n \"51\",\n \"55\",\n]);\n\nconst WEIGHTS = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2] as const;\n\nconst GENERATE_TYPES = [\n \"20\",\n \"23\",\n \"24\",\n \"27\",\n \"30\",\n \"33\",\n \"34\",\n] as const;\n\nconst compact = (value: string): string =>\n clean(value, \" -.\").trim();\n\n/**\n * Compute the CUIT check digit using weighted sum\n * mod 11. Weights: [5, 4, 3, 2, 7, 6, 5, 4, 3, 2].\n *\n * check = 11 - (sum % 11); if 11 -> 0, if 10 -> 9.\n */\nconst calcCheckDigit = (body: string): number => {\n let sum = 0;\n for (const [i, weight] of WEIGHTS.entries()) {\n sum += Number(body[i]) * weight;\n }\n const remainder = 11 - (sum % 11);\n if (remainder === 11) return 0;\n if (remainder === 10) return 9;\n return remainder;\n};\n\nconst validate = (value: string): ValidateResult => {\n const v = compact(value);\n\n if (v.length !== 11) {\n return err(\"INVALID_LENGTH\", \"CUIT must be 11 digits\");\n }\n\n if (!isdigits(v)) {\n return err(\n \"INVALID_FORMAT\",\n \"CUIT must contain only digits\",\n );\n }\n\n const typeCode = v.slice(0, 2);\n if (!VALID_TYPES.has(typeCode)) {\n return err(\n \"INVALID_COMPONENT\",\n \"CUIT has an invalid type code\",\n );\n }\n\n const expected = calcCheckDigit(v.slice(0, 10));\n if (Number(v[10]) !== expected) {\n return err(\n \"INVALID_CHECKSUM\",\n \"CUIT 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, 10)}-${v.slice(10)}`;\n};\n\n/** Generate a random valid CUIT. */\nconst generate = (): string => {\n const type = randomPick(GENERATE_TYPES);\n const body = type + randomDigits(8);\n const check = calcCheckDigit(body);\n return body + String(check);\n};\n\n/**\n * Argentine CUIT (tax identification number).\n *\n * Examples sourced from python-stdnum test suite\n * (ar.cuit module).\n */\nconst cuit: CountryValidator<\"AR\"> = {\n name: \"Argentine Tax ID\",\n localName: \"Clave Única de Identificación Tributaria\",\n abbreviation: \"CUIT\",\n aliases: [\n \"CUIT\",\n \"CUIL\",\n \"Clave Única de Identificación Tributaria\",\n ] as const,\n candidatePattern: \"\\\\d{2}-?\\\\d{8}-?\\\\d\",\n scope: \"country\",\n country: \"AR\",\n entityType: \"any\",\n compact,\n format,\n validate,\n sourceUrl: \"https://www.afip.gob.ar/\",\n lengths: [11] as const,\n examples: [\"20267565393\", \"20055361682\"] as const,\n generate,\n};\n\nexport default cuit;\nexport { compact, format, validate, generate };\n"],"mappings":";;;;;AA4BA,MAAM,cAAc,IAAI,IAAI;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,UAAU;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC;AAE7C,MAAM,iBAAiB;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,WAAW,UACf,MAAM,OAAO,KAAK,CAAC,CAAC,KAAK;;;;;;;AAQ3B,MAAM,kBAAkB,SAAyB;CAC/C,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ,QAAQ,GACxC,OAAO,OAAO,KAAK,EAAE,IAAI;CAE3B,MAAM,YAAY,KAAM,MAAM;CAC9B,IAAI,cAAc,IAAI,OAAO;CAC7B,IAAI,cAAc,IAAI,OAAO;CAC7B,OAAO;AACT;AAEA,MAAM,YAAY,UAAkC;CAClD,MAAM,IAAI,QAAQ,KAAK;CAEvB,IAAI,EAAE,WAAW,IACf,OAAO,IAAI,kBAAkB,wBAAwB;CAGvD,IAAI,CAAC,SAAS,CAAC,GACb,OAAO,IACL,kBACA,+BACF;CAGF,MAAM,WAAW,EAAE,MAAM,GAAG,CAAC;CAC7B,IAAI,CAAC,YAAY,IAAI,QAAQ,GAC3B,OAAO,IACL,qBACA,+BACF;CAGF,MAAM,WAAW,eAAe,EAAE,MAAM,GAAG,EAAE,CAAC;CAC9C,IAAI,OAAO,EAAE,GAAG,MAAM,UACpB,OAAO,IACL,oBACA,iCACF;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,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;AACzD;;AAGA,MAAM,iBAAyB;CAE7B,MAAM,OADO,WAAW,cACR,IAAI,aAAa,CAAC;CAClC,MAAM,QAAQ,eAAe,IAAI;CACjC,OAAO,OAAO,OAAO,KAAK;AAC5B;;;;;;;AAQA,MAAM,OAA+B;CACnC,MAAM;CACN,WAAW;CACX,cAAc;CACd,SAAS;EACP;EACA;EACA;CACF;CACA,kBAAkB;CAClB,OAAO;CACP,SAAS;CACT,YAAY;CACZ;CACA;CACA;CACA,WAAW;CACX,SAAS,CAAC,EAAE;CACZ,UAAU,CAAC,eAAe,aAAa;CACvC;AACF"}
|