CB-11346: Remove known platforms check This closes #523, This closes #519
Project: http://git-wip-us.apache.org/repos/asf/cordova-lib/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-lib/commit/faf54779 Tree: http://git-wip-us.apache.org/repos/asf/cordova-lib/tree/faf54779 Diff: http://git-wip-us.apache.org/repos/asf/cordova-lib/diff/faf54779 Branch: refs/heads/common-2.0.x Commit: faf54779fd6e02f23d2a302629599e578fd5d02a Parents: 3a810d1 Author: Jesse MacFadyen <[email protected]> Authored: Mon Feb 27 16:13:43 2017 -0800 Committer: Steve Gill <[email protected]> Committed: Fri Mar 10 15:29:12 2017 -0800 ---------------------------------------------------------------------- cordova-common/src/events.js | 1 + cordova-lib/spec-cordova/util.spec.js | 20 +++++----- cordova-lib/src/cordova/platform.js | 20 +++++----- cordova-lib/src/cordova/util.js | 9 +++-- cordova-lib/src/platforms/platforms.js | 60 +++++++++++++++++------------ 5 files changed, 62 insertions(+), 48 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/faf54779/cordova-common/src/events.js ---------------------------------------------------------------------- diff --git a/cordova-common/src/events.js b/cordova-common/src/events.js index e702bd8..3080416 100644 --- a/cordova-common/src/events.js +++ b/cordova-common/src/events.js @@ -20,6 +20,7 @@ var EventEmitter = require('events').EventEmitter; var INSTANCE = new EventEmitter(); +INSTANCE.setMaxListeners(20); var EVENTS_RECEIVER; module.exports = INSTANCE; http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/faf54779/cordova-lib/spec-cordova/util.spec.js ---------------------------------------------------------------------- diff --git a/cordova-lib/spec-cordova/util.spec.js b/cordova-lib/spec-cordova/util.spec.js index 924e611..2df7a8d 100644 --- a/cordova-lib/spec-cordova/util.spec.js +++ b/cordova-lib/spec-cordova/util.spec.js @@ -122,17 +122,17 @@ describe('util module', function() { }); it('Test 009 : should only return supported platform directories present in a cordova project dir', function() { var platforms = path.join(temp, 'platforms'); - var android = path.join(platforms, 'android'); - var ios = path.join(platforms, 'ios'); - var wp8_dir = path.join(platforms, 'wp8'); - var atari = path.join(platforms, 'atari'); - shell.mkdir('-p', android); - shell.mkdir('-p', ios); - shell.mkdir('-p', wp8_dir); - shell.mkdir('-p', atari); + + shell.mkdir('-p', path.join(platforms, 'android')); + shell.mkdir('-p', path.join(platforms, 'ios')); + shell.mkdir('-p', path.join(platforms, 'wp8')); + shell.mkdir('-p', path.join(platforms, 'atari')); + + // create a typical platforms.json file, it should not be returned as a platform + shell.exec('touch ' + path.join(platforms,'platforms.json')); + var res = util.listPlatforms(temp); - expect(res.length).toEqual(3); - expect(res.indexOf('atari')).toEqual(-1); + expect(res.length).toEqual(4); }); }); describe('getInstalledPlatformsWithVersions method', function() { http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/faf54779/cordova-lib/src/cordova/platform.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/platform.js b/cordova-lib/src/cordova/platform.js index 2d5ab88..19e7355 100644 --- a/cordova-lib/src/cordova/platform.js +++ b/cordova-lib/src/cordova/platform.js @@ -37,7 +37,7 @@ var config = require('./config'), fetch = require('cordova-fetch'), npmUninstall = require('cordova-fetch').uninstall, platformMetadata = require('./platform_metadata'); - + // Expose the platform parsers on top of this command for (var p in platforms) { module.exports[p] = platforms[p]; @@ -81,7 +81,7 @@ function addHelper(cmd, hooksRunner, projectRoot, targets, opts) { return hooksRunner.fire('before_platform_' + cmd, opts) .then(function() { - var platformsToSave = []; + var platformsToSave = []; return promiseutil.Q_chainmap(targets, function(target) { // For each platform, download it and call its helper script. @@ -89,7 +89,7 @@ function addHelper(cmd, hooksRunner, projectRoot, targets, opts) { var platform = parts[0]; var spec = parts[1]; var pkgJson; - + return Q.when().then(function() { if (!(platform in platforms)) { spec = platform; @@ -107,7 +107,7 @@ function addHelper(cmd, hooksRunner, projectRoot, targets, opts) { delete require.cache[require.resolve(path.join(projectRoot, 'package.json'))]; pkgJson = require(path.join(projectRoot,'package.json')); } - + // If there is no spec specified, try to get spec from package.json // else, if there is no spec specified, try to get spec from config.xml if (spec === undefined && pkgJson && pkgJson.dependencies && cmd === 'add') { @@ -260,7 +260,7 @@ function addHelper(cmd, hooksRunner, projectRoot, targets, opts) { cfg.removeEngine(platform); cfg.addEngine(platform, spec); cfg.write(); - + // Save to add to pacakge.json's cordova.platforms array in the next then. platformsToSave.push(platform); } @@ -271,7 +271,7 @@ function addHelper(cmd, hooksRunner, projectRoot, targets, opts) { var pkgJsonPath = path.join(projectRoot, 'package.json'); var modifiedPkgJson = false; if(fs.existsSync(pkgJsonPath)) { - delete require.cache[require.resolve(pkgJsonPath)]; + delete require.cache[require.resolve(pkgJsonPath)]; pkgJson = require(pkgJsonPath); } else { // TODO: Create package.json in cordova@7 @@ -292,7 +292,7 @@ function addHelper(cmd, hooksRunner, projectRoot, targets, opts) { events.emit('verbose','adding '+plat+' to cordova.platforms array in package.json'); pkgJson.cordova.platforms.push(plat); modifiedPkgJson = true; - } + } }); } // Save to package.json. @@ -406,7 +406,8 @@ function getPlatformDetailsFromDir(dir, platformIfKnown){ } } - if (!version || !platform || !platforms[platform]) { + // platform does NOT have to exist in 'platforms', but it should have a name, and a version + if (!version || !platform) { return Q.reject(new CordovaError('The provided path does not seem to contain a ' + 'Cordova platform: ' + libDir)); } @@ -658,7 +659,8 @@ function list(hooksRunner, projectRoot, opts) { function addDeprecatedInformationToPlatforms(platformsList){ platformsList = platformsList.map(function(p){ var platformKey = p.split(' ')[0]; //Remove Version Information - if(platforms[platformKey].deprecated){ + // allow for 'unknown' platforms, which will not exist in platforms + if(platforms[platformKey] && platforms[platformKey].deprecated){ p = p.concat(' ', '(deprecated)'); } return p; http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/faf54779/cordova-lib/src/cordova/util.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/util.js b/cordova-lib/src/cordova/util.js index 6937e4d..86d0cf7 100644 --- a/cordova-lib/src/cordova/util.js +++ b/cordova-lib/src/cordova/util.js @@ -191,15 +191,16 @@ function deleteSvnFolders(dir) { } function listPlatforms(project_dir) { - var core_platforms = require('../platforms/platforms'); var platforms_dir = path.join(project_dir, 'platforms'); if ( !fs.existsSync(platforms_dir)) { return []; } - var subdirs = fs.readdirSync(platforms_dir); - return subdirs.filter(function(p) { - return Object.keys(core_platforms).indexOf(p) > -1; + // get subdirs (that are actually dirs, and not files) + var subdirs = fs.readdirSync(platforms_dir) + .filter(function(file) { + return fs.statSync(path.join(platforms_dir, file)).isDirectory(); }); + return subdirs; } function getInstalledPlatformsWithVersions(project_dir) { http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/faf54779/cordova-lib/src/platforms/platforms.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/platforms/platforms.js b/cordova-lib/src/platforms/platforms.js index db9b76d..0efcbfc 100644 --- a/cordova-lib/src/platforms/platforms.js +++ b/cordova-lib/src/platforms/platforms.js @@ -18,6 +18,7 @@ */ var path = require('path'); +var fs = require('fs'); var util = require('../cordova/util'); var platforms = require('./platformsConfig.json'); var events = require('cordova-common').events; @@ -43,36 +44,45 @@ function getPlatformApi(platform, platformRootDir) { // CB-11174 Resolve symlinks first before working with root directory platformRootDir = util.convertToRealPathSafe(platformRootDir); + // Make sure the platforms/platform folder exists + if(!fs.existsSync(platformRootDir)) { + throw new Error('The platform "' + platform + '" does not appear to have been added to this project.'); + } + + + var platformApi; var cached = cachedApis[platformRootDir]; - if (cached && cached.platform == platform) return cached; - - if (!platforms[platform]) throw new Error('Unknown platform ' + platform); - - var PlatformApi; - try { - // First we need to find whether platform exposes its' API via js module - // If it does, then we require and instantiate it. - var platformApiModule = path.join(platformRootDir, 'cordova', 'Api.js'); - PlatformApi = require(platformApiModule); - } catch (err) { - // Check if platform already compatible w/ PlatformApi and show deprecation warning - if (err && err.code === 'MODULE_NOT_FOUND') { - if (platforms[platform].apiCompatibleSince) { - events.emit('warn', ' Using this version of Cordova with older version of cordova-' + platform + - ' is being deprecated. Consider upgrading to cordova-' + platform + '@' + - platforms[platform].apiCompatibleSince + ' or newer.'); + if (cached && cached.platform == platform) { + platformApi = cached; + } + else { + + var PlatformApi; + try { + // First we need to find whether platform exposes its' API via js module + // If it does, then we require and instantiate it. + var platformApiModule = path.join(platformRootDir, 'cordova', 'Api.js'); + PlatformApi = require(platformApiModule); + } catch (err) { + // Check if platform already compatible w/ PlatformApi and show deprecation warning + if (err && err.code === 'MODULE_NOT_FOUND') { + if (platforms[platform].apiCompatibleSince) { + events.emit('warn', ' Using this version of Cordova with older version of cordova-' + platform + + ' is being deprecated. Consider upgrading to cordova-' + platform + '@' + + platforms[platform].apiCompatibleSince + ' or newer.'); + } + // else nothing - there is no Api.js and no deprecation information hence + // the platform just does not expose Api and we will use polyfill as usual + } else { + events.emit('warn', 'Error loading cordova-'+platform); } - // else nothing - there is no Api.js and no deprecation information hence - // the platform just does not expose Api and we will use polyfill as usual - } else { - events.emit('warn', 'Error loading cordova-'+platform); + + PlatformApi = require('./PlatformApiPoly'); } - PlatformApi = require('./PlatformApiPoly'); + platformApi = new PlatformApi(platform, platformRootDir, events); + cachedApis[platformRootDir] = platformApi; } - - var platformApi = new PlatformApi(platform, platformRootDir, events); - cachedApis[platformRootDir] = platformApi; return platformApi; } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
