87 lines
3.0 KiB
Bash
Executable File
87 lines
3.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# HOT-Step CPP — macOS Development Mode
|
|
#
|
|
# Starts Vite dev server (hot-reload UI) + Node.js server (tsx watch).
|
|
# Automatically finds a compatible Node.js.
|
|
#
|
|
# Usage:
|
|
# ./dev.sh
|
|
|
|
set -e
|
|
|
|
cd "$(dirname "$0")"
|
|
ROOT_DIR="$(pwd)"
|
|
|
|
echo ""
|
|
echo "╔══════════════════════════════════════════╗"
|
|
echo "║ HOT-Step 9000 ⚡ DEV MODE ║"
|
|
echo "║ Vite HMR + tsx watch ║"
|
|
echo "╚══════════════════════════════════════════╝"
|
|
echo ""
|
|
|
|
# ── Find Node.js ────────────────────────────────────────────────────
|
|
find_node() {
|
|
if [ -x "${ROOT_DIR}/runtime/node" ]; then
|
|
echo "${ROOT_DIR}/runtime"; return 0
|
|
fi
|
|
for bp in "/opt/homebrew/opt/node@22/bin" "/usr/local/opt/node@22/bin"; do
|
|
if [ -x "${bp}/node" ]; then echo "$bp"; return 0; fi
|
|
done
|
|
if command -v node &>/dev/null; then
|
|
local ver; ver="$(node --version 2>/dev/null | tr -d 'v')"
|
|
local major="${ver%%.*}"
|
|
if [ "$major" -ge 18 ] && [ "$major" -lt 24 ] 2>/dev/null; then
|
|
echo "$(dirname "$(command -v node)")"; return 0
|
|
fi
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
NODE_DIR=""
|
|
if NODE_DIR=$(find_node); then
|
|
export PATH="${NODE_DIR}:${PATH}"
|
|
echo " Node.js: $(node --version)"
|
|
else
|
|
echo "❌ No compatible Node.js found (need 18-22)."
|
|
echo " Fix: brew install node@22"
|
|
exit 1
|
|
fi
|
|
|
|
# ── Install deps if needed ───────────────────────────────────────────
|
|
if [ ! -d "server/node_modules" ]; then
|
|
echo "📦 Installing server dependencies..."
|
|
cd server && npm install --loglevel=warn && cd ..
|
|
fi
|
|
if [ ! -d "ui/node_modules" ]; then
|
|
echo "📦 Installing UI dependencies..."
|
|
cd ui && npm install --loglevel=warn && cd ..
|
|
fi
|
|
|
|
# ── Cleanup on exit ──────────────────────────────────────────────────
|
|
cleanup() {
|
|
echo ""
|
|
echo "[dev.sh] Shutting down..."
|
|
if [ -n "${VITE_PID}" ] && kill -0 "${VITE_PID}" 2>/dev/null; then
|
|
kill "${VITE_PID}" 2>/dev/null || true
|
|
echo "[dev.sh] Vite stopped"
|
|
fi
|
|
}
|
|
trap cleanup EXIT INT TERM
|
|
|
|
# ── Start Vite (background) ─────────────────────────────────────────
|
|
echo "🚀 Starting Vite dev server..."
|
|
cd ui
|
|
npx vite &
|
|
VITE_PID=$!
|
|
cd ..
|
|
|
|
sleep 2
|
|
|
|
# ── Start Node server (foreground) ──────────────────────────────────
|
|
echo "🚀 Starting Node.js server..."
|
|
echo " UI: http://localhost:3000 (Vite HMR)"
|
|
echo " API: http://localhost:3001"
|
|
echo ""
|
|
cd server
|
|
npx tsx watch src/index.ts
|