0
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