feat: Husky pre-push хуки с проверками качества кода

- Добавлен 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/
This commit is contained in:
Ilia Mashkov
2025-11-19 10:26:47 +03:00
parent 1318800f75
commit 4ea641b64e
6 changed files with 231 additions and 3 deletions

1
.gitignore vendored
View File

@@ -3,6 +3,7 @@
# Исключения (не игнорировать) # Исключения (не игнорировать)
!.gitignore !.gitignore
!.husky/
# Директории сборки # Директории сборки
/build /build

89
.husky/README.md Normal file
View File

@@ -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
```

18
.husky/pre-push Normal file
View File

@@ -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 "Все проверки пройдены успешно!"

106
HUSKY_SETUP.md Normal file
View File

@@ -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
```

View File

@@ -4,11 +4,14 @@
"description": "Modern React 19 + TypeScript 5 application", "description": "Modern React 19 + TypeScript 5 application",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"dev": "webpack serve --mode development", "dev": "webpack serve --env port=3000 --env mode=development",
"build": "webpack --mode production", "build:prod": "webpack --env mode=production",
"build:dev": "webpack --env mode=development",
"lint": "eslint src --ext .ts,.tsx", "lint": "eslint src --ext .ts,.tsx",
"lint:styles": "stylelint 'src/**/*.{css,scss}'", "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": [], "keywords": [],
"author": "", "author": "",
@@ -19,6 +22,7 @@
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.26.0", "@babel/core": "^7.26.0",
"husky": "^9.1.0",
"@babel/preset-env": "^7.26.0", "@babel/preset-env": "^7.26.0",
"@babel/preset-react": "^7.26.0", "@babel/preset-react": "^7.26.0",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.26.0",

10
pnpm-lock.yaml generated
View File

@@ -99,6 +99,9 @@ importers:
html-webpack-plugin: html-webpack-plugin:
specifier: ^5.6.0 specifier: ^5.6.0
version: 5.6.5(webpack@5.103.0) version: 5.6.5(webpack@5.103.0)
husky:
specifier: ^9.1.0
version: 9.1.7
mini-css-extract-plugin: mini-css-extract-plugin:
specifier: ^2.9.0 specifier: ^2.9.0
version: 2.9.4(webpack@5.103.0) version: 2.9.4(webpack@5.103.0)
@@ -2566,6 +2569,11 @@ packages:
resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
engines: {node: '>=8.0.0'} 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: hyperdyperid@1.2.0:
resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==}
engines: {node: '>=10.18'} engines: {node: '>=10.18'}
@@ -6925,6 +6933,8 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- debug - debug
husky@9.1.7: {}
hyperdyperid@1.2.0: {} hyperdyperid@1.2.0: {}
iconv-lite@0.4.24: iconv-lite@0.4.24: