7.4 KiB
Frontend FSD Market Pages
Дата: 2026-06-20 Статус: спецификация
Контекст
Предыдущие FSD-итерации мигрировали broker-домен (frontend-fsd-broker-pilot), shared-слой
(frontend-fsd-shared-layer), entities stock/bond/portfolio (fsd-entities-migration) и app-слой с
auth (frontend-fsd-app-auth).
Рыночные страницы (StockPage, BondPage, HomePage) и их компоненты (StockDetails, BondDetails,
PriceChart, SearchBar) остались в исторической технической структуре (components/, hooks/,
плоские pages/). Это единственный крупный блок кода вне FSD-структуры, который активно
используется пользователями.
Иерархия источников
- Текущая задача пользователя: завершить FSD-миграцию рыночных страниц.
docs/inbox.md: направление на постепенную FSD-миграцию.docs/features/frontend-fsd-broker-pilot/spec.md: эталонный FSD-шаблон.
Цель
Перевести рыночные страницы (stock, bond, home) и связанные компоненты в FSD-структуру, следуя паттерну, установленному broker-пилотом — через widgets, entities и page entrypoints с совместимыми shim-файлами.
Область изменений
Фича охватывает только frontend-код рыночных страниц:
- StockPage, BondPage, HomePage — миграция из плоских
pages/вpages/stock/,pages/bond/,pages/home/с FSD-структурой; - StockDetails, BondDetails — миграция из
components/вwidgets/stock-details/,widgets/bond-details/; - PriceChart — миграция из
components/вwidgets/price-chart/; - SearchBar + useSearch — миграция в
widgets/search-bar/+ новый entityentities/search/; - таблица дивидендов — вынос из StockPage в новый виджет
widgets/dividends-table/; - shim-файлы для обратной совместимости;
- обновление роутинга и layout для импортов из новых FSD-точек входа.
Требования
1. Все компоненты следуют FSD-слоям
- entities — data-слой (API + query hooks). Новый:
entities/search/. - widgets — бизнес-композиция UI. Новые:
widgets/stock-details/,widgets/bond-details/,widgets/price-chart/,widgets/search-bar/,widgets/dividends-table/. - pages — тонкие entrypoints. Новые:
pages/stock/,pages/bond/,pages/home/.
1.1 Ownership данных остаётся у pages и entities
pages/stockиpages/bondвладеют route params и orchestration загрузки данных через существующие entity hooks (useStock,useBond,useStockCandles,useBondCandles,useStockDividends).widgets/stock-details,widgets/bond-details,widgets/price-chart,widgets/dividends-tableостаются презентационно-композиционными и получают готовые данные через props.widgets/search-barвладеет локальным UI-состоянием поиска (input, debounced query, dropdown), а query-hookuseSearchразмещается вentities/search/model/.pages/homeостаётся статическим page entrypoint без новой data-логики.
2. Границы срезов явные через public API
Каждый widget и entity имеет index.ts barrel с контролируемым экспортом.
Внешний код импортирует market pages/widgets/entities только через их public API
(@/pages/stock, @/widgets/search-bar, @/entities/search и т.д.). Deep imports во внутренние
model/, api/, ui/ директории не считаются контрактом для внешних потребителей.
3. Поведение UI не меняется
Миграция не добавляет новую функциональность и не пересматривает UX.
4. Совместимость через shim-файлы
Старые пути (components/StockDetails.tsx, hooks/useSearch.ts, pages/StockPage.tsx) становятся
re-export shim-файлами, импортирующими из новых FSD-точек входа.
5. Тесты следуют новым границам
Тесты перемещаются вместе с компонентами в соответствующие widget/page/ui-директории.
6. Общая инфраструктура остаётся в shared
HTTP-клиент и типы остаются в shared/api/. PriceChart использует lightweight-charts
непосредственно, без дополнительных абстракций.
Ограничения
- Изменения ограничены frontend-пакетом.
- Допускаются связанные обновления опубликованной frontend-документации и ADR, если они отражают новую FSD-структуру market pages.
- Не вводятся ESLint import boundaries или import guards.
- Не мигрируются portfolio и screener страницы.
- Не удаляется мёртвый код (old
pages/broker/,api/broker.ts). - Не меняется backend API, Swagger, codegen.
Acceptance Criteria
- StockDetails доступен через
widgets/stock-details. - BondDetails доступен через
widgets/bond-details. - PriceChart доступен через
widgets/price-chart. - SearchBar доступен через
widgets/search-barи использует query/public API изentities/search. - DividendsTable вынесен из StockPage в
widgets/dividends-table. - StockPage доступен через
pages/stock. - BondPage доступен через
pages/bond. - HomePage доступен через
pages/home. - Все старые пути (components/*, hooks/useSearch, pages/StockPage/BondPage/HomePage) — re-export shims, импортирующие из новых FSD-точек входа.
app/routing/AppRoutes.tsxиapp/layouts/AppLayout.tsxимпортируют из новых FSD-точек входа.pages/stockиpages/bondсохраняют orchestration загрузки market data и передают widgets готовые props без переноса route/query orchestration внутрь widgets.- Frontend lint, tests и build проходят.
- Пользовательское поведение эквивалентно.
- ADR и документация обновлены.
Не цели
- Миграция portfolio, screener и остальных доменов.
- Введение жёстких правил импортов.
- Удаление мёртвого кода (old
pages/broker/,api/broker.ts). - Переписывание стилей или визуального дизайна.
- Добавление новой функциональности.