#!/usr/bin/env sh set -eu app_env="$(printf '%s' "${APP_ENV:-development}" | tr '[:upper:]' '[:lower:]')" if [ -z "${VITE_ADMIN_PUBLIC_URL:-}" ] && [ -n "${ADMINFRONT_URL:-}" ]; then export VITE_ADMIN_PUBLIC_URL="$ADMINFRONT_URL" fi if [ -z "${VITE_ADMIN_PUBLIC_URL:-}" ] && [ -n "${ADMINFRONT_CALLBACK_URLS:-}" ]; then first_admin_callback="${ADMINFRONT_CALLBACK_URLS%%,*}" case "$first_admin_callback" in http://*/auth/callback | https://*/auth/callback) export VITE_ADMIN_PUBLIC_URL="${first_admin_callback%/auth/callback}" ;; esac fi case "$app_env" in production|prod|stage|staging) mode="production" ;; *) mode="development" ;; esac if [ "${1:-}" = "--print-admin-public-url" ]; then printf '%s\n' "${VITE_ADMIN_PUBLIC_URL:-}" exit 0 fi if [ "${1:-}" = "--print-mode" ]; then printf '%s\n' "$mode" exit 0 fi ensure_frontend_dependencies() { APP_PACKAGE_NAME="adminfront" # Detect workspace root if [ -f "/workspace/pnpm-workspace.yaml" ]; then WORKSPACE_ROOT="/workspace" elif [ -f "../../pnpm-workspace.yaml" ]; then WORKSPACE_ROOT="../.." else WORKSPACE_ROOT="" fi # Manage dependencies from the real workspace tree if possible, otherwise use current dir. if [ -n "$WORKSPACE_ROOT" ]; then WORKSPACE_DIR="$WORKSPACE_ROOT" LOCK_FILE="$WORKSPACE_ROOT/pnpm-lock.yaml" COMMON_PACKAGE_FILE="$WORKSPACE_ROOT/common/package.json" INSTALL_CMD="cd $WORKSPACE_ROOT && CI=true pnpm install --filter ${APP_PACKAGE_NAME}... --frozen-lockfile --ignore-scripts" elif [ -f "pnpm-lock.yaml" ]; then WORKSPACE_DIR="." LOCK_FILE="pnpm-lock.yaml" COMMON_PACKAGE_FILE="/workspace/common/package.json" INSTALL_CMD="CI=true pnpm install --frozen-lockfile --ignore-scripts" else WORKSPACE_DIR="." LOCK_FILE="package-lock.json" COMMON_PACKAGE_FILE="/workspace/common/package.json" INSTALL_CMD="npm ci" fi if [ ! -f "$WORKSPACE_DIR/package.json" ]; then return 0 fi lock_mode="" lock_file="$WORKSPACE_DIR/.baron-deps-install.lock" acquire_install_lock() { if command -v flock >/dev/null 2>&1; then lock_mode="flock" exec 9>"$lock_file" flock 9 trap 'release_install_lock' EXIT INT TERM return 0 fi lock_mode="mkdir" while ! mkdir "$lock_file" 2>/dev/null; do sleep 1 done trap 'release_install_lock' EXIT INT TERM } release_install_lock() { trap - EXIT INT TERM if [ "$lock_mode" = "flock" ]; then flock -u 9 || true exec 9>&- return 0 fi if [ "$lock_mode" = "mkdir" ]; then rmdir "$lock_file" >/dev/null 2>&1 || true fi } if command -v sha256sum >/dev/null 2>&1; then deps_hash="$(sha256sum "$WORKSPACE_DIR/package.json" "$LOCK_FILE" "$COMMON_PACKAGE_FILE" package.json 2>/dev/null | sha256sum | awk '{print $1}')" else deps_hash="$(cksum "$WORKSPACE_DIR/package.json" "$LOCK_FILE" "$COMMON_PACKAGE_FILE" package.json 2>/dev/null | cksum | awk '{print $1}')" fi deps_stamp="node_modules/.baron-deps-hash" installed_hash="$(cat "$deps_stamp" 2>/dev/null || true)" if [ "$installed_hash" != "$deps_hash" ]; then echo "Installing frontend dependencies..." acquire_install_lock if command -v sha256sum >/dev/null 2>&1; then deps_hash="$(sha256sum "$WORKSPACE_DIR/package.json" "$LOCK_FILE" "$COMMON_PACKAGE_FILE" package.json 2>/dev/null | sha256sum | awk '{print $1}')" else deps_hash="$(cksum "$WORKSPACE_DIR/package.json" "$LOCK_FILE" "$COMMON_PACKAGE_FILE" package.json 2>/dev/null | cksum | awk '{print $1}')" fi installed_hash="$(cat "$deps_stamp" 2>/dev/null || true)" if [ "$installed_hash" = "$deps_hash" ]; then release_install_lock return 0 fi eval "$INSTALL_CMD" mkdir -p node_modules printf '%s\n' "$deps_hash" > "$deps_stamp" release_install_lock fi } ensure_frontend_dependencies if [ "$mode" = "production" ]; then echo "Running in production mode with custom static server..." export ADMINFRONT_BUILD_OUT_DIR="${ADMINFRONT_BUILD_OUT_DIR:-/tmp/baron-sso-adminfront-dist}" exec sh -c "npm run build && node ./scripts/serve-prod.mjs" fi echo "Running in development mode..." exec npm run dev -- --host 0.0.0.0