chore: strengthen backend eslint and value policies #40

Merged
ksv741 merged 7 commits from codex/backend-eslint into develop 2026-09-28 16:37:02 +03:00
Owner

Что изменилось

Backend lint проверяет production TypeScript, тесты, JS/CJS/MJS scripts и configs. ESLint 10.11.0 и typescript-eslint 8.70.1 дополнены recommended-пресетами Node, NestJS typed, Jest, import-x с TypeScript resolver, SonarJS, RegExp, Security, Perfectionist и Stylistic. Prettier удалён; форматирование выполняет ESLint. Тернарные выражения допускают одну строку; в многострочном варианте ? и : стоят в начале строк друг под другом. Положение остальных операторов сохранено.

Удалён общий числовой ignore из no-magic-numbers: 289 замечаний устранены предметными локальными и общими константами с сохранением значений и границ. Регрессионная проверка охватывает все ранее разрешённые числа и bigint. Сохранены ограничения на non-null и definite assignment; включён no-explicit-any. Jest globals ограничены тестами, Nest rules — production TS. Порядок объектов, классов, модулей и декораторов не сортируется из-за runtime semantics. Ложные срабатывания документированы точечно.

Исправления включают явный forbidUnknownValues, корректное описание Swagger arrays, одновременное ожидание async assertions и fake timers, линейное удаление дробных нулей, упрощение NCR regex и повторно используемый serializer. Артефакты нагрузочного теста записываются в уникальный временный каталог. dotenv 17.4.2 объявлен прямой runtime-зависимостью для production Prisma config. Публичный OpenAPI не изменился.

Коды ошибок HTTP/auth/banking/Prisma/integrations и используемые значения протокола T-Bank перенесены в строковые enum у соответствующих владельцев. no-restricted-syntax запрещает inline-коды в полях code/errorCode, значения известных protocol families, шаблоны и строковые сравнения кодов; no-unsafe-enum-comparison закреплён как error. Проверки охватывают и однократное использование строки. Fixtures сохраняют независимые wire assertions; новые словари требуют расширения selectors и review.

Строковые значения, обработка неизвестных внешних кодов и публичный OpenAPI сохранены. Значения T-Bank проверяются по vendored proto. Чистые protocol/error imports не загружают DI/Prisma; новая защита не требует дополнительных зависимостей и не расширяет suppression baseline.

Исправлено превышение бюджета p95 в /brokerage-accounts/all/events: общий CatalogDiscoveryRepository.readSources группирует UID через IN по точному сочетанию source/kind/rangeKey вместо отдельных OR для каждой записи. Фильтры, freshness, проверки ревизий и денежные расчёты сохранены. SQLite-регрессия проверяет изоляцию UID, источников и периодов, дубликаты, отсутствующие UID и пустой запрос. На одинаковой синтетической БД профиль 100 запросов / 10 клиентов показал p95 260 → 136 мс, ответы событий и итоги совпадают. Полный исходный e2e после исправления: p95 259 мс, RPC 0; порог 500 мс не менялся. Это локальные измерения, результат CI проверяется отдельно.

Оставшийся технический долг

eslint-suppressions.json содержит 85 существующих нарушений трёх SonarJS rules в 33 файлах: cognitive-complexity (28), no-nested-conditional (51), no-nested-template-literals (6). Baseline ограничивает количество нарушений по файлам, но не измеряет дальнейшее усложнение конкретной функции. Ошибки Security/TypeScript/Jest туда не включены; замена числовых литералов baseline не расширяет.

Проверки

  • Чистый запуск без dist: npm ci, prisma generate, полный npm run verify — успешно. n/no-missing-require в трёх runtime-скриптах проверяет пути сборки по исходникам; отсутствующие файлы и пакеты продолжают отклоняться. Регрессионный тест не зависит от наличия локальной сборки.
  • После слияния актуального develop повторно пройдены npm ci и полный npm run verify. Merge меняет только workflows и README; последующая оптимизация чтения каталога проверена полным e2e-набором.
  • npm ci: воспроизводимая установка, npm audit — 0 vulnerabilities.
  • npm run verify: lint, 6 проверок конфигурации ESLint, оба typecheck, 226 unit tests / 37 suites, Prisma generation и build.
  • npm run test:e2e: все 263 теста / 21 suite на изолированных SQLite DB.
  • npm run test:openapi-contract: проверка после фиксации runtime dotenv.
  • Сгенерированный OpenAPI полностью совпадает с документом до изменений.
  • Отдельная npm ci --omit=dev --omit=optional --ignore-scripts установка: Prisma config загружается без devDependencies (проверка dependency resolution, не container smoke).
  • git diff --check и semantic/Boy Scout review.

Связано с WealthLedger/main#18.

## Что изменилось Backend lint проверяет production TypeScript, тесты, JS/CJS/MJS scripts и configs. ESLint 10.11.0 и typescript-eslint 8.70.1 дополнены recommended-пресетами Node, NestJS typed, Jest, import-x с TypeScript resolver, SonarJS, RegExp, Security, Perfectionist и Stylistic. Prettier удалён; форматирование выполняет ESLint. Тернарные выражения допускают одну строку; в многострочном варианте `?` и `:` стоят в начале строк друг под другом. Положение остальных операторов сохранено. Удалён общий числовой ignore из no-magic-numbers: 289 замечаний устранены предметными локальными и общими константами с сохранением значений и границ. Регрессионная проверка охватывает все ранее разрешённые числа и bigint. Сохранены ограничения на non-null и definite assignment; включён no-explicit-any. Jest globals ограничены тестами, Nest rules — production TS. Порядок объектов, классов, модулей и декораторов не сортируется из-за runtime semantics. Ложные срабатывания документированы точечно. Исправления включают явный forbidUnknownValues, корректное описание Swagger arrays, одновременное ожидание async assertions и fake timers, линейное удаление дробных нулей, упрощение NCR regex и повторно используемый serializer. Артефакты нагрузочного теста записываются в уникальный временный каталог. dotenv 17.4.2 объявлен прямой runtime-зависимостью для production Prisma config. Публичный OpenAPI не изменился. Коды ошибок HTTP/auth/banking/Prisma/integrations и используемые значения протокола T-Bank перенесены в строковые enum у соответствующих владельцев. `no-restricted-syntax` запрещает inline-коды в полях `code`/`errorCode`, значения известных protocol families, шаблоны и строковые сравнения кодов; `no-unsafe-enum-comparison` закреплён как error. Проверки охватывают и однократное использование строки. Fixtures сохраняют независимые wire assertions; новые словари требуют расширения selectors и review. Строковые значения, обработка неизвестных внешних кодов и публичный OpenAPI сохранены. Значения T-Bank проверяются по vendored proto. Чистые protocol/error imports не загружают DI/Prisma; новая защита не требует дополнительных зависимостей и не расширяет suppression baseline. Исправлено превышение бюджета p95 в `/brokerage-accounts/all/events`: общий `CatalogDiscoveryRepository.readSources` группирует UID через `IN` по точному сочетанию source/kind/rangeKey вместо отдельных `OR` для каждой записи. Фильтры, freshness, проверки ревизий и денежные расчёты сохранены. SQLite-регрессия проверяет изоляцию UID, источников и периодов, дубликаты, отсутствующие UID и пустой запрос. На одинаковой синтетической БД профиль 100 запросов / 10 клиентов показал p95 260 → 136 мс, ответы событий и итоги совпадают. Полный исходный e2e после исправления: p95 259 мс, RPC 0; порог 500 мс не менялся. Это локальные измерения, результат CI проверяется отдельно. ## Оставшийся технический долг eslint-suppressions.json содержит 85 существующих нарушений трёх SonarJS rules в 33 файлах: cognitive-complexity (28), no-nested-conditional (51), no-nested-template-literals (6). Baseline ограничивает количество нарушений по файлам, но не измеряет дальнейшее усложнение конкретной функции. Ошибки Security/TypeScript/Jest туда не включены; замена числовых литералов baseline не расширяет. ## Проверки - Чистый запуск без `dist`: `npm ci`, `prisma generate`, полный `npm run verify` — успешно. `n/no-missing-require` в трёх runtime-скриптах проверяет пути сборки по исходникам; отсутствующие файлы и пакеты продолжают отклоняться. Регрессионный тест не зависит от наличия локальной сборки. - После слияния актуального develop повторно пройдены npm ci и полный npm run verify. Merge меняет только workflows и README; последующая оптимизация чтения каталога проверена полным e2e-набором. - npm ci: воспроизводимая установка, npm audit — 0 vulnerabilities. - npm run verify: lint, 6 проверок конфигурации ESLint, оба typecheck, 226 unit tests / 37 suites, Prisma generation и build. - npm run test:e2e: все 263 теста / 21 suite на изолированных SQLite DB. - npm run test:openapi-contract: проверка после фиксации runtime dotenv. - Сгенерированный OpenAPI полностью совпадает с документом до изменений. - Отдельная npm ci --omit=dev --omit=optional --ignore-scripts установка: Prisma config загружается без devDependencies (проверка dependency resolution, не container smoke). - git diff --check и semantic/Boy Scout review. Связано с [WealthLedger/main#18](https://git.personal.ksv741.ru/WealthLedger/main/issues/18).
codex-bot added 2 commits 2026-09-28 12:24:53 +03:00
refactor: replace ignored numeric literals with constants
Backend security / security (push) Successful in 8s
Backend verify / verify (push) Failing after 2m17s
Conventional commits / commits (pull_request) Successful in 31s
Backend security / security (pull_request) Successful in 8s
Backend verify / verify (pull_request) Failing after 1m56s
9cc9fbdcff
ksv741 added 1 commit 2026-09-28 12:34:24 +03:00
style: align multiline ternary operators
Backend security / security (push) Successful in 8s
Backend verify / verify (push) Failing after 2m11s
Backend security / security (pull_request) Successful in 8s
Backend verify / verify (pull_request) Failing after 2m17s
Conventional commits / commits (pull_request) Successful in 34s
0303e60b64
ksv741 added 1 commit 2026-09-28 13:49:47 +03:00
refactor: enforce enum machine codes
Backend security / security (push) Successful in 8s
Backend security / security (pull_request) Canceled after 0s
Backend verify / verify (push) Canceled after 9s
Backend verify / verify (pull_request) Canceled after 4s
Conventional commits / commits (pull_request) Successful in 31s
2d14081d27
Use owner enums for error and T-Bank protocol values with ESLint regression checks.

Preserve open wire fallbacks and keep protocol imports independent of DI and Prisma.

Verified npm ci, verify, 226 unit tests, 262 isolated e2e tests and unchanged OpenAPI.
codex-bot changed title from chore: strengthen backend eslint and numeric policy to chore: strengthen backend eslint and value policies 2026-09-28 15:20:45 +03:00
ksv741 added 1 commit 2026-09-28 15:20:58 +03:00
chore: merge develop into eslint branch
Backend verify / commits (pull_request) Successful in 31s
Backend verify / security (pull_request) Successful in 8s
Backend verify / verify (pull_request) Failing after 1m54s
33a5135741
ksv741 added 1 commit 2026-09-28 15:49:05 +03:00
fix: resolve build imports before linting
Backend verify / commits (pull_request) Successful in 29s
Backend verify / security (pull_request) Successful in 8s
Backend verify / verify (pull_request) Failing after 11m25s
7d2262fb43
Resolve dist imports in runtime scripts against their TypeScript sources.

Keep missing-module checks enabled and cover absent build output in the lint gate.

Verified npm ci, prisma generate and full verify with dist absent at startup.
ksv741 added 1 commit 2026-09-28 16:24:17 +03:00
perf: group catalog source reads by identity
Backend verify / commits (pull_request) Successful in 30s
Backend verify / security (pull_request) Successful in 8s
Backend verify / verify (pull_request) Successful in 10m48s
e76eb545d7
ksv741 merged commit 6cd9c2dd28 into develop 2026-09-28 16:37:02 +03:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WealthLedger/backend#40