# Makefile for Medication Reminder App # Check if variables are set in environment, otherwise use .env or defaults ifndef APP_NAME ifndef DOCKER_IMAGE # Include environment variables from .env file if it exists -include .env endif endif # Set defaults if not defined anywhere APP_NAME ?= meds-app DOCKER_IMAGE ?= $(APP_NAME):latest export .PHONY: help install clean dev build test docker-build docker-buildx docker-run docker-clean info couchdb-up couchdb-down # Default target .DEFAULT_GOAL := help ##@ General info: ## Show project information @echo "Project Information:" @echo " Name: $(APP_NAME)" @echo " Docker Image: $(DOCKER_IMAGE)" @echo " Node Version: $(shell node --version 2>/dev/null || echo 'not installed')" @echo " Bun Version: $(shell bun --version 2>/dev/null || echo 'not installed')" @echo "" help: ## Display available commands @echo "$(APP_NAME) - Make Commands" @echo "" @echo "Environment Variables:" @echo " APP_NAME Application name (default: meds-app)" @echo " DOCKER_IMAGE Docker image name (default: $(APP_NAME):latest)" @echo " Variables can be set in .env file or environment" @echo "" @awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " %-20s %s\n", $$1, $$2 } /^##@/ { printf "\n%s\n", substr($$0, 5) } ' $(MAKEFILE_LIST) install: ## Install dependencies @echo "Installing dependencies for $(APP_NAME)..." @bun install clean: ## Clean build artifacts and dependencies @echo "Cleaning up $(APP_NAME) artifacts..." @rm -rf node_modules dist build .cache ##@ Development dev: ## Start development server @echo "Starting $(APP_NAME) development server..." @bun run dev build: ## Build the application @echo "Building $(APP_NAME) application..." @bun run build ##@ Testing test: ## Run unit tests @echo "Running $(APP_NAME) unit tests..." @bun run test test-watch: ## Run unit tests in watch mode @echo "Running $(APP_NAME) tests in watch mode..." @bun run test:watch ##@ Docker docker-build: ## Build Docker image for local development @echo "Building Docker image for $(APP_NAME): $(DOCKER_IMAGE)" @docker build \ --build-arg NODE_ENV=production \ --build-arg VITE_COUCHDB_URL=$${VITE_COUCHDB_URL} \ --build-arg VITE_COUCHDB_USER=$${VITE_COUCHDB_USER} \ --build-arg VITE_COUCHDB_PASSWORD=$${VITE_COUCHDB_PASSWORD} \ -t $(DOCKER_IMAGE) . docker-buildx: ## Build multi-arch image with buildx (set PUSH=true to push) @echo "Building multi-arch Docker image for $(APP_NAME): $(DOCKER_IMAGE)" @docker buildx build --platform linux/amd64,linux/arm64 \ --build-arg NODE_ENV=production \ --build-arg VITE_COUCHDB_URL=$${VITE_COUCHDB_URL} \ --build-arg VITE_COUCHDB_USER=$${VITE_COUCHDB_USER} \ --build-arg VITE_COUCHDB_PASSWORD=$${VITE_COUCHDB_PASSWORD} \ -t $(DOCKER_IMAGE) $$([ "$${PUSH}" = "true" ] && echo "--push") . docker-run: ## Build and run Docker container @echo "Building and running $(APP_NAME) container: $(DOCKER_IMAGE)" @docker stop $(APP_NAME)-container 2>/dev/null || true @docker rm $(APP_NAME)-container 2>/dev/null || true @make docker-build @docker run --rm -p 8080:80 --name $(APP_NAME)-container $(DOCKER_IMAGE) docker-clean: ## Clean Docker resources and containers @echo "Cleaning Docker resources for $(APP_NAME)..." @docker stop $(APP_NAME)-container 2>/dev/null || true @docker rm $(APP_NAME)-container 2>/dev/null || true @docker rmi $(DOCKER_IMAGE) 2>/dev/null || true @docker image prune -f 2>/dev/null || true @docker container prune -f 2>/dev/null || true ##@ Test Services couchdb-up: ## Start local CouchDB for integration tests @echo "Starting CouchDB test service..." @docker compose -f docker-compose.ci.yml up -d couchdb @echo "CouchDB is starting at http://localhost:$${VITE_COUCHDB_PORT:-5984}" @echo "Export credentials for tests if needed:" @echo " export VITE_COUCHDB_URL=http://localhost:$${VITE_COUCHDB_PORT:-5984}" @echo " export VITE_COUCHDB_USER=$${VITE_COUCHDB_USER:-admin}" @echo " export VITE_COUCHDB_PASSWORD=$${VITE_COUCHDB_PASSWORD:-password}" couchdb-down: ## Stop CouchDB test service and remove volume @echo "Stopping CouchDB test service and removing volume..." @docker compose -f docker-compose.ci.yml down -v