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:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
# Исключения (не игнорировать)
|
# Исключения (не игнорировать)
|
||||||
!.gitignore
|
!.gitignore
|
||||||
|
!.husky/
|
||||||
|
|
||||||
# Директории сборки
|
# Директории сборки
|
||||||
/build
|
/build
|
||||||
|
|||||||
89
.husky/README.md
Normal file
89
.husky/README.md
Normal 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
18
.husky/pre-push
Normal 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
106
HUSKY_SETUP.md
Normal 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
|
||||||
|
```
|
||||||
10
package.json
10
package.json
@@ -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
10
pnpm-lock.yaml
generated
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user