n8n-nodes-br-data-utils
Version:
Valida e higieniza dados brasileiros (CPF, CNPJ, telefone, CEP e mais) em workflows do n8n.
152 lines (151 loc) • 5.82 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateTelefone = validateTelefone;
exports.validateCelular = validateCelular;
exports.formatTelefone = formatTelefone;
exports.formatCelular = formatCelular;
/**
* Remove apenas os caracteres de formatação esperados para telefone (parênteses, espaços, hífen e +)
* e valida se o formato básico está correto
*/
function sanitizePhone(value) {
// Remove espaços no início e fim
const trimmed = value.trim();
// Aceita apenas números, parênteses, espaços, hífen e +
if (!/^[\d() +-]+$/.test(trimmed)) {
return { cleaned: '', isValidFormat: false };
}
// Remove apenas caracteres de formatação
const cleaned = trimmed.replace(/[() +-]/g, '');
// Verifica se restaram apenas números
if (!/^\d+$/.test(cleaned)) {
return { cleaned: '', isValidFormat: false };
}
return { cleaned, isValidFormat: true };
}
/**
* Valida um telefone fixo brasileiro
*/
function validateTelefone(telefone, options = {}) {
try {
const { cleaned: cleanPhone, isValidFormat } = sanitizePhone(telefone);
if (!isValidFormat) {
return { isValid: false, error: 'Telefone contém caracteres inválidos' };
}
// Telefone fixo: 10 dígitos (DDD + 8 dígitos) ou 13 dígitos com código do país
if (cleanPhone.length === 10) {
// Valida DDD (11-99)
const ddd = parseInt(cleanPhone.substring(0, 2));
if (ddd < 11 || ddd > 99) {
return { isValid: false, error: 'DDD inválido para telefone fixo' };
}
// Primeiro dígito do número não pode ser 0 ou 1
const firstDigit = parseInt(cleanPhone.charAt(2));
if (firstDigit < 2) {
return { isValid: false, error: 'Primeiro dígito do telefone fixo deve ser entre 2-9' };
}
}
else if (cleanPhone.length === 13 && cleanPhone.startsWith('55')) {
// Com código do país (+55)
const ddd = parseInt(cleanPhone.substring(2, 4));
if (ddd < 11 || ddd > 99) {
return { isValid: false, error: 'DDD inválido para telefone fixo' };
}
const firstDigit = parseInt(cleanPhone.charAt(4));
if (firstDigit < 2) {
return { isValid: false, error: 'Primeiro dígito do telefone fixo deve ser entre 2-9' };
}
}
else {
return { isValid: false, error: 'Telefone fixo deve ter 10 dígitos (DDD + número)' };
}
return {
isValid: true,
unmasked: cleanPhone,
masked: formatTelefone(cleanPhone),
};
}
catch (error) {
return { isValid: false, error: 'Erro ao validar telefone' };
}
}
/**
* Valida um celular brasileiro
*/
function validateCelular(celular, options = {}) {
try {
const { cleaned: cleanPhone, isValidFormat } = sanitizePhone(celular);
if (!isValidFormat) {
return { isValid: false, error: 'Celular contém caracteres inválidos' };
}
// Celular: 11 dígitos (DDD + 9 dígitos) ou 14 dígitos com código do país
if (cleanPhone.length === 11) {
// Valida DDD (11-99)
const ddd = parseInt(cleanPhone.substring(0, 2));
if (ddd < 11 || ddd > 99) {
return { isValid: false, error: 'DDD inválido para celular' };
}
// Primeiro dígito deve ser 9 (padrão celular brasileiro)
if (cleanPhone.charAt(2) !== '9') {
return { isValid: false, error: 'Celular deve começar com 9 após o DDD' };
}
}
else if (cleanPhone.length === 14 && cleanPhone.startsWith('55')) {
// Com código do país (+55)
const ddd = parseInt(cleanPhone.substring(2, 4));
if (ddd < 11 || ddd > 99) {
return { isValid: false, error: 'DDD inválido para celular' };
}
if (cleanPhone.charAt(4) !== '9') {
return { isValid: false, error: 'Celular deve começar com 9 após o DDD' };
}
}
else {
return { isValid: false, error: 'Celular deve ter 11 dígitos (DDD + 9 + número)' };
}
return {
isValid: true,
unmasked: cleanPhone,
masked: formatCelular(cleanPhone),
};
}
catch (error) {
return { isValid: false, error: 'Erro ao validar celular' };
}
}
/**
* Formata um telefone fixo no padrão (XX) XXXX-XXXX
*/
function formatTelefone(telefone) {
const { cleaned: cleanPhone, isValidFormat } = sanitizePhone(telefone);
if (!isValidFormat) {
return telefone;
}
if (cleanPhone.length === 10) {
return cleanPhone.replace(/^(\d{2})(\d{4})(\d{4})$/, '($1) $2-$3');
}
else if (cleanPhone.length === 13 && cleanPhone.startsWith('55')) {
// Com código do país
const formatted = cleanPhone.substring(2).replace(/^(\d{2})(\d{4})(\d{4})$/, '($1) $2-$3');
return `+55 ${formatted}`;
}
return telefone;
}
/**
* Formata um celular no padrão (XX) 9XXXX-XXXX
*/
function formatCelular(celular) {
const { cleaned: cleanPhone, isValidFormat } = sanitizePhone(celular);
if (!isValidFormat) {
return celular;
}
if (cleanPhone.length === 11) {
return cleanPhone.replace(/^(\d{2})(\d{5})(\d{4})$/, '($1) $2-$3');
}
else if (cleanPhone.length === 14 && cleanPhone.startsWith('55')) {
// Com código do país
const formatted = cleanPhone.substring(2).replace(/^(\d{2})(\d{5})(\d{4})$/, '($1) $2-$3');
return `+55 ${formatted}`;
}
return celular;
}