#!/bin/bash # experiment.sh # Author: Matthew Raymer # Description: Build script for TimeSafari Electron application # This script handles the complete build process for the TimeSafari Electron app, # including web asset compilation and Capacitor sync. # # Build Process: # 1. Environment setup and dependency checks # 2. Web asset compilation (Vite) # 3. Capacitor sync # 4. Electron start # # Dependencies: # - Node.js and npm # - TypeScript # - Vite # - @capacitor-community/electron # # Usage: ./experiment.sh # # Exit Codes: # 1 - Required command not found # 2 - TypeScript installation failed # 3 - Build process failed # 4 - Capacitor sync failed # 5 - Electron start failed # Exit on any error set -e # ANSI color codes for better output formatting readonly RED='\033[0;31m' readonly GREEN='\033[0;32m' readonly YELLOW='\033[1;33m' readonly BLUE='\033[0;34m' readonly NC='\033[0m' # No Color # Logging functions log_info() { echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] [INFO]${NC} $1" } log_success() { echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] [SUCCESS]${NC} $1" } log_warn() { echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] [WARN]${NC} $1" } log_error() { echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] [ERROR]${NC} $1" } # Function to check if a command exists check_command() { if ! command -v "$1" &> /dev/null; then log_error "$1 is required but not installed." exit 1 fi log_info "Found $1: $(command -v "$1")" } # Function to measure and log execution time measure_time() { local start_time=$(date +%s) "$@" local end_time=$(date +%s) local duration=$((end_time - start_time)) log_success "Completed in ${duration} seconds" } # Print build header echo -e "\n${BLUE}=== TimeSafari Electron Build Process ===${NC}\n" log_info "Starting build process at $(date)" # Check required commands log_info "Checking required dependencies..." check_command node check_command npm check_command git # Create application data directory log_info "Setting up application directories..." mkdir -p ~/.local/share/TimeSafari/timesafari # Clean up previous builds log_info "Cleaning previous builds..." rm -rf dist* || log_warn "No previous builds to clean" # Set environment variables for the build log_info "Configuring build environment..." export VITE_PLATFORM=electron export VITE_PWA_ENABLED=false export VITE_DISABLE_PWA=true export DEBUG_MIGRATIONS=0 # Ensure TypeScript is installed log_info "Verifying TypeScript installation..." if [ ! -f "./node_modules/.bin/tsc" ]; then log_info "Installing TypeScript..." if ! npm install --save-dev typescript@~5.2.2; then log_error "TypeScript installation failed!" exit 2 fi # Verify installation if [ ! -f "./node_modules/.bin/tsc" ]; then log_error "TypeScript installation verification failed!" exit 2 fi log_success "TypeScript installed successfully" else log_info "TypeScript already installed" fi # Get git hash for versioning GIT_HASH=$(git log -1 --pretty=format:%h) log_info "Using git hash: ${GIT_HASH}" # Build web assets log_info "Building web assets with Vite..." if ! measure_time env VITE_GIT_HASH="$GIT_HASH" npx vite build --config vite.config.app.electron.mts --mode electron; then log_error "Web asset build failed!" exit 3 fi # Sync with Capacitor log_info "Syncing with Capacitor..." if ! measure_time npx cap sync electron; then log_error "Capacitor sync failed!" exit 4 fi # Restore capacitor config log_info "Restoring capacitor config..." if ! git checkout electron/capacitor.config.json; then log_error "Failed to restore capacitor config!" exit 4 fi # Start Electron log_info "Starting Electron..." cd electron/ if ! measure_time npm run electron:start; then log_error "Electron start failed!" exit 5 fi # Print build summary log_success "Build and start completed successfully!" echo -e "\n${GREEN}=== End of Build Process ===${NC}\n" # Exit with success exit 0