You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by js...@apache.org on 2014/07/02 21:37:03 UTC

[4/4] git commit: CB-6776 Make project/.cordova/config.json integrate with platforms.js

CB-6776 Make project/.cordova/config.json integrate with platforms.js


Project: http://git-wip-us.apache.org/repos/asf/cordova-lib/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-lib/commit/3911876c
Tree: http://git-wip-us.apache.org/repos/asf/cordova-lib/tree/3911876c
Diff: http://git-wip-us.apache.org/repos/asf/cordova-lib/diff/3911876c

Branch: refs/heads/master
Commit: 3911876cdca2fc69f964c2e72fc7a01813ebf639
Parents: 2cc872f
Author: Josh Soref <js...@blackberry.com>
Authored: Thu Jun 19 15:17:17 2014 -0400
Committer: Josh Soref <js...@blackberry.com>
Committed: Wed Jul 2 15:36:13 2014 -0400

----------------------------------------------------------------------
 cordova-lib/spec-cordova/create.spec.js         |  4 +-
 .../fixtures/base/.cordova/config.json          |  6 +-
 cordova-lib/spec-cordova/lazy_load.spec.js      | 98 +++++++++++++++++---
 .../metadata/windows8_parser.spec.js            | 12 ++-
 .../spec-cordova/metadata/wp8_parser.spec.js    | 12 ++-
 cordova-lib/spec-cordova/platform.spec.js       |  4 +-
 cordova-lib/src/cordova/config.js               |  2 +-
 cordova-lib/src/cordova/create.js               | 14 +--
 cordova-lib/src/cordova/lazy_load.js            | 74 +++++++++++----
 .../cordova/metadata/amazon_fireos_parser.js    |  2 +-
 .../src/cordova/metadata/android_parser.js      |  2 +-
 .../src/cordova/metadata/blackberry10_parser.js | 14 ++-
 .../src/cordova/metadata/firefoxos_parser.js    |  2 +-
 cordova-lib/src/cordova/metadata/ios_parser.js  |  2 +-
 .../src/cordova/metadata/ubuntu_parser.js       |  2 +-
 .../src/cordova/metadata/windows_parser.js      | 17 ++--
 cordova-lib/src/cordova/metadata/wp8_parser.js  | 14 +--
 cordova-lib/src/cordova/platform.js             |  7 +-
 cordova-lib/src/cordova/platforms.js            |  1 +
 19 files changed, 206 insertions(+), 83 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/spec-cordova/create.spec.js
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-cordova/create.spec.js b/cordova-lib/spec-cordova/create.spec.js
index 47bb2af..a7e5c08 100644
--- a/cordova-lib/spec-cordova/create.spec.js
+++ b/cordova-lib/spec-cordova/create.spec.js
@@ -50,7 +50,7 @@ var cordovaDir = path.join(project, '.cordova');
 var configNormal = {
       lib: {
         www: {
-          uri: path.join(__dirname, 'fixtures', 'base', 'www'),
+          url: path.join(__dirname, 'fixtures', 'base', 'www'),
           version: "testCordovaCreate",
           id: appName
         }
@@ -59,7 +59,7 @@ var configNormal = {
 var configSymlink = {
       lib: {
         www: {
-          uri: path.join(__dirname, 'fixtures', 'base'), // "create" should copy or link the www child of this dir and not the dir itself.
+          url: path.join(__dirname, 'fixtures', 'base'), // "create" should copy or link the www child of this dir and not the dir itself.
           link: true
         }
       }

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/spec-cordova/fixtures/base/.cordova/config.json
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-cordova/fixtures/base/.cordova/config.json b/cordova-lib/spec-cordova/fixtures/base/.cordova/config.json
index 662fc9d..4f52ca7 100644
--- a/cordova-lib/spec-cordova/fixtures/base/.cordova/config.json
+++ b/cordova-lib/spec-cordova/fixtures/base/.cordova/config.json
@@ -3,17 +3,17 @@
   "name":"TestBase",
   "lib": {
     "android": {
-      "uri": "/some/junk/path",
+      "url": "/some/junk/path",
       "version": "dev",
       "id": "cordova-android-dev"
     },
     "ios": {
-      "uri": "/some/junk/path",
+      "url": "/some/junk/path",
       "version": "dev",
       "id": "cordova-ios-dev"
     },
     "wp8": {
-      "uri": "/some/junk/path",
+      "url": "/some/junk/path",
       "version": "dev",
       "id": "cordova-wp8-dev"
     }

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/spec-cordova/lazy_load.spec.js
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-cordova/lazy_load.spec.js b/cordova-lib/spec-cordova/lazy_load.spec.js
index 7db849d..27b5b91 100644
--- a/cordova-lib/spec-cordova/lazy_load.spec.js
+++ b/cordova-lib/spec-cordova/lazy_load.spec.js
@@ -32,6 +32,13 @@ describe('lazy_load module', function() {
     var custom_path;
     beforeEach(function() {
         custom_path = spyOn(config, 'has_custom_path').andReturn(false);
+        fakeLazyLoad = function(id, platform, version) {
+            if (platform == 'wp7' || platform == 'wp8') {
+                return Q(path.join('lib', 'wp', id, version, platform));
+            } else {
+                return Q(path.join('lib', platform, id, version, platforms[platform] && platforms[platform].subdirectory ? platforms[platform].subdirectory : ''));
+            }
+        };
     });
     describe('cordova method (loads stock cordova libs)', function() {
         var custom;
@@ -46,8 +53,15 @@ describe('lazy_load module', function() {
             }).fin(done);
         });
         it('should invoke lazy_load.custom with appropriate url, platform, and version as specified in platforms manifest', function(done) {
+            var url = platforms.android.url + ';a=snapshot;h=' + platforms.android.version + ';sf=tgz';
+            custom.andCallFake(function (platforms, platform) {
+                expect(platform).toEqual('android');
+                expect(platforms[platform].url).toEqual(url);
+                expect(platforms[platform].id).toEqual('cordova');
+                return fakeLazyLoad(platforms[platform].id, platform, platforms[platform].version);
+            });
             lazy_load.cordova('android').then(function(dir) {
-                expect(custom).toHaveBeenCalledWith(platforms.android.url + ';a=snapshot;h=' + platforms.android.version + ';sf=tgz', 'cordova', 'android', platforms.android.version);
+                expect(custom).toHaveBeenCalled();
                 expect(dir).toBeDefined();
                 done();
             });
@@ -67,7 +81,14 @@ describe('lazy_load module', function() {
 
         it('should callback with no errors and not fire event hooks if library already exists', function(done) {
             exists.andReturn(true);
-            lazy_load.custom('http://some remote url', 'some id', 'platform X', 'three point five').then(function() {
+            var mock_platforms = {
+                'platform X': {
+                    id: 'some id',
+                    url: 'http://some remote url',
+                    version: 'three point five'
+                }
+            };
+            lazy_load.custom(mock_platforms, 'platform X').then(function() {
                 expect(fire).not.toHaveBeenCalled()
             }, function(err) {
                 expect(err).not.toBeDefined();
@@ -75,7 +96,14 @@ describe('lazy_load module', function() {
         });
         it('should callback with no errors and fire event hooks even if library already exists if the lib url is a local dir', function(done) {
             exists.andReturn(true);
-            lazy_load.custom('some local dir', 'some id', 'platform X', 'three point six').then(function() {
+            var mock_platforms = {
+                'platform X': {
+                    id: 'some id',
+                    url: 'some local dir',
+                    version: 'three point six'
+                }
+            };
+            lazy_load.custom(mock_platforms, 'platform X').then(function() {
                 expect(fire).not.toHaveBeenCalled()
             }, function(err) {
                 expect(err).not.toBeDefined();
@@ -109,11 +137,18 @@ describe('lazy_load module', function() {
                 load_spy = spyOn(npmconf, 'load').andCallFake(function(cb) { cb(null, { get: function() { return npmConfProxy }}); });
             });
 
-            it('should call request with appopriate url params', function(done) {
+            it('should call request with appropriate url params', function(done) {
                 var url = 'https://github.com/apache/someplugin';
-                lazy_load.custom(url, 'random', 'android', '1.0').then(function() {
+                var with_android_platform = {
+                    'android': {
+                        id: 'random',
+                        url: url,
+                        version: '1.0'
+                    }
+                };
+                lazy_load.custom(with_android_platform, 'android').then(function() {
                     expect(req).toHaveBeenCalledWith({
-                        uri:url
+                        url:url
                     }, jasmine.any(Function));
                 }, function(err) {
                     expect(err).not.toBeDefined();
@@ -123,9 +158,16 @@ describe('lazy_load module', function() {
                 var proxy = 'https://somelocalproxy.com';
                 npmConfProxy = proxy;
                 var url = 'https://github.com/apache/someplugin';
-                lazy_load.custom(url, 'random', 'android', '1.0').then(function() {
+                var with_android_platform = {
+                    'android': {
+                        id: 'random',
+                        url: url,
+                        version: '1.0'
+                    }
+                };
+                lazy_load.custom(with_android_platform, 'android').then(function() {
                     expect(req).toHaveBeenCalledWith({
-                        uri:url,
+                        url:url,
                         proxy:proxy
                     }, jasmine.any(Function));
                 }, function(err) {
@@ -136,9 +178,16 @@ describe('lazy_load module', function() {
                 var proxy = 'http://somelocalproxy.com';
                 npmConfProxy = proxy;
                 var url = 'http://github.com/apache/someplugin';
-                lazy_load.custom(url, 'random', 'android', '1.0').then(function() {
+                var with_android_platform = {
+                    'android': {
+                        id: 'random',
+                        url: url,
+                        version: '1.0'
+                    }
+                };
+                lazy_load.custom(with_android_platform, 'android').then(function() {
                     expect(req).toHaveBeenCalledWith({
-                        uri:url,
+                        url:url,
                         proxy:proxy
                     }, jasmine.any(Function));
                 }, function(err) {
@@ -149,14 +198,28 @@ describe('lazy_load module', function() {
 
         describe('local paths for libraries', function() {
             it('should return the local path, no symlink', function(done) {
-                lazy_load.custom('/some/random/lib', 'id', 'X', 'three point eight').then(function(dir) {
+                var mock_platforms = {
+                    'X': {
+                        id: 'id',
+                        url: '/some/random/lib',
+                        version: 'three point eight'
+                    }
+                };
+                lazy_load.custom(mock_platforms, 'X').then(function(dir) {
                     expect(dir).toEqual('/some/random/lib');
                 }, function(err) {
                     expect(err).toBeUndefined();
                 }).fin(done);
             });
             it('should not file download hook', function(done) {
-                lazy_load.custom('/some/random/lib', 'id', 'X', 'three point nine').then(function() {
+                var mock_platforms = {
+                    'X': {
+                        id: 'id',
+                        url: '/some/random/lib',
+                        version: 'three point nine'
+                    }
+                };
+                lazy_load.custom(mock_platforms, 'X').then(function() {
                     expect(fire).not.toHaveBeenCalledWith('after_library_download', {platform:'X',url:'/some/random/lib',id:'id',version:'three point nine',path:'/some/random/lib', symlink:false});
                 }, function(err) {
                     expect(err).toBeUndefined();
@@ -175,7 +238,7 @@ describe('lazy_load module', function() {
             var read = spyOn(config, 'read').andReturn({
                 lib:{
                     maybe:{
-                        uri:'you or eye?',
+                        url:'you or eye?',
                         id:'eye dee',
                         version:'four point twenty'
                     }
@@ -183,8 +246,15 @@ describe('lazy_load module', function() {
             });
             var p = '/some/random/custom/path';
             custom_path.andReturn(p);
+            custom.andCallFake(function (platforms, platform) {
+                expect(platform).toEqual('maybe');
+                expect(platforms[platform].url).toEqual('you or eye?');
+                expect(platforms[platform].id).toEqual('eye dee');
+                expect(platforms[platform].version).toEqual('four point twenty');
+                return fakeLazyLoad(platforms[platform].id, platform, platforms[platform].version);
+            });
             lazy_load.based_on_config('yup', 'maybe').then(function() {
-                expect(custom).toHaveBeenCalledWith('you or eye?', 'eye dee', 'maybe', 'four point twenty');
+                expect(custom).toHaveBeenCalled();
             }, function(err) {
                 expect(err).toBeUndefined();
             }).fin(done);

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/spec-cordova/metadata/windows8_parser.spec.js
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-cordova/metadata/windows8_parser.spec.js b/cordova-lib/spec-cordova/metadata/windows8_parser.spec.js
index 79af143..389e9e5 100644
--- a/cordova-lib/spec-cordova/metadata/windows8_parser.spec.js
+++ b/cordova-lib/spec-cordova/metadata/windows8_parser.spec.js
@@ -36,7 +36,7 @@ var cfg = new ConfigParser(path.join(__dirname, '..', 'test-config.xml'));
 describe('windows8 project parser', function() {
 
     var proj = '/some/path';
-    var exists, exec, custom, readdir, cfg_parser;
+    var exists, exec, custom, readdir, cfg_parser, config_read;
     var winXml;
     beforeEach(function() {
         exists = spyOn(fs, 'existsSync').andReturn(true);
@@ -45,6 +45,16 @@ describe('windows8 project parser', function() {
             cb(null, '', '');
         });
         custom = spyOn(config, 'has_custom_path').andReturn(false);
+        config_read = spyOn(config, 'read').andCallFake(function() {
+            return custom() ? {
+                lib: {
+                    windows8: {
+                        url: custom()
+                    }
+                }
+            }
+            : ({})
+        });
         readdir = spyOn(fs, 'readdirSync').andReturn(['test.jsproj']);
         winXml = null;
         spyOn(xmlHelpers, 'parseElementtreeSync').andCallFake(function(path) {

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/spec-cordova/metadata/wp8_parser.spec.js
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-cordova/metadata/wp8_parser.spec.js b/cordova-lib/spec-cordova/metadata/wp8_parser.spec.js
index 84e8777..69336cb 100644
--- a/cordova-lib/spec-cordova/metadata/wp8_parser.spec.js
+++ b/cordova-lib/spec-cordova/metadata/wp8_parser.spec.js
@@ -36,7 +36,7 @@ var cfg = new ConfigParser(path.join(__dirname, '..', 'test-config.xml'));
 
 describe('wp8 project parser', function() {
     var proj = '/some/path';
-    var exists, exec, custom, readdir, cfg_parser;
+    var exists, exec, custom, readdir, cfg_parser, config_read;
     var manifestXml, projXml;
     beforeEach(function() {
         exists = spyOn(fs, 'existsSync').andReturn(true);
@@ -44,6 +44,16 @@ describe('wp8 project parser', function() {
             (cb || opts)(0, '', '');
         });
         custom = spyOn(config, 'has_custom_path').andReturn(false);
+        config_read = spyOn(config, 'read').andCallFake(function() {
+            return custom() ? {
+                lib: {
+                    wp8: {
+                        url: custom()
+                    }
+                }
+            }
+            : ({})
+        });
         readdir = spyOn(fs, 'readdirSync').andReturn(['test.csproj']);
         projXml = manifestXml = null;
         spyOn(xmlHelpers, 'parseElementtreeSync').andCallFake(function(path) {

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/spec-cordova/platform.spec.js
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-cordova/platform.spec.js b/cordova-lib/spec-cordova/platform.spec.js
index 76c9501..fb59ef2 100644
--- a/cordova-lib/spec-cordova/platform.spec.js
+++ b/cordova-lib/spec-cordova/platform.spec.js
@@ -28,6 +28,7 @@ var helpers = require('./helpers'),
     events = require('../src/events'),
     cordova = require('../src/cordova/cordova');
 
+var supported_platforms = Object.keys(platforms).filter(function(p) { return p != 'www'; });
 var tmpDir = helpers.tmpDir('platform_test');
 var project = path.join(tmpDir, 'project');
 
@@ -52,7 +53,6 @@ describe('platform end-to-end', function() {
             expect(installed[1].indexOf(helpers.testPlatform)).toBe(-1);
         });
     }
-
     function fullPlatformList() {
         return cordova.raw.platform('list').then(function() {
             var installed = results.match(/Installed platforms: (.*)/);
@@ -75,7 +75,7 @@ describe('platform end-to-end', function() {
         // Now we load the config.json in the newly created project and edit the target platform's lib entry
         // to point at the fixture version. This is necessary so that cordova.prepare can find cordova.js there.
         var c = config.read(project);
-        c.lib[helpers.testPlatform].uri = path.join(__dirname, 'fixtures', 'platforms', helpers.testPlatform + '-lib');
+        c.lib[helpers.testPlatform].url = path.join(__dirname, 'fixtures', 'platforms', helpers.testPlatform + '-lib');
         config.write(project, c);
 
         // The config.json in the fixture project points at fake "local" paths.

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/src/cordova/config.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/config.js b/cordova-lib/src/cordova/config.js
index a92b10a..0ab3f18 100644
--- a/cordova-lib/src/cordova/config.js
+++ b/cordova-lib/src/cordova/config.js
@@ -76,7 +76,7 @@ config.write = function set_config(project_root, json) {
 config.has_custom_path = function(project_root, platform) {
     var json = config.read(project_root);
     if (json.lib && json.lib[platform]) {
-        var uri = url.parse(json.lib[platform].uri);
+        var uri = url.parse(json.lib[platform].url || json.lib[platform].uri);
         if (!(uri.protocol)) return uri.path;
         else if (uri.protocol && uri.protocol[1] ==':') return uri.href;
     }

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/src/cordova/create.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/create.js b/cordova-lib/src/cordova/create.js
index b2ef453..2d2b429 100644
--- a/cordova-lib/src/cordova/create.js
+++ b/cordova-lib/src/cordova/create.js
@@ -97,29 +97,29 @@ function create(dir, id, name, cfg) {
     var custom_hooks;
 
     if (config_json.lib && config_json.lib.www) {
-        events.emit('log', 'Using custom www assets from '+config_json.lib.www.uri);
+        events.emit('log', 'Using custom www assets from '+config_json.lib.www.url);
         // TODO (kamrik): extend lazy_load for retrieval without caching to allow net urls for --src.
-        var www_version = config_json.lib.www.version || 'not_versioned';
-        var www_id = config_json.lib.www.id || 'dummy_id';
+        config_json.lib.www.version = config_json.lib.www.version || 'not_versioned';
+        config_json.lib.www.id = config_json.lib.www.id || 'dummy_id';
         symlink  = !!config_json.lib.www.link;
 
         // Make sure that the source www/ is not a direct ancestor of the target www/, or else we will recursively copy forever.
         // To do this, we make sure that the shortest relative path from source-to-target must start by going up at least one directory.
-        var relative_path_from_source_to_target = path.relative(config_json.lib.www.uri, www_dir);
+        var relative_path_from_source_to_target = path.relative(config_json.lib.www.url, www_dir);
         var does_relative_path_go_up_at_least_one_dir = relative_path_from_source_to_target.split(path.sep)[0] == '..';
         if (!does_relative_path_go_up_at_least_one_dir) {
             throw new CordovaError(
                 'Project dir "' +
                 dir +
                 '" must not be created at/inside the template used to create the project "' +
-                config_json.lib.www.uri + '".'
+                config_json.lib.www.url + '".'
             );
         }
         if(symlink) {
-            p = Q(config_json.lib.www.uri);
+            p = Q(config_json.lib.www.url);
             events.emit('verbose', 'Symlinking custom www assets into "' + www_dir + '"');
         } else {
-            p = lazy_load.custom(config_json.lib.www.uri, www_id, 'www', www_version)
+            p = lazy_load.custom(config_json.lib, 'www')
             .then(function(d) {
                 events.emit('verbose', 'Copying custom www assets into "' + www_dir + '"');
                 return d;

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/src/cordova/lazy_load.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/lazy_load.js b/cordova-lib/src/cordova/lazy_load.js
index c157cc2..e8cee87 100644
--- a/cordova-lib/src/cordova/lazy_load.js
+++ b/cordova-lib/src/cordova/lazy_load.js
@@ -38,7 +38,22 @@ var path          = require('path'),
     URL           = require('url'),
     Q             = require('q'),
     npm           = require('npm'),
-    util          = require('./util');
+    util          = require('./util'),
+    stubplatform  = {
+        url    : undefined,
+        version: undefined,
+        altplatform: undefined,
+        subdirectory: ''
+    };
+
+function mixin(mix, into) {
+    Object.getOwnPropertyNames(mix).forEach(function (prop) {
+        if (Object.hasOwnProperty.call(mix, prop)) {
+            Object.defineProperty(into, prop, Object.getOwnPropertyDescriptor(mix, prop));
+        }
+    });
+    return into;
+}
 
 
 exports.cordova = cordova;
@@ -47,13 +62,17 @@ exports.cordova_npm = cordova_npm;
 exports.custom = custom;
 exports.based_on_config = based_on_config;
 
-
 // Returns a promise for the path to the lazy-loaded directory.
 function based_on_config(project_root, platform, opts) {
     var custom_path = config.has_custom_path(project_root, platform);
+    if (custom_path === undefined && platform === 'windows') {
+        custom_path = config.has_custom_path(project_root, 'windows8');
+    }
     if (custom_path) {
-        var dot_file = config.read(project_root);
-        return module.exports.custom(dot_file.lib[platform].uri, dot_file.lib[platform].id, platform, dot_file.lib[platform].version);
+        var dot_file = config.read(project_root),
+            mixed_platforms = mixin(platforms, {});
+        mixed_platforms[platform] = mixin(dot_file.lib && dot_file.lib[platform] || {}, mixed_platforms[platform] || {});
+        return module.exports.custom(mixed_platforms, platform);
     } else {
         return module.exports.cordova(platform, opts);
     }
@@ -70,12 +89,15 @@ function cordova(platform, opts) {
 }
 
 function cordova_git(platform) {
+    var mixed_platforms = mixin(platforms, {}),
+        plat;
     if (!(platform in platforms)) {
         return Q.reject(new Error('Cordova library "' + platform + '" not recognized.'));
     }
-
-    var url = platforms[platform].url + ';a=snapshot;h=' + platforms[platform].version + ';sf=tgz';
-    return module.exports.custom(url, 'cordova', platform, platforms[platform].version);
+    plat = mixed_platforms[platform];
+    plat.url = plat.url + ';a=snapshot;h=' + plat.version + ';sf=tgz';
+    plat.id = 'cordova';
+    return module.exports.custom(mixed_platforms, platform);
 }
 
 function cordova_npm(platform) {
@@ -103,28 +125,41 @@ function cordova_npm(platform) {
 }
 
 // Returns a promise for the path to the lazy-loaded directory.
-function custom(url, id, platform, version) {
+function custom(platforms, platform) {
+    var plat;
+    var id;
+    var uri;
+    var url;
+    var version;
+    var subdir;
+    var platdir;
     var download_dir;
     var tmp_dir;
     var lib_dir;
+    var isUri;
+    if (!(platform in platforms)) {
+        return Q.reject(new Error('Cordova library "' + platform + '" not recognized.'));
+    }
 
+    plat = mixin(platforms[platform], mixin(stubplatform, {}));
+    version = plat.version;
+    url = plat.url;
+    id = plat.id;
+    subdir = plat.subdirectory;
+    platdir = plat.altplatform || platform;
     // Return early for already-cached remote URL, or for local URLs.
-    var uri = URL.parse(url);
-    var isUri = uri.protocol && uri.protocol[1] != ':'; // second part of conditional is for awesome windows support. fuuu windows
+    uri = URL.parse(url);
+    isUri = uri.protocol && uri.protocol[1] != ':'; // second part of conditional is for awesome windows support. fuuu windows
     if (isUri) {
-        download_dir = (platform == 'wp8' ? path.join(util.libDirectory, 'wp', id, version) :
-                        path.join(util.libDirectory, platform, id, version));
-        lib_dir = download_dir;
-        if (platforms[platform] && platforms[platform].subdirectory && platform !== 'blackberry10') {
-            lib_dir =  path.join(download_dir, platforms[platform].subdirectory);
-        }
+        download_dir = path.join(util.libDirectory, platdir, id, version);
+        lib_dir = path.join(download_dir, subdir);
         if (fs.existsSync(download_dir)) {
             events.emit('verbose', id + ' library for "' + platform + '" already exists. No need to download. Continuing.');
             return Q(lib_dir);
         }
     } else {
         // Local path.
-        lib_dir = platforms[platform] && platforms[platform].subdirectory ? path.join(url, platforms[platform].subdirectory) : url;
+        lib_dir = path.join(url, subdir);
         return Q(lib_dir);
     }
     return hooker.fire('before_library_download', {
@@ -153,7 +188,7 @@ function custom(url, id, platform, version) {
             shell.mkdir('-p', tmp_dir);
 
             var size = 0;
-            var request_options = {uri:url};
+            var request_options = {url:url};
             if (proxy) {
                 request_options.proxy = proxy;
             }
@@ -173,7 +208,6 @@ function custom(url, id, platform, version) {
                     size = body.length;
                 }
             });
-
             req.pipe(zlib.createUnzip())
             .pipe(tar.Extract({path:tmp_dir}))
             .on('error', function(err) {
@@ -186,7 +220,7 @@ function custom(url, id, platform, version) {
                 var entries = fs.readdirSync(tmp_dir);
                 var entry = path.join(tmp_dir, entries[0]);
                 shell.mkdir('-p', download_dir);
-                shell.mv('-f', path.join(entry, (platform=='blackberry10'?'blackberry10':''), '*'), download_dir);
+                shell.mv('-f', path.join(entry, '*'), download_dir);
                 shell.rm('-rf', tmp_dir);
                 d.resolve(hooker.fire('after_library_download', {
                     platform:platform,

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/src/cordova/metadata/amazon_fireos_parser.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/metadata/amazon_fireos_parser.js b/cordova-lib/src/cordova/metadata/amazon_fireos_parser.js
index 7bd0082..b3c78bb 100644
--- a/cordova-lib/src/cordova/metadata/amazon_fireos_parser.js
+++ b/cordova-lib/src/cordova/metadata/amazon_fireos_parser.js
@@ -43,7 +43,7 @@ module.exports = function android_parser(project) {
 };
 
 // Returns a promise.
-module.exports.check_requirements = function(project_root) {
+module.exports.check_requirements = function(project_root, lib_path) {
     // Rely on platform's bin/create script to check requirements.
     return Q(true);
 };

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/src/cordova/metadata/android_parser.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/metadata/android_parser.js b/cordova-lib/src/cordova/metadata/android_parser.js
index 01d478c..5738e7b 100644
--- a/cordova-lib/src/cordova/metadata/android_parser.js
+++ b/cordova-lib/src/cordova/metadata/android_parser.js
@@ -43,7 +43,7 @@ module.exports = function android_parser(project) {
 };
 
 // Returns a promise.
-module.exports.check_requirements = function(project_root) {
+module.exports.check_requirements = function(project_root, lib_path) {
     // Rely on platform's bin/create script to check requirements.
     return Q(true);
 };

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/src/cordova/metadata/blackberry10_parser.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/metadata/blackberry10_parser.js b/cordova-lib/src/cordova/metadata/blackberry10_parser.js
index 8d6ec1c..9535a4b 100644
--- a/cordova-lib/src/cordova/metadata/blackberry10_parser.js
+++ b/cordova-lib/src/cordova/metadata/blackberry10_parser.js
@@ -30,7 +30,7 @@ var fs            = require('fs'),
     ConfigParser  = require('../../configparser/ConfigParser'),
     CordovaError  = require('../../CordovaError'),
     events        = require('../../events'),
-    config        = require('../config');
+    lazy_load     = require('../lazy_load');
 
 module.exports = function blackberry_parser(project) {
     if (!fs.existsSync(path.join(project, 'www'))) {
@@ -42,13 +42,11 @@ module.exports = function blackberry_parser(project) {
 };
 
 // Returns a promise.
-module.exports.check_requirements = function(project_root) {
-    var custom_path = config.has_custom_path(project_root, 'blackberry10');
-    var lib_path;
-    if (custom_path) {
-        lib_path = path.join(custom_path, 'blackberry10');
-    } else {
-        lib_path = path.join(util.libDirectory, 'blackberry10', 'cordova', require('../platforms').blackberry10.version);
+module.exports.check_requirements = function(project_root, lib_path) {
+    if (lib_path === undefined) {
+        return lazy_load.based_on_config(project_root, 'blackberry10').then(function (lib_path) {
+            return module.exports.check_requirements(project_root, lib_path);
+        });
     }
     var d = Q.defer();
     child_process.exec('"' + path.join(lib_path, 'bin', 'check_reqs') + '"', function(err, output, stderr) {

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/src/cordova/metadata/firefoxos_parser.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/metadata/firefoxos_parser.js b/cordova-lib/src/cordova/metadata/firefoxos_parser.js
index 0179063..b8c43ee 100644
--- a/cordova-lib/src/cordova/metadata/firefoxos_parser.js
+++ b/cordova-lib/src/cordova/metadata/firefoxos_parser.js
@@ -35,7 +35,7 @@ module.exports = function firefoxos_parser(project) {
 };
 
 // Returns a promise.
-module.exports.check_requirements = function(project_root) {
+module.exports.check_requirements = function(project_root, lib_path) {
     return Q(); // Requirements always met.
 };
 

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/src/cordova/metadata/ios_parser.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/metadata/ios_parser.js b/cordova-lib/src/cordova/metadata/ios_parser.js
index 67a07a8..972c05a 100644
--- a/cordova-lib/src/cordova/metadata/ios_parser.js
+++ b/cordova-lib/src/cordova/metadata/ios_parser.js
@@ -49,7 +49,7 @@ module.exports = function ios_parser(project) {
 };
 
 // Returns a promise.
-module.exports.check_requirements = function(project_root) {
+module.exports.check_requirements = function(project_root, lib_path) {
     // Rely on platform's bin/create script to check requirements.
     return Q(true);
 };

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/src/cordova/metadata/ubuntu_parser.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/metadata/ubuntu_parser.js b/cordova-lib/src/cordova/metadata/ubuntu_parser.js
index 4887fe6..df8a65d 100644
--- a/cordova-lib/src/cordova/metadata/ubuntu_parser.js
+++ b/cordova-lib/src/cordova/metadata/ubuntu_parser.js
@@ -43,7 +43,7 @@ function sanitize(str) {
 }
 
 // Returns a promise.
-module.exports.check_requirements = function(project_root, callback) {
+module.exports.check_requirements = function(project_root, lib_path) {
     // jshint quotmark:false
     var d = Q.defer();
 

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/src/cordova/metadata/windows_parser.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/metadata/windows_parser.js b/cordova-lib/src/cordova/metadata/windows_parser.js
index ce08abf..5233167 100644
--- a/cordova-lib/src/cordova/metadata/windows_parser.js
+++ b/cordova-lib/src/cordova/metadata/windows_parser.js
@@ -31,7 +31,7 @@ var fs            = require('fs'),
     ConfigParser  = require('../../configparser/ConfigParser'),
     CordovaError  = require('../../CordovaError'),
     xml           = require('../../util/xml-helpers'),
-    config        = require('../config'),
+    lazy_load     = require('../lazy_load'),
     hooker        = require('../hooker'),
     jsproj        = require('../../util/windows/jsproj');
 
@@ -60,16 +60,13 @@ module.exports = function windows_parser(project) {
 };
 
 // Returns a promise
-module.exports.check_requirements = function(project_root) {
-    events.emit('log', 'Checking windows requirements...');
-    var lib_path = path.join(util.libDirectory, 'windows', 'cordova',
-                    require('../platforms').windows.version, 'windows');
-
-    var custom_path = config.has_custom_path(project_root, 'windows8') ||
-        config.has_custom_path(project_root, 'windows');
-    if (custom_path) {
-        lib_path = path.join(custom_path, 'windows');
+module.exports.check_requirements = function(project_root, lib_path) {
+    if (lib_path === undefined) {
+        return lazy_load.based_on_config(project_root, 'windows8').then(function (lib_path) {
+            return module.exports.check_requirements(project_root, lib_path);
+        });
     }
+    events.emit('log', 'Checking windows8 requirements...');
     var command = '"' + path.join(lib_path, 'bin', 'check_reqs') + '"';
     events.emit('verbose', 'Running "' + command + '" (output to follow)');
     var d = Q.defer();

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/src/cordova/metadata/wp8_parser.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/metadata/wp8_parser.js b/cordova-lib/src/cordova/metadata/wp8_parser.js
index 991bf0f..f305209 100644
--- a/cordova-lib/src/cordova/metadata/wp8_parser.js
+++ b/cordova-lib/src/cordova/metadata/wp8_parser.js
@@ -31,7 +31,7 @@ var fs            = require('fs'),
     ConfigParser  = require('../../configparser/ConfigParser'),
     CordovaError  = require('../../CordovaError'),
     xml           = require('../../util/xml-helpers'),
-    config        = require('../config'),
+    lazy_load     = require('../lazy_load'),
     hooker        = require('../hooker'),
     csproj = require('../../util/windows/csproj');
 
@@ -50,13 +50,13 @@ module.exports = function wp8_parser(project) {
 };
 
 // Returns a promise.
-module.exports.check_requirements = function(project_root) {
-    events.emit('log', 'Checking wp8 requirements...');
-    var lib_path = path.join(util.libDirectory, 'wp', 'cordova', require('../platforms').wp8.version, 'wp8');
-    var custom_path = config.has_custom_path(project_root, 'wp8');
-    if (custom_path) {
-        lib_path = path.join(custom_path, 'wp8');
+module.exports.check_requirements = function(project_root, lib_path) {
+    if (lib_path === undefined) {
+        return lazy_load.based_on_config(project_root, 'wp8').then(function (lib_path) {
+            return module.exports.check_requirements(project_root, lib_path);
+        });
     }
+    events.emit('log', 'Checking wp8 requirements...');
     var command = '"' + path.join(lib_path, 'bin', 'check_reqs') + '"';
     events.emit('verbose', 'Running "' + command + '" (output to follow)');
     var d = Q.defer();

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/src/cordova/platform.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/platform.js b/cordova-lib/src/cordova/platform.js
index 1c9b930..06d1962 100644
--- a/cordova-lib/src/cordova/platform.js
+++ b/cordova-lib/src/cordova/platform.js
@@ -120,7 +120,7 @@ function add(hooks, projectRoot, targets, opts) {
 
             return p
             .then(function(libDir) {
-                var template = config_json.lib && config_json.lib[platform] && config_json.lib[platform].template || null;
+                var template = config_json && config_json.lib && config_json.lib[platform] && config_json.lib[platform].template || null;
                 var copts = null;
                 if ('spawnoutput' in opts) {
                     copts = opts.spawnoutput;
@@ -414,7 +414,10 @@ function supports(project_root, name) {
     }
 
     // Check for platform support.
-    return platformParser.check_requirements(project_root);
+    return lazy_load.based_on_config(project_root, name)
+        .then(function(libDir) {
+        return platformParser.check_requirements(project_root, libDir);
+    });
 }
 
 // Returns a promise.

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/3911876c/cordova-lib/src/cordova/platforms.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/platforms.js b/cordova-lib/src/cordova/platforms.js
index 9fcfac7..3bc739a 100644
--- a/cordova-lib/src/cordova/platforms.js
+++ b/cordova-lib/src/cordova/platforms.js
@@ -49,6 +49,7 @@ module.exports = {
         parser : './metadata/wp8_parser',
         url    : 'https://git-wip-us.apache.org/repos/asf?p=cordova-wp8.git',
         version: '3.5.0',
+        altplatform: 'wp',
         subdirectory: 'wp8'
     },
     'blackberry10' : {