You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by an...@apache.org on 2014/06/14 01:46:19 UTC

[3/9] git commit: adding prepare-browserify

adding prepare-browserify


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

Branch: refs/heads/master
Commit: 171c9811d3e914a02585894707ccf412668c4040
Parents: 24e861c
Author: Anis Kadri <an...@apache.org>
Authored: Tue Jun 10 16:06:46 2014 -0700
Committer: Anis Kadri <an...@apache.org>
Committed: Tue Jun 10 16:06:46 2014 -0700

----------------------------------------------------------------------
 cordova-lib/src/plugman/prepare-browserify.js   | 194 +++++++++++++++++++
 .../src/plugman/util/prepare-namespace.js       |  40 ++++
 2 files changed, 234 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/171c9811/cordova-lib/src/plugman/prepare-browserify.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/plugman/prepare-browserify.js b/cordova-lib/src/plugman/prepare-browserify.js
new file mode 100644
index 0000000..d5c003d
--- /dev/null
+++ b/cordova-lib/src/plugman/prepare-browserify.js
@@ -0,0 +1,194 @@
+/**
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+/* jshint node:true */
+
+var platform_modules   = require('./platforms'),
+    path               = require('path'),
+    config_changes     = require('./util/config-changes'),
+    xml_helpers        = require('../util/xml-helpers'),
+    wp8                = require('./platforms/wp8'),
+    windows8           = require('./platforms/windows8'),
+    common             = require('./platforms/common');
+    fs                 = require('fs'),
+    shell              = require('shelljs'),
+    util               = require('util'),
+    events             = require('./events'),
+    plugman            = require('./plugman'),
+    et                 = require('elementtree'),
+    prepareNamespace   = require('./util/prepare-namespace'),
+    bundle             = require('cordova-js/tasks/lib/bundle-browserify'),
+    requireTr          = require('cordova-js/tasks/lib/require-tr'),
+    writeLicenseHeader = require('cordova-js/tasks/lib/write-license-header');
+
+function uninstallQueuedPlugins(platform_json, wwwDir) {
+    // Check if there are any plugins queued for uninstallation, and if so, remove any of their plugin web assets loaded in
+    // via <js-module> elements
+    var plugins_to_uninstall = platform_json.prepare_queue.uninstalled;
+    if (plugins_to_uninstall && plugins_to_uninstall.length) {
+        var plugins_www = path.join(wwwDir, 'plugins');
+        if (fs.existsSync(plugins_www)) {
+            plugins_to_uninstall.forEach(function(plug) {
+                var id = plug.id;
+                var plugin_modules = path.join(plugins_www, id);
+                if (fs.existsSync(plugin_modules)) {
+                    events.emit('verbose', 'Removing plugins directory from www "'+plugin_modules+'"');
+                    shell.rm('-rf', plugin_modules);
+                }
+            });
+        }
+    }
+}
+
+function generateFinalBundle(platform, libraryRelease, outReleaseFile) {
+
+    var outReleaseFileStream = fs.createWriteStream(outReleaseFile);
+    var commitId = 'N/A';
+    var time = new Date().valueOf();
+
+    writeLicenseHeader(outReleaseFileStream, platform, commitId);
+    
+    releaseBundle = libraryRelease.bundle();
+
+    releaseBundle.pipe(outReleaseFileStream);
+
+    outReleaseFileStream.on('finish', function() {
+      var newtime = new Date().valueOf() - time;
+      plugman.emit('verbose', 'generated cordova.' + platform + '.js @ ' + commitId + ' in ' + newtime + 'ms');
+      // TODO clean up all the *.browserify files
+    });
+
+    outReleaseFileStream.on('error', function(err) {
+      var newtime = new Date().valueOf() - time;
+      console.log('error while generating cordova_b.js');
+      plugman.emit('verbose', 'error while generating cordova.js');
+    });
+
+}
+
+// Called on --prepare.
+// Sets up each plugin's Javascript code to be loaded properly.
+// Expects a path to the project (platforms/android in CLI, . in plugman-only),
+// a path to where the plugins are downloaded, the www dir, and the platform ('android', 'ios', etc.).
+module.exports = function handlePrepare(project_dir, platform, plugins_dir, www_dir, is_top_level) {
+    // Process:
+    // - Do config munging by calling into config-changes module
+    // - List all plugins in plugins_dir
+    // - Load and parse their plugin.xml files.
+    // - Skip those without support for this platform. (No <platform> tags means JS-only!)
+    // - Build a list of all their js-modules, including platform-specific js-modules.
+    // - For each js-module (general first, then platform) build up an object storing the path and any clobbers, merges and runs for it.
+    events.emit('verbose', 'Preparing ' + platform + ' browserify project');
+    var platform_json = config_changes.get_platform_json(plugins_dir, platform);
+    var wwwDir = www_dir || platform_modules[platform].www_dir(project_dir);
+    var scripts = [];
+
+    uninstallQueuedPlugins(platform_json, www_dir);
+
+    events.emit('verbose', 'Processing configuration changes for plugins.');
+    config_changes.process(plugins_dir, project_dir, platform);
+
+    if(!is_top_level) return;
+
+    requireTr.platform = platform;
+    var libraryRelease = bundle(platform, false, 'N/A');
+
+    platform_json = config_changes.get_platform_json(plugins_dir, platform);
+    var plugins = Object.keys(platform_json.installed_plugins).concat(Object.keys(platform_json.dependent_plugins));
+    events.emit('verbose', 'Iterating over installed plugins:', plugins);
+
+    plugins && plugins.forEach(function(plugin) {
+        var pluginDir = path.join(plugins_dir, plugin),
+            pluginXML = path.join(pluginDir, 'plugin.xml');
+        if (!fs.existsSync(pluginXML)) {
+            plugman.emit('warn', 'Missing file: ' + pluginXML);
+            return;
+        }
+        var xml = xml_helpers.parseElementtreeSync(pluginXML);
+
+        var plugin_id = xml.getroot().attrib.id;
+
+        // add the plugins dir to the platform's www.
+        var platformPluginsDir = path.join(wwwDir, 'plugins');
+        // XXX this should not be here if there are no js-module. It leaves an empty plugins/ directory
+        shell.mkdir('-p', platformPluginsDir);
+
+        var jsModules = xml.findall('./js-module');
+        var assets = xml.findall('asset');
+        var platformTag = xml.find(util.format('./platform[@name="%s"]', platform));
+
+        if (platformTag) {
+            assets = assets.concat(platformTag.findall('./asset'));
+            jsModules = jsModules.concat(platformTag.findall('./js-module'));
+        }
+
+        // Copy www assets described in <asset> tags.
+        assets = assets || [];
+        assets.forEach(function(asset) {
+            common.asset.install(asset, pluginDir, wwwDir);
+        });
+        jsModules.forEach(function(module) {
+            // Copy the plugin's files into the www directory.
+            // NB: We can't always use path.* functions here, because they will use platform slashes.
+            // But the path in the plugin.xml and in the cordova_plugins.js should be always forward slashes.
+            var pathParts = module.attrib.src.split('/');
+
+            var fsDirname = path.join.apply(path, pathParts.slice(0, -1));
+            var fsDir = path.join(platformPluginsDir, plugin_id, fsDirname);
+            shell.mkdir('-p', fsDir);
+
+            // Read in the file, prepend the cordova.define, and write it back out.
+            var moduleName = plugin_id + '.';
+            if (module.attrib.name) {
+                moduleName += module.attrib.name;
+            } else {
+                moduleName += path.basename(module.attrib.src, '.js');
+            }
+
+            var fsPath = path.join.apply(path, pathParts);
+            var scriptPath = path.join(pluginDir, fsPath);
+
+            requireTr.addModule({symbol: moduleName, path: scriptPath});
+
+            module.getchildren().forEach(function(child) {
+                if (child.tag.toLowerCase() == 'clobbers') {
+                    fs.appendFileSync(scriptPath,
+                      prepareNamespace(child.attrib.target, 'c'),
+                      'utf-8');
+                } else if (child.tag.toLowerCase() == 'merges') {
+                    fs.appendFileSync(scriptPath,
+                      prepareNamespace(child.attrib.target, 'm'),
+                      'utf-8');
+                }
+            });
+            scripts.push(scriptPath);
+        });
+    });
+    
+    libraryRelease.transform(requireTr.transform);
+
+    scripts.forEach(function(script) {
+        libraryRelease.add(script);
+    });
+        
+    var outReleaseFile = path.join(wwwDir, 'cordova.js');
+    
+    generateFinalBundle(platform, libraryRelease, outReleaseFile);
+
+};

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/171c9811/cordova-lib/src/plugman/util/prepare-namespace.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/plugman/util/prepare-namespace.js b/cordova-lib/src/plugman/util/prepare-namespace.js
new file mode 100644
index 0000000..eac973e
--- /dev/null
+++ b/cordova-lib/src/plugman/util/prepare-namespace.js
@@ -0,0 +1,40 @@
+var util = require('util');
+
+// FIXME this is extremely guettho
+module.exports = function(target, method) {
+    var old = target;
+    var target = target.replace(/^window(\.)?/, '');
+
+    var lastDot = target.lastIndexOf('.');
+    var namespace = target.substr(0, lastDot);
+    var lastName = target.substr(lastDot + 1);
+    var props = target.split(".");
+    var code = "";
+
+    if(target !== "") {
+        for(var i = 1, len = props.length ; i <= len ; i++) {
+            var sub = props.slice(0, i).join(".");
+            code += util.format("window.%s = window.%s || {};\n", sub, sub);
+        }
+    }
+
+    props.unshift('window');  
+    var object = props.slice(0, props.length - 1).join('.');
+    //  code = "\n";
+    if(method === "c") {
+        return util.format(
+                "%s\nrequire('cordova/builder').assignOrWrapInDeprecateGetter(%s, '%s', module.exports);", 
+                code,
+                object,
+                lastName
+                );
+    } else if(method === "m" && old !== "") {
+        return util.format(
+                "%s\n;require('cordova/builder').recursiveMerge(%s, module.exports);", 
+                code,
+                old
+                );
+    } else {
+        return "// no clobber or merges";
+    }
+}