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