Esempio n. 1
0
		callback: function (projectDir) {
			if (projectDir === '') {
				// no option value was specified
				// set project dir to current directory
				projectDir = conf.options['project-dir'].default;
			}

			projectDir = appc.fs.resolvePath(projectDir);

			// load the tiapp.xml
			try {
				this.tiapp = new tiappxml(path.join(projectDir, 'tiapp.xml'));
			} catch (ex) {
				logger.error(ex);
				logger.log();
				process.exit(1);
			}

			this.tiapp.properties || (this.tiapp.properties = {});

			// make sure the tiapp.xml is sane
			ti.validateTiappXml(this.logger, this.config, this.tiapp);

			// set the --name default to the app's name
			this.conf.options.name.default = appc.string.capitalize(this.tiapp.name);

			return projectDir;
		}.bind(this),
Esempio n. 2
0
							callback: function (projectDir) {
								if (projectDir === '') {
									// no option value was specified
									// check if current directory is a valid dir
									// if not output meaningful error message
									projectDir = conf.options['project-dir'].default;
									if (!fs.existsSync(path.join(projectDir, 'tiapp.xml'))) {
										return;
									}
								}

								// start file logging here
								patchLogger(logger, cli);

								// load the tiapp.xml
								try {
									var tiapp = cli.tiapp = new tiappxml(path.join(projectDir, 'tiapp.xml'));
								} catch (ex) {
									logger.error(ex);
									logger.log();
									process.exit(1);
								}

								tiapp.properties || (tiapp.properties = {});

								// make sure the tiapp.xml is sane
								ti.validateTiappXml(logger, config, tiapp);

								// check that the Titanium SDK version is correct
								if (!ti.validateCorrectSDK(logger, config, cli, 'build')) {
									throw new cli.GracefulShutdown();
								}

								return projectDir;
							},
Esempio n. 3
0
exports.validate = function (logger, config, cli) {
	ti.validateProjectDir(logger, cli, cli.argv, 'project-dir');

	ti.validateTiappXml(logger, cli.tiapp);

	if (!ti.validateCorrectSDK(logger, config, cli, 'build')) {
		// we're running the build command for the wrong SDK version, gracefully return
		return false;
	}
};
Esempio n. 4
0
							callback: function (projectDir) {
								// load the tiapp.xml
								try {
									var tiapp = cli.tiapp = new tiappxml(path.join(projectDir, 'tiapp.xml'));
								} catch (ex) {
									logger.error(ex);
									logger.log();
									process.exit(1);
								}

								// make sure the tiapp.xml is sane
								ti.validateTiappXml(logger, tiapp);

								// check that the Titanium SDK version is correct
								if (!ti.validateCorrectSDK(logger, config, cli, 'build')) {
									throw new cli.GracefulShutdown;
								}

								return projectDir;
							},
Esempio n. 5
0
exports.validate = function (logger, config, cli) {
	ti.validateProjectDir(logger, cli, cli.argv, 'project-dir');
	ti.validateTiappXml(logger, cli.tiapp);
	
	if (!ti.validateCorrectSDK(logger, config, cli, 'build')) {
		// we're running the build command for the wrong SDK version, gracefully return
		return false;
	}
	if (!androidEnv || !Object.keys(androidEnv.targets).length) {
		logger.error(__('Unable to detect Android SDK targets.') + '\n');
		logger.log(__('Please download SDK targets via Android SDK Manager and try again. (version %s or newer)', version.format(minAndroidSdkVersion, 2)) + '\n');
		process.exit(1);
	}
	
	if (targets.indexOf(cli.argv.target) == -1) {
		logger.error(__('Invalid target "%s"', cli.argv.target) + '\n');
		appc.string.suggest(cli.argv.target, targets, logger.log, 3);
		process.exit(1);
	}
	
	if (!afs.exists(cli.argv['android-sdk'], 'platform-tools')) {
		logger.error(__('Invalid Android SDK path') + '\n');
		process.exit(1);
	}
	if (!afs.exists(cli.argv['android-sdk'], 'platform-tools', 'adb') && !afs.exists(cli.argv['android-sdk'], 'platform-tools', 'adb.exe')) {
		logger.error(__('Invalid Android SDK installation: unable to find adb') + '\n');
		process.exit(1);
	}
	
	// Check for java version
	if (!androidEnv.java.version) {
		logger.error(__('"Missing Java SDK. Please make sure Java SDK is on your PATH') + '\n');
		process.exit(1);
	} else if (version.lt(androidEnv.java.version, minJavaSdkVersion)) {
		logger.error(__('JDK version %s detected, but at least %s is required', androidEnv.java.version, minJavaSdkVersion) + '\n');
		process.exit(1);
	}
	
	if (!/^([a-zA-Z_]{1}[a-zA-Z0-9_]*(\.[a-zA-Z_]{1}[a-zA-Z0-9_]*)*)$/.test(cli.tiapp.id)) {
		logger.error(__('tiapp.xml contains an invalid app id "%s"', cli.tiapp.id));
		logger.error(__('The app id must consist of letters, numbers, and underscores.'));
		logger.error(__('The first character must be a letter or underscore.'));
		logger.error(__('The first character after a period must not be a number.'));
		logger.error(__("Usually the app id is your company's reversed Internet domain name. (i.e. com.example.myapp)") + '\n');
		process.exit(1);
	}
	
	if (!ti.validAppId(cli.tiapp.id)) {
		logger.error(__('Invalid app id "%s"', cli.tiapp.id));
		logger.error(__('The app id must not contain Java reserved words.') + '\n');
		process.exit(1);
	}
	
	// Set defaults for target Emulator
	if (cli.argv.target == 'emulator') {
		if (isNaN(parseInt(cli.argv['avd-id']))) {
			cli.argv['avd-id'] = 7;
		}
		if (!cli.argv['avd-skin']) {
			cli.argv['avd-skin'] = 'HVGA';
		}
		/*
		if (!cli.argv['avd-abi']) {
			cli.argv['avd-abi'] = androidEnv.targets[cli.argv['avd-id']].abis[0] || androidEnv.targets['7'].abis[0] || 'armeabi';
		}
		*/
	}
	
	// Validate arguments for dist-playstore
	if (cli.argv.target == 'dist-playstore') {
		if(!cli.argv['alias']) {
			logger.error(__('Invalid required option "--alias"') + '\n');
			process.exit(1);
		}
		
		if (!cli.argv.keystore) {
			logger.error(__('Missing required keystore file path') + '\n');
			process.exit(1);
		}
		
		cli.argv.keystore = afs.resolvePath(cli.argv.keystore);
		if (!afs.exists(cli.argv.keystore) || !fs.statSync(cli.argv.keystore).isFile()) {
			logger.error(__('Invalid keystore file "%s"', cli.argv.keystore) + '\n');
			process.exit(1);
		}
		
		if(!cli.argv['password']) {
			logger.error(__('Invalid required option "--password"') + '\n');
			process.exit(1);
		}
		
		if (!cli.argv['output-dir']) {
			logger.error(__('Invalid required option "--output-dir"') + '\n');
			process.exit(1);
		}
		
		cli.argv['output-dir'] = afs.resolvePath(cli.argv['output-dir']);
		if (!afs.exists(cli.argv['output-dir'])) {
			wrench.mkdirSyncRecursive(cli.argv['output-dir']);
		} else if (!fs.statSync(cli.argv['output-dir']).isDirectory()) {
			logger.error(__('Invalid required option "--output-dir", option is not a directory.') + '\n');
			process.exit(1);
		}
	}
	
	if (cli.argv['debug-host'] && cli.argv.target != 'dist-playstore') {
		if (typeof cli.argv['debug-host'] == 'number') {
			logger.error(__('Invalid debug host "%s"', cli.argv['debug-host']) + '\n');
			logger.log(__('The debug host must be in the format "host:port".') + '\n');
			process.exit(1);
		}

		var parts = cli.argv['debug-host'].split(':'),
			port = parts.length > 1 && parseInt(parts[1]);

		if (parts.length < 2) {
			logger.error(__('Invalid debug host "%s"', cli.argv['debug-host']) + '\n');
			logger.log(__('The debug host must be in the format "host:port".') + '\n');
			process.exit(1);
		}
		if (isNaN(port) || port < 1 || port > 65535) {
			logger.error(__('Invalid debug host "%s"', cli.argv['debug-host']) + '\n');
			logger.log(__('The port must be a valid integer between 1 and 65535.') + '\n');
			process.exit(1);
		}
		cli.argv['debug-host'] = parts.map(function (p) { return p.trim(); }).join(':');
	}

	// Resolve path for android-sdk
	cli.argv['android-sdk'] = afs.resolvePath(cli.argv['android-sdk']);
};
Esempio n. 6
0
exports.validate = function (logger, config, cli) {
	ti.validateProjectDir(logger, cli, cli.argv, 'project-dir');
	ti.validateTiappXml(logger, cli.tiapp);
	
	if (!ti.validateCorrectSDK(logger, config, cli, 'build')) {
		// we're running the build command for the wrong SDK version, gracefully return
		return false;
	}
	if (!androidEnv || !Object.keys(androidEnv.targets).length) {
		logger.error(__('Unable to detect Android SDK targets.') + '\n');
		logger.log(__('Please download SDK targets via Android SDK Manager and try again. (version %s or newer)', version.format(minAndroidSdkVersion, 2)) + '\n');
		process.exit(1);
	}
	
	if (targets.indexOf(cli.argv.target) == -1) {
		logger.error(__('Invalid target "%s"', cli.argv.target) + '\n');
		appc.string.suggest(cli.argv.target, targets, logger.log, 3);
		process.exit(1);
	}
	
	if (!afs.exists(cli.argv['android-sdk'], 'platform-tools')) {
		logger.error(__('Invalid Android SDK path') + '\n');
		process.exit(1);
	}
	if (!afs.exists(cli.argv['android-sdk'], 'platform-tools', 'adb') && !afs.exists(cli.argv['android-sdk'], 'platform-tools', 'adb.exe')) {
		logger.error(__('Invalid Android SDK installation: unable to find adb') + '\n');
		process.exit(1);
	}
	
	// Check for java version
	if (!androidEnv.java.version) {
		logger.error(__('"Missing Java SDK. Please make sure Java SDK is on your PATH') + '\n');
		process.exit(1);
	} else if (version.lt(androidEnv.java.version, minJavaSdkVersion)) {
		logger.error(__('JDK version %s detected, but at least %s is required', androidEnv.java.version, minJavaSdkVersion) + '\n');
		process.exit(1);
	}
	
	if (!/^([a-zA-Z_]{1}[a-zA-Z0-9_]*(\.[a-zA-Z_]{1}[a-zA-Z0-9_]*)*)$/.test(cli.tiapp.id)) {
		logger.error(__('tiapp.xml contains an invalid app id "%s"', cli.tiapp.id));
		logger.error(__('The app id must consist of letters, numbers, and underscores.'));
		logger.error(__('The first character must be a letter or underscore.'));
		logger.error(__('The first character after a period must not be a number.'));
		logger.error(__("Usually the app id is your company's reversed Internet domain name. (i.e. com.example.myapp)") + '\n');
		process.exit(1);
	}
	
	if (!ti.validAppId(cli.tiapp.id)) {
		logger.error(__('Invalid app id "%s"', cli.tiapp.id));
		logger.error(__('The app id must not contain Java reserved words.') + '\n');
		process.exit(1);
	}
	
	// Set defaults for target Emulator
	if (cli.argv.target == 'emulator') {
		var avdid = parseInt(cli.argv['avd-id']);

		// double check and make sure that the avd-id passed (or the default)
		// exists as an android target and if not, deal with it vs. bombing
		if (isNaN(avdid) || !androidEnv.targets || !androidEnv.targets[avdid]) {
			var keys = Object.keys(androidEnv.targets || {}),
				name,
				skins;

			avdid = 0;
			for (var c = 0; c < keys.length; c++) {
				var target = androidEnv.targets[keys[c]],
					api = target['api-level'];

				// search for the first api > 10 (Android 2.3.3) which is what titanium requires
				if (api >= 10) {
					avdid = keys[c];
					name = target.name;
					skins = target.skins;
					break;
				}
			}

			if (avdid) {
				// if we found a valid avd id, let's use it but warn the user
				if (cli.argv['avd-id']) {
					logger.warn(__('AVD ID %s not found. Launching with the AVD ID %s%s.',
						(''+cli.argv['avd-id']).cyan, (''+avdid).cyan, name ? ' (' + name + ')' : ''));
				} else {
					logger.warn(__('No AVD ID specified. Launching with the AVD ID %s%s.',
						(''+avdid).cyan, name ? ' (' + name + ')' : ''));
				}
				cli.argv['avd-id'] = avdid;
				var s = skins.length && skins[skins.length - 1];
				if (s && skins && skins.indexOf(cli.argv['avd-skin']) == -1) {
					logger.warn(__('AVD ID %s does not support skin %s. Launching with the AVD skin %s.',
						avdid, (''+cli.argv['avd-skin']).cyan, (''+s).cyan));
					cli.argv['avd-skin'] = s;
				}
			} else {
				// if we couldn't find one
				if (cli.argv['avd-id']) {
					logger.error(__('AVD ID %s not found and no suitable Android SDKs found. Please install Android SDK 2.3.3 or newer.', (''+cli.argv['avd-id']).cyan) + '\n');
				} else {
					logger.error(__('No suitable Android SDKs found. Please install Android SDK 2.3.3 or newer.', (''+cli.argv['avd-id']).cyan) + '\n');
				}
				process.exit(1);
			}
		}

		if (!cli.argv['avd-abi']) {
			// check to make sure exists
			if (androidEnv.targets && androidEnv.targets[cli.argv['avd-id']]) {
				cli.argv['avd-abi'] = androidEnv.targets[cli.argv['avd-id']].abis[0] || androidEnv.targets['7'].abis[0] || 'armeabi';
			} else {
				logger.warn(__('AVD ID %s not found. Please use %s to specify a valid AVD ID. Ignoring --avd-abi.', cli.argv['avd-id'], '--avd-id'.cyan));
			}
		}
	}
	
	// Validate arguments for dist-playstore
	if (cli.argv.target == 'dist-playstore') {
		if(!cli.argv['alias']) {
			logger.error(__('Invalid required option "--alias"') + '\n');
			process.exit(1);
		}
		
		if (!cli.argv.keystore) {
			logger.error(__('Missing required keystore file path') + '\n');
			process.exit(1);
		}
		
		cli.argv.keystore = afs.resolvePath(cli.argv.keystore);
		if (!afs.exists(cli.argv.keystore) || !fs.statSync(cli.argv.keystore).isFile()) {
			logger.error(__('Invalid keystore file: %s', cli.argv.keystore.cyan) + '\n');
			process.exit(1);
		}
		
		if(!cli.argv['password']) {
			logger.error(__('Invalid required option "--password"') + '\n');
			process.exit(1);
		}
		
		if (!cli.argv['output-dir']) {
			logger.error(__('Invalid required option "--output-dir"') + '\n');
			process.exit(1);
		}
		
		cli.argv['output-dir'] = afs.resolvePath(cli.argv['output-dir']);
		if (!afs.exists(cli.argv['output-dir'])) {
			wrench.mkdirSyncRecursive(cli.argv['output-dir']);
		} else if (!fs.statSync(cli.argv['output-dir']).isDirectory()) {
			logger.error(__('Invalid required option "--output-dir", option is not a directory.') + '\n');
			process.exit(1);
		}
	}
	
	if (cli.argv['debug-host'] && cli.argv.target != 'dist-playstore') {
		if (typeof cli.argv['debug-host'] == 'number') {
			logger.error(__('Invalid debug host "%s"', cli.argv['debug-host']) + '\n');
			logger.log(__('The debug host must be in the format "host:port".') + '\n');
			process.exit(1);
		}

		var parts = cli.argv['debug-host'].split(':'),
			port = parts.length > 1 && parseInt(parts[1]);

		if (parts.length < 2) {
			logger.error(__('Invalid debug host "%s"', cli.argv['debug-host']) + '\n');
			logger.log(__('The debug host must be in the format "host:port".') + '\n');
			process.exit(1);
		}
		if (isNaN(port) || port < 1 || port > 65535) {
			logger.error(__('Invalid debug host "%s"', cli.argv['debug-host']) + '\n');
			logger.log(__('The port must be a valid integer between 1 and 65535.') + '\n');
			process.exit(1);
		}
		cli.argv['debug-host'] = parts.map(function (p) { return p.trim(); }).join(':');
	}

	// Resolve path for android-sdk
	cli.argv['android-sdk'] = afs.resolvePath(cli.argv['android-sdk']);
};