aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/uglifyjs13
-rw-r--r--lib/ast.js21
2 files changed, 34 insertions, 0 deletions
diff --git a/bin/uglifyjs b/bin/uglifyjs
index 8a510d61..b8fad946 100755
--- a/bin/uglifyjs
+++ b/bin/uglifyjs
@@ -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) {
diff --git a/lib/ast.js b/lib/ast.js
index 62bdd8db..a1301da8 100644
--- a/lib/ast.js
+++ b/lib/ast.js
@@ -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 = [];