cnj-validate
Version:
Biblioteca TypeScript para validação e análise de números de processos em conformidade com o CNJ (Conselho Nacional de Justiça) do Brasil
129 lines • 4.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateCNJ = validateCNJ;
exports.validateCNJFormat = validateCNJFormat;
exports.calculateVerifyingDigit = calculateVerifyingDigit;
exports.isValidCNJ = isValidCNJ;
exports.normalizeCNJ = normalizeCNJ;
exports.formatCNJ = formatCNJ;
exports.detectCNJFormat = detectCNJFormat;
const errors_1 = require("../types/errors");
const decomposer_1 = require("./decomposer");
/**
* Constantes para cálculo do dígito verificador
*/
const MOD = 97n;
const SUB = 98n;
/**
* Valida um número CNJ completo
* @param cnj Número CNJ no formato NNNNNNN-DD.AAAA.J.CT.0000 ou NNNNNNNDDAAAAJCT0000
* @returns Resultado da validação
*/
function validateCNJ(cnj) {
try {
const decomposed = (0, decomposer_1.decomposeCNJ)(cnj);
const expectedDigit = calculateVerifyingDigit(decomposed.argNumber);
const isValid = decomposed.verifyingDigit === expectedDigit;
return {
isValid,
expectedDigit,
receivedDigit: decomposed.verifyingDigit,
error: isValid
? undefined
: `Dígito verificador inválido. Esperado: ${expectedDigit}, Recebido: ${decomposed.verifyingDigit}`,
};
}
catch (error) {
return {
isValid: false,
error: error instanceof Error
? error.message
: 'Erro desconhecido na validação',
};
}
}
/**
* Valida apenas se o formato do CNJ está correto (sem verificar dígito)
* @param cnj Número CNJ a ser validado
* @returns true se o formato está correto
*/
function validateCNJFormat(cnj) {
try {
(0, decomposer_1.decomposeCNJ)(cnj);
return true;
}
catch {
return false;
}
}
/**
* Calcula o dígito verificador para um número CNJ
* @param argNumber Número de argumento (NNNNNNNAAAAJCT0000 + "00")
* @returns Dígito verificador de 2 dígitos
*/
function calculateVerifyingDigit(argNumber) {
try {
const number = BigInt(argNumber);
const remainder = number % MOD;
const digit = SUB - remainder;
return digit.toString().padStart(2, '0');
}
catch {
throw new errors_1.CNJValidationError('CALCULATION_ERROR', 'Erro no cálculo do dígito verificador', 'CALC_ERROR', { argNumber });
}
}
/**
* Verifica se um CNJ é válido de forma mais rápida (apenas booleano)
* @param cnj Número CNJ a ser validado
* @returns true se válido, false se inválido
*/
function isValidCNJ(cnj) {
return validateCNJ(cnj).isValid;
}
/**
* Normaliza um número CNJ removendo caracteres não numéricos
* @param cnj CNJ a ser normalizado
* @returns CNJ apenas com números
*/
function normalizeCNJ(cnj) {
return cnj.replace(/\D/g, '');
}
/**
* Formata um número CNJ não formatado
* @param cnj CNJ com 20 dígitos
* @returns CNJ formatado (NNNNNNN-DD.AAAA.J.CT.0000)
*/
function formatCNJ(cnj) {
const normalized = normalizeCNJ(cnj);
if (normalized.length !== 20) {
throw errors_1.CNJValidationError.invalidLength(cnj, 20);
}
const lawsuit = normalized.substring(0, 7);
const digit = normalized.substring(7, 9);
const year = normalized.substring(9, 13);
const segment = normalized.substring(13, 14);
const court = normalized.substring(14, 16);
const unit = normalized.substring(16, 20);
return `${lawsuit}-${digit}.${year}.${segment}.${court}.${unit}`;
}
/**
* Detecta o formato de um CNJ
* @param cnj CNJ a ser analisado
* @returns 'formatted', 'unformatted' ou 'invalid'
*/
function detectCNJFormat(cnj) {
const normalized = normalizeCNJ(cnj);
if (normalized.length !== 20) {
return 'invalid';
}
// Verifica se tem formatação (hífen e pontos)
if (cnj.includes('-') && cnj.includes('.')) {
return 'formatted';
}
// Se tem apenas números, é não formatado
if (/^\d{20}$/.test(cnj)) {
return 'unformatted';
}
return 'invalid';
}
//# sourceMappingURL=validator.js.map