#!/usr/bin/env sh set -eu # Colors (disabled if not a terminal) if [ -t 1 ]; then RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' else RED='' GREEN='' YELLOW='' BLUE='' NC='' fi timestamp() { date -u +%Y-%m-%dT%H:%M:%SZ } log_info() { printf "💙 ${BLUE}[%s] [INFO]${NC} %s\n" "$(timestamp)" "$1" } log_success() { printf "💚 ${GREEN}[%s] [SUCCESS]${NC} %s\n" "$(timestamp)" "$1" } log_error() { printf "❤ ${RED}[%s] [ERROR]${NC} %s\n" "$(timestamp)" "$1" >&2 } log_warn() { printf "💛 ${YELLOW}[%s] [WARN]${NC} %s\n" "$(timestamp)" "$1" } cleanup() { log_warn "Received shutdown signal, cleaning up..." # Kill child processes jobs -p | xargs kill 2>/dev/null || true exit 130 } trap cleanup INT TERM # Pre-flight checks log_info "Starting Medusa development environment..." if find . -maxdepth 1 -mindepth 1 ! -uid "$UID" -print -quit | grep -q .; then echo "ERROR: files not owned by UID=$UID exist in current directory. If running in DEVELOPER_MODE, fill UID and GID of your user in .env file and rebuild" >&2 find . -maxdepth 1 -mindepth 1 ! -uid "$UID" -ls >&2 exit 1 fi if find . -maxdepth 1 -mindepth 1 ! -gid "$GID" -print -quit | grep -q .; then echo "ERROR: files not owned by GID=$GID exist in current directory. If running in DEVELOPER_MODE, fill UID and GID of your user in .env file and rebuild" >&2 find . -maxdepth 1 -mindepth 1 ! -gid "$GID" -ls >&2 exit 1 fi if [ ! -f "medusa-config.js" ]; then log_error "medusa-config.js not found. Are you in the Medusa project root?" exit 1 fi if [ ! -d "node_modules" ]; then log_error "node_modules/ not found. Run 'yarn install' first." exit 1 fi if [ -z "${DATABASE_URL:-}" ]; then log_error "DATABASE_URL environment variable is not set" exit 1 fi # Database connectivity check (optional, can be skipped with --skip-db-check) if [ "${1:-}" != "--skip-db-check" ]; then log_info "Checking database connectivity..." # Simple check using npx medusa (will fail if DB is unreachable) if ! npx medusa db:check 2>/dev/null; then log_warn "Database connectivity check failed (this is OK if db:check doesn't exist)" else log_success "Database is reachable" fi fi # Run migrations log_info "Running database migrations..." start_time=$(date +%s) if npx medusa db:migrate; then migration_time=$(($(date +%s) - start_time)) log_success "Migrations completed in ${migration_time}s" else log_error "Migration failed" exit 1 fi # Create admin user if credentials are provided if [ -n "${ADMIN_LOGIN:-}" ] && [ -n "${ADMIN_PASSWORD:-}" ]; then log_info "Creating admin user with email: ${ADMIN_LOGIN}..." if npx medusa user -e "${ADMIN_LOGIN}" -p "${ADMIN_PASSWORD}"; then log_success "Admin user created successfully" else log_warn "Admin user creation failed (user may already exist)" fi elif [ -n "${ADMIN_LOGIN:-}" ] || [ -n "${ADMIN_PASSWORD:-}" ]; then log_warn "Both ADMIN_LOGIN and ADMIN_PASSWORD must be set to create admin user" fi # Start development server log_info "Starting Medusa development server..." log_info "Press Ctrl+C to stop" npx medusa develop