From 4ea641b64e71772378348abf82f6b8f05fe84dac Mon Sep 17 00:00:00 2001 From: Ilia Mashkov Date: Wed, 19 Nov 2025 10:26:47 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20Husky=20pre-push=20=D1=85=D1=83=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=81=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D0=BA=D0=B0=D1=87=D0=B5=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлен Husky 9 с pre-push хуком - Проверки: type-check, lint, lint:styles, build:prod - Новые скрипты: build:prod, build:dev с env переменными - Обновлен dev скрипт для использования env переменных - Добавлена документация (.husky/README.md, HUSKY_SETUP.md) - Обновлен .gitignore для включения .husky/ --- .gitignore | 1 + .husky/README.md | 89 +++++++++++++++++++++++++++++++++++++++ .husky/pre-push | 18 ++++++++ HUSKY_SETUP.md | 106 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 10 +++-- pnpm-lock.yaml | 10 +++++ 6 files changed, 231 insertions(+), 3 deletions(-) create mode 100644 .husky/README.md create mode 100644 .husky/pre-push create mode 100644 HUSKY_SETUP.md diff --git a/.gitignore b/.gitignore index 1bbcc1c..b1e1d90 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ # Исключения (не игнорировать) !.gitignore +!.husky/ # Директории сборки /build diff --git a/.husky/README.md b/.husky/README.md new file mode 100644 index 0000000..347e824 --- /dev/null +++ b/.husky/README.md @@ -0,0 +1,89 @@ +# Husky Git Hooks + +## Описание + +Husky используется для автоматического запуска проверок перед выполнением git операций. + +## Настроенные хуки + +### pre-push + +Запускается автоматически перед `git push` и выполняет следующие проверки: + +1. **Проверка типов TypeScript** (`pnpm type-check`) + - Проверяет корректность типов во всех TypeScript файлах + - Использует `tsc --noEmit` (компиляция без генерации файлов) + +2. **Проверка ESLint** (`pnpm lint`) + - Проверяет качество кода JavaScript/TypeScript + - Проверяет соблюдение правил для React, Hooks, доступности + +3. **Проверка Stylelint** (`pnpm lint:styles`) + - Проверяет качество CSS/SCSS кода + - Проверяет порядок свойств и селекторов + +4. **Production сборка** (`pnpm build:prod`) + - Проверяет, что проект успешно собирается для production + - Гарантирует отсутствие ошибок сборки перед push + +## Установка + +После клонирования репозитория выполните: + +```bash +pnpm install +``` + +Husky автоматически установится благодаря скрипту `prepare` в package.json. + +## Пропуск проверок (не рекомендуется) + +Если необходимо пропустить проверки (например, для срочного фикса): + +```bash +git push --no-verify +``` + +**Внимание:** Используйте эту опцию только в крайних случаях! + +## Ручной запуск проверок + +Вы можете запустить все проверки вручную: + +```bash +pnpm pre-push +``` + +Или по отдельности: + +```bash +pnpm type-check # Проверка типов +pnpm lint # Проверка ESLint +pnpm lint:styles # Проверка Stylelint +``` + +## Исправление ошибок + +### Автоматическое исправление ESLint + +```bash +pnpm lint --fix +``` + +### Автоматическое исправление Stylelint + +```bash +pnpm lint:styles --fix +``` + +## Отключение хуков + +Если нужно временно отключить хуки: + +```bash +# Удалить хуки +rm -rf .husky + +# Восстановить хуки +pnpm prepare +``` diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100644 index 0000000..15fcede --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,18 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +echo "Запуск проверок перед push..." + +echo "Проверка типов TypeScript..." +pnpm type-check || exit 1 + +echo "Проверка ESLint..." +pnpm lint || exit 1 + +echo "Проверка Stylelint..." +pnpm lint:styles || exit 1 + +echo "Production сборка..." +pnpm build:prod || exit 1 + +echo "Все проверки пройдены успешно!" diff --git a/HUSKY_SETUP.md b/HUSKY_SETUP.md new file mode 100644 index 0000000..a4d3237 --- /dev/null +++ b/HUSKY_SETUP.md @@ -0,0 +1,106 @@ +# Инструкция по настройке Husky + +## Автоматическая установка + +После клонирования репозитория выполните: + +```bash +pnpm install +``` + +Husky автоматически установится и настроит хуки благодаря скрипту `prepare`. + +## Ручная настройка (если требуется) + +Если хуки не работают, выполните следующие команды: + +### 1. Сделать файл хука исполняемым + +```bash +chmod +x .husky/pre-push +``` + +### 2. Инициализировать Husky + +```bash +pnpm prepare +``` + +## Проверка работы + +Попробуйте сделать коммит и push: + +```bash +git add . +git commit -m "test: проверка husky" +git push +``` + +Перед push должны запуститься проверки: +- Проверка типов TypeScript +- Проверка ESLint +- Проверка Stylelint + +## Что делать, если проверки не проходят + +### Проверка типов TypeScript + +```bash +pnpm type-check +``` + +Исправьте ошибки типов в коде. + +### Проверка ESLint + +```bash +# Показать ошибки +pnpm lint + +# Автоматически исправить +pnpm lint --fix +``` + +### Проверка Stylelint + +```bash +# Показать ошибки +pnpm lint:styles + +# Автоматически исправить +pnpm lint:styles --fix +``` + +## Пропуск проверок (крайний случай) + +```bash +git push --no-verify +``` + +Используйте только в экстренных ситуациях! + +## Отладка + +Если хуки не запускаются: + +1. Проверьте, что файл существует: + ```bash + ls -la .husky/pre-push + ``` + +2. Проверьте права доступа: + ```bash + chmod +x .husky/pre-push + ``` + +3. Проверьте содержимое: + ```bash + cat .husky/pre-push + ``` + +4. Переустановите Husky: + ```bash + rm -rf .husky + pnpm prepare + chmod +x .husky/pre-push + ``` diff --git a/package.json b/package.json index b780755..0b25acc 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,14 @@ "description": "Modern React 19 + TypeScript 5 application", "main": "index.js", "scripts": { - "dev": "webpack serve --mode development", - "build": "webpack --mode production", + "dev": "webpack serve --env port=3000 --env mode=development", + "build:prod": "webpack --env mode=production", + "build:dev": "webpack --env mode=development", "lint": "eslint src --ext .ts,.tsx", "lint:styles": "stylelint 'src/**/*.{css,scss}'", - "type-check": "tsc --noEmit" + "type-check": "tsc --noEmit", + "prepare": "husky", + "pre-push": "pnpm type-check && pnpm lint && pnpm lint:styles && pnpm build:prod" }, "keywords": [], "author": "", @@ -19,6 +22,7 @@ }, "devDependencies": { "@babel/core": "^7.26.0", + "husky": "^9.1.0", "@babel/preset-env": "^7.26.0", "@babel/preset-react": "^7.26.0", "@babel/preset-typescript": "^7.26.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b4afea5..8954b56 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -99,6 +99,9 @@ importers: html-webpack-plugin: specifier: ^5.6.0 version: 5.6.5(webpack@5.103.0) + husky: + specifier: ^9.1.0 + version: 9.1.7 mini-css-extract-plugin: specifier: ^2.9.0 version: 2.9.4(webpack@5.103.0) @@ -2566,6 +2569,11 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + hyperdyperid@1.2.0: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} @@ -6925,6 +6933,8 @@ snapshots: transitivePeerDependencies: - debug + husky@9.1.7: {} + hyperdyperid@1.2.0: {} iconv-lite@0.4.24: