25 lines
1.9 KiB
Markdown
25 lines
1.9 KiB
Markdown
# 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, OpenAPI check и FSD dependency checks; commit message должен следовать Conventional Commits.
|
|
|
|
## 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` - локальные стили.
|
|
|
|
Большие view files дробить по ответственности. Если section/state можно
|
|
самостоятельно назвать, вынести его в соседний presentation component вместо
|
|
накопления смысловой нагрузки в одном файле.
|