1 | import onlyNumbers from '@brazilian-utils/helper-only-numbers';
|
2 | import generateChecksum from '@brazilian-utils/helper-generate-checksum';
|
3 |
|
4 | var RESERVED_ENTRIES = ['00000000000', '11111111111', '22222222222', '33333333333', '44444444444', '55555555555', '66666666666', '77777777777', '88888888888', '99999999999'];
|
5 | var VERIFICATION_INDEXES = [9, 10];
|
6 |
|
7 | function isFormatValid(taxId) {
|
8 | return /^\d{3}\.?\d{3}\.?\d{3}-?\d{2}$/.test(taxId);
|
9 | }
|
10 |
|
11 | function isReserved(taxId) {
|
12 | return RESERVED_ENTRIES.indexOf(taxId) >= 0;
|
13 | }
|
14 |
|
15 | function isChecksumValid(taxId) {
|
16 | return VERIFICATION_INDEXES.every(function (index) {
|
17 | var mod = generateChecksum(taxId.slice(0, index).split('').reduce(function (a, b) {
|
18 | return a + b;
|
19 | }, ''), index + 1) % 11;
|
20 | return taxId[index] === String(mod < 2 ? 0 : 11 - mod);
|
21 | });
|
22 | }
|
23 |
|
24 | function isValidCpf(cpf) {
|
25 | if (!cpf) return false;
|
26 | var numericCPF = onlyNumbers(cpf);
|
27 | return isFormatValid(cpf) && !isReserved(numericCPF) && isChecksumValid(numericCPF);
|
28 | }
|
29 |
|
30 | export default isValidCpf;
|
31 |
|