<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Openapi on Kirill's homepage</title><link>https://kkucherenkov.github.io/tags/openapi/</link><description>Recent content in Openapi on Kirill's homepage</description><generator>Hugo</generator><language>ru</language><copyright>&lt;a href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank" rel="noopener"&gt;CC BY-NC 4.0&lt;/a&gt;</copyright><lastBuildDate>Sun, 27 Sep 2026 14:40:00 +0400</lastBuildDate><atom:link href="https://kkucherenkov.github.io/tags/openapi/index.xml" rel="self" type="application/rss+xml"/><item><title>Контракт, от которого код не может уйти: spec-first в монорепо NestJS + Nuxt + Flutter</title><link>https://kkucherenkov.github.io/posts/spec_first_monorepo/</link><pubDate>Sun, 27 Sep 2026 14:40:00 +0400</pubDate><guid>https://kkucherenkov.github.io/posts/spec_first_monorepo/</guid><description>&lt;p&gt;Три моих проекта стоят на одном каркасе:
&lt;a href="https://kkucherenkov.github.io/projects/course_shelf/"&gt;Course Shelf&lt;/a&gt;,
&lt;a href="https://kkucherenkov.github.io/projects/coriolis/"&gt;Coriolis Companion&lt;/a&gt; и
&lt;a href="https://kkucherenkov.github.io/projects/burkmak/"&gt;burkmak&lt;/a&gt;. В каждом бэкенд на
NestJS и два клиента: SPA на Nuxt и приложение на Flutter. Все три клиента
ходят в один API, и у этого API должно быть одно описание.&lt;/p&gt;
&lt;p&gt;Обычно описание живёт в трёх местах: в контроллере, в TypeScript-типах веба и в
Dart-моделях приложения. Держится это на дисциплине. Если переименовать поле в DTO,
бэкенд не соберётся, а оба клиента получат &lt;code&gt;undefined&lt;/code&gt; в рантайме, и при
рефакторинге такое расхождение легко пропустить.&lt;/p&gt;</description></item></channel></rss>