Example #1
0
exports.validate = function (logger, config, cli) {
	var platforms = cli.argv.platforms || cli.argv.platform;
	if (platforms) {
		platforms = ti.scrubPlatforms(platforms);

		if (platforms.bad.length) {
			logger.error(__n('Invalid platform: %%s', 'Invalid platforms: %%s', platforms.bad.length, platforms.bad.join(', ')) + '\n');
			logger.log(__('Available platforms for SDK version %s:', ti.manifest.sdkVersion) + '\n');
			ti.targetPlatforms.forEach(function (p) {
				logger.log('    ' + p.cyan);
			});
			logger.log();
			process.exit(1);
		}

		cli.argv.platforms = platforms.scrubbed;
	} else {
		cli.argv.platforms = null;
	}

	ti.validateProjectDir(logger, cli, cli.argv, 'project-dir');

	return function (finished) {
		ti.loadPlugins(logger, config, cli, cli.argv['project-dir'], function () {
			finished();
		});
	};
};
Example #2
0
exports.validate = function (logger, config, cli) {
	ti.validateProjectDir(logger, cli.argv, 'project-dir');
	if (!ti.validateCorrectSDK(logger, config, cli, cli.argv['project-dir'])) {
		// we're running the build command for the wrong SDK version, gracefully return
		return false;
	}
};
Example #3
0
exports.validate = function (logger, config, cli) {
	ti.validateProjectDir(logger, cli, cli.argv, 'project-dir');

	// Validate the key, if it exists
	if (cli.argv._.length > 0) {
		var key = cli.argv._[0];
		if (!/^([A-Za-z_]{1}[A-Za-z0-9-_]*(\.[A-Za-z-_]{1}[A-Za-z0-9-_]*)*)$/.test(key)) {
			logger.error(__('Invalid key "%s"', key) + '\n');
			process.exit(1);
		}
	}

	return function (finished) {
		ti.loadPlugins(null, config, cli, cli.argv['project-dir'], finished, cli.argv.output != 'report' || cli.argv._.length, false);
	};
};
Example #4
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']);
};
Example #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') {
		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']);
};
Example #6
0
exports.validate = function (logger, config, cli) {
	cli.argv.platform && ti.validatePlatform(logger, cli.argv, 'platform');
	ti.validateProjectDir(logger, cli, cli.argv, 'project-dir');
	ti.loadPlugins(logger, cli, cli.argv['project-dir']);
};
Example #7
0
exports.validate = function (logger, config, cli) {
	var tokens,
		parts,
		port,
		i;
	
	ti.validateProjectDir(logger, cli, cli.argv, 'project-dir');
	if (!ti.validateCorrectSDK(logger, config, cli)) {
		// 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);
	}
	
	// Validate App ID
	tokens = cli.tiapp.id.split('.');
	for ( i = 0; i < tokens.length; i++) {
		if (javaKeywords.indexOf(tokens[i]) != -1) {
			logger.error(__('Invalid java keyword used in project app id: %s', tokens[i]) + '\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);
		}

		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']);

};