You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by br...@apache.org on 2012/11/21 22:44:39 UTC

[5/5] git commit: Add `serve` command.

Add `serve` command.


Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/commit/6033427e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/tree/6033427e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/diff/6033427e

Branch: refs/heads/cordova-client
Commit: 6033427e8c0c4e2a5a7ed24d8b8ff64fca8b3910
Parents: bab6419
Author: Braden Shepherdson <br...@chromium.org>
Authored: Thu Nov 8 15:18:44 2012 -0500
Committer: Braden Shepherdson <br...@chromium.org>
Committed: Thu Nov 8 15:18:44 2012 -0500

----------------------------------------------------------------------
 README.md                         |    1 +
 bin/cordova                       |    2 +-
 cordova.js                        |    1 +
 doc/help.txt                      |    4 +
 src/metadata/android_parser.js    |    6 ++
 src/metadata/blackberry_parser.js |    6 ++
 src/metadata/ios_parser.js        |    6 ++
 src/serve.js                      |  109 ++++++++++++++++++++++++++++++++
 8 files changed, 134 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/blob/6033427e/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
index b36f46d..9289d54 100644
--- a/README.md
+++ b/README.md
@@ -46,6 +46,7 @@ cordova-client has a single global `create` command that creates new cordova pro
 - `plugin [rm | remove] <plugin-name> [<plugin-name> ...]` remove one (or more) added plugins
 - `build [<platform> [<platform> [...]]]` compile the app and deploy to a connected + compatible device. With no parameters builds for all platforms added to the project, otherwise builds for the specified platforms
 - `emulate [<platform> [<platform> [...]]]` launch emulators and deploy app to them. With no parameters emulates for all platforms added to the project, otherwise emulates for the specified platforms
+- `serve <platform> [port]` launch a local web server for that platform's www directory on the given port (default 8000).
 
 
 # Project Directory Structure

http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/blob/6033427e/bin/cordova
----------------------------------------------------------------------
diff --git a/bin/cordova b/bin/cordova
index a83cf6c..4d29175 100755
--- a/bin/cordova
+++ b/bin/cordova
@@ -27,7 +27,7 @@ if (version) {
 } else if (cordova.hasOwnProperty(cmd)) {
     var opts = Array.prototype.slice.call(tokens, 0);
     var r;
-    if (cmd == 'create' || cmd == 'docs') {
+    if (cmd == 'create' || cmd == 'docs' || cmd == 'serve') {
         r = cordova[cmd].apply(this, opts);
     } else if (cmd == 'emulate' || cmd == 'build') {
         r = cordova[cmd].call(this, opts);

http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/blob/6033427e/cordova.js
----------------------------------------------------------------------
diff --git a/cordova.js b/cordova.js
index 56a3c61..7d56ab1 100755
--- a/cordova.js
+++ b/cordova.js
@@ -7,6 +7,7 @@ module.exports = {
     build:    require('./src/build'),
     emulate:  require('./src/emulate'),
     plugin:   require('./src/plugin'),
+    serve:    require('./src/serve'),
     on:       function() {
         cordova_events.on.apply(cordova_events, arguments);
     },

http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/blob/6033427e/doc/help.txt
----------------------------------------------------------------------
diff --git a/doc/help.txt b/doc/help.txt
index 254146a..c0cc0ac 100644
--- a/doc/help.txt
+++ b/doc/help.txt
@@ -13,6 +13,9 @@ Project-Level Commands
     plugin [add|remove|ls [path]] ..... adds or removes a plugin (from the specified path), or lists all currently-added plugins
     build ............................. builds a cordova project
     emulate ........................... starts emulator for cordova project
+    serve <platform> [port] ........... runs a local web server for the www/ directory of the given platform
+                                        the default port is 8000
+                                        note that you must edit the native code to point at the server!
     help .............................. shows this!
 
 Example usage
@@ -21,4 +24,5 @@ Example usage
     $ cd Baz
     $ cordova platform add android
     $ cordova build
+    $ cordova serve android
 

http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/blob/6033427e/src/metadata/android_parser.js
----------------------------------------------------------------------
diff --git a/src/metadata/android_parser.js b/src/metadata/android_parser.js
index fae804f..3c6a844 100644
--- a/src/metadata/android_parser.js
+++ b/src/metadata/android_parser.js
@@ -52,6 +52,11 @@ module.exports.prototype = {
         });
     },
 
+    // Returns the platform-specific www directory.
+    www_dir:function() {
+        return path.join(this.path, 'assets', 'www');
+    },
+
     update_www:function() {
         var projectRoot = util.isCordova(process.cwd());
         var www = path.join(projectRoot, 'www');
@@ -65,3 +70,4 @@ module.exports.prototype = {
         this.update_www();
     }
 };
+

http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/blob/6033427e/src/metadata/blackberry_parser.js
----------------------------------------------------------------------
diff --git a/src/metadata/blackberry_parser.js b/src/metadata/blackberry_parser.js
index cfc3262..377db45 100644
--- a/src/metadata/blackberry_parser.js
+++ b/src/metadata/blackberry_parser.js
@@ -49,6 +49,12 @@ module.exports.prototype = {
         this.write_project_properties();
         if (callback) callback();
     },
+
+    // Returns the platform-specific www directory.
+    www_dir:function() {
+        return path.join(this.path, 'www');
+    },
+
     update_www:function() {
         var projectRoot = util.isCordova(this.path);
         var www = path.join(projectRoot, 'www');

http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/blob/6033427e/src/metadata/ios_parser.js
----------------------------------------------------------------------
diff --git a/src/metadata/ios_parser.js b/src/metadata/ios_parser.js
index e841bd6..0dcf322 100644
--- a/src/metadata/ios_parser.js
+++ b/src/metadata/ios_parser.js
@@ -52,6 +52,12 @@ module.exports.prototype = {
             }
         });
     },
+
+    // Returns the platform-specific www directory.
+    www_dir:function() {
+        return path.join(this.path, 'www');
+    },
+
     update_www:function() {
         var projectRoot = util.isCordova(process.cwd());
         var www = path.join(projectRoot, 'www');

http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/blob/6033427e/src/serve.js
----------------------------------------------------------------------
diff --git a/src/serve.js b/src/serve.js
new file mode 100644
index 0000000..b80610f
--- /dev/null
+++ b/src/serve.js
@@ -0,0 +1,109 @@
+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'),
+    fs = require('fs'),
+    ls = fs.readdirSync,
+    util = require('util'),
+    http = require("http"),
+    url = require("url");
+
+function launch_server(www, port) {
+    port = port || 8000;
+
+    http.createServer(function(request, response) {
+        var uri = url.parse(request.url).pathname;
+        var filename = path.join(www, uri);
+
+        fs.exists(filename, function(exists) {
+            if(!exists) {
+                response.writeHead(404, {"Content-Type": "text/plain"});
+                response.write("404 Not Found\n");
+                response.end();
+                return;
+            }
+
+            if (fs.statSync(filename).isDirectory()) filename += path.sep + 'index.html';
+
+            fs.readFile(filename, "binary", function(err, file) {
+                if(err) {
+                    response.writeHead(500, {"Content-Type": "text/plain"});
+                    response.write(err + "\n");
+                    response.end();
+                    return;
+                }
+
+                response.writeHead(200);
+                response.write(file, "binary");
+                response.end();
+            });
+        });
+    }).listen(parseInt(''+port, 10));
+
+    console.log("Static file server running at\n  => http://localhost:" + port + "/\nCTRL + C to shutdown");
+}
+
+module.exports = function serve (platform, port) {
+    var projectRoot = cordova_util.isCordova(process.cwd());
+
+    if (!projectRoot) {
+        throw 'Current working directory is not a Cordova-based project.';
+    }
+
+    var xml = path.join(projectRoot, 'www', 'config.xml');
+    var cfg = new config_parser(xml);
+
+    // Retrieve the platforms.
+    var platforms = ls(path.join(projectRoot, 'platforms'));
+    if (!platform) {
+        console.log('You need to specify a platform.');
+        process.exit(1);
+    } else if (platforms.length == 0) {
+        console.log('No platforms to serve.');
+        process.exit(1);
+    } else if (platforms.filter(function(x) { return x == platform }).length == 0) {
+        console.log(platform + ' is not an installed platform.');
+        process.exit(1);
+    }
+
+    // If we got to this point, the given platform is valid.
+
+    // Default port is 8000 if not given. This is also the default of the Python module.
+    port = port || 8000;
+
+    var parser, platformPath;
+    switch (platform) {
+        case 'android':
+            platformPath = path.join(projectRoot, 'platforms', 'android');
+            parser = new android_parser(platformPath);
+
+            // Update the related platform project from the config
+            parser.update_project(cfg);
+            var www = parser.www_dir();
+            launch_server(www, port);
+            break;
+        case 'blackberry-10':
+            platformPath = path.join(projectRoot, 'platforms', 'blackberry-10');
+            parser = new blackberry_parser(platformPath);
+
+            // Update the related platform project from the config
+            parser.update_project(cfg, function() {
+                // Shell it
+                launch_server(parser.www_dir(), port);
+            });
+            break;
+        case 'ios':
+            platformPath = path.join(projectRoot, 'platforms', 'ios');
+            js = path.join(__dirname, '..', 'lib', 'ios', 'CordovaLib', 'javascript', 'cordova.ios.js');
+            parser = new ios_parser(platformPath);
+            // Update the related platform project from the config
+            parser.update_project(cfg, function() {
+                launch_server(parser.www_dir(), port);
+            });
+            break;
+    }
+};
+