Metaschema — описание типов и контрактов
Декларативная библиотека описания типов, валидации и контрактов. Один формат схемы для БД, API, доменной модели.
Идея
В обычном стеке: одно для валидации (Joi/Zod), другое для БД (ORM-схемы), третье для API (OpenAPI/JSON Schema). автор: «Это была самая запутанная библиотека из всех». В Metaschema всё это один формат.
Минимальная схема
({
fields: {
id: 'string',
name: { type: 'string', length: { min: 1, max: 200 } },
email: 'string',
age: { type: 'number', min: 0, max: 120 },
},
})
Используется для:
- Валидации API-параметров (Metacom вход/выход).
- Описания таблиц БД (metasql).
- Проверки доменных объектов.
Кастомные типы в приложении
«Кастомные типы, возможность писать не внутри библиотеки метасхемы, а в самих приложениях. И метасхемы тоже, и декларативно кучу всего описывать.»
// applications/myapp/types/email.js — кастомный тип
module.exports = {
kind: 'string',
pattern: /^[^@]+@[^@]+$/,
// shorthand: ': "email"' → автоматически разворачивается
};
Используется как { email: 'email' } в любой схеме.
Schema vs Type
- Type — возвращает instance (валидатор) одного значения.
- Schema — возвращает объект
definitions(поля + структура). - Раньше было перепутано, после рефакторинга 2.0 разделено.
Красивые ошибки
При невалидном значении ошибка пишется человеко-читаемо: где, что, какой тип ожидался, какой пришёл.
Применение в стеке
| Слой | Что валидируется через metaschema |
|---|---|
| Metacom вход | аргументы RPC-вызова |
| Metacom выход | результат RPC-вызова |
| Metasql | типы полей таблиц БД, миграции |
| Domain | контракты доменных сущностей |
Один формат — единая истина по типам через весь стек.
Сравнение с другими
| Joi/Zod | OpenAPI | Metaschema | |
|---|---|---|---|
| Валидация runtime | да | нет (статика) | да |
| БД-схема | нет | нет | да |
| Кастомные типы | да | extends | да, в приложении |
| Контракты RPC | косвенно | да | да, прямо |
Мультитенантность
«Одна мультитенантность есть в том плане, что одна схема и один application, просто им пользуются разные пользователи. Складская система, добавили tenant_id, и две компании пользуются одной базой.»
🎓 Источники
- 🎓 Metarhia metaschema — рефакторинг библиотеки описания типов · 2022-05-20
- 🎓 Metarhia рефакторинг Metaschema 2.0 · 2022-05-11
- 🎓 Летняя школа 2022 #11 — metaschema, ревью PR · 2022-08-04
- 🎓 Летняя школа 2022 #5 — схемы, контракты и типы · 2022-07-21