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

Проверки, 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, webStrapi
typecheckПроверка типов workspace, Next typegenHTTP runtime-данные
lintOxlint с ошибкой на warning в apps packagesПолный lint CMS/Python/Bash
format:checkOxfmt в корне с ignore patternsПроверка смысла программы
testJest в webUI, настоящий 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Вывод
ContractsBase + declarationESM JavaScript и .d.ts в dist
FunctionsBase: NodeNext/ES2022/strictJavaScript в 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 @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 и не доказательство переноса редакционного контента. Детали.