5.0 KiB
Frontend FSD Shared Layer
Дата: 2026-06-20 Статус: спецификация
Контекст
Broker FSD pilot завершён: broker-домен работает в FSD-слоях entities/widgets/pages. Следующий шаг
миграции — нормализация shared-инфраструктуры. Сейчас общий код размазан по техническим каталогам
(api/, components/, context/, hooks/), и FSD-сущности вынуждены импортировать из них через
длинные относительные пути (../../../api/client). Это мешает введению import boundaries и
усложняет дальнейшую миграцию доменов.
Цель
Создать FSD-слой shared/ с явным public API, в который переносится truly shared
инфраструктурный код: базовый HTTP-клиент, типы ответов API, переиспользуемые UI-примитивы без
доменной логики.
Область изменений
Входит
- Перенос
api/client.ts,api/responses.ts,api/types.tsвshared/api/ - Перенос компонентов без доменных зависимостей (
SkeletonBlock,TableSkeleton) вshared/ui/ - Превращение исходных файлов в re-export shims (стратегия coexistence, как в broker pilot)
- Переключение импортов в FSD-сущностях и legacy hooks на
@/shared/api/...
Не входит
- Layout и ProtectedRoute — остаются в
components/(зависят от доменного кода SearchBar, useAuth) - SearchBar, StockDetails, BondDetails, PriceChart — доменные компоненты, остаются на месте
- AuthContext — остаётся в
context/(будет перенесён при миграции auth-домена или app-слоя) - Все доменные API-функции (
getShare,getBond,searchSecuritiesи т.д.) — остаются вapi/client.tsкак есть, будут вынесены при миграции соответствующих доменов - Все доменные типы (
ShareResponse,Portfolio,ScreenerItemи т.д.) — остаются вapi/responses.tsкак есть - Import guards, ESLint boundaries — отложены до стабилизации слоёв
Требования
1. shared/api/ содержит базовую HTTP-инфраструктуру
shared/api/client.ts включает:
- Базовый HTTP-клиент (
request,setAccessToken,getAccessToken,setOnUnauthorized) - Все доменные API-функции (как временная мера до миграции доменов)
shared/api/responses.ts включает все типы ответов API (как временная мера).
shared/api/types.ts — generated OpenAPI types.
2. shared/ui/ содержит только truly generic UI-компоненты
В shared/ui/ попадают только компоненты без импортов доменного кода:
SkeletonBlock— примитивный скелетон (нет зависимостей)TableSkeleton— табличный скелетон (зависит только от SkeletonBlock)
Layout и ProtectedRoute остаются в legacy components/, так как импортируют SearchBar и useAuth.
3. Coexistence через shims
Исходные файлы в api/ и components/ превращаются в re-export shims.
4. FSD-сущности импортируют через @/shared/
Импорты в entities/widgets/pages меняются с относительных на @/shared/api/....
Acceptance Criteria
src/shared/api/client.ts,responses.ts,types.tsсуществуют и экспортируют всё, что экспортировали исходные файлыsrc/shared/ui/SkeletonBlock.tsxиsrc/shared/ui/TableSkeleton.tsxсуществуют- Исходные файлы
api/client.ts,api/responses.ts,api/types.tsстали re-export shims - Исходные файлы
components/SkeletonBlock.tsx,components/TableSkeleton.tsxстали re-export shims - Все FSD entity импорты
../../../api/...заменены на@/shared/api/... - Все legacy hooks используют
@/shared/api/...вместо../api/... npm test -w apps/frontend— PASSnpm run lint -w apps/frontend— PASSnpm run build -w apps/frontend— PASS
Ограничения
- Никаких изменений поведения UI
- Не меняется структура ответов API
- Layout, ProtectedRoute, AuthContext остаются на месте
- Не затрагиваются backend, docs, CI