Add support for enclose option. Closes #139.
authorJake Harding <jharding@twitter.com>
Fri, 1 Mar 2013 05:21:14 +0000 (21:21 -0800)
committerMihai Bazon <mihai@bazon.net>
Sun, 24 Mar 2013 09:11:23 +0000 (11:11 +0200)
bin/uglifyjs
lib/ast.js

index 8a510d6..b8fad94 100755 (executable)
@@ -32,6 +32,7 @@ For example -p 3 will drop 3 directories from file names and ensure they are rel
 Pass options like -c hoist_vars=false,if_return=false. \
 Use -c with no argument to use the default compression options.")
     .describe("d", "Global definitions")
+    .describe("e", "Embed everything in a big function, with a configurable parameter/argument list.")
 
     .describe("comments", "Preserve copyright comments in the output. \
 By default this works like Google Closure, keeping JSDoc-style comments that contain \"@license\" or \"@preserve\". \
@@ -62,6 +63,7 @@ You need to pass an argument to this option to specify the name that your module
     .alias("d", "define")
     .alias("r", "reserved")
     .alias("V", "version")
+    .alias("e", "enclose")
 
     .string("source-map")
     .string("source-map-root")
@@ -70,6 +72,7 @@ You need to pass an argument to this option to specify the name that your module
     .string("m")
     .string("c")
     .string("d")
+    .string("e")
     .string("comments")
     .string("wrap")
     .boolean("screw-ie")
@@ -248,6 +251,16 @@ if (ARGS.wrap) {
     TOPLEVEL = TOPLEVEL.wrap_commonjs(ARGS.wrap, ARGS.export_all);
 }
 
+if (ARGS.enclose) {
+    var arg_parameter_list = ARGS.enclose;
+
+    if (!(arg_parameter_list instanceof Array)) {
+        arg_parameter_list = [arg_parameter_list];
+    }
+
+    TOPLEVEL = TOPLEVEL.wrap_enclose(arg_parameter_list);
+}
+
 var SCOPE_IS_NEEDED = COMPRESS || MANGLE || ARGS.lint;
 
 if (SCOPE_IS_NEEDED) {
index 62bdd8d..a1301da 100644 (file)
@@ -285,6 +285,27 @@ var AST_Toplevel = DEFNODE("Toplevel", "globals", {
     $propdoc: {
         globals: "[Object/S] a map of name -> SymbolDef for all undeclared names",
     },
+    wrap_enclose: function(arg_parameter_pairs) {
+        var self = this;
+        var args = [];
+        var parameters = [];
+
+        arg_parameter_pairs.forEach(function(pair) {
+            var split = pair.split(":");
+
+            args.push(split[0]);
+            parameters.push(split[1]);
+        });
+
+        var wrapped_tl = "(function(" + parameters.join(",") + "){ '$ORIG'; })(" + args.join(",") + ")";
+        wrapped_tl = parse(wrapped_tl);
+        wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){
+            if (node instanceof AST_Directive && node.value == "$ORIG") {
+                return MAP.splice(self.body);
+            }
+        }));
+        return wrapped_tl;
+    },
     wrap_commonjs: function(name, export_all) {
         var self = this;
         var to_export = [];