Files
ripster/start.sh

158 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd -- "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$ROOT_DIR"
USE_NODE20_NPX=0
normalize_semver() {
local version="$1"
echo "${version#v}" | sed -E 's/[^0-9.].*$//'
}
version_gte() {
local current required
local c_major c_minor c_patch r_major r_minor r_patch
current=$(normalize_semver "$1")
required=$(normalize_semver "$2")
IFS='.' read -r c_major c_minor c_patch <<< "$current"
IFS='.' read -r r_major r_minor r_patch <<< "$required"
c_major=${c_major:-0}
c_minor=${c_minor:-0}
c_patch=${c_patch:-0}
r_major=${r_major:-0}
r_minor=${r_minor:-0}
r_patch=${r_patch:-0}
if (( c_major > r_major )); then return 0; fi
if (( c_major < r_major )); then return 1; fi
if (( c_minor > r_minor )); then return 0; fi
if (( c_minor < r_minor )); then return 1; fi
if (( c_patch >= r_patch )); then return 0; fi
return 1
}
load_nvm_if_available() {
if command -v nvm >/dev/null 2>&1; then
return 0
fi
export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
if [[ -s "$NVM_DIR/nvm.sh" ]]; then
# shellcheck source=/dev/null
. "$NVM_DIR/nvm.sh" >/dev/null 2>&1
fi
command -v nvm >/dev/null 2>&1
}
try_use_project_node() {
local project_root="$1"
local required_version="$2"
local current_version
current_version=$(node -v 2>/dev/null || true)
if [[ -n "$current_version" ]] && version_gte "$current_version" "$required_version"; then
return 0
fi
if ! load_nvm_if_available; then
return 1
fi
pushd "$project_root" >/dev/null
if [[ -f ".nvmrc" ]]; then
nvm use --silent >/dev/null 2>&1 || true
fi
popd >/dev/null
current_version=$(node -v 2>/dev/null || true)
if [[ -n "$current_version" ]] && version_gte "$current_version" "$required_version"; then
echo "Projekt-Node aktiviert: ${current_version}"
return 0
fi
return 1
}
ensure_minimum_node_version() {
local project_root="$1"
local min_version="20.19.0"
local current_version
local switched=0
if ! command -v node >/dev/null 2>&1; then
echo "Node.js wurde nicht gefunden. Bitte Node.js >= ${min_version} installieren."
return 1
fi
if try_use_project_node "$project_root" "$min_version"; then
switched=1
fi
current_version=$(node -v 2>/dev/null || true)
if [[ -z "$current_version" ]]; then
echo "Konnte die Node.js-Version nicht ermitteln."
return 1
fi
if ! version_gte "$current_version" "$min_version"; then
if (( switched == 0 )) && load_nvm_if_available; then
echo "Node.js ${current_version} erkannt. Versuche automatische Aktivierung von ${min_version} via nvm ..."
nvm install "${min_version}" >/dev/null
nvm use "${min_version}" >/dev/null
current_version=$(node -v 2>/dev/null || true)
fi
if ! version_gte "$current_version" "$min_version"; then
if command -v npx >/dev/null 2>&1; then
echo "Node.js ${current_version} erkannt. Nutze node@20 Fallback via npx."
if npx -y node@20 -v >/dev/null 2>&1; then
USE_NODE20_NPX=1
return 0
fi
fi
echo "Node.js ${current_version} erkannt. Erforderlich: >= ${min_version}."
echo "Projektlokal:"
echo "nvm install ${min_version} && nvm use"
return 1
fi
fi
}
run_npm() {
if (( USE_NODE20_NPX == 1 )); then
npx -y node@20 "$(command -v npm)" "$@"
else
npm "$@"
fi
}
ensure_minimum_node_version "$ROOT_DIR"
if [[ ! -d "$ROOT_DIR/node_modules" ]]; then
echo "Installiere Abhaengigkeiten in $ROOT_DIR ..."
run_npm install
fi
if [[ ! -d "$ROOT_DIR/backend/node_modules" ]]; then
echo "Installiere Abhaengigkeiten in $ROOT_DIR/backend ..."
run_npm --prefix backend install
fi
if [[ ! -d "$ROOT_DIR/frontend/node_modules" ]]; then
echo "Installiere Abhaengigkeiten in $ROOT_DIR/frontend ..."
run_npm --prefix frontend install
fi
echo "Starte Ripster Dev-Umgebung ..."
if (( USE_NODE20_NPX == 1 )); then
exec npx -y node@20 "$(command -v npm)" run dev
else
exec npm run dev
fi