You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Максимум размер файла: 400 строк (за исключением автогенерируемых модулей типо swagger)
Максимум размер функции: 50 строчек (Маленькие функции: Функции должны быть короткими и выполнять только одну задачу)
Максимум переданных параметров в метод: 5
Максимальная глубина вложенности блоков: 4
Максимальная сложность(ветвление): 8
Блокировка любых подавлений ошибок типо: "/* eslint-disable no-console, eqeqeq */"
Блокировка любых any, unknown, dynamic
Monorepo должно делиться на модули
Каждый модуль максимум 5000 строчек кода.
Каждый модуль должен отвечать за свою отдельную функциональность.
Если модуль требует больше 5000 строчек кода, значит уже пора делить этот модуль на несколько частей:
на подмодули
на отдельные packages
на отдельные bounded contexts
на отдельные сервисы, если реально нужна отдельная runtime/deployment-граница
Модуль не должен быть большой общей папкой, куда складывается всё подряд.
В одной папке не должно лежать больше 10 файлов с кодом
Если в папке больше 10 файлов с кодом, скорее всего надо создавать подпапки и раскладывать код по смыслу.
Цель правила: в одной папке не должно быть большой плоской кучи кода.
Не должно быть не используемых зависимостей в коде.
Не должно быть неиспользуемых модулей в коде
Если есть методы/классы/функции/модули, которые нигде не вызываются, должна быть ошибка или warning.
Исключение: публичный API библиотеки/модуля.
Но если код является публичным API, он должен быть явно экспортирован и считаться частью public contract.
Не должно быть дублей кода
Для TypeScript используется библиотека jscpd.
Также нужен агент-ревьюер, который будет детально изучать, дублирует ли код другой код по смыслу.
Причина: автоматический поиск дублей может не находить случаи, когда один и тот же смысл написан разными словами.
Обязательно надо использовать ORM или typed query layer для работы с базой данных
Запрещено писать SQL прямо внутри business logic.
Все обращения к базе должны идти через:
ORM
repository layer
typed query layer
другой типизированный слой доступа к данным
Raw SQL разрешён только как исключение:
если ORM не может нормально выразить запрос
если запрос performance-critical
если запрос parameterized
если у запроса явно описаны input/output types
если есть тест
если есть комментарий/architecture note, почему ORM недостаточно
Использовать Swagger/OpenAPI и swagger-api-generated для доступа к API
Всегда работаем с доказуемыми типами.
API schema является source of truth.
Для доступа к API обязательно использовать generated client/types из Swagger/OpenAPI schema.
Запрещено:
руками писать fetch/axios вызовы к внутренним API
руками дублировать DTO-типы между клиентом и сервером
руками описывать request/response-типы, если они уже есть в OpenAPI schema
обращаться к API без generated client
Если меняется endpoint/request/response, сначала должна быть обновлена Swagger/OpenAPI schema, потом сгенерированы новые типы и клиент.
Запрещено писать cast, as и любые способы ломать типизацию в коде
Для CI/CD:
Сделать прогон safe lint --fix в CI/CD
Если кто-то забыл прогнать fix локально, CI/CD должен сам прогнать fix и добавить эти изменения в код автоматически.
Auto-fix должен быть:
deterministic
idempotent
безопасным
с зафиксированной версией toolchain
отдельным commit от CI/CD bot
полностью видимым в PR diff
После auto-fix CI/CD обязан заново прогнать:
lint
typecheck
tests
build
Если после повторного auto-fix снова появляются изменения, значит fix не достиг fixed point и CI/CD должен упасть.
Тесты:
Test coverage минимум 10%
Обязательно использование property-based testing там, где есть инварианты
Например:
парсеры
сериализация/десериализация
нормализация данных
state machines
permission logic
financial/math logic
retry/idempotency logic
validation logic
Обязательно использование e2e тестирования
E2E тестами должны быть покрыты основные пользовательские сценарии и критические бизнес-флоу.
В открытом PR должно быть покрыто 100% нового и изменённого кода тестами
Если PR добавляет новый код, к нему должны быть добавлены тесты.
Если PR меняет старый код, тесты должны покрывать изменённое поведение.
Использование mutation testing на изменения в PR
Mutation testing должен запускаться на изменённых файлах с кодом.
Цель mutation testing: проверять не только наличие тестов, но и то, что тесты реально ловят поломки.
Линтеры:
Каждый модуль максимум 5000 строчек кода.
Каждый модуль должен отвечать за свою отдельную функциональность.
Если модуль требует больше 5000 строчек кода, значит уже пора делить этот модуль на несколько частей:
Модуль не должен быть большой общей папкой, куда складывается всё подряд.
Если в папке больше 10 файлов с кодом, скорее всего надо создавать подпапки и раскладывать код по смыслу.
Цель правила: в одной папке не должно быть большой плоской кучи кода.
Если есть методы/классы/функции/модули, которые нигде не вызываются, должна быть ошибка или warning.
Исключение: публичный API библиотеки/модуля.
Но если код является публичным API, он должен быть явно экспортирован и считаться частью public contract.
Для TypeScript используется библиотека
jscpd.Также нужен агент-ревьюер, который будет детально изучать, дублирует ли код другой код по смыслу.
Причина: автоматический поиск дублей может не находить случаи, когда один и тот же смысл написан разными словами.
Запрещено писать SQL прямо внутри business logic.
Все обращения к базе должны идти через:
Raw SQL разрешён только как исключение:
Всегда работаем с доказуемыми типами.
API schema является source of truth.
Для доступа к API обязательно использовать generated client/types из Swagger/OpenAPI schema.
Запрещено:
Если меняется endpoint/request/response, сначала должна быть обновлена Swagger/OpenAPI schema, потом сгенерированы новые типы и клиент.
Для CI/CD:
lint --fixв CI/CDЕсли кто-то забыл прогнать fix локально, CI/CD должен сам прогнать fix и добавить эти изменения в код автоматически.
Auto-fix должен быть:
После auto-fix CI/CD обязан заново прогнать:
Если после повторного auto-fix снова появляются изменения, значит fix не достиг fixed point и CI/CD должен упасть.
Тесты:
Например:
E2E тестами должны быть покрыты основные пользовательские сценарии и критические бизнес-флоу.
Если PR добавляет новый код, к нему должны быть добавлены тесты.
Если PR меняет старый код, тесты должны покрывать изменённое поведение.
Mutation testing должен запускаться на изменённых файлах с кодом.
Цель mutation testing: проверять не только наличие тестов, но и то, что тесты реально ловят поломки.