Black November

ATÉ 50% OFF

TÁ ACABANDO!

0 dias

0 horas

0 min

0 seg

3
respostas

Existe biblioteca para validações?

Eu usei o ChatGPT para fazer uma função chamada "verificadorDeEmail" e outra "verificadorDeNome", ele então criou do zero os códigos, mas existe uma biblioteca que faça só a validação de "email" e outra que faça só de "nome" e outra só de "CPF" e assim por diante? Ou/e tem uma biblioteca que faça isso tudo? E usando as bibliotecas eu posso personalizar as mensagens de erro? Onde achar as bibliotecas? Procurando no Google ou tem um jeito mais fácil que mostra as bibliotecas mais utilizadas e melhores?

A função de "verificadorDeEmail":

// src/utils/verificadorDeEmail.js
function verificadorDeEmail(v) {
  const erros = [];
  let email = String(v ?? '').trim();

  if (email.length === 0) {
    erros.push({
      dica: 'O e-mail não pode estar vazio nem conter apenas espaços. Ex.: ex@dominio.com',
    });
    return { ok: false, erros };
  }

  if (/\s/.test(email)) {
    erros.push({
      dica: 'O e-mail não pode conter espaços. Ex.: ex@dominio.com',
    });
    return { ok: false, erros };
  }

  const partesArroba = email.split('@');
  if (partesArroba.length !== 2) {
    erros.push({
      dica: 'Falta o separador "@": use o formato usuario@dominio. Ex.: ex@dominio.com',
    });
    return { ok: false, erros };
  }

  let [local, domain] = partesArroba;

  // 4) limites de comprimento (prática comum)
  //   - total ≤ 320, local ≤ 64, domínio ≤ 255
  if (email.length > 320) {
    erros.push({ dica: 'O e-mail é muito longo (máx. 320 caracteres).' });
    return { ok: false, erros };
  }
  if (local.length === 0 || local.length > 64) {
    erros.push({ dica: 'A parte antes de "@" deve ter entre 1 e 64 caracteres.' });
    return { ok: false, erros };
  }
  if (domain.length === 0 || domain.length > 255) {
    erros.push({ dica: 'O domínio (após "@") deve ter entre 1 e 255 caracteres.' });
    return { ok: false, erros };
  }

  // 5) regras da parte local (antes do @)
  if (local.startsWith('.') || local.endsWith('.')) {
    erros.push({ dica: 'A parte antes de "@" não pode começar nem terminar com ponto.' });
    return { ok: false, erros };
  }
  if (local.includes('..')) {
    erros.push({ dica: 'O e-mail não pode conter dois pontos consecutivos.' });
    return { ok: false, erros };
  }
  // permite + e outros símbolos comuns (RFC 5322 simplificado)
  const regexLocal = /^[A-Za-z0-9.!#$%&'*+/=?^_`{|}~-]+$/;
  if (!regexLocal.test(local)) {
    erros.push({
      dica:
        "A parte antes de '@' contém caracteres inválidos. Permitidos: letras, números e . ! # $ % & ' * + / = ? ^ _ ` { | } ~ -",
    });
    return { ok: false, erros };
  }

  // 6) regras do domínio
  if (domain.startsWith('.')) {
    erros.push({ dica: 'O domínio não pode começar com ponto.' });
    return { ok: false, erros };
  }
  if (domain.endsWith('.')) {
    erros.push({ dica: 'O domínio não pode terminar com ponto.' });
    return { ok: false, erros };
  }
  if (domain.includes('..')) {
    erros.push({ dica: 'O e-mail não pode conter dois pontos consecutivos.' });
    return { ok: false, erros };
  }
  // precisa ter pelo menos um ponto para separar TLD (ex.: exemplo.com)
  if (!domain.includes('.')) {
    erros.push({ dica: 'O domínio deve conter ao menos um ponto. Ex.: dominio.com' });
    return { ok: false, erros };
  }

  const domainLower = domain.toLowerCase();
  const labels = domainLower.split('.');

  // cada label: 1..63, apenas [A-Za-z0-9-], não inicia/termina com '-'
  const labelRegex = /^[A-Za-z0-9-]+$/;
  for (const label of labels) {
    if (label.length === 0) {
      erros.push({ dica: 'O domínio não pode ter partes vazias (ex.: "@.com" ou "@dominio..com").' });
      return { ok: false, erros };
    }
    if (label.length > 63) {
      erros.push({ dica: 'Cada parte do domínio deve ter no máximo 63 caracteres.' });
      return { ok: false, erros };
    }
    if (!labelRegex.test(label)) {
      erros.push({
        dica: 'O domínio deve conter apenas letras, números e hífen. Ex.: exemplo.com, mail.exemplo.com',
      });
      return { ok: false, erros };
    }
    if (label.startsWith('-') || label.endsWith('-')) {
      erros.push({ dica: 'Nenhuma parte do domínio pode começar ou terminar com hífen.' });
      return { ok: false, erros };
    }
  }

  // TLD: somente letras e tamanho >= 2
  const tld = labels[labels.length - 1];
  if (!/^[A-Za-z]{2,}$/.test(tld)) {
    erros.push({
      dica: 'A terminação do domínio (TLD) deve ter ao menos 2 letras. Ex.: .com, .org, .br',
    });
    return { ok: false, erros };
  }

  // 7) valor final normalizado
  // - mantém a parte local como veio
  // - normaliza o domínio para minúsculas
  const normalizado = `${local}@${domainLower}`;

  return { ok: true, valor: normalizado, erros: [] };
}

module.exports = verificadorDeEmail;

E seria melhor usar as bibliotecas ou fazer algo como isso do zero?

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
3 respostas

Oi Luidi! Como vai?

Que legal que você está explorando a validação de dados em sua aplicação! Existem várias bibliotecas que podem facilitar o processo de validação de entradas como e-mail, nome, CPF, entre outros. Usar uma biblioteca pode economizar tempo e garantir que você esteja usando práticas comuns e testadas.

Para validação de e-mails, nomes e outros tipos de dados, você pode considerar as seguintes bibliotecas:

  1. Joi: É uma biblioteca poderosa para validação de dados no Node.js. Você pode criar esquemas de validação personalizados e também personalizar as mensagens de erro. Exemplo de uso para validar um e-mail:

    const Joi = require('joi');
    
    const schema = Joi.object({
      email: Joi.string().email({ tlds: { allow: false } }).required().messages({
        'string.email': 'O e-mail deve ser válido. Ex.: ex@dominio.com',
        'any.required': 'O e-mail é obrigatório.',
      }),
    });
    
    const { error } = schema.validate({ email: 'email_invalido' });
    if (error) {
      console.log(error.details[0].message);
    }
    
  2. Validator.js: É uma biblioteca leve que fornece funções para validar e sanitizar strings. Para validar um e-mail:

    const validator = require('validator');
    
    const email = 'ex@dominio.com';
    if (!validator.isEmail(email)) {
      console.log('O e-mail fornecido é inválido.');
    }
    
  3. CPF/CNPJ validation: Para validação de CPF, você pode usar bibliotecas específicas como cpf-cnpj-validator:

    const { cpf } = require('cpf-cnpj-validator');
    
    const cpfValido = '123.456.789-09';
    if (!cpf.isValid(cpfValido)) {
      console.log('O CPF fornecido é inválido.');
    }
    

Quanto a encontrar bibliotecas, além de pesquisar no Google, você pode usar o npm (Node Package Manager) para procurar pacotes populares. No terminal, você pode usar o comando npm search <termo> para buscar pacotes relacionados ao que você precisa.

Usar bibliotecas pode ser mais vantajoso do que criar tudo do zero, especialmente se você deseja manter seu código limpo e focar mais na lógica de negócios do que em detalhes de validação. Além disso, as bibliotecas são frequentemente atualizadas para corrigir bugs e melhorar a segurança.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

É melhor usar o Joi + CPF/CNPJ validation ou/ Validator.js + CPF/CNPJ validation? Ou um outro que achei pesquisando que é o "zod", daí seria zod + CPF/CNPJ validation. Ou Valibot + CPF/CNPJ validation. Como saber a melhor opção?

Oi, Luidi!

Escolha uma combinação de validação depende do quanto você quer tipagem forte, mensagens personalizadas e flexibilidade. Resolva fazendo o seguinte: decida primeiro como você quer modelar suas validações, e só depois qual biblioteca combina com essa forma de trabalhar.

Veja as opções de forma direta:

  • Se você usa muito JavaScript puro, quer algo simples e rápido de aplicar → Validator.js + cpf-cnpj-validator.
  • Se você quer validações estruturadas, mensagens personalizáveis e esquema robustoJoi + cpf-cnpj-validator.
  • Se você pretende tipagem forte e integração com TypeScript, além de validações declarativas → Zod + cpf-cnpj-validator.
  • Se você quer algo mais moderno e minimalista, com validações rápidas e boa DX → Valibot + cpf-cnpj-validator.

Pontos importantes:

  • Todas essas libs permitem mensagens personalizadas.
  • O npm mostra as mais usadas. Faça isso no terminal para decidir com base em popularidade e manutenção:
    
    npm view joi
    npm view zod
    npm view validator
    npm view valibot
    
  • Você pode comparar downloads, últimos updates, RFCs, tamanho e velocidade no próprio site do npm.

Se você está começando e quer algo equilibrado, escolha Joi + cpf-cnpj-validator: você ganha organização, clareza e mensagens customizadas sem esforço.

Fico à disposição.