Файлы и комментарии

Last updated: 2026-08-18Десять ролей файлов, каталоги по доменам вместо слоёв, и пять тегов, которыми ограничены комментарии.

Файлы и каталоги

Роль в имени файла

<домен>.<роль>.ts — роль видна в листинге каталога, файл не нужно открывать.

РольСодержимоеОбещание
*.entry.tsТочка входа процессаЕдинственное место, где собирается граф зависимостей
*.route.tsHTTP-эндпоинтыТолько разбор запроса и вызов домена
*.rpc.tsgRPC-методыТо же для RPC
*.store.tsДоступ к БДЕдинственное место, где есть SQL или ORM
*.wire.tsКлиент к чужому APIЕдинственное место, где живёт чужой формат
*.policy.tsПравила доступа и инвариантыЧисто, без I/O — правила тестируются без БД
*.shape.tsТипы и схемы валидацииНичего исполняемого
*.event.tsКонтракты событий, продюсеры и консьюмерыИмена сабджектов только здесь
*.job.tsФоновые задачи, кронИдемпотентность обязательна
*.pure.tsЧистые вычисления доменаНоль I/O. Легальное место для того, что раньше сваливали в utils

*.tsx — компонент по определению, роль не нужна. Имена, продиктованные фреймворком (page, layout, route, middleware, mod), остаются как есть. Публичный вход пакета — public.ts.

Запрещённые имена файлов

utils util helpers helper common shared misc lib
main types constants service manager handler index

Каждое из них — обещание свалки: файл с таким именем через полгода содержит две несвязанные вещи, и его никто не может удалить, потому что непонятно, кто им пользуется.

Каталоги — вертикальные срезы

Слои: видно фреймворк
src/controllers/track.ts
src/services/track.ts
src/types/track.ts
src/utils/track.ts
Домены: видно продукт
src/track/track.route.ts
src/track/track.store.ts
src/track/track.shape.ts
src/track/track.pure.ts

Каталог называется по домену, не по технической природе. Запрещены каталоги utils helpers common shared misc lib core services controllers managers handlers. По листингу src/ должно быть видно, что делает продукт, а не на каком фреймворке он написан.


Комментарии

Комментарий отвечает на «почему», никогда на «что». «Что» уже написано в коде строкой ниже, и оно не врёт — в отличие от комментария.

Разрешены пять тегов:

ts
// why: Stripe шлёт webhook раньше, чем отдаёт объект в API
// perf: 40k строк — Map быстрее линейного поиска на два порядка
// safety: сравнение constant-time, значение приходит извне
// spec: RFC 8628 §3.5
// ref: инцидент 2026-08-04, откат прода

Продолжение многострочного комментария тег не повторяет. Блочный комментарий — только JSDoc над экспортом; /* ... */ вокруг кода означает, что код надо удалить, а не закомментировать.

Запрещено

Как обычно
// increment the counter
count += 1

// ============================
// Step 1: validate the input
// TODO: переписать
По GRAIN
count += 1

// why: счётчик обновляется до записи — иначе гонка с воркером
// grain:allow unit-suffix — поле внешнего контракта Stripe

Комментарий-пересказ кода, TODO / FIXME / HACK, нумерация шагов, ASCII-разделители, эмодзи — в комментариях и в логах: лог читает grep, а не человек.

Осознанное исключение из любого правила оформляется явно и с причиной:

ts
// grain:allow unit-suffix — поле внешнего контракта Stripe, переименовать нельзя

Причина обязательна — без неё чекер ругается на сам escape. Это превращает нарушение из небрежности в решение, которое можно обсудить.

Файлы и комментарии | AS Docs