6.6 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
Низкий риск
Фактический подход: ре-экспорты в index.ts вместо types.ts. В процессе реализации выяснилось, что direct-импорты из
types.tsведут к многословнымcomponents['schemas']['XxxDto']в 60+ файлах. Принято решение перенести friendly-name ре-экспорты изresponses.tsвindex.ts. Таким образомresponses.tsудалён, а единая точка входа —@/shared/api.
- Перенести friendly-name type-алиасы из
responses.tsвshared/api/index.ts - Удалить
shared/api/responses.ts - Переключить все импорты с
@/shared/api/responsesна@/shared/api - Перенести normalizeEnvelope (ky-версию) в
shared/api/kyClient.ts - Прогнать
npm run build
Phase 4 — MSW Browser
Низкий риск, handlers готовы
- Создать
apps/frontend/mocks/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
Крупный, высокий риск
Фактический подход: code-first вместо file-based. В процессе реализации выяснилось, что
@tanstack/router-pluginне генерируетrouteTree.gen.tsкорректно на данной версии Vite/плагина. Принято решение использовать code-first подход — все маршруты определяются вручную вrouteTree.tsx.
- Установить зависимости:
@tanstack/react-router@tanstack/router-devtools(devDependency)
- Создать
src/app/routing/routeTree.tsx— code-first дерево маршрутов:- Все маршруты определены в одном файле через
createRootRoute,createRoute,createRouter beforeLoadдля guard'ов (requireAuth)- Loaders для предзагрузки отложены
- Все маршруты определены в одном файле через
- Создать
src/app/routing/router.ts:createRouter()с Route Tree изrouteTree.tsx
- Заменить
<BrowserRouter>+<Routes>→<RouterProvider>вApp.tsx - Заменить все импорты
react-router-domпо всему проекту:Link→Linkиз@tanstack/react-routeruseNavigate→useNavigate({ to: '...' })(объектный синтаксис)useParams→useParamsuseSearchParams→useSearchParamsCompat(временная обёртка, т.к. TanStack Router не экспортирует useSearchParams)useLocation→useLocation
- Заменить
MemoryRouterв тестах наcreateMemoryHistory+RouterProvider - Обновить
test-utils.tsx— рендер-обёртка на 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зелёными