Проверки, TypeScript, Oxlint, Oxfmt и Jest
Оглавление · Далее: разбор проблем
Что выполняет pnpm check
Порядок закреплён в root package.json:
pnpm build
→ pnpm typecheck
→ pnpm lint
→ pnpm format:check
→ pnpm test
Команды связаны &&: при ошибке следующие не выполняются. Успешный check означает
успех этих конкретных проверок, а не готовность всей production-инфраструктуры.
| Команда | Смысл | Что не входит |
|---|---|---|
build | Рекурсивная сборка contracts, functions, web | Strapi |
typecheck | Проверка типов workspace, Next typegen | HTTP runtime-данные |
lint | Oxlint с ошибкой на warning в apps packages | Полный lint CMS/Python/Bash |
format:check | Oxfmt в корне с ignore patterns | Проверка смысла программы |
test | Jest в web | UI, настоящий Hatchet и Strapi |
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 |
| Functions | Base: NodeNext/ES2022/strict | JavaScript в 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 @gheilt/web test --watch
pnpm --filter @gheilt/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
и не доказательство переноса редакционного контента. Детали.