Sometimes you need a reset.
Especially with npm/pnpm.
This script will do that.
#!/bin/bash
set -euo pipefail
# Colors
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
timestamp() {
date +"%Y-%m-%d %H:%M:%S"
}
log_success() {
echo -e "${GREEN}[$(timestamp)] ✅ $1${NC}"
}
log_error() {
echo -e "${RED}[$(timestamp)] ❌ $1${NC}"
}
log_step() {
echo -e "${YELLOW}[$(timestamp)] ➡️ $1${NC}"
}
# Check dependencies
command -v pnpm >/dev/null 2>&1 || { log_error "pnpm is not installed. Aborting."; exit 1; }
command -v node >/dev/null 2>&1 || { log_error "node is not installed. Aborting."; exit 1; }
# Flags
SKIP_HOOKS=false
NO_BUILD=false
for arg in "$@"; do
case $arg in
--skip-hooks) SKIP_HOOKS=true ;;
--no-build) NO_BUILD=true ;;
*) ;;
esac
done
clear
log_step "🔧 Starting pnpm purge and rebuild..."
log_step "🖥 Stopping servers..."
echo "🛑 Attempting to stop Next.js dev server..."
SELF_PID=$$
PIDS=$(pgrep -f "next dev" | grep -v "$SELF_PID")
echo "🛑 Attempting to stop Next.js development server (pnpm dev)..."
pkill -f "pnpm dev" &> /dev/null
echo "🛑 Stop command issued for 'pnpm dev' process."
if [ -z "$PIDS" ]; then
echo "✅ No running Next.js dev processes found."; echo ""
exit 0
fi
echo "📋 Processes to be stopped:"; echo ""
ps -fp $PIDS
# Kill the processes
echo "$PIDS" | xargs kill; echo ""
# Wait and re-check
sleep 1
if pgrep -f "next dev" > /dev/null; then
echo "❌ Some processes are still running. Trying kill -9..."
echo "$PIDS" | xargs kill -9; echo ""
else
echo "✅ Successfully stopped all Next.js dev processes."; echo ""
fi
# Backup step
log_step "📦 Backing up package.json and lock file..."
cp package.json package.json.bak 2>/dev/null || true
cp pnpm-lock.yaml pnpm-lock.yaml.bak 2>/dev/null || true
log_success "Backup created."
log_step "🧹 Removing .next directory..."
rm -rf .next && log_success ".next directory removed."
log_step "🧹 Removing node_modules directory..."
rm -rf node_modules && log_success "node_modules removed."
log_step "🔍 Checking for outdated packages..."
pnpm outdated || log_error "Some packages are outdated."
echo -e "${YELLOW}[*] To upgrade, run: npx npm-check-updates -u && pnpm install${NC}"
read -r -p "[?] Continue with current versions? (press enter to proceed)"
log_step "🧾 Removing pnpm-lock.yaml..."
rm -f pnpm-lock.yaml && log_success "Lock file removed."
log_step "🧽 Pruning PNPM store..."
pnpm store prune && log_success "Store pruned."
log_step "📥 Installing dependencies..."
pnpm install && log_success "Dependencies installed."
if [ "$SKIP_HOOKS" = false ]; then
if [ -f scripts/setup-hook.mjs ]; then
log_step "🪝 Setting up pre-commit hooks..."
node scripts/setup-hook.mjs && log_success "Pre-commit hook set up."
else
log_error "Hook script not found. Skipping."
fi
fi
if [ "$NO_BUILD" = false ]; then
log_step "🏗 Building the project..."
pnpm build && log_success "Project built."
else
log_step "🛑 Build skipped by --no-build"
fi
log_success "🎉 All steps completed successfully."