6.2 KiB
6.2 KiB
Frontend Infrastructure Tooling — Implementation Plan
Architecture Decisions
ADR references
- ADR-005: Biome вместо ESLint + Prettier
- ADR-006: TanStack Router вместо react-router-dom
- ADR-007: OpenAPI codegen как единый источник типов
Non-ADR decisions
- ky как единый HTTP-клиент — выбор библиотеки, не меняющий архитектуры
- MSW browser mode — расширение существующей инфраструктуры тестов
- Zod для env validation — утилитарное улучшение
Phases
Выполнять последовательно для минимизации конфликтов.
Phase 1 — ky Migration
Низкий риск, обратно совместим
- Доработать
kyClient.ts:- Добавить нормализацию конверта (normalizeEnvelope) в afterResponse hook
- Экспортировать
kyApiиconfigureKyAuth
- Поочерёдно перевести entity API на
kyApi:- session, stock, bond, search, portfolio, broker-*
- Удалить
shared/api/client.ts - Заменить
configureAuth→configureKyAuthв точке входа - Прогнать тесты — поведение не должно измениться
Phase 2 — Biome
Средний риск — изменения в коде при авто-миграции
- Установить
@biomejs/biome npx @biomejs/biome migrate eslint --write- Создать
biome.json, донастроить:- Отключить несовместимые правила
- Настроить
files.ignore,linter.rules
- Проверить FSD-правила: @conarti/feature-sliced не портируются в Biome → оставить минимальный
.eslintrc.cjsтолько для FSD - Удалить
eslint,prettier,.eslintrc.cjs(если FSD не нужен) - Обновить
package.json:lintскрипт →biome check - Обновить CI в
.gitea/workflows/ci.yml - Обновить pre-commit hook (lint-staged → biome)
- Прогнать
biome check --write, закоммитить - Прогнать тесты
Phase 3 — Unify API Types
Низкий риск
- Убедиться, что все entity API импортируют из
types.ts(codegen) - Удалить
shared/api/responses.ts - Перенести normalizeEnvelope (ky-версию) в
shared/api/kyClient.ts - Прогнать
npm run build
Phase 4 — MSW Browser
Низкий риск, handlers готовы
- Создать
shared/lib/test/browser.ts(setupWorker) - Прокинуть в
public/mockServiceWorker.jsчерезnpx msw init public/ - Создать
shared/config/env.tsс чтениемVITE_API_MOCK - Подключить MSW browser в
main.tsxпо условию - Проверить
npm run dev VITE_API_MOCK=trueбез бэкенда
Phase 5 — Env Validation
Низкий риск
- Расширить
shared/config/env.ts— Zod-схема для всех VITE_* - Вызвать валидацию в
main.tsxдо рендера
Phase 6 — TanStack Router
Крупный, высокий риск
- Установить зависимости:
@tanstack/react-router@tanstack/router-devtools(devDependency)@tanstack/router-plugin(vite plugin)
- Настроить Vite plugin в
vite.config.ts - Создать файловую структуру роутов:
src/app/routes/ __root.tsx — AppLayout + ErrorBoundary index.tsx — HomePage stocks.$secid.tsx — StockPage bonds.$secid.tsx — BondPage screener.tsx — ScreenerPage + Zod search params login.tsx — LoginPage register.tsx — RegisterPage profile.tsx — ProfilePage (guard: beforeLoad) portfolios.tsx — PortfoliosListPage (guard) portfolios.$id.tsx — PortfolioDetailPage (guard) broker/ index.tsx — BrokerAccountsPage (guard) $accountId/ index.tsx — BrokerAccountOverviewPage (guard) shares.tsx — BrokerPositionsPage (guard) bonds.tsx — BrokerPositionsPage (guard) operations.tsx — BrokerOperationsPage + Zod search params (guard) events.tsx — BrokerEventsPage (guard) - Перенести каждый роут из
AppRoutes.tsx— каждый файл создаёт lazy route - Создать роутер в
app/routing/router.ts:createRouter()с Route TreebeforeLoadдля guard'ов- Loaders для предзагрузки (TanStack Query integration)
- Заменить
<BrowserRouter>+<Routes>→<RouterProvider>вApp.tsx - Заменить все импорты
react-router-domпо всему проекту:Link→Linkиз@tanstack/react-routeruseNavigate→useNavigateuseParams→useParamsuseSearchParams→useSearch+useNavigateuseLocation→useLocation
- Заменить
MemoryRouterв тестах наcreateMemoryRouterиз TanStack Router - Настроить router-devtools в dev-режиме
- Прогнать тесты
Dependencies
Phase 1 (ky) → независим
Phase 2 (Biome) → независим
Phase 3 (Types) → после Phase 1 (ky меняет нормализацию)
Phase 4 (MSW) → после Phase 5 (env нужен для VITE_API_MOCK)
Phase 5 (Env) → независим
Phase 6 (Router) → после Phase 3 (типы API стабильны)
Rollback Strategy
- Каждый phase — отдельный коммит, можно revert по одному
- Biome:
.eslintrc.cjsсохраняется как.eslintrc.cjs.bakдо верификации - Router: старый
AppRoutes.tsxиreact-router-domне удаляются до полного прохождения тестов - Каждый phase должен оставлять
npm run buildиnpm run testзелёными