88 lines
4.9 KiB
Markdown
88 lines
4.9 KiB
Markdown
# Frontend Infrastructure Tooling
|
||
|
||
## Purpose
|
||
|
||
Модернизировать инструментарий и инфраструктуру фронтенда: ускорить разработку, улучшить типобезопасность, убрать дублирование, дать возможность разрабатывать UI без запущенного бэкенда.
|
||
|
||
## Requirements
|
||
|
||
### 1. MSW Browser Mode
|
||
|
||
Фронтенд должен иметь возможность запускаться без бэкенда при `VITE_API_MOCK=true`.
|
||
|
||
- Создать browser entry для MSW (apps/frontend/mocks/browser.ts с setupWorker)
|
||
- Развернуть mockServiceWorker.js в public/
|
||
- Переиспользовать существующие MSW handlers (apps/frontend/mocks/handlers.ts) — не дублировать
|
||
- При VITE_API_MOCK=true в dev-режиме все API-запросы перехватываются MSW
|
||
- При VITE_API_MOCK=false или отсутствии — поведение не меняется (запросы идут в реальный API)
|
||
|
||
### 2. Biome вместо ESLint + Prettier
|
||
|
||
Заменить ESLint 8 + Prettier на Biome как единый инструмент линтинга и форматирования.
|
||
|
||
- Удалить .eslintrc.cjs, зависимости eslint, prettier
|
||
- Установить @biomejs/biome с конфигом biome.json
|
||
- Перенести существующие правила ESLint (no-unused-vars, no-restricted-imports, FSD layer boundaries)
|
||
- Заменить npm-скрипт lint на biome check
|
||
- Обновить pre-commit hook и CI
|
||
- Если FSD-правила @conarti/feature-sliced не переносятся в Biome — оставить минимальный ESLint только для них
|
||
|
||
### 3. Унификация типов API
|
||
|
||
Убрать дублирование рукописных и сгенерированных типов.
|
||
|
||
- Удалить рукописный shared/api/responses.ts
|
||
- Перенести все entity-API файлы на типы из shared/api/types.ts (openapi-typescript)
|
||
- normalizeEnvelope перенести в kyClient.ts
|
||
- Типы пишем только через codegen, рукописные — удаляем
|
||
|
||
### 4. Полная миграция на ky
|
||
|
||
Заменить нативный fetch на ky во всех API-вызовах.
|
||
|
||
- Доработать kyClient.ts: добавить normalizeEnvelope в afterResponse hook
|
||
- Перевести все entity-API файлы с request() на kyApi
|
||
- Удалить shared/api/client.ts
|
||
- Заменить configureAuth на configureKyAuth в точке входа
|
||
|
||
### 5. TanStack Router + Lazy Loading
|
||
|
||
Мигрировать с react-router-dom на TanStack Router.
|
||
|
||
- Установить @tanstack/react-router, @tanstack/router-devtools, @tanstack/router-plugin
|
||
- Создать файловую структуру роутов (Route Tree generation)
|
||
- Все страницы lazy по умолчанию (built-in, без React.lazy)
|
||
- Search params с Zod-схемами для страниц с фильтрацией (screener, broker-operations)
|
||
- ProtectedRoute реализовать через beforeLoad guard
|
||
- AppLayout — как layout route (__root.tsx)
|
||
- Loaders для предзагрузки данных с TanStack Query в ключевых роутах
|
||
- Заменить все импорты react-router-dom на @tanstack/react-router
|
||
|
||
### 6. Валидация окружения
|
||
|
||
Создать формальную Zod-схему для VITE_* переменных с проверкой при старте.
|
||
|
||
- Определить ожидаемые VITE_* переменные с их типами
|
||
- Валидировать при старте приложения в main.tsx или App.tsx
|
||
- При отсутствии обязательных переменных — понятная ошибка в консоли/браузере
|
||
|
||
## Acceptance Criteria
|
||
|
||
| # | Acceptance Criteria | Verification |
|
||
|---|-------------------|--------------|
|
||
| 1 | `npm run dev VITE_API_MOCK=true` работает без бэкенда | Ручная проверка |
|
||
| 2 | `biome check src/` проходит без ошибок | `biome check` |
|
||
| 3 | Все тесты проходят | `npm run test` |
|
||
| 4 | `npm run build` проходит | `npm run build` |
|
||
| 5 | Нет рукописных типов API в shared/api/responses.ts | grep на импорты |
|
||
| 6 | Все API-запросы идут через ky | grep на fetch в entity API |
|
||
| 7 | Роуты лениво загружаются | DevTools Network tab |
|
||
| 8 | При невалидных VITE_* — ошибка при старте | Ручная проверка |
|
||
|
||
## Out of Scope
|
||
|
||
- Автоматизация codegen в dev/watch mode
|
||
- Storybook
|
||
- E2E-тесты (Playwright)
|
||
- Миграция с React 18 на React 19
|