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(); 
							 |