#!/usr/bin/env bash set -u SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" REPO_ROOT="$(cd -- "$SCRIPT_DIR/.." && pwd -P)" FRONTEND_DIR="$REPO_ROOT/frontend" node_version_supported() { local version="$1" local major local minor [[ "$version" =~ ^v([0-9]+)\.([0-9]+)\.([0-9]+) ]] || return 1 major=$((10#${BASH_REMATCH[1]})) minor=$((10#${BASH_REMATCH[2]})) (( (major == 20 && minor >= 19) || (major == 22 && minor >= 12) || major >= 23 )) } if [[ ! -f "$FRONTEND_DIR/package.json" ]]; then echo "[ERROR] Frontend package.json was not found:" >&2 echo " $FRONTEND_DIR/package.json" >&2 exit 1 fi NODE_EXE="" NPM_EXE="" for candidate in "$REPO_ROOT"/.tools/node-*-linux-x64/bin; do if [[ -x "$candidate/node" && -x "$candidate/npm" ]]; then CANDIDATE_VERSION="$("$candidate/node" --version 2>/dev/null || true)" if node_version_supported "$CANDIDATE_VERSION"; then NODE_EXE="$candidate/node" NPM_EXE="$candidate/npm" PATH="$candidate:${PATH:-}" break fi fi done export PATH if [[ -z "$NODE_EXE" ]]; then NODE_EXE="$(command -v node || true)" NPM_EXE="$(command -v npm || true)" fi if [[ -z "$NODE_EXE" || -z "$NPM_EXE" ]]; then echo "[ERROR] Node.js and npm were not found." >&2 echo "Install Node.js 20.19+ or 22.12+ and make node/npm available on PATH." >&2 exit 1 fi NODE_VERSION="$("$NODE_EXE" --version 2>/dev/null || true)" if ! node_version_supported "$NODE_VERSION"; then echo "[ERROR] Unsupported Node.js version: $NODE_VERSION" >&2 echo "Vite requires Node.js 20.19+ or 22.12+ (Node.js 21 is not supported)." >&2 exit 1 fi if [[ ! -x "$FRONTEND_DIR/node_modules/.bin/vite" ]]; then echo "[ERROR] Frontend dependencies are not installed." >&2 echo "Run the following command first:" >&2 echo " cd \"$FRONTEND_DIR\" && \"$NPM_EXE\" ci" >&2 exit 1 fi cd "$FRONTEND_DIR" echo "Starting ReactFlow at http://127.0.0.1:5173" echo "Press Ctrl+C to stop the service." echo exec "$NPM_EXE" run dev -- --strictPort