Структура документации и как ей пользоваться

Документация Joi организована по принципу функциональных блоков, каждый из которых отражает отдельный уровень работы с системой валидации данных. Основная цель такой структуры — обеспечить быстрое сопоставление задачи с соответствующим методом или типом схемы без необходимости последовательного чтения всего материала.

В основе лежит разделение на несколько крупных разделов:

1. Описание базовых типов схем

Каждый тип данных в Joi представлен отдельным конструктором схемы:

  • string() — строки
  • number() — числа
  • boolean() — логические значения
  • object() — объекты
  • array() — массивы
  • date() — даты
  • alternatives() — альтернативные схемы

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


2. Методы модификации и валидации

Методы в Joi делятся на несколько категорий:

Ограничения значений

Используются для задания диапазонов и условий допустимых данных:

  • min(), max() — ограничения диапазона
  • length() — фиксированная длина
  • pattern() — регулярные выражения
  • greater(), less() — сравнительные ограничения

Логика обязательности

  • required() — обязательное поле
  • optional() — необязательное поле
  • forbidden() — запрещённое поле
  • default() — значение по умолчанию

Форматирование и преобразование

  • trim() — удаление пробелов
  • lowercase(), uppercase() — изменение регистра
  • replace() — замена по шаблону
  • custom() — пользовательская функция преобразования

3. Структура цепочек методов

Документация Joi делает акцент на цепочечном построении схем. Каждый метод возвращает новый экземпляр схемы, что позволяет последовательно наращивать ограничения:

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

Такой подход отражён в документации через примеры, где каждая цепочка демонстрирует эволюцию схемы от простого типа до комплексного валидатора.


4. Объектные схемы и вложенные структуры

Раздел, посвящённый object(), описывает работу с ключами и вложенностью:

  • keys() — определение структуры объекта
  • unknown() — разрешение неизвестных ключей
  • pattern() — динамические ключи
  • extract() — извлечение подструктур

Особое внимание уделяется вложенным схемам, где каждый уровень объекта валидируется независимо, но в рамках общей структуры.


5. Массивы и композиция схем

Раздел array() включает методы для работы с коллекциями:

  • items() — описание допустимых элементов
  • ordered() — строго позиционная валидация
  • min(), max() — ограничения размера
  • unique() — контроль уникальности элементов

Документация подчёркивает возможность комбинирования схем внутри массива, включая поддержку альтернативных типов элементов.


6. Альтернативные схемы

alternatives() используется для ситуаций, где данные могут соответствовать одному из нескольких вариантов:

  • try() — проверка нескольких схем последовательно
  • conditional() — выбор схемы по условию
  • when() — зависимая логика валидации

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


Система ошибок и сообщений

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

  • стандартные сообщения Joi
  • переопределение через messages()
  • контекст ошибок (тип, путь, значение)
  • кастомизация формата вывода

Каждая ошибка сопровождается структурированным объектом, что позволяет интеграцию с внешними системами логирования и API-ответами.


Опции валидации

Документация выделяет глобальные и локальные настройки:

  • abortEarly — остановка при первой ошибке
  • allowUnknown — разрешение неизвестных полей
  • stripUnknown — удаление лишних полей
  • convert — автоматическое приведение типов
  • presence — глобальная обязательность полей

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


Расширение функциональности

Joi поддерживает расширения через плагины:

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

Документация описывает структуру расширений как набор хуков, позволяющих вмешиваться в этапы валидации: построение схемы, проверка значения, формирование результата.


Структура примеров в документации

Каждый раздел сопровождается стандартизированными примерами:

  • минимальная схема
  • расширенная конфигурация
  • кейсы ошибок
  • комбинированные схемы

Примеры строятся от простого к сложному, демонстрируя рост сложности без изменения базовой логики конструкции.


Организация справочного материала

Справочная часть документации построена как набор независимых страниц по каждому методу:

  • описание назначения
  • сигнатура функции
  • допустимые параметры
  • возвращаемое значение
  • примеры использования
  • поведение при ошибках

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


Взаимосвязь разделов

Все разделы документации связаны единым принципом: любой метод рассматривается в контексте схемы, к которой он применяется. Это создаёт целостную систему, где:

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

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