FEEDBACK-327: перевести бизнес-валидацию с valibot на zod - #16
Merged
Conversation
…ot на zod Курс js_rest_api уходит от TypeBox к генерации через hey-api, а бизнес-слой идёт на zod. Эталон переезжает первым, чтобы уроки писались по работающей форме. Валидаторы больше не перечисляют поля руками, а расширяют сгенерированную схему. Так закрыт дефект, который тесты не видели: валидатор объявлял только email, а object у valibot выбрасывает неизвестные поля, поэтому POST /users отдавал 201 и сохранял fullName как null. Проверено прогоном: теперь поле доезжает до базы. Правило unique стало обычным предикатом для .refine(). Заодно починена генерация. Она не работала вовсе: typescript 7.0.2 ломает hey-api (`Cannot read properties of undefined (reading 'AnyKeyword')`), поэтому версия прибита к ^5.9.3. Генерация теперь заканчивается форматтером, иначе `make lint` падает на сгенерированных файлах после каждого прогона. Тесты 15/15, tsc и формат чисто.
mokevnin
force-pushed
the
feedback-327-zod
branch
from
August 17, 2026 22:09
df77190 to
30b7f7f
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Курс
js_rest_apiуходит от TypeBox к генерации через hey-api, а бизнес-слой идёт на zod. Эталон переезжает первым, потому что уроки пишутся по нему.Что изменилось
validators/,rules/unique.tsи обработчике ошибокapp.ts(ValiError→z.ZodError).openapi-ts.config.ts: добавлен плагинzod, поэтому валидаторы расширяют сгенерированную схему (zUserCreateDto.extend) вместо своей копии контракта.uniqueстал обычным предикатом для.refine(), то есть подключается к любой строковой схеме.Дефект, который тесты не видели
POST /usersотдавал 201 и сохранял пользователя сfullName: null. Валидатор объявлял толькоemail, аobjectу valibot выбрасывает неизвестные поля, поэтомуfullNameдо базы не доезжал. Существующие тесты проверяют только коды ответов, так что это не всплывало.Проверено прогоном до и после:
Поэтому валидаторы теперь берут схемы сгенерированными: контракт один, и потерять поле нельзя.
Генерация не работала вообще
make generate-typesпадал:typescript@7.0.2ломает hey-api (TypeError: Cannot read properties of undefined (reading 'AnyKeyword')— генератор ходит вts.SyntaxKind, которого в нативном порте нет). Версия прибита к^5.9.3; наtscэто не влияет,make check-typesпроходит.Плюс генерация заканчивается форматтером: генератор пишет в своём стиле, и без этого шага
make lintпадает на сгенерированных файлах после каждого прогона.Проверки
pnpm test15/15,pnpm exec tscбез ошибок,make lintчисто.Чего я не тронул
@put, а уроки курса учат@patch. Контракты разошлись, но это решение про то, чему учим, а не про рефакторинг.AGENTS.mdустарел: описываетapp.js,node:testи eslint, хотя репозиторий уже наapp.ts, vitest и oxlint.mainдо мержа fix(lint): убрать мёртвые директивы biome-ignore #15. Конфликта по смыслу нет: fix(lint): убрать мёртвые директивы biome-ignore #15 снимал мёртвыеbiome-ignoreиз тех же трёх файлов валидаторов, а в новых версиях их и так нет.Тикет: FEEDBACK-327
🤖 Generated with Claude Code