diff options
-rwxr-xr-x | bin/uglifyjs | 13 | ||||
-rw-r--r-- | lib/ast.js | 21 |
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) { @@ -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 = []; |