Frontend:
- apps/web (Vite+TS, TanStack Router/Query, shadcn/ui @cfdm/ui base-nova)
- 10 страниц в routes/_auth/, Recharts через shadcn Chart, lucide-react
- формы на RHF + Zod (FormSheet/FormField)
- удалены Tabler, Chart.js, react-router-dom
Backend (параллельный трек):
- apps/api (Fastify 5 + Drizzle + better-sqlite3)
- packages/db: Drizzle-схема и repositories по сущностям
- packages/shared: Zod-контракты
- роуты с валидацией и единым форматом ошибок { error: { code, message } }
- sync/backup — заглушки 501 (billmanager-адаптеры переносятся отдельно)
- legacy Express оставлен как runtime по умолчанию (RUNTIME=express)
Infra:
- Dockerfile multi-stage под pnpm workspaces
- .dockerignore и docker-compose обновлены под monorepo
Rules:
- удалены нерелевантные правила (rust, cloudflare, server/frontend-conventions)
- project-structure.mdc и AGENTS.md переписаны под monorepo
- frontend-shadcn.mdc, shadcn-ui-production.mdc, sqlite.mdc обновлены
Co-authored-by: Cursor <cursoragent@cursor.com>
27 lines
664 B
Plaintext
27 lines
664 B
Plaintext
---
|
|
description: Backend Vitest + Fastify inject
|
|
globs: apps/api/**/*,packages/db/**/*,packages/shared/**/*
|
|
alwaysApply: false
|
|
---
|
|
|
|
# Backend Testing
|
|
|
|
Vitest + `app.inject()` (встроено в Fastify).
|
|
|
|
## Требования
|
|
|
|
- Каждый route plugin → минимум 1 integration test
|
|
- Sync/DNS → parity fixtures
|
|
- `:memory:` SQLite для unit; file DB для integration
|
|
- `beforeEach` — fresh schema migrate
|
|
|
|
## Паттерн
|
|
|
|
```ts
|
|
const app = await buildApp({ db: testDb })
|
|
const res = await app.inject({ method: 'GET', url: '/health' })
|
|
expect(res.statusCode).toBe(200)
|
|
```
|
|
|
|
См. [`vitest-best-practices.mdc`](vitest-best-practices.mdc).
|