Библиотека Yup появилась как ответ на потребность в удобной, декларативной и расширяемой валидации данных в JavaScript-приложениях, особенно в связке с формами. Её концепция строится вокруг схем описания структуры данных, где каждое значение проходит проверку согласно заранее определённым правилам. В отличие от императивных подходов, Yup предлагает модель, в которой валидация выражается через композицию цепочек методов и схем, что делает код более предсказуемым и читаемым.
Yup был создан Джейсоном Куэнсом (Jason Quense) в рамках работы над инструментами Formidable Labs. Первоначальная идея заключалась в том, чтобы упростить валидацию форм в React-приложениях, где традиционные решения быстро становились громоздкими при росте количества полей и бизнес-логики.
До появления Yup разработчики чаще всего использовали ручные проверки или библиотеки наподобие Joi, ориентированные на серверную среду Node.js. Однако такие решения не всегда органично вписывались в фронтенд-экосистему. Требовалась библиотека, которая:
Эти требования легли в основу архитектуры Yup.
Первые версии Yup были во многом вдохновлены Joi, но с упрощённым API и адаптацией под клиентскую среду. Основной акцент был сделан на цепочечное описание правил:
import * as Yup from 'yup';
const schema = Yup.object({
email: Yup.string().email().required(),
age: Yup.number().min(18),
});
С самого начала библиотека опиралась на идею схем типов: строка,
число, массив, объект и смешанный тип (mixed) стали
базовыми строительными блоками. Это позволило унифицировать подход к
валидации любых структур данных.
Архитектурно Yup строился как набор иммутабельных схем. Каждое добавление правила возвращает новую схему, не мутируя исходную. Такой подход упростил предсказуемость и сделал возможным композицию схем.
Значительный рост популярности Yup произошёл благодаря интеграции с библиотекой управления формами Formik. Связка Formik + Yup стала стандартом де-факто для многих React-приложений.
Formik предоставлял управление состоянием формы, а Yup — декларативную валидацию. Это разделение ответственности оказалось удобным:
Появилась возможность описывать всю валидацию формы как единую схему, передаваемую в Formik:
const validationSchema = Yup.object({
username: Yup.string().min(3).required(),
password: Yup.string().min(8).required(),
});
Такой подход значительно сократил количество шаблонного кода и упростил поддержку сложных форм.
Со временем Yup расширился за счёт добавления новых механизмов валидации и улучшения композиции схем. Появились такие возможности, как:
when;test;array().of();transform.Пример условной логики:
const schema = Yup.object({
isCompany: Yup.boolean(),
companyName: Yup.string().when('isCompany', {
is: true,
then: (schema) => schema.required(),
otherwise: (schema) => schema.notRequired(),
}),
});
Особое значение приобрела возможность расширять библиотеку пользовательскими проверками. Это позволило адаптировать Yup под сложные бизнес-правила, не выходя за рамки декларативного стиля.
С ростом популярности TypeScript возникла необходимость строгой типизации схем. Yup постепенно получил поддержку типовых выводов, что позволило автоматически извлекать тип данных из схемы.
Например:
const userSchema = Yup.object({
name: Yup.string().required(),
age: Yup.number().required(),
});
type User = Yup.InferType<typeof userSchema>;
Это стало важным шагом в сторону уменьшения дублирования типов и схем в кодовой базе. Однако типизация Yup долгое время оставалась менее строгой по сравнению с альтернативами нового поколения, что стимулировало развитие конкурирующих решений.
Yup оказал заметное влияние на подход к клиентской валидации в JavaScript. Он закрепил несколько ключевых идей:
Эти принципы позже были развиты в других библиотеках валидации, ориентированных на строгую типизацию и производительность.
Со временем экосистема JavaScript начала смещаться в сторону более строгих и производительных решений, таких как Zod и Valibot, однако Yup продолжает широко использоваться в существующих проектах благодаря стабильности API и огромной базе кода.
Библиотека поддерживает обратную совместимость, что делает её особенно востребованной в долгоживущих приложениях. Основное развитие сосредоточено на:
Yup остаётся примером библиотеки, которая сформировала стандарт подхода к декларативной валидации данных в фронтенд-разработке и закрепила схему как центральный элемент работы с формами и пользовательским вводом.