merged in bootstrap conflict after platform parser reorg.
Project: http://git-wip-us.apache.org/repos/asf/cordova-cli/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-cli/commit/3ee9664b Tree: http://git-wip-us.apache.org/repos/asf/cordova-cli/tree/3ee9664b Diff: http://git-wip-us.apache.org/repos/asf/cordova-cli/diff/3ee9664b Branch: refs/heads/2.8.x Commit: 3ee9664bcb9041a6324b9f076755d538e8656544 Parents: 61e23c1 Author: Benn Mapes <[email protected]> Authored: Mon Jun 3 16:58:58 2013 -0700 Committer: Fil Maj <[email protected]> Committed: Thu Jun 6 18:25:43 2013 -0700 ---------------------------------------------------------------------- bootstrap.js | 18 +-------------- package.json | 2 +- platforms.js | 23 +++++++++++++++++++- spec/cordova-cli/platform.spec.js | 18 ++++++++-------- src/compile.js | 20 ++++++++-------- src/emulate.js | 36 ++++++++++--------------------- src/platform.js | 27 +++++++++-------------- src/plugin.js | 21 ++++++------------ src/plugin_parser.js | 1 - src/prepare.js | 36 ++++++++++--------------------- src/serve.js | 17 ++++---------- src/util.js | 4 +- test_runner.js | 7 ++++- 13 files changed, 98 insertions(+), 132 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/3ee9664b/bootstrap.js ---------------------------------------------------------------------- diff --git a/bootstrap.js b/bootstrap.js index c70188f..aeefa2b 100644 --- a/bootstrap.js +++ b/bootstrap.js @@ -22,26 +22,12 @@ var util = require('./src/util'), create = require('./src/create'), - a_parser = require('./src/metadata/android_parser'), - b_parser = require('./src/metadata/blackberry_parser'), - i_parser = require('./src/metadata/ios_parser'), - wp7_parser= require('./src/metadata/wp7_parser'), - wp8_parser= require('./src/metadata/wp8_parser'), n = require('ncallbacks'), path = require('path'), fs = require('fs'), shell = require('shelljs'), platforms = require('./platforms'); -// Library requirements checkers -var min_reqs = { - "android":a_parser.check_requirements, - "ios":i_parser.check_requirements, - "blackberry":b_parser.check_requirements, - "wp7":wp7_parser.check_requirements, - "wp8":wp8_parser.check_requirements -} - // Create native projects using bin/create var projectFixtures = path.join(__dirname, 'spec', 'fixtures', 'projects'); var tempDir = path.join(projectFixtures, 'native'); @@ -69,8 +55,8 @@ var end = n(platforms.length, function() { } }); -platforms.forEach(function(platform) { - min_reqs[platform](function(err) { +Object.keys(platforms).forEach(function(platform) { + platforms[platform].parser.check_requirements(function(err) { if (err) { console.error('WARNING: Your system does not meet requirements to create ' + platform + ' projects. See error output below.'); console.error(err); http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/3ee9664b/package.json ---------------------------------------------------------------------- diff --git a/package.json b/package.json index d34c03f..0642eb2 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "open": "0.0.3" }, "devDependencies": { - "jasmine-node":"1.3.x" + "jasmine-node":"1.8.x" }, "author": "Anis Kadri", "contributors": [ http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/3ee9664b/platforms.js ---------------------------------------------------------------------- diff --git a/platforms.js b/platforms.js index c49c797..b2f7b0b 100644 --- a/platforms.js +++ b/platforms.js @@ -17,4 +17,25 @@ under the License. */ -module.exports = ['ios', 'android', /*'blackberry',*/ 'wp7', 'wp8']; +module.exports = { + 'ios' : { + parser : require('./src/metadata/ios_parser'), + url : 'https://git-wip-us.apache.org/repos/asf/cordova-ios.git' + }, + 'android' : { + parser : require('./src/metadata/android_parser'), + url : 'https://git-wip-us.apache.org/repos/asf/cordova-ios.git' + }, + 'wp7' : { + parser : require('./src/metadata/wp7_parser'), + url : 'https://git-wip-us.apache.org/repos/asf/cordova-wp7.git' + }, + 'wp8' : { + parser : require('./src/metadata/wp8_parser'), + url : 'https://git-wip-us.apache.org/repos/asf/cordova-wp8.git' + }/*, + blackberry : { + parser : require('./metadata/blackberry_parser'), + url : 'https://git-wip-us.apache.org/repos/asf/cordova-blackberry.git' + }*/ +}; http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/3ee9664b/spec/cordova-cli/platform.spec.js ---------------------------------------------------------------------- diff --git a/spec/cordova-cli/platform.spec.js b/spec/cordova-cli/platform.spec.js index 5aab03d..2aa0177 100644 --- a/spec/cordova-cli/platform.spec.js +++ b/spec/cordova-cli/platform.spec.js @@ -27,6 +27,7 @@ var cordova = require('../../cordova'), util = require('../../src/util'), hooker = require('../../src/hooker'), platforms = require('../../platforms'), + platform = require('../../src/platform'), tempDir = path.join(__dirname, '..', '..', 'temp'); android_parser = require('../../src/metadata/android_parser'), ios_parser = require('../../src/metadata/ios_parser'), @@ -104,16 +105,15 @@ describe('platform command', function() { }); it('should handle multiple platforms', function() { - var arc = spyOn(android_parser, 'check_requirements'); - var brc = spyOn(blackberry_parser, 'check_requirements'); + spyOn(platform, 'supports').andCallFake(function(target, callback) { + callback(null); + }); var sh = spyOn(shell, 'exec'); - cordova.platform('add', ['android', 'blackberry']); - arc.mostRecentCall.args[0](false); - brc.mostRecentCall.args[0](false); - var android_create = path.join('android', 'bin', 'create'); - var bb_create = path.join('blackberry', 'bin', 'create'); - expect(sh.argsForCall[0][0]).toContain(android_create); - expect(sh.argsForCall[1][0]).toContain(bb_create); + cordova.platform('add', ['foo', 'bar']); + var foo_create = path.join('foo', 'bin', 'create'); + var bar_create = path.join('bar', 'bin', 'create'); + expect(sh.argsForCall[0][0]).toContain(foo_create); + expect(sh.argsForCall[1][0]).toContain(bar_create); }); }); http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/3ee9664b/src/compile.js ---------------------------------------------------------------------- diff --git a/src/compile.js b/src/compile.js index 2521811..4cf3b85 100644 --- a/src/compile.js +++ b/src/compile.js @@ -45,7 +45,7 @@ function shell_out_to_debug(projectRoot, platform, callback) { } -module.exports = function compile(platforms, callback) { +module.exports = function compile(platformList, callback) { var projectRoot = cordova_util.isCordova(process.cwd()); if (!projectRoot) { @@ -55,22 +55,22 @@ module.exports = function compile(platforms, callback) { var xml = cordova_util.projectConfig(projectRoot); var cfg = new config_parser(xml); - if (arguments.length === 0 || (platforms instanceof Array && platforms.length === 0)) { - platforms = cordova_util.listPlatforms(projectRoot); - } else if (typeof platforms == 'string') platforms = [platforms]; - else if (platforms instanceof Function && callback === undefined) { - callback = platforms; - platforms = cordova_util.listPlatforms(projectRoot); + if (arguments.length === 0 || (platformList instanceof Array && platformList.length === 0)) { + platformList = cordova_util.listPlatforms(projectRoot); + } else if (typeof platformList == 'string') platformList = [platformList]; + else if (platformList instanceof Function && callback === undefined) { + callback = platformList; + platformList = cordova_util.listPlatforms(projectRoot); } - if (platforms.length === 0) throw new Error('No platforms added to this project. Please use `cordova platform add <platform>`.'); + if (platformList.length === 0) throw new Error('No platforms added to this project. Please use `cordova platform add <platform>`.'); var hooks = new hooker(projectRoot); if (!(hooks.fire('before_compile'))) { throw new Error('before_compile hooks exited with non-zero code. Aborting.'); } - var end = n(platforms.length, function() { + var end = n(platformList.length, function() { if (!(hooks.fire('after_compile'))) { throw new Error('after_compile hooks exited with non-zero code. Aborting.'); } @@ -78,7 +78,7 @@ module.exports = function compile(platforms, callback) { }); // Iterate over each added platform - platforms.forEach(function(platform) { + platformList.forEach(function(platform) { shell_out_to_debug(projectRoot, platform, end); }); }; http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/3ee9664b/src/emulate.js ---------------------------------------------------------------------- diff --git a/src/emulate.js b/src/emulate.js index ffa1319..4e5451a 100644 --- a/src/emulate.js +++ b/src/emulate.js @@ -20,11 +20,7 @@ var cordova_util = require('./util'), path = require('path'), shell = require('shelljs'), config_parser = require('./config_parser'), - android_parser = require('./metadata/android_parser'), - ios_parser = require('./metadata/ios_parser'), - blackberry_parser = require('./metadata/blackberry_parser'), - wp7_parser = require('./metadata/wp7_parser'), - wp8_parser = require('./metadata/wp8_parser'), + platforms = require('../platforms'), platform = require('./platform'), fs = require('fs'), ls = fs.readdirSync, @@ -32,14 +28,6 @@ var cordova_util = require('./util'), hooker = require('../src/hooker'), util = require('util'); -var parsers = { - "android":android_parser, - "ios":ios_parser, - "blackberry":blackberry_parser, - "wp7":wp7_parser, - "wp8":wp8_parser -}; - function shell_out_to_emulate(root, platform, callback) { var cmd = '"' + path.join(root, 'platforms', platform, 'cordova', 'run') + '"'; // TODO: PLATFORM LIBRARY INCONSISTENCY @@ -55,7 +43,7 @@ function shell_out_to_emulate(root, platform, callback) { }); } -module.exports = function emulate (platforms, callback) { +module.exports = function emulate (platformList, callback) { var projectRoot = cordova_util.isCordova(process.cwd()); if (!projectRoot) { @@ -65,22 +53,22 @@ module.exports = function emulate (platforms, callback) { var xml = cordova_util.projectConfig(projectRoot); var cfg = new config_parser(xml); - if (arguments.length === 0 || (platforms instanceof Array && platforms.length === 0)) { - platforms = cordova_util.listPlatforms(projectRoot); - } else if (typeof platforms == 'string') platforms = [platforms]; - else if (platforms instanceof Function && callback === undefined) { - callback = platforms; - platforms = cordova_util.listPlatforms(projectRoot); + if (arguments.length === 0 || (platformList instanceof Array && platformList.length === 0)) { + platformList = cordova_util.listPlatforms(projectRoot); + } else if (typeof platformList == 'string') platformList = [platformList]; + else if (platformList instanceof Function && callback === undefined) { + callback = platformList; + platformList = cordova_util.listPlatforms(projectRoot); } - if (platforms.length === 0) throw new Error('No platforms added to this project. Please use `cordova platform add <platform>`.'); + if (platformList.length === 0) throw new Error('No platforms added to this project. Please use `cordova platform add <platform>`.'); var hooks = new hooker(projectRoot); if (!(hooks.fire('before_emulate'))) { throw new Error('before_emulate hooks exited with non-zero code. Aborting build.'); } - var end = n(platforms.length, function() { + var end = n(platformList.length, function() { if (!(hooks.fire('after_emulate'))) { throw new Error('after_emulate hooks exited with non-zero code. Aborting.'); } @@ -88,9 +76,9 @@ module.exports = function emulate (platforms, callback) { }); // Iterate over each added platform and shell out to debug command - platforms.forEach(function(platform) { + platformList.forEach(function(platform) { var platformPath = path.join(projectRoot, 'platforms', platform); - var parser = new parsers[platform](platformPath); + var parser = new platforms[platform].parser(platformPath); parser.update_project(cfg, function() { shell_out_to_emulate(projectRoot, platform, end); }); http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/3ee9664b/src/platform.js ---------------------------------------------------------------------- diff --git a/src/platform.js b/src/platform.js index 5670f1b..38032bc 100644 --- a/src/platform.js +++ b/src/platform.js @@ -23,22 +23,10 @@ var config_parser = require('./config_parser'), path = require('path'), hooker = require('./hooker'), n = require('ncallbacks'), - android_parser = require('./metadata/android_parser'), - ios_parser = require('./metadata/ios_parser'), - blackberry_parser = require('./metadata/blackberry_parser'), - wp7_parser = require('./metadata/wp7_parser'), - wp8_parser = require('./metadata/wp8_parser'), + platforms = require('../platforms'), plugman = require('plugman'), shell = require('shelljs'); -var parsers = { - "android":android_parser, - "ios":ios_parser, - "blackberry":blackberry_parser, - "wp7":wp7_parser, - "wp8":wp8_parser -}; - module.exports = function platform(command, targets, callback) { var projectRoot = cordova_util.isCordova(process.cwd()); @@ -103,7 +91,7 @@ module.exports = function platform(command, targets, callback) { throw new Error('An error occured during creation of ' + target + ' sub-project. ' + create_output); } - var parser = new parsers[target](output); + var parser = new platforms[target].parser(output); parser.update_project(cfg, function() { createOverrides(target); hooks.fire('after_platform_add'); @@ -154,10 +142,17 @@ module.exports.supports = function(name, callback) { if (!name) throw new Error('requires a platform name parameter'); if (!callback) throw new Error('requires a callback parameter'); + // check if platform exists + var platform = platforms[name]; + if (!platform) { + callback(new Error(util.format('"%s" platform does not exist', name))); + return; + } + // look up platform meta-data parser - var platformParser = parsers[name]; + var platformParser = platforms[name].parser; if (!platformParser) { - callback(new Error(util.format('"%s" platform does not exist', name))); + callback(new Error(util.format('"%s" platform parser does not exist', name))); return; } http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/3ee9664b/src/plugin.js ---------------------------------------------------------------------- diff --git a/src/plugin.js b/src/plugin.js index d5371cf..6045840 100644 --- a/src/plugin.js +++ b/src/plugin.js @@ -22,20 +22,13 @@ var cordova_util = require('./util'), shell = require('shelljs'), path = require('path'), shell = require('shelljs'), + platforms = require('../platforms'), config_parser = require('./config_parser'), hooker = require('./hooker'), plugin_parser = require('./plugin_parser'), ls = fs.readdirSync, plugman = require('plugman'); -var parsers = { - "android": require('./metadata/android_parser'), - "ios": require('./metadata/ios_parser'), - "wp7": require('./metadata/wp7_parser'), - "wp8": require('./metadata/wp8_parser'), - "blackberry": require('./metadata/blackberry_parser') -}; - module.exports = function plugin(command, targets, callback) { var projectRoot = cordova_util.isCordova(process.cwd()); @@ -49,7 +42,7 @@ module.exports = function plugin(command, targets, callback) { // Grab config info for the project var xml = cordova_util.projectConfig(projectRoot); var cfg = new config_parser(xml); - var platforms = cordova_util.listPlatforms(projectRoot); + var platformList = cordova_util.listPlatforms(projectRoot); // Massage plugin name(s) / path(s) var pluginPath, plugins; @@ -85,9 +78,9 @@ module.exports = function plugin(command, targets, callback) { } // Iterate over all platforms in the project and install the plugin. - platforms.forEach(function(platform) { + platformList.forEach(function(platform) { var platformRoot = path.join(projectRoot, 'platforms', platform); - var parser = new parsers[platform](platformRoot); + var parser = new platforms[platform].parser(platformRoot); // TODO: unify use of blackberry in cli vs blackberry10 in plugman plugman.install((platform=='blackberry'?'blackberry10':platform), platformRoot, path.basename(dir), pluginsDir, { www_dir: parser.staging_dir() }); @@ -100,7 +93,7 @@ module.exports = function plugin(command, targets, callback) { break; case 'rm': case 'remove': - if (platforms.length === 0) { + if (platformList.length === 0) { throw new Error('You need at least one platform added to your app. Use `cordova platform add <platform>`.'); } targets.forEach(function(target, index) { @@ -112,7 +105,7 @@ module.exports = function plugin(command, targets, callback) { // supported platforms and app platforms var pluginXml = new plugin_parser(path.join(targetPath, 'plugin.xml')); var intersection = pluginXml.platforms.filter(function(e) { - if (platforms.indexOf(e) == -1) return false; + if (platformList.indexOf(e) == -1) return false; else return true; }); @@ -122,7 +115,7 @@ module.exports = function plugin(command, targets, callback) { // is not needed and we just --remove the plugin below. intersection.forEach(function(platform) { var platformRoot = path.join(projectRoot, 'platforms', platform); - var parser = new parsers[platform](platformRoot); + var parser = new platforms[platform].parser(platformRoot); plugman.uninstall(platform, platformRoot, target, path.join(projectRoot, 'plugins'), { www_dir: parser.staging_dir() }); }); http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/3ee9664b/src/plugin_parser.js ---------------------------------------------------------------------- diff --git a/src/plugin_parser.js b/src/plugin_parser.js index d104c9e..3b1c24b 100644 --- a/src/plugin_parser.js +++ b/src/plugin_parser.js @@ -18,7 +18,6 @@ under the License. */ var et = require('elementtree'), - platforms = require('./../platforms'), fs = require('fs'); function plugin_parser(xmlPath) { http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/3ee9664b/src/prepare.js ---------------------------------------------------------------------- diff --git a/src/prepare.js b/src/prepare.js index b5c66ee..b08827e 100644 --- a/src/prepare.js +++ b/src/prepare.js @@ -19,30 +19,18 @@ var cordova_util = require('./util'), path = require('path'), config_parser = require('./config_parser'), + platforms = require('../platforms'), platform = require('./platform'), fs = require('fs'), shell = require('shelljs'), et = require('elementtree'), - android_parser = require('./metadata/android_parser'), - blackberry_parser = require('./metadata/blackberry_parser'), - ios_parser = require('./metadata/ios_parser'), - wp7_parser = require('./metadata/wp7_parser'), - wp8_parser = require('./metadata/wp8_parser'), hooker = require('./hooker'), n = require('ncallbacks'), prompt = require('prompt'), plugman = require('plugman'), util = require('util'); -var parsers = { - "android":android_parser, - "ios":ios_parser, - "blackberry":blackberry_parser, - "wp7":wp7_parser, - "wp8":wp8_parser -}; - -module.exports = function prepare(platforms, callback) { +module.exports = function prepare(platformList, callback) { var projectRoot = cordova_util.isCordova(process.cwd()); if (!projectRoot) { @@ -52,22 +40,22 @@ module.exports = function prepare(platforms, callback) { var xml = cordova_util.projectConfig(projectRoot); var cfg = new config_parser(xml); - if (arguments.length === 0 || (platforms instanceof Array && platforms.length === 0)) { - platforms = cordova_util.listPlatforms(projectRoot); - } else if (typeof platforms == 'string') platforms = [platforms]; - else if (platforms instanceof Function && callback === undefined) { - callback = platforms; - platforms = cordova_util.listPlatforms(projectRoot); + if (arguments.length === 0 || (platformList instanceof Array && platformList.length === 0)) { + platformList = cordova_util.listPlatforms(projectRoot); + } else if (typeof platformList == 'string') platformList = [platformList]; + else if (platformList instanceof Function && callback === undefined) { + callback = platformList; + platformList = cordova_util.listPlatforms(projectRoot); } - if (platforms.length === 0) throw new Error('No platforms added to this project. Please use `cordova platform add <platform>`.'); + if (platformList.length === 0) throw new Error('No platforms added to this project. Please use `cordova platform add <platform>`.'); var hooks = new hooker(projectRoot); if (!(hooks.fire('before_prepare'))) { throw new Error('before_prepare hooks exited with non-zero code. Aborting.'); } - var end = n(platforms.length, function() { + var end = n(platformList.length, function() { if (!(hooks.fire('after_prepare'))) { throw new Error('after_prepare hooks exited with non-zero code. Aborting.'); } @@ -75,9 +63,9 @@ module.exports = function prepare(platforms, callback) { }); // Iterate over each added platform - platforms.forEach(function(platform) { + platformList.forEach(function(platform) { var platformPath = path.join(projectRoot, 'platforms', platform); - var parser = new parsers[platform](platformPath); + var parser = new platforms[platform].parser(platformPath); parser.update_project(cfg, function() { // Call plugman --prepare for this platform. sets up js-modules appropriately. http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/3ee9664b/src/serve.js ---------------------------------------------------------------------- diff --git a/src/serve.js b/src/serve.js index e7eb42b..b5036de 100644 --- a/src/serve.js +++ b/src/serve.js @@ -20,20 +20,13 @@ var cordova_util = require('./util'), path = require('path'), shell = require('shelljs'), + platforms = require('../platforms'), config_parser = require('./config_parser'), fs = require('fs'), util = require('util'), http = require("http"), url = require("url"); -var parsers = { - 'android': require('./metadata/android_parser'), - 'ios': require('./metadata/ios_parser'), - 'blackberry': require('./metadata/blackberry_parser'), - 'wp7': require('./metadata/wp7_parser'), - 'wp8': require('./metadata/wp8_parser') -}; - function launch_server(www, platform_www, config_xml_path, port) { port = port || 8000; @@ -107,12 +100,12 @@ module.exports.config = function (platform, port, callback) { var cfg = new config_parser(xml); // Retrieve the platforms. - var platforms = cordova_util.listPlatforms(projectRoot); + var platformList = cordova_util.listPlatforms(projectRoot); if (!platform) { throw new Error('You need to specify a platform.'); - } else if (platforms.length == 0) { + } else if (platformList.length == 0) { throw new Error('No platforms to serve.'); - } else if (platforms.filter(function(x) { return x == platform }).length == 0) { + } else if (platformList.filter(function(x) { return x == platform }).length == 0) { throw new Error(platform + ' is not an installed platform.'); } @@ -129,7 +122,7 @@ module.exports.config = function (platform, port, callback) { // Top-level www directory. result.paths.push(cordova_util.projectWww(projectRoot)); - var parser = parsers[platform](path.join(projectRoot, 'platforms', platform)); + var parser = platforms[platform].parser(path.join(projectRoot, 'platforms', platform)); // Update the related platform project from the config parser.update_project(cfg, function() { http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/3ee9664b/src/util.js ---------------------------------------------------------------------- diff --git a/src/util.js b/src/util.js index 9b725a4..1ec7813 100644 --- a/src/util.js +++ b/src/util.js @@ -19,7 +19,6 @@ */ var fs = require('fs'), path = require('path'), - core_platforms = require('../platforms'), shell = require('shelljs'); var lib_path = path.join(__dirname, '..', 'lib') @@ -59,8 +58,9 @@ module.exports = { }); }, listPlatforms:function(project_dir) { + var core_platforms = require('../platforms'); return fs.readdirSync(path.join(project_dir, 'platforms')).filter(function(p) { - return core_platforms.indexOf(p) > -1; + return Object.keys(core_platforms).indexOf(p) > -1; }); }, // list the directories in the path, ignoring any files http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/3ee9664b/test_runner.js ---------------------------------------------------------------------- diff --git a/test_runner.js b/test_runner.js index 1174b37..0250aa3 100644 --- a/test_runner.js +++ b/test_runner.js @@ -14,7 +14,7 @@ shell.rm('-rf', tmp); shell.mkdir('-p', path.join(tmp, 'platform-script')); shell.cp('-r', path.join(__dirname, 'spec', 'fixtures'), tmp); -var end = n(platforms.length, function() { +var end = n(Object.keys(platforms).length, function() { console.log('Testing core cli and the following platforms: ' + supported.join(', ')); var cmd = 'node ' + path.join('node_modules', 'jasmine-node', 'bin', 'jasmine-node') + ' --color ' + tmp; specs.forEach(function(s) { @@ -23,10 +23,13 @@ var end = n(platforms.length, function() { }); shell.cp('-r', path.join(__dirname, 'spec', 'cordova-cli'), tmp); shell.exec(cmd, {async:true, silent:false}, function(code, output) { + if(code > 0) { + console.log(output); + } }); }); console.log('Determining which platforms to run tests for...'); -platforms.forEach(function(p) { +Object.keys(platforms).forEach(function(p) { platform.supports(p, function(e) { if (e) { } else {
