#!/bin/bash # Pre-Push Hook Script # Runs all checks locally before allowing push to remote set -e # Exit on any error echo "🚀 Running Pre-Push Checks..." echo "================================" # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Function to print colored output print_status() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # Check if we're in a git repository if ! git rev-parse --git-dir > /dev/null 2>&1; then print_error "Not in a git repository!" exit 1 fi # Get current branch CURRENT_BRANCH=$(git branch --show-current) print_status "Current branch: $CURRENT_BRANCH" # Check if there are uncommitted changes if ! git diff-index --quiet HEAD --; then print_error "You have uncommitted changes. Please commit or stash them first." exit 1 fi # 1. Install dependencies print_status "Installing dependencies..." if ! npm ci --silent; then print_error "Failed to install dependencies" exit 1 fi print_success "Dependencies installed" # 2. Run ESLint print_status "Running ESLint..." if ! npm run lint; then print_error "ESLint failed! Please fix the errors before pushing." exit 1 fi print_success "ESLint passed" # 3. Run Tests print_status "Running tests..." if ! npm run test; then print_error "Tests failed! Please fix the failing tests before pushing." exit 1 fi print_success "All tests passed" # 4. Build Application print_status "Building application..." if ! npm run build; then print_error "Build failed! Please fix the build errors before pushing." exit 1 fi print_success "Build successful" # 5. Security Audit print_status "Running security audit..." if ! npm audit --audit-level=moderate; then print_warning "Security vulnerabilities found. Consider running 'npm audit fix'" # Don't fail the push for security warnings, just warn fi # 6. Type Check print_status "Running TypeScript type check..." if ! npx tsc --noEmit; then print_error "TypeScript type check failed!" exit 1 fi print_success "TypeScript type check passed" echo "" echo "================================" print_success "All pre-push checks passed! ✅" print_status "Ready to push to $CURRENT_BRANCH" echo "================================" # Optional: Show what will be pushed echo "" print_status "Files to be pushed:" git diff --name-only origin/$CURRENT_BRANCH..HEAD 2>/dev/null || git diff --name-only HEAD~1..HEAD echo "" print_status "Proceeding with push..."