Мета-информация в схемах

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

Сама по себе схема Yup описывает правила валидации: тип значения, ограничения, зависимости между полями. Однако в реальных приложениях этого недостаточно. Часто требуется сопровождать схему дополнительными данными:

  • человекочитаемыми названиями полей;
  • подсказками для интерфейса;
  • описаниями для генерации форм;
  • служебными атрибутами для логики приложения;
  • кастомными метками для UI-слоёв.

Мета-информация в Yup позволяет встроить эти данные непосредственно в схему, сохраняя единый источник правды.


label как базовый элемент семантики схемы

Одним из основных механизмов добавления семантики является метод label.

import * as Yup from 'yup';

const schema = Yup.object({
  firstName: Yup.string().label('Имя пользователя').required(),
});

Метод label не влияет на проверку, но используется в сообщениях об ошибках:

  • вместо firstName is a required field
  • формируется сообщение с использованием метки: Имя пользователя is a required field

Таким образом label становится базовой формой человекочитаемой мета-информации, привязанной к полю.


meta как произвольное расширение схемы

Более гибкий механизм — метод meta, позволяющий прикреплять произвольные данные к любому узлу схемы.

const schema = Yup.object({
  email: Yup.string()
    .email()
    .required()
    .meta({
      icon: 'mail',
      group: 'auth',
      autocomplete: 'email',
    }),
});

В отличие от label, meta не интерпретируется библиотекой в процессе валидации. Его назначение — хранение вспомогательных данных.

Типичные сценарии использования:

  • генерация форм на основе схемы;
  • отображение иконок рядом с полями;
  • группировка полей по секциям интерфейса;
  • интеграция с UI-kit системами;
  • построение административных панелей.

Мета-данные сохраняются внутри описания схемы и доступны при интроспекции.


Интроспекция схем через describe

Механизм describe позволяет получить структурированное описание схемы, включая тесты, типы и мета-информацию.

const schema = Yup.string()
  .required()
  .label('Логин')
  .meta({ field: 'username' });

const description = schema.describe();

Результат содержит:

  • тип значения;
  • список тестов (валидационных правил);
  • label;
  • meta-данные.

Формат описания используется для:

  • построения UI без ручного описания полей;
  • сериализации схем;
  • анализа структуры формы на сервере;
  • генерации документации.

Метаданные на уровне объектов и вложенных схем

Мета-информация может применяться не только к примитивам, но и к составным структурам.

const schema = Yup.object({
  profile: Yup.object({
    age: Yup.number().min(18).meta({
      visible: true,
    }),
  }).meta({
    section: 'personal',
  }),
});

Здесь формируется иерархия метаданных:

  • у объекта profile есть собственная мета-информация;
  • у поля age — собственный набор расширений.

Такая структура особенно важна при:

  • генерации многоуровневых форм;
  • построении мастеров (wizard-интерфейсов);
  • динамическом скрытии и отображении секций.

Контекст валидации как динамическая мета-информация

Помимо статических метаданных, Yup поддерживает контекст (context), который передаётся при выполнении валидации и может влиять на поведение схемы.

schema.validate(data, {
  context: {
    role: 'admin',
    mode: 'strict',
  },
});

Внутри кастомных проверок этот контекст доступен через this.options.context.

Yup.string().test('role-check', function (value) {
  const { role } = this.options.context || {};
  if (role !== 'admin') {
    return value !== 'forbidden';
  }
  return true;
});

Контекст не сохраняется в схеме, но выполняет роль временной мета-информации, влияющей на логику валидации.


Ошибки как форма обратной мета-информации

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

Yup.string()
  .min(5, 'Слишком короткое значение')
  .required('Поле обязательно для заполнения');

Каждое правило может иметь собственное сообщение, формируя семантически насыщенную обратную связь.

Дополнительно сообщения могут зависеть от label, создавая комбинированную систему:

  • техническое правило;
  • человекочитаемое имя поля;
  • пользовательское сообщение.

Системная роль мета-информации в масштабируемых схемах

При увеличении сложности схем Yup мета-слой становится критическим элементом архитектуры. Он позволяет отделить:

  • логику валидации;
  • описание данных;
  • представление интерфейса.

Схема начинает выполнять сразу несколько ролей:

  • контракт данных;
  • источник UI-структуры;
  • носитель служебных атрибутов;
  • механизм валидации.

Такое разделение особенно важно при использовании схем в:

  • микрофронтендах;
  • генеративных формах;
  • системах управления контентом;
  • API-валидации с единым контрактом на клиенте и сервере.

Ограничения и особенности использования мета-данных

Мета-информация в Yup не участвует в процессе проверки и не влияет на результат валидации. Это принципиальное архитектурное решение.

Ключевые особенности:

  • мета-данные не участвуют в сравнении значений;
  • не влияют на трансформации (transform);
  • не сериализуются автоматически в JSON;
  • требуют явного извлечения через describe.

Это делает их безопасным механизмом расширения, не нарушающим предсказуемость валидации.


Комбинирование label, meta и контекста

На практике эти механизмы используются совместно:

const schema = Yup.object({
  password: Yup.string()
    .label('Пароль')
    .required('Введите пароль')
    .min(8, 'Минимум 8 символов')
    .meta({
      strength: 'medium',
      showMeter: true,
    }),
});

Здесь формируется многослойная структура:

  • label определяет семантику;
  • сообщения задают поведение ошибок;
  • meta описывает UI-аспекты;
  • схема остаётся чистым валидатором.

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