4.3 KiB
Conventions
Must
- Использовать Biome:
npm run lint; табы и двойные кавычки определяетbiome.json. - Для type-only импортов использовать
import type; не использоватьenumиnamespace. - UI-строки хранить в
src/shared/i18n/locales/ru.tsи получать черезuseTranslation(). - Zod-схемы не содержат пользовательских строк: использовать
validationMessage(key)изsrc/shared/i18n/zod.ts. - Публичный импорт слайса идёт через его
index.ts. - Тесты лежат рядом с исходником как
*.test.tsx. - Зависимости используют exact versions; не добавлять semver ranges.
- Полный локальный gate:
npm run verify. Pre-commit запускает staged formatting и FSD dependency checks; commit message должен следовать Conventional Commits.
React component style
Biome-enforced guardrails:
- Named React components объявлять как const-valued components, а не function declarations.
- Не использовать default exports.
- Export statements держать после declarations тела module.
Storybook CSF-файлы *.stories.tsx используют штатный export default meta
и прямые export const для stories: статический indexer должен видеть их
метаданные и названия. Biome разрешает эти два исключения только для stories;
.storybook/main.ts и preview.tsx разрешают только обязательный default export.
Synthetic fixtures и Storybook descriptions являются данными/документацией
истории; продуктовые UI-строки по-прежнему принадлежат i18n.
Mandatory review conventions:
- React components типизировать через
FC:const Component: FC<Props> = (props) => { ... }; если props нет —const Component: FC = () => { ... }. - Props описывать named type рядом с component либо в
Component.types.ts, если type переиспользуется или file становится крупным. - Не использовать inline props typing в component parameters.
- Для components только с
childrenиспользоватьFC<PropsWithChildren>без отдельного props alias. Если кромеchildrenесть другие props, использовать named props type на основеPropsWithChildren<{ ... }>. - Не destructure props в component parameters; принимать
propsи destructure внутри component body. - Обычный module export surface сводить к одному нижнему named export block, когда это выражается читаемо без потери public API.
- Чистые barrel files должны использовать прямой re-export без промежуточного import:
export { Component } from "./Component";.
File roles
Component.tsx- контейнер или публичный компонент; для data-driven pages вызывает page VM hook и выбирает top-level state view.Component.vm.ts- hook с данными, действиями, state selection и derived presentation data.Component.view.tsx- чистое представление: получает props, рендерит JSX и не вызывает data/auth/router/navigation/VM hooks.Component.types.ts- props и локальные типы.Component.module.css- локальные стили.
Самостоятельный top-level state или именуемый section обычно выносится в
соседний *.view.tsx, когда у него есть отдельная responsibility, reuse либо
change cadence или он скрывает principal component. Небольшой tightly-coupled
renderer остаётся рядом с parent. Предпочтительный flat pattern —
components/AccountOperationsPageLoaded.view.tsx без отдельной директории,
barrel, test и stylesheet для каждого компонента.