Skip to content

build(npm): CONTENT-396 перевести заготовку на npm и закрыть смоуком точку входа - #19

Merged
fey merged 1 commit into
mainfrom
content-396-npm
Sep 4, 2026
Merged

fey merged 1 commit into
mainfrom
content-396-npm

Conversation

@fey

@fey fey commented Sep 4, 2026 •

Copy link
Copy Markdown
Contributor

Тикет: CONTENT-396. Продолжение PR #18.

Зачем

Заготовку копирует студент, а шаги проекта по чату говорят про npm: npm create vite@latest ., npm i @hexlet/chat-server, npm run build. Пока здесь стоял pnpm, взявший заготовку получал менеджер пакетов, о котором задание не говорит. Сам проект с pnpm откатился ещё в июне (4fc4308 в frontend_l4_chat_project).

После #18 воркспейс распущен, поэтому от pnpm оставались только локфайл и allowBuilds — переход стал мелкой правкой.

Что сделано

  • pnpm-lock.yaml заменён на package-lock.json, packageManager снят.
  • pnpm-workspace.yaml удалён, а решения про install-скрипты переехали в поле allowScripts в package.json. Npm с 11-й версии гейтит postinstall так же, как pnpm, и без этого поля npm ci печатает предупреждение, а скрипты не выполняются. Решения перенесены один в один: esbuild разрешён (готовит нативный бинарь), @swc/core отклонён (его скрипт только проверяет биндинг, приезжает зависимостью i18next-cli). Версии не пиньются, иначе каждый бамп dependabot'ом давал бы новое предупреждение.
  • Makefile перешёл на npm ci, npm run build, npx start-server. В шапке файла записано, почему здесь npm: это заготовка учебного проекта, студент копирует её себе, и менеджер пакетов должен совпадать с тем, о котором говорят шаги. Иначе pnpm вернётся сюда следующей правкой.
  • В CI ушёл pnpm/action-setup, кеш setup-node переключён на npm.

Проверено

npm ci с чистого дерева, без предупреждений про install-скрипты. make build — 936 модулей. make lint зелёный. Смоук: make start отдаёт страницу чата из dist, API отвечает 401 без токена.

Смоук-тест

У заготовки не было проверок вовсе: CI гонял сборку, и комментарий в воркфлоу это признавал прямо. Сборка ловит поломанный импорт и отсутствующую зависимость, но не ловит главное — контракт, которым заготовка связана с проектом. Проверка проекта зовёт init со своим сокетом и рендерит то, что он вернул. Сломать это можно было незаметно, и ровно это и было: init сокета не принимал.

Тест повторяет тот же путь и проверяет две вещи: разметка отрендерилась и содержит заголовок чата, и init подписался на событие сокета, то есть параметр действительно используется. Рендер идёт через renderToString, поэтому ни браузера, ни jsdom не нужно, а react-dom уже в зависимостях. Прогон занимает 3 секунды, в CI добавлен шаг make test.

Тест не декорация, я его сломал в обе стороны:

Мутация Результат
init игнорирует сокет падает, expected "spy" to be called at least once
init возвращает null вместо разметки падает на expect(markup).toContain("Hexlet Chat")
откат обеих зелёный

vitest взят третьей мажорной: четвёртая требует vite 6 и выше, а здесь стоит vite 5.

Что осталось

Своим тикетом: устаревшие зависимости (axios ^0.27.2, rollbar, lodash, react-scroll, concurrently, серверный socket.io в клиенте) и README, который обещает авторизацию и каналы, которых в клиенте нет.

Заготовку копирует студент, а шаги проекта говорят про npm: `npm create vite`,
`npm i @hexlet/chat-server`, `npm run build`. Пока здесь стоял pnpm, взявший
заготовку получал менеджер пакетов, о котором задание не говорит. Причина
записана комментарием в Makefile, чтобы следующий читатель не вернул pnpm
обратно.

Воркспейс уже распущен предыдущей правкой, поэтому от pnpm оставались только
локфайл и allowBuilds. Локфайл заменён на package-lock.json, а решения про
install-скрипты переехали в поле allowScripts: npm с 11-й версии гейтит
postinstall так же, как pnpm. esbuild разрешён (готовит нативный бинарь),
@swc/core отклонён (его скрипт только проверяет биндинг) — то же, что стояло
в allowBuilds. Версии в allowScripts не пиньются, иначе каждый бамп
зависимости дал бы новое предупреждение.

В CI ушёл pnpm/action-setup, кеш setup-node переключён на npm.

Прогнано: npm ci с чистого дерева без предупреждений про install-скрипты,
make build (936 модулей), make lint, плюс смоук — make start отдаёт страницу
чата из dist, API отвечает 401 без токена.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fey
fey merged commit 37b421c into main Sep 4, 2026
2 checks passed
@fey fey changed the title build(npm): CONTENT-396 перевести заготовку с pnpm на npm build(npm): CONTENT-396 перевести заготовку на npm и закрыть смоуком точку входа Sep 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant