summaryrefslogtreecommitdiff
path: root/js/config/makebundle.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/config/makebundle.js')
-rw-r--r--js/config/makebundle.js254
1 files changed, 254 insertions, 0 deletions
diff --git a/js/config/makebundle.js b/js/config/makebundle.js
new file mode 100644
index 00000000000..978edbf236e
--- /dev/null
+++ b/js/config/makebundle.js
@@ -0,0 +1,254 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+var fs = require('fs');
+var path = require('path');
+var esprima = require('esprima');
+
+var usage = function()
+{
+ console.log("usage:");
+ console.log("" + process.argv[0] + " " + path.basename(process.argv[1]) + " <files>");
+}
+
+if(process.argv.length < 3)
+{
+ usage();
+ process.exit(1);
+}
+
+var files = [];
+for(var i = 2; i < process.argv.length; ++i)
+{
+ files.push(process.argv[i]);
+}
+
+var Depends = function()
+{
+ this.depends = [];
+};
+
+Depends.prototype.get = function(file)
+{
+ for(var i = 0; i < this.depends.length; ++i)
+ {
+ var obj = this.depends[i];
+ if(obj.file === file)
+ {
+ return obj.depends;
+ }
+ }
+ return [];
+};
+
+Depends.prototype.expand = function(o)
+{
+ if(o === undefined)
+ {
+ for(i = 0; i < this.depends.length; ++i)
+ {
+ this.expand(this.depends[i]);
+ }
+ }
+ else
+ {
+ var newDepends = o.depends.slice();
+ for(var j = 0; j < o.depends.length; ++j)
+ {
+ var depends = this.get(o.depends[j]);
+ for(var k = 0; k < depends.length; ++k)
+ {
+ if(newDepends.indexOf(depends[k]) === -1)
+ {
+ newDepends.push(depends[k]);
+ }
+ }
+ }
+
+ if(o.depends.length != newDepends.length)
+ {
+
+ o.depends = newDepends;
+ this.expand(o);
+ }
+ }
+ return this;
+}
+
+Depends.comparator = function(a, b)
+{
+ // B depends on A
+ var i;
+ var result = 0;
+ for(i = 0; i < b.depends.length; ++i)
+ {
+ if(b.depends[i] === a.file)
+ {
+ result = -1;
+ }
+ }
+ // A depends on B
+ for(i = 0; i < a.depends.length; ++i)
+ {
+ if(a.depends[i] === b.file)
+ {
+ if(result == -1)
+ {
+ process.stderr.write("warning: circulary dependency between: " + a.file + " and " + b.file + "\n");
+ return result;
+ }
+ result = 1;
+ }
+ }
+
+ return result;
+};
+
+Depends.prototype.sort = function()
+{
+ var objects = this.depends.slice();
+ for(var i = 0; i < objects.length; ++i)
+ {
+ for(var j = 0; j < objects.length; ++j)
+ {
+ if(j === i) { continue; }
+ var v = Depends.comparator(objects[i], objects[j]);
+ if(v < 0)
+ {
+ var tmp = objects[j];
+ objects[j] = objects[i];
+ objects[i] = tmp;
+ }
+ }
+ }
+ return objects;
+};
+
+var Parser = {};
+
+Parser.traverse = function(object, depend, file)
+{
+ for(key in object)
+ {
+ var value = object[key];
+ if(value !== null && typeof value == "object")
+ {
+ Parser.traverse(value, depend, file);
+
+ if(value.type === "CallExpression")
+ {
+ if(value.callee.name === "require")
+ {
+ var includedFile = value.arguments[0].value + ".js";
+ if(includedFile.indexOf("Ice/") === 0 ||
+ includedFile.indexOf("IceWS/") === 0 ||
+ includedFile.indexOf("IceMX/") === 0 ||
+ includedFile.indexOf("IceGrid/") === 0 ||
+ includedFile.indexOf("IceStorm/") === 0 ||
+ includedFile.indexOf("Glacier2/") === 0)
+ {
+ includedFile = path.resolve("../" + includedFile);
+ if(depend.depends.indexOf(includedFile) === -1)
+ {
+ depend.depends.push(includedFile);
+ }
+ }
+ }
+ }
+ }
+ }
+};
+
+Parser.dir = function(base, depends)
+{
+ var d = depends || new Depends();
+ for(var i = 0; i < files.length; ++i)
+ {
+ var file = files[i];
+ var stats = fs.statSync(file);
+ if(path.extname(file) == ".js" && stats.isFile())
+ {
+ try
+ {
+ var dirname = path.basename(path.dirname(file));
+ var fullpath;
+ if(dirname === "browser")
+ {
+ fullpath = path.resolve(path.dirname(file) + "/../" + path.basename(file));
+ if(!fs.existsSync(fullpath))
+ {
+ fullpath = path.resolve(file);
+ }
+ }
+ else
+ {
+ fullpath = path.resolve(file);
+ }
+ var depend = { realpath: file, file: fullpath, depends: [] };
+ d.depends.push(depend);
+ var ast = esprima.parse(fs.readFileSync(file, 'utf-8'));
+ Parser.traverse(ast, depend, file);
+ }
+ catch(e)
+ {
+ throw e;
+ }
+ }
+ }
+ return d;
+};
+
+var d = Parser.dir("");
+d.depends = d.expand().sort();
+
+var file, i, length = d.depends.length, line;
+var optimize = process.env.OPTIMIZE && process.env.OPTIMIZE == "yes";
+
+for(i = 0; i < length; ++i)
+{
+ file = d.depends[i].realpath;
+ data = fs.readFileSync(file);
+ lines = data.toString().split("\n");
+ var skip = false;
+ for(j in lines)
+ {
+ line = lines[j].trim();
+ //
+ // Get rid of require statements, the bundle include all required files,
+ // so require statements are not required.
+ //
+ if(line == "var require = typeof(module) !== \"undefined\" ? module.require : function(){};")
+ {
+ continue;
+ }
+ else if(line.match(/require\(".*"\);/))
+ {
+ continue;
+ }
+
+ if(optimize && line.match(/Debug\.assert\(/))
+ {
+ if(line.lastIndexOf(";") === -1)
+ {
+ // skip until next semicolon
+ skip = true;
+ }
+ continue;
+ }
+ if(skip)
+ {
+ if(line.lastIndexOf(";") !== -1)
+ {
+ skip = false;
+ }
+ continue;
+ }
+ process.stdout.write(lines[j] + "\n");
+ }
+}