@idealyst/cli 1.0.28 โ†’ 1.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/index.js +96 -35
  2. package/dist/types/generators/utils.d.ts +1 -0
  3. package/package.json +9 -5
  4. package/templates/api/__tests__/api.test.ts +26 -0
  5. package/templates/api/jest.config.js +23 -0
  6. package/templates/api/jest.setup.js +9 -0
  7. package/templates/api/package.json +6 -0
  8. package/templates/native/__tests__/App.test.tsx +156 -0
  9. package/templates/native/__tests__/components.test.tsx +300 -0
  10. package/templates/native/jest.config.js +21 -0
  11. package/templates/native/jest.setup.js +12 -0
  12. package/templates/native/package.json +34 -0
  13. package/templates/shared/__tests__/shared.test.ts +39 -0
  14. package/templates/shared/jest.config.js +22 -0
  15. package/templates/shared/package.json +10 -0
  16. package/templates/shared/rollup.config.js +43 -0
  17. package/templates/web/__tests__/App.test.tsx +342 -0
  18. package/templates/web/__tests__/components.test.tsx +564 -0
  19. package/templates/web/jest.config.js +27 -0
  20. package/templates/web/jest.setup.js +24 -0
  21. package/templates/web/package.json +11 -1
  22. package/templates/workspace/.devcontainer/devcontainer.json +150 -0
  23. package/templates/workspace/.devcontainer/post-create.sh +129 -0
  24. package/templates/workspace/.dockerignore +151 -0
  25. package/templates/workspace/.env.example +36 -0
  26. package/templates/workspace/.env.production +56 -0
  27. package/templates/workspace/DOCKER.md +385 -0
  28. package/templates/workspace/Dockerfile +100 -0
  29. package/templates/workspace/README.md +93 -0
  30. package/templates/workspace/docker/nginx/prod.conf +238 -0
  31. package/templates/workspace/docker/nginx.conf +131 -0
  32. package/templates/workspace/docker/postgres/init.sql +41 -0
  33. package/templates/workspace/docker/prometheus/prometheus.yml +52 -0
  34. package/templates/workspace/docker-compose.prod.yml +146 -0
  35. package/templates/workspace/docker-compose.yml +144 -0
  36. package/templates/workspace/jest.config.js +20 -0
  37. package/templates/workspace/package.json +11 -1
  38. package/templates/workspace/scripts/docker/db-backup.sh +230 -0
  39. package/templates/workspace/scripts/docker/deploy.sh +212 -0
  40. package/templates/workspace/scripts/test-runner.js +120 -0
  41. package/templates/workspace/setup.sh +205 -0
@@ -0,0 +1,144 @@
1
+ version: '3.8'
2
+
3
+ services:
4
+ # PostgreSQL Database
5
+ postgres:
6
+ image: postgres:15-alpine
7
+ container_name: ${PROJECT_NAME:-idealyst}-postgres
8
+ environment:
9
+ POSTGRES_DB: ${POSTGRES_DB:-idealyst_db}
10
+ POSTGRES_USER: ${POSTGRES_USER:-postgres}
11
+ POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
12
+ ports:
13
+ - "${POSTGRES_PORT:-5432}:5432"
14
+ volumes:
15
+ - postgres_data:/var/lib/postgresql/data
16
+ - ./docker/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql
17
+ healthcheck:
18
+ test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres}"]
19
+ interval: 30s
20
+ timeout: 10s
21
+ retries: 5
22
+ networks:
23
+ - idealyst-network
24
+
25
+ # Redis Cache
26
+ redis:
27
+ image: redis:7-alpine
28
+ container_name: ${PROJECT_NAME:-idealyst}-redis
29
+ ports:
30
+ - "${REDIS_PORT:-6379}:6379"
31
+ volumes:
32
+ - redis_data:/data
33
+ healthcheck:
34
+ test: ["CMD", "redis-cli", "ping"]
35
+ interval: 30s
36
+ timeout: 10s
37
+ retries: 5
38
+ networks:
39
+ - idealyst-network
40
+
41
+ # API Service
42
+ api:
43
+ build:
44
+ context: .
45
+ dockerfile: Dockerfile
46
+ target: api-runner
47
+ container_name: ${PROJECT_NAME:-idealyst}-api
48
+ environment:
49
+ NODE_ENV: ${NODE_ENV:-production}
50
+ PORT: 3001
51
+ DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-idealyst_db}
52
+ REDIS_URL: redis://redis:6379
53
+ ports:
54
+ - "${API_PORT:-3001}:3001"
55
+ depends_on:
56
+ postgres:
57
+ condition: service_healthy
58
+ redis:
59
+ condition: service_healthy
60
+ volumes:
61
+ - ./uploads:/app/uploads
62
+ restart: unless-stopped
63
+ healthcheck:
64
+ test: ["CMD", "curl", "-f", "http://localhost:3001/health"]
65
+ interval: 30s
66
+ timeout: 10s
67
+ retries: 5
68
+ networks:
69
+ - idealyst-network
70
+
71
+ # Web Application
72
+ web:
73
+ build:
74
+ context: .
75
+ dockerfile: Dockerfile
76
+ target: web-runner
77
+ container_name: ${PROJECT_NAME:-idealyst}-web
78
+ ports:
79
+ - "${WEB_PORT:-80}:80"
80
+ depends_on:
81
+ - api
82
+ restart: unless-stopped
83
+ healthcheck:
84
+ test: ["CMD", "curl", "-f", "http://localhost"]
85
+ interval: 30s
86
+ timeout: 10s
87
+ retries: 5
88
+ networks:
89
+ - idealyst-network
90
+
91
+ # Development Service (for local development)
92
+ dev:
93
+ build:
94
+ context: .
95
+ dockerfile: Dockerfile
96
+ target: dev
97
+ container_name: ${PROJECT_NAME:-idealyst}-dev
98
+ environment:
99
+ NODE_ENV: development
100
+ ports:
101
+ - "3000:3000" # Web dev server
102
+ - "3001:3001" # API dev server
103
+ - "5173:5173" # Vite dev server
104
+ - "8080:8080" # Additional dev server
105
+ - "19006:19006" # Expo dev tools
106
+ volumes:
107
+ - .:/app
108
+ - /app/node_modules
109
+ - /var/run/docker.sock:/var/run/docker.sock:ro
110
+ depends_on:
111
+ postgres:
112
+ condition: service_healthy
113
+ redis:
114
+ condition: service_healthy
115
+ networks:
116
+ - idealyst-network
117
+ tty: true
118
+ stdin_open: true
119
+
120
+ # Test Runner
121
+ test:
122
+ build:
123
+ context: .
124
+ dockerfile: Dockerfile
125
+ target: test-runner
126
+ container_name: ${PROJECT_NAME:-idealyst}-test
127
+ environment:
128
+ NODE_ENV: test
129
+ CI: true
130
+ volumes:
131
+ - .:/app
132
+ - /app/node_modules
133
+ networks:
134
+ - idealyst-network
135
+ profiles:
136
+ - testing
137
+
138
+ volumes:
139
+ postgres_data:
140
+ redis_data:
141
+
142
+ networks:
143
+ idealyst-network:
144
+ driver: bridge
@@ -0,0 +1,20 @@
1
+ /** @type {import('jest').Config} */
2
+ module.exports = {
3
+ projects: [
4
+ '<rootDir>/packages/*/jest.config.js',
5
+ ],
6
+ collectCoverage: true,
7
+ collectCoverageFrom: [
8
+ 'packages/*/src/**/*.{ts,tsx}',
9
+ '!packages/*/src/**/*.d.ts',
10
+ '!packages/*/src/**/index.ts',
11
+ ],
12
+ coverageDirectory: '<rootDir>/coverage',
13
+ coverageReporters: ['text', 'lcov', 'html'],
14
+ testTimeout: 30000,
15
+ // Ignore template files in node_modules
16
+ testPathIgnorePatterns: [
17
+ '/node_modules/',
18
+ '/templates/',
19
+ ],
20
+ };
@@ -8,18 +8,28 @@
8
8
  ],
9
9
  "packageManager": "yarn@4.1.0",
10
10
  "scripts": {
11
+ "test": "yarn workspaces foreach --include '@/*' run test",
12
+ "test:watch": "yarn workspaces foreach --include '@/*' run test:watch",
13
+ "test:coverage": "yarn workspaces foreach --include '@/*' run test:coverage",
14
+ "test:ci": "yarn workspaces foreach --include '@/*' --parallel run test --passWithNoTests",
15
+ "test:runner": "node scripts/test-runner.js",
16
+ "test:help": "node scripts/test-runner.js help",
11
17
  "publish:all": "yarn workspaces foreach --include '@/*' npm publish",
12
18
  "version:patch": "yarn workspaces foreach --include '@/*' version patch",
13
19
  "version:minor": "yarn workspaces foreach --include '@/*' version minor",
14
20
  "version:major": "yarn workspaces foreach --include '@/*' version major",
15
21
  "build:all": "yarn workspaces foreach --include '@/*' run build",
16
- "test:all": "yarn workspaces foreach --include '@/*' run test"
22
+ "lint:all": "yarn workspaces foreach --include '@/*' run lint",
23
+ "type-check:all": "yarn workspaces foreach --include '@/*' run type-check"
17
24
  },
18
25
  "devDependencies": {
19
26
  "@babel/core": "^7.28.0",
20
27
  "@babel/preset-env": "^7.28.0",
21
28
  "@babel/preset-react": "^7.27.1",
22
29
  "@babel/preset-typescript": "^7.27.1",
30
+ "@types/jest": "^29.5.12",
31
+ "jest": "^29.7.0",
32
+ "ts-jest": "^29.1.2",
23
33
  "typescript": "^5.0.0"
24
34
  }
25
35
  }
@@ -0,0 +1,230 @@
1
+ #!/bin/bash
2
+
3
+ # Database backup and restore script for Idealyst workspace
4
+ # Usage: ./scripts/docker/db-backup.sh [backup|restore] [filename]
5
+
6
+ set -e
7
+
8
+ COMMAND=${1:-backup}
9
+ FILENAME=${2:-"backup-$(date +%Y%m%d-%H%M%S).sql"}
10
+ PROJECT_NAME=${PROJECT_NAME:-idealyst}
11
+
12
+ # Source environment variables
13
+ if [ -f ".env" ]; then
14
+ source .env
15
+ fi
16
+
17
+ POSTGRES_CONTAINER="${PROJECT_NAME}-postgres"
18
+ DATABASE=${POSTGRES_DB:-idealyst_db}
19
+ USERNAME=${POSTGRES_USER:-postgres}
20
+
21
+ echo "๐Ÿ—„๏ธ Database Operations for Idealyst"
22
+ echo "===================================="
23
+
24
+ # Function to check if database container is running
25
+ check_database() {
26
+ if ! docker ps | grep -q "$POSTGRES_CONTAINER"; then
27
+ echo "โŒ Database container '$POSTGRES_CONTAINER' is not running"
28
+ echo "๐Ÿ’ก Start it with: docker-compose up -d postgres"
29
+ exit 1
30
+ fi
31
+ }
32
+
33
+ # Function to create backup
34
+ create_backup() {
35
+ local backup_file=$1
36
+
37
+ echo "๐Ÿ“ฆ Creating backup of database '$DATABASE'..."
38
+ echo "๐Ÿ“ Backup file: $backup_file"
39
+
40
+ # Create backups directory if it doesn't exist
41
+ mkdir -p backups
42
+
43
+ # Create the backup
44
+ docker exec "$POSTGRES_CONTAINER" pg_dump \
45
+ -U "$USERNAME" \
46
+ -d "$DATABASE" \
47
+ --clean \
48
+ --if-exists \
49
+ --create \
50
+ --verbose > "backups/$backup_file"
51
+
52
+ if [ $? -eq 0 ]; then
53
+ echo "โœ… Backup created successfully: backups/$backup_file"
54
+
55
+ # Show backup info
56
+ local size=$(du -h "backups/$backup_file" | cut -f1)
57
+ echo "๐Ÿ“Š Backup size: $size"
58
+
59
+ # Compress the backup
60
+ gzip "backups/$backup_file"
61
+ echo "๐Ÿ—œ๏ธ Backup compressed: backups/$backup_file.gz"
62
+
63
+ else
64
+ echo "โŒ Backup failed"
65
+ exit 1
66
+ fi
67
+ }
68
+
69
+ # Function to restore backup
70
+ restore_backup() {
71
+ local backup_file=$1
72
+
73
+ # Check if backup file exists
74
+ if [ ! -f "$backup_file" ]; then
75
+ # Try with .gz extension
76
+ if [ -f "$backup_file.gz" ]; then
77
+ echo "๐Ÿ“ฆ Found compressed backup, extracting..."
78
+ gunzip "$backup_file.gz"
79
+ else
80
+ echo "โŒ Backup file not found: $backup_file"
81
+ echo "๐Ÿ“ Available backups:"
82
+ ls -la backups/ 2>/dev/null || echo "No backups directory found"
83
+ exit 1
84
+ fi
85
+ fi
86
+
87
+ echo "โš ๏ธ WARNING: This will replace the current database '$DATABASE'"
88
+ echo "๐Ÿ“ Restoring from: $backup_file"
89
+
90
+ read -p "Are you sure you want to continue? (y/N): " -n 1 -r
91
+ echo
92
+
93
+ if [[ ! $REPLY =~ ^[Yy]$ ]]; then
94
+ echo "โŒ Restore cancelled"
95
+ exit 1
96
+ fi
97
+
98
+ echo "๐Ÿ”„ Restoring database..."
99
+
100
+ # Stop API container to prevent connections
101
+ echo "๐Ÿ›‘ Stopping API container..."
102
+ docker-compose stop api 2>/dev/null || true
103
+
104
+ # Wait a moment for connections to close
105
+ sleep 2
106
+
107
+ # Restore the backup
108
+ docker exec -i "$POSTGRES_CONTAINER" psql \
109
+ -U "$USERNAME" \
110
+ -d postgres < "$backup_file"
111
+
112
+ if [ $? -eq 0 ]; then
113
+ echo "โœ… Database restored successfully"
114
+
115
+ # Restart API container
116
+ echo "๐Ÿš€ Restarting API container..."
117
+ docker-compose start api
118
+
119
+ else
120
+ echo "โŒ Restore failed"
121
+ echo "๐Ÿš€ Restarting API container..."
122
+ docker-compose start api
123
+ exit 1
124
+ fi
125
+ }
126
+
127
+ # Function to list backups
128
+ list_backups() {
129
+ echo "๐Ÿ“ Available backups:"
130
+ echo "===================="
131
+
132
+ if [ -d "backups" ]; then
133
+ ls -lah backups/ | grep -E '\.(sql|gz)$' || echo "No backup files found"
134
+ else
135
+ echo "No backups directory found"
136
+ fi
137
+ }
138
+
139
+ # Function to clean old backups
140
+ clean_backups() {
141
+ local days=${1:-7}
142
+
143
+ echo "๐Ÿงน Cleaning backups older than $days days..."
144
+
145
+ if [ -d "backups" ]; then
146
+ find backups/ -name "*.sql.gz" -mtime +$days -delete
147
+ find backups/ -name "*.sql" -mtime +$days -delete
148
+ echo "โœ… Old backups cleaned"
149
+ else
150
+ echo "No backups directory found"
151
+ fi
152
+ }
153
+
154
+ # Function to show database info
155
+ show_db_info() {
156
+ echo "๐Ÿ“Š Database Information:"
157
+ echo "======================="
158
+ echo "Container: $POSTGRES_CONTAINER"
159
+ echo "Database: $DATABASE"
160
+ echo "Username: $USERNAME"
161
+ echo ""
162
+
163
+ # Show database size
164
+ echo "๐Ÿ—„๏ธ Database size:"
165
+ docker exec "$POSTGRES_CONTAINER" psql \
166
+ -U "$USERNAME" \
167
+ -d "$DATABASE" \
168
+ -c "SELECT pg_size_pretty(pg_database_size('$DATABASE')) as database_size;"
169
+
170
+ echo ""
171
+ echo "๐Ÿ“‹ Tables:"
172
+ docker exec "$POSTGRES_CONTAINER" psql \
173
+ -U "$USERNAME" \
174
+ -d "$DATABASE" \
175
+ -c "\dt"
176
+ }
177
+
178
+ # Main script logic
179
+ main() {
180
+ case $COMMAND in
181
+ "backup")
182
+ check_database
183
+ create_backup "$FILENAME"
184
+ ;;
185
+
186
+ "restore")
187
+ check_database
188
+ if [ -z "$FILENAME" ]; then
189
+ echo "โŒ Please specify a backup file to restore"
190
+ echo "Usage: $0 restore <backup-file>"
191
+ exit 1
192
+ fi
193
+ restore_backup "$FILENAME"
194
+ ;;
195
+
196
+ "list")
197
+ list_backups
198
+ ;;
199
+
200
+ "clean")
201
+ local days=${FILENAME:-7}
202
+ clean_backups "$days"
203
+ ;;
204
+
205
+ "info")
206
+ check_database
207
+ show_db_info
208
+ ;;
209
+
210
+ *)
211
+ echo "Usage: $0 [backup|restore|list|clean|info] [filename|days]"
212
+ echo ""
213
+ echo "Commands:"
214
+ echo " backup [filename] - Create a database backup"
215
+ echo " restore <filename> - Restore from a backup file"
216
+ echo " list - List available backups"
217
+ echo " clean [days] - Clean backups older than N days (default: 7)"
218
+ echo " info - Show database information"
219
+ echo ""
220
+ echo "Examples:"
221
+ echo " $0 backup"
222
+ echo " $0 backup my-backup.sql"
223
+ echo " $0 restore backups/backup-20240101-120000.sql"
224
+ echo " $0 clean 30"
225
+ exit 1
226
+ ;;
227
+ esac
228
+ }
229
+
230
+ main
@@ -0,0 +1,212 @@
1
+ #!/bin/bash
2
+
3
+ # Docker deployment script for Idealyst workspace
4
+ # Usage: ./scripts/docker/deploy.sh [environment]
5
+
6
+ set -e
7
+
8
+ ENVIRONMENT=${1:-production}
9
+ PROJECT_NAME=${PROJECT_NAME:-idealyst}
10
+
11
+ echo "๐Ÿš€ Deploying Idealyst to $ENVIRONMENT environment..."
12
+
13
+ # Validate environment
14
+ if [[ ! "$ENVIRONMENT" =~ ^(development|staging|production)$ ]]; then
15
+ echo "โŒ Invalid environment. Use: development, staging, or production"
16
+ exit 1
17
+ fi
18
+
19
+ # Check if required files exist
20
+ if [ ! -f "docker-compose.yml" ]; then
21
+ echo "โŒ docker-compose.yml not found. Run this script from the project root."
22
+ exit 1
23
+ fi
24
+
25
+ if [ ! -f ".env" ]; then
26
+ echo "โš ๏ธ .env file not found. Creating from .env.example..."
27
+ cp .env.example .env
28
+ echo "๐Ÿ“ Please edit .env with your configuration before proceeding."
29
+ exit 1
30
+ fi
31
+
32
+ # Source environment variables
33
+ source .env
34
+
35
+ # Function to wait for service health
36
+ wait_for_service() {
37
+ local service=$1
38
+ local max_attempts=30
39
+ local attempt=1
40
+
41
+ echo "โณ Waiting for $service to be healthy..."
42
+
43
+ while [ $attempt -le $max_attempts ]; do
44
+ if docker-compose ps $service | grep -q "healthy\|Up"; then
45
+ echo "โœ… $service is ready"
46
+ return 0
47
+ fi
48
+
49
+ echo "๐Ÿ”„ Attempt $attempt/$max_attempts - waiting for $service..."
50
+ sleep 10
51
+ attempt=$((attempt + 1))
52
+ done
53
+
54
+ echo "โŒ $service failed to become healthy"
55
+ return 1
56
+ }
57
+
58
+ # Function to run database migrations
59
+ run_migrations() {
60
+ echo "๐Ÿ—„๏ธ Running database migrations..."
61
+
62
+ # Check if any package has Prisma schema
63
+ for package_dir in packages/*/; do
64
+ if [ -f "${package_dir}prisma/schema.prisma" ]; then
65
+ echo "๐Ÿ“ฆ Running migrations for $(basename "$package_dir")..."
66
+ docker-compose exec api yarn workspace $(basename "$package_dir") prisma migrate deploy
67
+ fi
68
+ done
69
+ }
70
+
71
+ # Function to build and deploy
72
+ deploy() {
73
+ case $ENVIRONMENT in
74
+ "development")
75
+ echo "๐Ÿ”ง Starting development environment..."
76
+ docker-compose up --build -d postgres redis
77
+ wait_for_service postgres
78
+ wait_for_service redis
79
+ docker-compose up --build -d dev
80
+ ;;
81
+
82
+ "staging"|"production")
83
+ echo "๐Ÿ—๏ธ Building application..."
84
+ docker-compose build --no-cache
85
+
86
+ if [ "$ENVIRONMENT" = "production" ]; then
87
+ echo "๐Ÿš€ Deploying to production..."
88
+ docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d postgres redis
89
+ else
90
+ echo "๐Ÿงช Deploying to staging..."
91
+ docker-compose up -d postgres redis
92
+ fi
93
+
94
+ wait_for_service postgres
95
+ wait_for_service redis
96
+
97
+ # Run migrations
98
+ run_migrations
99
+
100
+ if [ "$ENVIRONMENT" = "production" ]; then
101
+ docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d api web nginx
102
+ else
103
+ docker-compose up -d api web
104
+ fi
105
+
106
+ wait_for_service api
107
+ wait_for_service web
108
+ ;;
109
+ esac
110
+ }
111
+
112
+ # Function to show deployment status
113
+ show_status() {
114
+ echo ""
115
+ echo "๐Ÿ“Š Deployment Status:"
116
+ echo "===================="
117
+ docker-compose ps
118
+
119
+ echo ""
120
+ echo "๐ŸŒ Service URLs:"
121
+ echo "==============="
122
+
123
+ if [ "$ENVIRONMENT" = "development" ]; then
124
+ echo "Web App (Dev): http://localhost:3000"
125
+ echo "API (Dev): http://localhost:3001"
126
+ echo "Database: postgresql://postgres:postgres@localhost:5432/${POSTGRES_DB}"
127
+ echo "Redis: redis://localhost:6379"
128
+ else
129
+ echo "Web App: http://localhost:${WEB_PORT:-80}"
130
+ echo "API: http://localhost:${API_PORT:-3001}"
131
+
132
+ if [ "$ENVIRONMENT" = "production" ]; then
133
+ echo "Nginx: http://localhost"
134
+ echo "Monitoring: http://localhost:3002 (Grafana)"
135
+ echo "Metrics: http://localhost:9090 (Prometheus)"
136
+ fi
137
+ fi
138
+
139
+ echo ""
140
+ echo "๐Ÿ“ Logs:"
141
+ echo "========"
142
+ echo "View logs: docker-compose logs -f [service]"
143
+ echo "Available services: $(docker-compose config --services | tr '\n' ' ')"
144
+ }
145
+
146
+ # Function to run tests
147
+ run_tests() {
148
+ echo "๐Ÿงช Running tests..."
149
+ docker-compose --profile testing run --rm test
150
+ }
151
+
152
+ # Main deployment process
153
+ main() {
154
+ echo "๐Ÿ—๏ธ Environment: $ENVIRONMENT"
155
+ echo "๐Ÿ“ฆ Project: $PROJECT_NAME"
156
+ echo ""
157
+
158
+ # Stop existing containers
159
+ echo "๐Ÿ›‘ Stopping existing containers..."
160
+ docker-compose down
161
+
162
+ # Clean up orphaned containers
163
+ docker-compose down --remove-orphans
164
+
165
+ # Deploy
166
+ deploy
167
+
168
+ # Show status
169
+ show_status
170
+
171
+ echo ""
172
+ echo "โœ… Deployment complete!"
173
+ echo ""
174
+ echo "๐Ÿ’ก Useful commands:"
175
+ echo " View logs: docker-compose logs -f"
176
+ echo " Stop services: docker-compose down"
177
+ echo " Restart service: docker-compose restart [service]"
178
+ echo " Run tests: ./scripts/docker/deploy.sh test"
179
+ echo ""
180
+ }
181
+
182
+ # Handle special commands
183
+ case $ENVIRONMENT in
184
+ "test")
185
+ run_tests
186
+ exit 0
187
+ ;;
188
+ "status")
189
+ show_status
190
+ exit 0
191
+ ;;
192
+ "logs")
193
+ docker-compose logs -f
194
+ exit 0
195
+ ;;
196
+ "stop")
197
+ echo "๐Ÿ›‘ Stopping all services..."
198
+ docker-compose down
199
+ echo "โœ… All services stopped"
200
+ exit 0
201
+ ;;
202
+ "clean")
203
+ echo "๐Ÿงน Cleaning up Docker resources..."
204
+ docker-compose down -v --remove-orphans
205
+ docker system prune -f
206
+ echo "โœ… Cleanup complete"
207
+ exit 0
208
+ ;;
209
+ esac
210
+
211
+ # Run main deployment
212
+ main