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]

Reply via email to