vojo/docs/known-tech-debt-lint
2026-04-29 01:03:12 +03:00
..
diff.sh chore: upgrade TypeScript to 5.4 with bundler module resolution and reformat repo against tightened ESLint 2026-04-27 13:07:49 +03:00
README.md chore: upgrade TypeScript to 5.4 with bundler module resolution and reformat repo against tightened ESLint 2026-04-27 13:07:49 +03:00
typecheck.snapshot.txt redesign(p4): land Dawn RoomViewHeader for all rooms with peer chrome, presence, member-count subline, and reactive bridge gate. 2026-04-29 01:03:12 +03:00

Известный техдолг по линтеру

Эта папка фиксирует известное состояние npm run typecheck в репозитории. Build при этом зелёный, prod задеплоен — это исторический технический долг, не блокер. Папка нужна чтобы при любых изменениях кода сравнивать delta (только то что мы добавили), не путаясь в предсуществующих ошибках.

После апгрейда TypeScript 4.9 → 5.4 + moduleResolution: "Bundler" (см. историю коммита) основная масса (~803 из 835 предыдущих ошибок) исчезла. Осталось ~32 ошибки уже про реальные баги/несоответствия типов в нашем коде, не про модульное резолвинг. npm run check:eslint теперь — обычный зелёный чек (0 ошибок, 116 warnings), отдельный snapshot не нужен.

Состав

Файл Что
typecheck.snapshot.txt Полный stdout npm run typecheck. ~61 строка, ~32 ошибки.
diff.sh Скрипт сравнения: запускает текущий typecheck, сравнивает с snapshot-ом, выдаёт только delta.

Как пользоваться

bash docs/known-tech-debt-lint/diff.sh

На чистой ветке выводит:

=== typecheck diff vs known-tech-debt snapshot ===
  no new typecheck errors

Если что-то сломал — выводит конкретные новые ошибки в формате file.tsx(_,_): error TS... (line/col маска чтобы pure-line-shift не давал phantom NEW + fixed). Реальные позиции — npm run typecheck напрямую. Если случайно починил предсуществующий долг — отчитается «(incidentally fixed: N)» к сведению.

Скрипт смотрит working tree, не staged-состояние. Для строгого pre-commit gate сначала apply'нуть свой stage в чистый worktree (git stash --keep-index + bash diff.sh + git stash pop).

npm run check:eslint запускайте напрямую — он зелёный.

Что в долге (TL;DR)

Typecheck (~32 ошибок): реальные несоответствия типов. Категории:

  • TS2345 keyof literal-union mismatch (~14): mx.getAccountData(string) / mx.getStateEvent(...) ждёт keyof AccountDataEvents (узкие литеральные типы), у нас передаются AccountDataEvent.PoniesEmoteRooms, 'm.call.member', 'in.cinny.spaces' и т.п. — валидные Matrix event-types, но не в SDK-юнионе.
  • TS2345 i18next signature (~3): t('Room.members_count', { count: millify(...) })count хочет number, а millify() возвращает string. На рантайме отображается корректно (в локалях нет plural-вариантов).
  • TS2345 / TS18048 Room | undefined / Room | null после .filter((r) => !!r) (~6): TS не пропускает truthy-фильтр без type predicate. UserChips.tsx, AddExisting.tsx, Invites.tsx, GlobalPacks.tsx. Runtime безопасно.
  • TS2345 IContentRoomMessageEventContent (1): MessageEditor.tsx — typing gap между общим content и room-message variant.
  • TS7006 implicit any (6): event-handler params (evt, event, ev) в Message.tsx, EventReaders.tsx, UrlPreviewCard.tsx, LiveChip.tsx, MemberGlance.tsx, ReactionViewer.tsx.
  • TS2540 read-only sandbox (1): CallEmbed.ts — iframe.sandbox = "...". Современные DOM types сделали его DOMTokenList read-only, но браузеры всё ещё принимают строку.
  • TS2353 unknown property endpoint (1): push.ts — лишнее поле в setPusher.data. SDK типы неполные, sygnal/UnifiedPush его читает.
  • TS2322 (number | undefined)[]number[] (1): usePowerLevelTags.ts — то же truthy-filter narrowing.

Build зелёный, ESLint зелёный. Все 32 оставшихся ошибки — type-strictness без runtime-импакта (truthy-filter narrowing, узкие SDK literal-union'ы, под-типированные event-handler params, слишком строгий DOM types). Это известный долг, не блокер. Будущая чистка — отдельный план (создать docs/plans/typecheck_residual_cleanup.md когда возьмёмся).

Когда обновлять snapshot

Когда долг будет частично разруливаться отдельной задачей — после её мерджа пересоздать snapshot:

npm run typecheck > docs/known-tech-debt-lint/typecheck.snapshot.txt 2>&1

И обновить TL;DR в этом README.

Когда typecheck станет зелёным — удалить эту папку целиком и включить husky pre-commit hook.