UNPKG

cpf-cnpj-formatter

Version:

A simple formatter for CPF and CNPJ numbers

135 lines (134 loc) 4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatCPFCNPJ = void 0; /** * Validates a CPF number * @param cpf - The CPF number to validate * @returns ValidationResult object with validation status and error message if invalid */ const validateCPF = (cpf) => { const numbers = cpf.replace(/\D/g, ''); if (numbers.length !== 11) { return { isValid: false, error: 'CPF deve conter 11 dígitos' }; } // Check if all digits are the same if (/^(\d)\1+$/.test(numbers)) { return { isValid: false, error: 'CPF inválido' }; } // Validate first digit let sum = 0; for (let i = 0; i < 9; i++) { sum += parseInt(numbers.charAt(i)) * (10 - i); } let rest = 11 - (sum % 11); let digit = rest > 9 ? 0 : rest; if (digit !== parseInt(numbers.charAt(9))) { return { isValid: false, error: 'CPF inválido' }; } // Validate second digit sum = 0; for (let i = 0; i < 10; i++) { sum += parseInt(numbers.charAt(i)) * (11 - i); } rest = 11 - (sum % 11); digit = rest > 9 ? 0 : rest; if (digit !== parseInt(numbers.charAt(10))) { return { isValid: false, error: 'CPF inválido' }; } return { isValid: true }; }; /** * Validates a CNPJ number * @param cnpj - The CNPJ number to validate * @returns ValidationResult object with validation status and error message if invalid */ const validateCNPJ = (cnpj) => { const numbers = cnpj.replace(/\D/g, ''); if (numbers.length !== 14) { return { isValid: false, error: 'CNPJ deve conter 14 dígitos' }; } // Check if all digits are the same if (/^(\d)\1+$/.test(numbers)) { return { isValid: false, error: 'CNPJ inválido' }; } // Validate first digit let size = numbers.length - 2; let numbersWithoutDigits = numbers.substring(0, size); const digits = numbers.substring(size); let sum = 0; let pos = size - 7; for (let i = size; i >= 1; i--) { sum += parseInt(numbersWithoutDigits.charAt(size - i)) * pos--; if (pos < 2) pos = 9; } let result = sum % 11 < 2 ? 0 : 11 - (sum % 11); if (result !== parseInt(digits.charAt(0))) { return { isValid: false, error: 'CNPJ inválido' }; } // Validate second digit size = size + 1; numbersWithoutDigits = numbers.substring(0, size); sum = 0; pos = size - 7; for (let i = size; i >= 1; i--) { sum += parseInt(numbersWithoutDigits.charAt(size - i)) * pos--; if (pos < 2) pos = 9; } result = sum % 11 < 2 ? 0 : 11 - (sum % 11); if (result !== parseInt(digits.charAt(1))) { return { isValid: false, error: 'CNPJ inválido' }; } return { isValid: true }; }; /** * Formats and validates a CPF or CNPJ number * @param value - The value to format and validate * @returns An object containing the formatted value and validation result */ const formatCPFCNPJ = (value) => { const numbers = value.replace(/\D/g, ''); if (numbers.length <= 11) { const validation = validateCPF(numbers); const formatted = numbers .replace(/(\d{3})(\d)/, '$1.$2') .replace(/(\d{3})(\d)/, '$1.$2') .replace(/(\d{3})(\d{1,2})$/, '$1-$2'); return { formatted, validation }; } else { const validation = validateCNPJ(numbers); const formatted = numbers .replace(/(\d{2})(\d)/, '$1.$2') .replace(/(\d{3})(\d)/, '$1.$2') .replace(/(\d{3})(\d)/, '$1/$2') .replace(/(\d{4})(\d{1,2})$/, '$1-$2'); return { formatted, validation }; } }; exports.formatCPFCNPJ = formatCPFCNPJ;