Проверки, 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, docs | Strapi |
typecheck | Проверка типов workspace, Next typegen | HTTP runtime-данные |
lint | Oxlint с ошибкой на warning в apps packages | Полный lint CMS/Python/Bash |
format:check | Oxfmt в корне с 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 | Вывод |
|---|---|---|
| Contracts | Base + declaration | ESM JavaScript и .d.ts в dist |
| Web | Next config, bundler resolution, noEmit | Next сборка, 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 и проверки живых адресов всех сервисов.