- 新增文件必须使用 TypeScript (.ts/.tsx) - 禁止使用 fetch,提示使用 axios - 安装 husky 和 lint-staged 依赖 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
111 lines
3.4 KiB
Bash
Executable File
111 lines
3.4 KiB
Bash
Executable File
#!/bin/sh
|
||
|
||
# ============================================
|
||
# Git Pre-commit Hook
|
||
# ============================================
|
||
# 规则:
|
||
# 1. src 目录下新增的代码文件必须使用 TypeScript (.ts/.tsx)
|
||
# 2. 修改的代码不能使用 fetch,应使用 axios
|
||
# ============================================
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
YELLOW='\033[1;33m'
|
||
GREEN='\033[0;32m'
|
||
NC='\033[0m' # No Color
|
||
|
||
has_error=0
|
||
|
||
echo ""
|
||
echo "🔍 正在检查代码规范..."
|
||
echo ""
|
||
|
||
# ============================================
|
||
# 规则 1: 新文件必须使用 TypeScript
|
||
# ============================================
|
||
|
||
# 获取新增的文件(只检查 src 目录下的代码文件)
|
||
new_js_files=$(git diff --cached --name-only --diff-filter=A | grep -E '^src/.*\.(js|jsx)$' || true)
|
||
|
||
if [ -n "$new_js_files" ]; then
|
||
echo "${RED}❌ 错误: 发现新增的 JavaScript 文件${NC}"
|
||
echo "${YELLOW} 新文件必须使用 TypeScript (.ts/.tsx)${NC}"
|
||
echo ""
|
||
echo " 以下文件需要改为 TypeScript:"
|
||
echo "$new_js_files" | while read file; do
|
||
echo " - $file"
|
||
done
|
||
echo ""
|
||
echo " 💡 提示: 请将文件扩展名改为 .ts 或 .tsx"
|
||
echo ""
|
||
has_error=1
|
||
fi
|
||
|
||
# ============================================
|
||
# 规则 2: 禁止使用 fetch,应使用 axios
|
||
# ============================================
|
||
|
||
# 获取所有暂存的文件(新增 + 修改)
|
||
staged_files=$(git diff --cached --name-only --diff-filter=AM | grep -E '^src/.*\.(js|jsx|ts|tsx)$' || true)
|
||
|
||
if [ -n "$staged_files" ]; then
|
||
# 检查暂存内容中是否包含 fetch 调用
|
||
# 使用 git diff --cached 检查实际修改的内容
|
||
fetch_found=""
|
||
|
||
for file in $staged_files; do
|
||
# 检查该文件暂存的更改中是否有 fetch 调用
|
||
# 排除注释和字符串中的 fetch
|
||
# 匹配: fetch(, await fetch, .fetch(
|
||
fetch_matches=$(git diff --cached -U0 "$file" 2>/dev/null | grep -E '^\+.*[^a-zA-Z_]fetch\s*\(' | grep -v '^\+\s*//' || true)
|
||
|
||
if [ -n "$fetch_matches" ]; then
|
||
fetch_found="$fetch_found
|
||
$file"
|
||
fi
|
||
done
|
||
|
||
if [ -n "$fetch_found" ]; then
|
||
echo "${RED}❌ 错误: 检测到使用了 fetch API${NC}"
|
||
echo "${YELLOW} 请使用 axios 进行 HTTP 请求${NC}"
|
||
echo ""
|
||
echo " 以下文件包含 fetch 调用:"
|
||
echo "$fetch_found" | while read file; do
|
||
if [ -n "$file" ]; then
|
||
echo " - $file"
|
||
fi
|
||
done
|
||
echo ""
|
||
echo " 💡 修改建议:"
|
||
echo " ${GREEN}// 替换前${NC}"
|
||
echo " fetch('/api/data').then(res => res.json())"
|
||
echo ""
|
||
echo " ${GREEN}// 替换后${NC}"
|
||
echo " import axios from 'axios';"
|
||
echo " axios.get('/api/data').then(res => res.data)"
|
||
echo ""
|
||
has_error=1
|
||
fi
|
||
fi
|
||
|
||
# ============================================
|
||
# 检查结果
|
||
# ============================================
|
||
|
||
if [ $has_error -eq 1 ]; then
|
||
echo "${RED}========================================${NC}"
|
||
echo "${RED}提交被阻止,请修复以上问题后重试${NC}"
|
||
echo "${RED}========================================${NC}"
|
||
echo ""
|
||
exit 1
|
||
fi
|
||
|
||
echo "${GREEN}✅ 代码规范检查通过${NC}"
|
||
echo ""
|
||
|
||
# 运行 lint-staged(如果配置了)
|
||
# 可选:在 package.json 中添加 "lint-staged" 配置来启用代码格式化
|
||
# if [ -f "package.json" ] && grep -q '"lint-staged"' package.json; then
|
||
# npx lint-staged
|
||
# fi
|