158 lines
3.9 KiB
Bash
Executable File
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
|