Убирает дублирование состояния, навигации, моделей и оформления frontend; усиливает проверки типов без новых зависимостей. Страницы собирают узкие блоки представления, сущности владеют DTO и финансовыми преобразованиями, shared API — lifecycle ресурсов. Сохранены точность денег, null/zero, валидация, идемпотентность возвратов, cached snapshots, retry и границы доступа.
TypeScript использует общий строгий профиль с noUncheckedIndexedAccess, noImplicitReturns, noImplicitOverride и noUncheckedSideEffectImports. ESLint закрепляет type imports, запрет non-null assertions и проверку лишних условий в production. Dependency-cruiser запрещает импорт тестов, stories и fixtures из production.
Auth скрывает токен и refresh внутри владельца сессии. Guards управляют переходами после входа и выхода; настройки больше не выполняют позднюю навигацию после logout. Выход при ошибке сети очищает локальную сессию; новый гостевой маршрут сохраняется как returnTo. Удалены LoginForm.vm и RegisterForm.vm.
Общий matcher маршрутов обслуживает breadcrumbs и document title. Дублирующие маршруты /accounts/all удалены; URL-периоды журналов используют одну валидацию и нормализацию с сохранением остальных параметров. Legacy-ссылки банковских страниц с ?month= продолжают работать, queries принимают только фактически используемый диапазон.
Банковские DTO отделены от queries, точные bigint-преобразования денег — от валидации формы. Один адаптер поля даты заменяет дублирование; удалены hooks над отдельными controllers. Выбор покупки для возврата вынесен в useRefundPurchase, история карты — в CardHistory. Мутации, версии, лимит возврата и идемпотентный retry остаются у формы.
Поиск акций и облигаций переиспользует каркас, карточку, CSS и URL/debounce hook. Страницы инструментов используют общие loading/error, заголовок, график, метрики, цену и layout; CSS больше не экспортируется наружу. StockQuote и StockCompany получают узкие props. Типы данных инструментов импортируются через публичные API stock/bond.
Портфель строит ссылки по UID без дополнительных metadata-запросов каждой акции; страница инструмента сохраняет redirect на canonical slug. Чистые модели доходов, позиций и previews отделены от page VM. Удалены промежуточные VM и неиспользуемые exports.
Общий InvestmentRefreshState заменяет повторяющийся UI обновления счетов/портфеля. Ключ события принадлежит brokerage-event. Формы переиспользуют Mantine Fieldset; EntryCard владеет переносом длинного текста и сумм, без page CSS, меняющего внутреннюю разметку.
useResourceQuery ограничен GET-ключами ресурсных endpoints из OpenAPI; observe сохраняет canonical cache key. Lifecycle-тесты перенесены к shared API без зависимости от portfolio entity. Один predicate задаёт инвестиционный subtree для отмены запросов и сброса cache при смене подключения.
Удалены повторные тесты декларативного UI, query-обёрток и промежуточных VM. Сохранены проверки денег, кеша, доступа и восстановления. Добавлены сценарии задержанного/неудачного logout и браузерная регрессия полного переноса заголовка EntryCard на 375/1280 px.
Новых зависимостей, repository scripts и изменений внешнего API нет.
Итог diff относительно develop: 212 файлов, +4058 / −4395 строк, чистое сокращение 337 строк. Последняя партия из 20 пунктов: +1293 / −1051 строк; рост связан с разделением модулей и проверками регрессий.
Проверки: npm ci; исходные и целевые тесты; полный npm run verify — 434 теста в 61 файле, typecheck, ESLint и 8 проверок его профиля, OpenAPI, Knip, графы приложения и Storybook, обе сборки. Покрытие: statements 91.5%, branches 85.1%, functions 87.55%, lines 92.64%; все пороги соблюдены. Временные отрицательные примеры строгого TS/dependency-профиля проверены ранее и удалены.
Браузерная проверка 375/1280 px: карточки поиска, заголовок и метрики инструмента, длинные суммы и описания операций, отсутствие горизонтального переполнения, focus/actions и disabled/enabled поля. Постоянные browser tests проверяют layout позиций и полный перенос заголовка EntryCard. Временные probes не входят в PR.
Pre-commit (gitleaks, lint-staged, deps) и commitlint прошли. Hooks не изменили проверенный diff, рабочее дерево чистое. Storybook сохраняет предупреждение о чанках больше 500 kB; сборка успешна.
Убирает дублирование состояния, навигации, моделей и оформления frontend; усиливает проверки типов без новых зависимостей. Страницы собирают узкие блоки представления, сущности владеют DTO и финансовыми преобразованиями, shared API — lifecycle ресурсов. Сохранены точность денег, null/zero, валидация, идемпотентность возвратов, cached snapshots, retry и границы доступа.
- TypeScript использует общий строгий профиль с noUncheckedIndexedAccess, noImplicitReturns, noImplicitOverride и noUncheckedSideEffectImports. ESLint закрепляет type imports, запрет non-null assertions и проверку лишних условий в production. Dependency-cruiser запрещает импорт тестов, stories и fixtures из production.
- Auth скрывает токен и refresh внутри владельца сессии. Guards управляют переходами после входа и выхода; настройки больше не выполняют позднюю навигацию после logout. Выход при ошибке сети очищает локальную сессию; новый гостевой маршрут сохраняется как returnTo. Удалены LoginForm.vm и RegisterForm.vm.
- Общий matcher маршрутов обслуживает breadcrumbs и document title. Дублирующие маршруты /accounts/all удалены; URL-периоды журналов используют одну валидацию и нормализацию с сохранением остальных параметров. Legacy-ссылки банковских страниц с ?month= продолжают работать, queries принимают только фактически используемый диапазон.
- Банковские DTO отделены от queries, точные bigint-преобразования денег — от валидации формы. Один адаптер поля даты заменяет дублирование; удалены hooks над отдельными controllers. Выбор покупки для возврата вынесен в useRefundPurchase, история карты — в CardHistory. Мутации, версии, лимит возврата и идемпотентный retry остаются у формы.
- Поиск акций и облигаций переиспользует каркас, карточку, CSS и URL/debounce hook. Страницы инструментов используют общие loading/error, заголовок, график, метрики, цену и layout; CSS больше не экспортируется наружу. StockQuote и StockCompany получают узкие props. Типы данных инструментов импортируются через публичные API stock/bond.
- Портфель строит ссылки по UID без дополнительных metadata-запросов каждой акции; страница инструмента сохраняет redirect на canonical slug. Чистые модели доходов, позиций и previews отделены от page VM. Удалены промежуточные VM и неиспользуемые exports.
- Общий InvestmentRefreshState заменяет повторяющийся UI обновления счетов/портфеля. Ключ события принадлежит brokerage-event. Формы переиспользуют Mantine Fieldset; EntryCard владеет переносом длинного текста и сумм, без page CSS, меняющего внутреннюю разметку.
- useResourceQuery ограничен GET-ключами ресурсных endpoints из OpenAPI; observe сохраняет canonical cache key. Lifecycle-тесты перенесены к shared API без зависимости от portfolio entity. Один predicate задаёт инвестиционный subtree для отмены запросов и сброса cache при смене подключения.
- Удалены повторные тесты декларативного UI, query-обёрток и промежуточных VM. Сохранены проверки денег, кеша, доступа и восстановления. Добавлены сценарии задержанного/неудачного logout и браузерная регрессия полного переноса заголовка EntryCard на 375/1280 px.
Новых зависимостей, repository scripts и изменений внешнего API нет.
Итог diff относительно develop: 212 файлов, +4058 / −4395 строк, чистое сокращение 337 строк. Последняя партия из 20 пунктов: +1293 / −1051 строк; рост связан с разделением модулей и проверками регрессий.
Проверки: npm ci; исходные и целевые тесты; полный npm run verify — 434 теста в 61 файле, typecheck, ESLint и 8 проверок его профиля, OpenAPI, Knip, графы приложения и Storybook, обе сборки. Покрытие: statements 91.5%, branches 85.1%, functions 87.55%, lines 92.64%; все пороги соблюдены. Временные отрицательные примеры строгого TS/dependency-профиля проверены ранее и удалены.
Браузерная проверка 375/1280 px: карточки поиска, заголовок и метрики инструмента, длинные суммы и описания операций, отсутствие горизонтального переполнения, focus/actions и disabled/enabled поля. Постоянные browser tests проверяют layout позиций и полный перенос заголовка EntryCard. Временные probes не входят в PR.
Pre-commit (gitleaks, lint-staged, deps) и commitlint прошли. Hooks не изменили проверенный diff, рабочее дерево чистое. Storybook сохраняет предупреждение о чанках больше 500 kB; сборка успешна.
codex-bot
changed title from refactor: simplify frontend date and form boundaries to refactor: simplify frontend state and remove redundant view models2026-09-28 20:35:40 +03:00
codex-bot
changed title from refactor: simplify frontend state and remove redundant view models to refactor: simplify frontend state and clarify model ownership2026-09-28 21:46:16 +03:00
codex-bot
changed title from refactor: simplify frontend state and clarify model ownership to refactor: simplify frontend and tighten type checks2026-09-29 06:17:14 +03:00
codex-bot
changed title from refactor: simplify frontend and tighten type checks to refactor: simplify frontend and clarify module ownership2026-09-29 07:08:43 +03:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Убирает дублирование состояния, навигации, моделей и оформления frontend; усиливает проверки типов без новых зависимостей. Страницы собирают узкие блоки представления, сущности владеют DTO и финансовыми преобразованиями, shared API — lifecycle ресурсов. Сохранены точность денег, null/zero, валидация, идемпотентность возвратов, cached snapshots, retry и границы доступа.
Новых зависимостей, repository scripts и изменений внешнего API нет.
Итог diff относительно develop: 212 файлов, +4058 / −4395 строк, чистое сокращение 337 строк. Последняя партия из 20 пунктов: +1293 / −1051 строк; рост связан с разделением модулей и проверками регрессий.
Проверки: npm ci; исходные и целевые тесты; полный npm run verify — 434 теста в 61 файле, typecheck, ESLint и 8 проверок его профиля, OpenAPI, Knip, графы приложения и Storybook, обе сборки. Покрытие: statements 91.5%, branches 85.1%, functions 87.55%, lines 92.64%; все пороги соблюдены. Временные отрицательные примеры строгого TS/dependency-профиля проверены ранее и удалены.
Браузерная проверка 375/1280 px: карточки поиска, заголовок и метрики инструмента, длинные суммы и описания операций, отсутствие горизонтального переполнения, focus/actions и disabled/enabled поля. Постоянные browser tests проверяют layout позиций и полный перенос заголовка EntryCard. Временные probes не входят в PR.
Pre-commit (gitleaks, lint-staged, deps) и commitlint прошли. Hooks не изменили проверенный diff, рабочее дерево чистое. Storybook сохраняет предупреждение о чанках больше 500 kB; сборка успешна.
refactor: simplify frontend date and form boundariesto refactor: simplify frontend state and remove redundant view modelsrefactor: simplify frontend state and remove redundant view modelsto refactor: simplify frontend state and clarify model ownershiprefactor: simplify frontend state and clarify model ownershipto refactor: simplify frontend and tighten type checksrefactor: simplify frontend and tighten type checksto refactor: simplify frontend and clarify module ownership