Учебное руководство
Главы руководства
На этой странице

Проверки, TypeScript, Oxlint, Oxfmt и Jest

Оглавление · Далее: разбор проблем

Что выполняет pnpm check

Порядок закреплён в root package.json:

pnpm build
  → pnpm typecheck
  → pnpm lint
  → pnpm format:check
  → pnpm test

Команды связаны &&: при ошибке следующие не выполняются. Успешный check означает успех этих конкретных проверок, а не готовность всей production-инфраструктуры.

КомандаСмыслЧто не входит
buildРекурсивная сборка contracts, web, docsStrapi
typecheckПроверка типов workspace, Next typegenHTTP runtime-данные
lintOxlint с ошибкой на warning в apps packagesПолный lint CMS/Python/Bash
format:checkOxfmt в корне с ignore patternsПроверка смысла программы
formatИзменяет форматированиеНе readonly-проверка

Strapi проверяется npm ci, schemas, tsc и Node tests в CI check; admin/runtime image дополнительно собирается в job images для main. Root pnpm check остаётся workspace-проверкой.

TypeScript в трёх окружениях

Workspace использует typescript@7.0.2 и команду tsc; отдельного пакета @typescript/native-preview в manifests нет. Вопрос «ts-go» здесь не означает замену Node.js на Go: проверка типов, генерация JavaScript и runtime — разные этапы.

ПриложениеConfigВывод
ContractsBase + declarationESM JavaScript и .d.ts в dist
WebNext config, bundler resolution, noEmitNext сборка, TypeScript проверяет
StrapiСобственный TS 5 и configСамостоятельная сборка CMS

Web использует alias @/* и generated route types Next. Node-воркер напрямую не читает этот config и не знает такого alias. skipLibCheck уменьшает проверку деклараций зависимостей; он не выключает strict для нашего кода.

Node 24 dev-запуск .ts не заменяет tsc --noEmit. Не переносите TypeScript-код, требующий преобразований/путевых aliases, в native runtime без проверки обоих режимов.

Почему Jest

Jest подключён через next/jest.js: Next настраивает трансформацию тестового кода. Environment — node, match — src/**/*.test.ts. Отдельного Vite-конфига нет. В проекте сознательно не установлены Vitest и автоматические UI-тесты Playwright.

Alias @/ отображается на src. Contracts в тестах отображается на исходный .ts, а в production импортируется из dist. Поэтому тест не гарантирует правильность упаковки production-пакета; это дополнительно проверяет build/Docker.

Какие тесты есть

Серверные Jest suites проверяют router, webhook, CMS pagination/contracts и media proxy. Нет live CMS в unit tests: repository/fetch заменяются контролируемым transport fixture. Тесты проверяют полную pagination, отказ второй страницы, безопасные URL, nullable endsAt, null → NOT_FOUND, отказ CMS → INTERNAL_SERVER_ERROR, фиксированный Garage Host, запрет redirect/неверного MIME/traversal и отсутствие credentials в static uploads.

Изолированный Strapi запускает Node tests после собственного tsc: преобразование HTML, исходные даты, повтор расписания, сохранение правок, explicit update, dry-run без базы, повтор после сбоя media-каталога и ожидание post-commit callbacks. Эти проверки выполняет CI check отдельным npm ci/test:import; сборку admin/runtime проверяет Docker job images.

npm --prefix infra/strapi ci --no-audit --no-fund
npm --prefix infra/strapi run check:models
npm --prefix infra/strapi run test:import
pnpm check

Unit green не заменяет настоящий upload/read/delete, import/rerun, restore drill или обычную публикацию в Content Manager. Для UI используются ручные сценарии.

Команды для разработки

pnpm test
pnpm --filter @atmanki/web test --watch
pnpm --filter @atmanki/web exec jest src/server/router.test.ts --runInBand
pnpm lint
pnpm format:check

После изменения contract выполняйте build/typecheck обоих потребителей. После изменения только Markdown достаточно проверить ссылки и примеры; сборка всех приложений не проверит качество объяснений.

Что проверять вручную

UI: мобильная ширина, keyboard navigation, Drawer, accordion, карусель, детальная страница, missing slug, изображения и шрифт. Визуальная копия не подтверждена скриншотным сравнением.

Инфраструктура: config --quiet, сборка образов, healthchecks, доступ через Caddy, авторизованный вход в панели и обновление страниц через Strapi webhook. node scripts/check-static-site.mjs проверяет SSG/ISR на production standalone-сервере с изолированной CMS; pnpm check требует доступной CMS для статической сборки. Сделать mock-тест зелёным и сделать реальную задачу работающей — разные результаты.

Audit и качество

cd infra/strapi
npm audit --omit=dev

У корневого check нет автоматического audit gate. Предыдущая зафиксированная проверка CMS от 2026-10-02 сообщала 22 замечания, 4 high; текущий результат может меняться вместе с базой advisory. Не применяйте несовместимые major-upgrades транзитивных библиотек без проверки Strapi.

Где смотреть код

Router tests, webhook tests, Jest config, Oxlint, Oxfmt, base TS.

Garage и upload provider

При добавлении S3 отдельно проверены сборка CMS и upload/read/delete через @strapi/provider-upload-aws-s3@5.56.0 с Garage 2.3.0, включая multipart 6 MiB и чтение через Caddy. Это отдельная integration-проверка, не часть восьми Jest tests и не доказательство переноса редакционного контента. Детали.

Скрипт медиабиблиотеки

python3 -m unittest discover -s scripts/tests -p 'test_media_library.py' проверяет сохранение редакторских полей, конфликт плана, атомарный журнал, отказ от чужого журнала, продолжение после потерянного ответа и повторный запуск без записей. Эти проверки работают с поддельным клиентом и запускаются в GitHub CI без production-доступов. Jest проверяет ревалидацию по событиям записей и медиа.

Проверка наблюдаемости

python3 -m unittest discover -s scripts/tests -p test_caddy_config.py
python3 -m unittest discover -s scripts/tests -p test_observability_provisioning.py
pnpm --filter @atmanki/web exec jest src/lib/observability.test.ts --runInBand

Тесты проверяют сохранение маршрутов и credentials, отказ от чужого владельца и privileged роли, фильтрацию чувствительных полей и сохранение связи с source map. bash scripts/check-observability.sh выполняется в CI: создаёт изолированные контейнеры/volumes, проверяет Compose, Prometheus, повторную подготовку баз, миграции приёмников и provisioning Grafana, затем удаляет только свои fixture-объекты. Он не должен запускаться против production Docker environment.

После выпуска отдельно проверяются реальные посещения, исходное место browser/server ошибки и свежие метрики. Source maps могут быть совместимы по типам API и при этом не соответствовать конкретному JS-файлу. Telegram не входит в критерии выпуска.

Контракт первого пилота SourceCraft проверяется без Docker и токенов:

python3 -m unittest discover -s scripts/tests -p test_sourcecraft_pilot.py

Тесты проверяют запрет локальной/PR-публикации, точный SHA и registry digest. Реальный CI, registry push/pull и HTTP на VPS проверяются по порядку пилота; локальные тесты их не заменяют.

Полные окружения

python3 -m unittest discover -s scripts/tests проверяет delivery manifest, свежесть SourceCraft control, provider/generation, TTL, cold/wake и LRU. node --test infra/strapi/scripts/tests/*.test.mjs включает published-only export/import, remapping media/relations, checksum/model fingerprint, отказ перезаписи редакторских данных и изолированную выдачу доступов. Локальные тесты не заменяют SourceCraft CI, экспорт production snapshot и проверки живых адресов всех сервисов.