build(npm): CONTENT-396 перевести заготовку на npm и закрыть смоуком точку входа - #19
Merged
Merged
Conversation
Заготовку копирует студент, а шаги проекта говорят про 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Тикет: 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 вернётся сюда следующей правкой.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 onceinitвозвращаетnullвместо разметкиexpect(markup).toContain("Hexlet Chat")vitestвзят третьей мажорной: четвёртая требует vite 6 и выше, а здесь стоит vite 5.Что осталось
Своим тикетом: устаревшие зависимости (
axios ^0.27.2,rollbar,lodash,react-scroll,concurrently, серверныйsocket.ioв клиенте) и README, который обещает авторизацию и каналы, которых в клиенте нет.