You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							185 lines
						
					
					
						
							5.5 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							185 lines
						
					
					
						
							5.5 KiB
						
					
					
				| /** | |
|  * @fileoverview Prerequisites checker for mobile development environment | |
|  *  | |
|  * This script verifies that all necessary tools and configurations are in place | |
|  * for mobile app development, including both Android and iOS platforms. | |
|  *  | |
|  * Features: | |
|  * - Validates development environment setup | |
|  * - Checks required command-line tools | |
|  * - Verifies Android SDK and device connectivity | |
|  * - Confirms iOS development tools and simulator status | |
|  *  | |
|  * Prerequisites checked: | |
|  * - Node.js and npm installation | |
|  * - Gradle for Android builds | |
|  * - Xcode and command line tools for iOS | |
|  * - ANDROID_HOME environment variable | |
|  * - Android platform files | |
|  * - Connected Android devices/emulators | |
|  * - iOS platform files | |
|  * - Running iOS simulators | |
|  *  | |
|  * Exit codes: | |
|  * - 0: All checks passed | |
|  * - 1: One or more checks failed | |
|  *  | |
|  * @example | |
|  * // Run directly | |
|  * node scripts/check-prerequisites.js | |
|  *  | |
|  * // Run via npm script | |
|  * npm run test:prerequisites | |
|  *  | |
|  * @author TimeSafari Team | |
|  * @license MIT | |
|  */ | |
| 
 | |
| const { execSync } = require('child_process'); | |
| const { existsSync } = require('fs'); | |
| 
 | |
| /** | |
|  * Checks if a command-line tool is available by attempting to run its --version command | |
|  *  | |
|  * @param {string} command - The command to check (e.g., 'node', 'npm', 'gradle') | |
|  * @param {string} errorMessage - The error message to display if the command is not available | |
|  * @returns {boolean} - True if the command exists and is executable, false otherwise | |
|  *  | |
|  * @example | |
|  * checkCommand('node', 'Node.js is required') | |
|  * // Returns true if node is available, false otherwise | |
|  */ | |
| function checkCommand(command, errorMessage) { | |
|     try { | |
|         execSync(command, { stdio: 'ignore' }); | |
|         return true; | |
|     } catch (e) { | |
|         console.error(`❌ ${errorMessage}`); | |
|         return false; | |
|     } | |
| } | |
| 
 | |
| /** | |
|  * Verifies Android development environment setup | |
|  *  | |
|  * Checks for: | |
|  * 1. ANDROID_HOME environment variable | |
|  * 2. Android platform files in project | |
|  * 3. Connected Android devices or running emulators | |
|  *  | |
|  * @returns {boolean} - True if Android setup is complete and valid, false otherwise | |
|  *  | |
|  * @example | |
|  * if (!checkAndroidSetup()) { | |
|  *     console.error('Android prerequisites not met'); | |
|  * } | |
|  */ | |
| function checkAndroidSetup() { | |
|     // Check ANDROID_HOME environment variable | |
|     // This is required for Android SDK tools access | |
|     if (!process.env.ANDROID_HOME) { | |
|         console.error('❌ ANDROID_HOME environment variable not set'); | |
|         return false; | |
|     } | |
| 
 | |
|     // Check if Android platform was added to the project | |
|     // The 'android' directory should exist if platform was added via 'npx cap add android' | |
|     if (!existsSync('android')) { | |
|         console.error('❌ Android platform not added. Run: npx cap add android'); | |
|         return false; | |
|     } | |
| 
 | |
|     // Check for connected devices or running emulators | |
|     // Uses ADB (Android Debug Bridge) to list connected devices | |
|     try { | |
|         const devices = execSync('adb devices').toString(); | |
|         // Parse ADB output - looking for lines ending with 'device' (not 'offline' or 'unauthorized') | |
|         if (!devices.split('\n').slice(1).some(line => line.includes('device'))) { | |
|             console.error('❌ No Android devices connected'); | |
|             return false; | |
|         } | |
|     } catch (e) { | |
|         console.error('❌ ADB not available'); | |
|         return false; | |
|     } | |
| 
 | |
|     return true; | |
| } | |
| 
 | |
| /** | |
|  * Verifies iOS development environment setup | |
|  *  | |
|  * Checks for: | |
|  * 1. iOS platform files in project | |
|  * 2. Running iOS simulators | |
|  * 3. Xcode command line tools availability | |
|  *  | |
|  * @returns {boolean} - True if iOS setup is complete and valid, false otherwise | |
|  *  | |
|  * @example | |
|  * if (!checkIosSetup()) { | |
|  *     console.error('iOS prerequisites not met'); | |
|  * } | |
|  */ | |
| function checkIosSetup() { | |
|     // Check if iOS platform was added to the project | |
|     // The 'ios' directory should exist if platform was added via 'npx cap add ios' | |
|     if (!existsSync('ios')) { | |
|         console.error('❌ iOS platform not added. Run: npx cap add ios'); | |
|         return false; | |
|     } | |
| 
 | |
|     // Check for available and running iOS simulators | |
|     // Uses xcrun simctl to list simulator devices | |
|     try { | |
|         const simulators = execSync('xcrun simctl list devices available').toString(); | |
|         if (!simulators.includes('Booted')) { | |
|             console.error('❌ No iOS simulator running'); | |
|             return false; | |
|         } | |
|     } catch (e) { | |
|         console.error('❌ Xcode command line tools not available'); | |
|         return false; | |
|     } | |
| 
 | |
|     return true; | |
| } | |
| 
 | |
| /** | |
|  * Main function to check all prerequisites for mobile development | |
|  *  | |
|  * Verifies: | |
|  * 1. Required command line tools (node, npm, gradle, xcodebuild) | |
|  * 2. Android development setup | |
|  * 3. iOS development setup | |
|  *  | |
|  * Exits with code 1 if any checks fail | |
|  *  | |
|  * @example | |
|  * // Run from package.json script: | |
|  * // "test:prerequisites": "node scripts/check-prerequisites.js" | |
|  */ | |
| function main() { | |
|     let success = true; | |
| 
 | |
|     // Check required command line tools | |
|     // These are essential for building and testing the application | |
|     success &= checkCommand('node --version', 'Node.js is required'); | |
|     success &= checkCommand('npm --version', 'npm is required'); | |
|     success &= checkCommand('gradle --version', 'Gradle is required for Android builds'); | |
|     success &= checkCommand('xcodebuild --help', 'Xcode is required for iOS builds'); | |
| 
 | |
|     // Check platform-specific development environments | |
|     success &= checkAndroidSetup(); | |
|     success &= checkIosSetup(); | |
| 
 | |
|     // Exit with error if any checks failed | |
|     if (!success) { | |
|         process.exit(1); | |
|     } | |
| 
 | |
|     console.log('✅ All prerequisites met!'); | |
| } | |
| 
 | |
| // Execute the checks | |
| main(); 
 |