diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 2ed094a3..ca18ff86 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -8,6 +8,7 @@ on: jobs: lint: + name: Линтеры runs-on: ubuntu-latest steps: - name: Загрузка платформы @@ -21,14 +22,33 @@ jobs: # Шаги не прерывают друг друга: при падении видно все три отчёта сразу, # а не только первый упавший линтер. + # editorconfig-checker скачивает свой бинарник через GitHub API. Без # токена запрос неавторизованный, а лимит общий на IP раннера — прогоны # падали случайно, с «API rate limit exceeded» вместо ошибок разметки. + # + # Версия бинарника и формат вывода закреплены в npm-скрипте. Обёртка + # качает «latest», поэтому CI сам уехал на 4.0.0, а тот в GitHub Actions + # переключается на формат github-actions: файл и строка уходят в + # метаданные аннотации, и в логе остаётся голое «trailing whitespace». + # + # Подсказка печатается только если проверка дошла до отчёта: при упавшей + # загрузке бинарника совет искать пробелы уводит не туда. Пайплайн склеен + # с `exit 0` через `&&`, потому что шаг идёт в `bash -e`: без склейки + # падение проверки убьёт шаг до подсказки. - name: Проверка editorconfig if: ${{ !cancelled() }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: npm run editorconfig + run: | + set -o pipefail + npm run editorconfig 2>&1 | tee "$RUNNER_TEMP/editorconfig.log" && exit 0 + if grep -q 'errors found' "$RUNNER_TEMP/editorconfig.log"; then + echo + echo "Файлы выше расходятся с .editorconfig — правило, файл и строка указаны в отчёте." + echo "Локально тот же отчёт: npm run editorconfig. Простые случаи правит на месте npm run editorconfig -- --fix" + fi + exit 1 - name: Проверка линтером CSS if: ${{ !cancelled() }} run: npm run lint:css diff --git a/.gitignore b/.gitignore index a0804138..05293903 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,7 @@ interviews .cache .issues.json -# бинарник, который editorconfig-checker скачивает при запуске +# остатки старой обёртки editorconfig-checker, которая качала бинарник сюда bin .env diff --git a/AGENTS.md b/AGENTS.md index b25b01d6..e2200475 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -114,7 +114,7 @@ npm run build && npm run lint:html # валидация разметки, н `lint:html` проверяет по одной странице каждого типа, а не весь сайт: за разметку статей отвечает один шаблон `doc.njk`, и тысячная статья не скажет ничего, чего не сказала первая. Список страниц — в `scripts/lint-html.js`, при добавлении нового типа страницы его нужно пополнить. -`editorconfig-checker` при каждом запуске качает свой бинарник в `./bin/latest/`. Папка в `.gitignore`. +`editorconfig-checker` — это обёртка вокруг бинарника, который скачивается в `node_modules` при первом запуске и кешируется там до следующего `npm ci`. Обёртке нужна нода не ниже 24, как в `.nvmrc`: на более старой она падает с `TypeError` в минифицированном коде вместо отчёта о нарушениях. Версия закреплена в npm-скрипте переменной `EC_VERSION`: обёртка по умолчанию тянет `latest`, и тогда локально остаётся навсегда та версия, которую скачали однажды, а в CI приезжает свежая — отчёты расходятся. Формат вывода тоже задан явно (`--format gcc`): с версии 4 чекер сам переключается в CI на формат аннотаций GitHub, и в логе от ошибки остаётся один текст без файла и строки. Тесты лежат в `__tests__/` рядом с кодом, общие помощники — в `test/helpers/`. Покрытие пока тонкое, самое ценное место для новых тестов — трансформации: это чистые функции, html на входе и html на выходе. diff --git a/docs/deps.md b/docs/deps.md index b3d7c3d5..cf12eef9 100644 --- a/docs/deps.md +++ b/docs/deps.md @@ -29,12 +29,15 @@ npx npm-check-updates -u npm install ``` +У пакета `editorconfig-checker` версия бинарника закреплена отдельно, переменной `EC_VERSION` в npm-скрипте `editorconfig`. `npm outdated` показывает только версию обёртки, бинарник поднимается руками. + ## Разрешение конфликтов в файле _package-lock.json_ Иногда могут возникнуть конфликты слияния в Git для _package-lock.json_. Править руками этот файл можно лишь в исключительных ситуациях. Для разрешения конфликтов в этом файле можно использовать следующий алгоритм: -- правим конфликты (если есть) в файле _package.json_; +- правим конфликты (если есть) в файле _package.json_; + - вложенный пункт со сломанным отступом; - принимаем изменения в _package-lock.json_ из той ветки, которую вливаем в свою; - обновляем файл _package-lock.json_, выполнив команду `npm install`. diff --git a/package.json b/package.json index d3114d6c..646354cf 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "start": "cross-env-shell NODE_ENV=development NODE_OPTIONS=--max-old-space-size=8192 \"npm run make-links && eleventy --incremental --serve --quiet\"", "build": "cross-env-shell NODE_ENV=production \"npm run make-links && eleventy --quiet && npx gulp\"", "deploy": "cd dist && rsync -e 'ssh -i $HOME/.ssh/doka_deploy -o StrictHostKeyChecking=no' --exclude 'api.json' --exclude 'mail' --archive --progress --compress --delete . deploy@dev.doka.guide:$(echo $(grep 'SERVER_PATH' ../.env | cut -d '=' -f2))", - "editorconfig": "editorconfig-checker", + "editorconfig": "cross-env EC_VERSION=v4.0.1 editorconfig-checker --format gcc", "lint:css": "stylelint 'src/styles/**/*.css'", "lint:js": "eslint '**/*.js'", "lint:html": "node scripts/lint-html.js",