Código do github está incorreto, apesar de não interferir na funcionalidade das regex que estamos testando é sempre bom ter tudo correto e funcionando como deveria. Comentei na função calculaDigitoVerificador o que está errado. Código no github:
//Função que calcula o Dígito verificador do CPF
function calculaDigitoVerificador(cpf, multiplicadorInicial) {
let soma = 0;
let multiplicador = multiplicadorInicial;
for (let tamanho = 0; tamanho < 9 + multiplicadorInicial; tamanho++) { // Nessa linha a condição da iteração do for está errada
soma += cpf[tamanho] * multiplicador;
multiplicador--;
}
let resto = soma % 11;
if (resto < 2) {
return cpf[9 + multiplicadorInicial] === 0; // Comparação estrita de string e número além de out of bounds.
} else {
return cpf[9 + multiplicadorInicial] === 11 - resto; // Comparação estrita de string e número além de out of bounds.
}
}
// Função principal para validar o CPF
export default function ehUmCPF(campo) {
const cpfSemPontuacao = removePontuacao(campo);
if (todosDigitosIguais(cpfSemPontuacao) || calculaDigitoVerificador(cpfSemPontuacao, 10) || calculaDigitoVerificador(cpfSemPontuacao, 11) || cpfSemPontuacao.match(/[A-Za-zÀ-ÿ]+/)) { //inserir caracteres especiais como desafio
console.log("Dígitos iguais:",todosDigitosIguais(cpfSemPontuacao));
console.log("CPF sem pontuação:", cpfSemPontuacao);
campo.setCustomValidity('Esse CPF não é válido');
}
}
- Sugestão para correção função calculaDigitoVerificador ao receber os parametros 10 ou 11, iterar até multiplicadorInicial - 1;
- Se for realizar comparação estrita usar parseInt() e comparar o índice correto;
for (let tamanho = 0; tamanho < multiplicadorInicial - 1; tamanho++) {
if (resto < 2) {
return parseInt(cpf[multiplicadorInicial - 1]) === 0;
} else {
return parseInt(cpf[multiplicadorInicial - 1]) === 11 - resto;
}
Na função ehUmCpf()
- Mudar a condição para verificar se o retorno de um dos dígitos verificadores do CPF for inválido
!calculaDigitoVerificador(cpfSemPontuacao, 10) ||
!calculaDigitoVerificador(cpfSemPontuacao, 11)