@thalonbr/docbr
Version:
Uma biblioteca leve e moderna para **validação de documentos brasileiros** (CPF e CNPJ), com suporte total a **CNPJ alfanumérico**, conforme especificações da Receita Federal para 2026.
38 lines (37 loc) • 1.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isValidCNPJ = isValidCNPJ;
const string_utils_1 = require("../utils/string.utils");
function calculateCNPJDigit(cnpjBase) {
if (cnpjBase.length !== 12)
return null;
const pesosDV1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
const pesosDV2 = [6, ...pesosDV1];
const numbersArray = cnpjBase.split('').map(string_utils_1.parseCharacterToNumber);
const firstSum = numbersArray.reduce((acc, num, i) => acc + num * pesosDV1[i], 0);
const firstCheckedDigit = firstSum % 11 < 2 ? 0 : 11 - (firstSum % 11);
const numbersWithFirstCheckedDigit = [...numbersArray, firstCheckedDigit];
const secondSum = numbersWithFirstCheckedDigit.reduce((acc, num, i) => acc + num * pesosDV2[i], 0);
const secondCheckedDigit = secondSum % 11 < 2 ? 0 : 11 - (secondSum % 11);
return `${firstCheckedDigit}${secondCheckedDigit}`;
}
/**
* Valida se um CNPJ (com dígitos ou sem) é válido.
* @param cnpj - string contendo cnpj numérico ou alfanumérico
* @returns boolean indicando validade do CNPJ
*/
function isValidCNPJ(cnpj) {
let parsedCNPJ = '';
if (!cnpj)
throw new Error('Forneça um CNPJ');
parsedCNPJ = cnpj.replace(/[.\-\/]/g, '');
if (parsedCNPJ.length !== 14) {
parsedCNPJ = (0, string_utils_1.fillStringWithZero)(parsedCNPJ, 14);
}
const cnpjBase = parsedCNPJ.slice(0, 12);
const checkedDigitExpected = parsedCNPJ.slice(12);
const calculatedDigit = calculateCNPJDigit(cnpjBase);
if (calculatedDigit === null)
throw new Error('Não foi possivel calcular o digito verificador!');
return checkedDigitExpected === calculatedDigit;
}