Устройство монорепо
Один репозиторий, npm workspaces, apps/* и packages/*. Разделение простое: в packages
лежит то, что не знает, где оно работает, в apps — то, что знает.
Что в каком каталоге
| Каталог | Что это | Зачем именно так |
|---|---|---|
apps/kiosk | приложение на планшете (Expo / React Native) | единственный, кто держит последовательный порт и говорит с платой замков. 🟡 пишется |
apps/api | сервер (NestJS + SQLite) | коды, аренды, журнал, команды устройствам. 🟡 пишется |
apps/panel | веб-панель оператора (Next.js) | ✅ карта ячеек, аренды и коды, журнал, тревоги, привязка каналов, объезд |
apps/docs | эта документация (Docusaurus) | собирается в статику, раздаётся nginx с собственного имени docs.… |
packages/lock-protocol | ⭐ разговор с платой замков | вся эмпирика живого железа; читать первым |
packages/lock-sim | эмулятор платы | плата отключена, разработка и дёт на нём |
packages/domain | бизнес-логика без привязки к платформе | одни и те же правила на устройстве и на сервере |
packages/contracts | zod-схемы обмена устройства, панели и сервера | единственное описание формата: типы выводятся из схем, а не пишутся рядом руками |
packages/i18n | LV (по умолчанию), RU, EN, LT, ET | пропущенный перевод — ошибка сборки, а не пустая кнопка на уличном экране |
packages/design-tokens | токены дизайн-системы Elvaro | источник один (CSS), остальное генерируется, расхождение ловит тест |
infra | развёртывание на двух машинах Oracle | четыре имени, TLS, выкладка. Состояние — в infra/README.md |
Прошивка, образы и золотой бэкап железа лежат отдельно и в монорепо не переезжают: там несколько гигабайт двоичных файлов.