Email валидация

Валидация email-адресов в Yup строится на цепочке методов схемы строк, где базовая проверка формата дополняется набором ограничений и пользовательских правил. Основной инструмент — string().email(), который реализует проверку соответствия значения стандартному шаблону email.

В Yup email обычно описывается через строковую схему:

import * as yup from "yup";

const schema = yup.object({
  email: yup.string().email(),
});

Метод email() проверяет структуру строки: наличие локальной части, символа @ и домена. При этом сама проверка не гарантирует существование адреса или его доставляемость, она ограничивается синтаксическим соответствием.

Обязательность поля и комбинация с required

По умолчанию строка может быть пустой или undefined, поэтому в большинстве случаев email комбинируется с required():

const schema = yup.object({
  email: yup.string().email().required(),
});

Порядок вызовов влияет на поведение сообщений об ошибках. Приоритет обычно отдается required(), так как пустое значение должно обрабатываться отдельно от некорректного формата.

Кастомные сообщения об ошибках

Каждый метод в цепочке может принимать сообщение об ошибке:

const schema = yup.object({
  email: yup
    .string()
    .email("Некорректный формат email")
    .required("Email обязателен"),
});

Такой подход позволяет разделять ошибки по типам: отсутствие значения и нарушение формата.

Тонкости проверки email в Yup

Встроенная проверка email основана на регулярном выражении. Оно охватывает большинство стандартных случаев, но не является исчерпывающим RFC-валидатором. Это важно учитывать при строгих требованиях к корпоративным системам.

Валидация не учитывает:

  • существование домена;
  • наличие MX-записей;
  • возможность доставки;
  • временные или одноразовые адреса.

Усиленная валидация через test()

Для более строгих сценариев используется метод test(), позволяющий добавлять собственную логику:

const schema = yup.object({
  email: yup
    .string()
    .email()
    .test("no-disposable", "Временные email запрещены", (value) => {
      if (!value) return true;
      return !value.endsWith("@tempmail.com");
    }),
});

test() получает значение поля и возвращает true или false, определяя валидность.

Нормализация значения перед проверкой

Часто email требует предварительной обработки: обрезки пробелов, приведения к нижнему регистру. В Yup это реализуется через transform():

const schema = yup.object({
  email: yup
    .string()
    .transform((value) => value?.trim().toLowerCase())
    .email()
    .required(),
});

Transform выполняется до валидации, что позволяет унифицировать входные данные.

Nullable и пустые значения

При работе с формами часто возникает необходимость различать null, пустую строку и отсутствие значения:

const schema = yup.object({
  email: yup.string().email().nullable(),
});

nullable() разрешает null как допустимое значение, но не заменяет required().

Условная валидация email

Yup поддерживает зависимость от других полей через when(). Это используется, например, при альтернативных способах авторизации:

const schema = yup.object({
  loginType: yup.string(),
  email: yup.string().when("loginType", {
    is: "email",
    then: (schema) => schema.email().required(),
    otherwise: (schema) => schema.notRequired(),
  }),
});

Такая конструкция позволяет динамически менять правила валидации без дублирования схем.

Сложные правила и комбинирование ограничений

Email-поле часто становится частью комплексной бизнес-логики:

const schema = yup.object({
  email: yup
    .string()
    .trim()
    .lowercase()
    .email()
    .required()
    .test("company-domain", "Разрешены только корпоративные email", (value) => {
      if (!value) return false;
      return value.endsWith("@company.com");
    }),
});

Здесь объединяются нормализация, стандартная проверка и доменная фильтрация.

Поведение при пустых строках

Особенность Yup заключается в том, что пустая строка "" не считается undefined. Поэтому без дополнительной обработки email().required() может пропускать некорректные сценарии. Часто используется трансформация:

.transform((value) => (value === "" ? undefined : value))

Это приводит поведение к более предсказуемому виду.

Интеграция с формами

Валидация email в Yup часто применяется в связке с библиотеками управления формами, где схема используется как единый источник правил. При этом Yup выполняет синхронную и асинхронную проверку, возвращая структурированный объект ошибок.

Ограничения встроенной email-валидации

Несмотря на удобство, встроенный метод email() имеет ограничения:

  • не проверяет реальное существование адреса;
  • не различает все возможные RFC-валидные варианты;
  • может пропускать редкие, но корректные форматы;
  • не учитывает почтовые политики доменов.

Для строгих систем применяется комбинация regex + DNS/SMTP проверок вне Yup.

Практика построения устойчивой схемы

В реальных проектах email-схема обычно строится по принципу слоев:

  1. Нормализация (trim, lowercase)
  2. Проверка пустого значения (required)
  3. Синтаксическая проверка (email)
  4. Бизнес-ограничения (test)
  5. Условная логика (when)

Такая структура позволяет масштабировать правила без потери читаемости и предсказуемости поведения.