Support `-p relative`. Fix #256
authorMihai Bazon <mihai@bazon.net>
Wed, 7 Aug 2013 08:43:47 +0000 (11:43 +0300)
committerMihai Bazon <mihai@bazon.net>
Wed, 7 Aug 2013 08:43:47 +0000 (11:43 +0300)
README.md
bin/uglifyjs

index 749b8ce..46ba2a5 100644 (file)
--- a/README.md
+++ b/README.md
@@ -46,55 +46,62 @@ files.
 
 The available options are:
 
-    --source-map       Specify an output file where to generate source map.
-                                                                          [string]
-    --source-map-root  The path to the original source to be included in the
-                       source map.                                        [string]
-    --source-map-url   The path to the source map to be added in //@
-                       sourceMappingURL.  Defaults to the value passed with
-                       --source-map.                                      [string]
-    --in-source-map    Input source map, useful if you're compressing JS that was
-                       generated from some other original code.
-    --screw-ie8        Pass this flag if you don't care about full compliance with
-                       Internet Explorer 6-8 quirks (by default UglifyJS will try
-                       to be IE-proof).
-    -p, --prefix       Skip prefix for original filenames that appear in source
-                       maps. For example -p 3 will drop 3 directories from file
-                       names and ensure they are relative paths.
-    -o, --output       Output file (default STDOUT).
-    -b, --beautify     Beautify output/specify output options.            [string]
-    -m, --mangle       Mangle names/pass mangler options.                 [string]
-    -r, --reserved     Reserved names to exclude from mangling.
-    -c, --compress     Enable compressor/pass compressor options. Pass options
-                       like -c hoist_vars=false,if_return=false. Use -c with no
-                       argument to use the default compression options.   [string]
-    -d, --define       Global definitions                                 [string]
-    --comments         Preserve copyright comments in the output. By default this
-                       works like Google Closure, keeping JSDoc-style comments
-                       that contain "@license" or "@preserve". You can optionally
-                       pass one of the following arguments to this flag:
-                       - "all" to keep all comments
-                       - a valid JS regexp (needs to start with a slash) to keep
-                       only comments that match.
-                       Note that currently not *all* comments can be kept when
-                       compression is on, because of dead code removal or
-                       cascading statements into sequences.               [string]
-    --stats            Display operations run time on STDERR.            [boolean]
-    --acorn            Use Acorn for parsing.                            [boolean]
-    --spidermonkey     Assume input files are SpiderMonkey AST format (as JSON).
-                                                                         [boolean]
-    --self             Build itself (UglifyJS2) as a library (implies
-                       --wrap=UglifyJS --export-all)                     [boolean]
-    --wrap             Embed everything in a big function, making the “exports”
-                       and “global” variables available. You need to pass an
-                       argument to this option to specify the name that your
-                       module will take when included in, say, a browser.
-                                                                          [string]
-    --export-all       Only used when --wrap, this tells UglifyJS to add code to
-                       automatically export all globals.                 [boolean]
-    --lint             Display some scope warnings                       [boolean]
-    -v, --verbose      Verbose                                           [boolean]
-    -V, --version      Print version number and exit.                    [boolean]
+  --source-map       Specify an output file where to generate source map.
+                                                                        [string]
+  --source-map-root  The path to the original source to be included in the
+                     source map.                                        [string]
+  --source-map-url   The path to the source map to be added in //#
+                     sourceMappingURL.  Defaults to the value passed with
+                     --source-map.                                      [string]
+  --in-source-map    Input source map, useful if you're compressing JS that was
+                     generated from some other original code.
+  --screw-ie8        Pass this flag if you don't care about full compliance
+                     with Internet Explorer 6-8 quirks (by default UglifyJS
+                     will try to be IE-proof).                         [boolean]
+  --expr             Parse a single expression, rather than a program (for
+                     parsing JSON)                                     [boolean]
+  -p, --prefix       Skip prefix for original filenames that appear in source
+                     maps. For example -p 3 will drop 3 directories from file
+                     names and ensure they are relative paths. You can also
+                     specify -p relative, which will make UglifyJS figure out
+                     itself the relative paths between original sources, the
+                     source map and the output file.                    [string]
+  -o, --output       Output file (default STDOUT).
+  -b, --beautify     Beautify output/specify output options.            [string]
+  -m, --mangle       Mangle names/pass mangler options.                 [string]
+  -r, --reserved     Reserved names to exclude from mangling.
+  -c, --compress     Enable compressor/pass compressor options. Pass options
+                     like -c hoist_vars=false,if_return=false. Use -c with no
+                     argument to use the default compression options.   [string]
+  -d, --define       Global definitions                                 [string]
+  -e, --enclose      Embed everything in a big function, with a configurable
+                     parameter/argument list.                           [string]
+  --comments         Preserve copyright comments in the output. By default this
+                     works like Google Closure, keeping JSDoc-style comments
+                     that contain "@license" or "@preserve". You can optionally
+                     pass one of the following arguments to this flag:
+                     - "all" to keep all comments
+                     - a valid JS regexp (needs to start with a slash) to keep
+                     only comments that match.
+                     Note that currently not *all* comments can be kept when
+                     compression is on, because of dead code removal or
+                     cascading statements into sequences.               [string]
+  --stats            Display operations run time on STDERR.            [boolean]
+  --acorn            Use Acorn for parsing.                            [boolean]
+  --spidermonkey     Assume input files are SpiderMonkey AST format (as JSON).
+                                                                       [boolean]
+  --self             Build itself (UglifyJS2) as a library (implies
+                     --wrap=UglifyJS --export-all)                     [boolean]
+  --wrap             Embed everything in a big function, making the “exports”
+                     and “global” variables available. You need to pass an
+                     argument to this option to specify the name that your
+                     module will take when included in, say, a browser.
+                                                                        [string]
+  --export-all       Only used when --wrap, this tells UglifyJS to add code to
+                     automatically export all globals.                 [boolean]
+  --lint             Display some scope warnings                       [boolean]
+  -v, --verbose      Verbose                                           [boolean]
+  -V, --version      Print version number and exit.                    [boolean]
 
 Specify `--output` (`-o`) to declare the output file.  Otherwise the output
 goes to STDOUT.
index 1e686d1..cad29ee 100755 (executable)
@@ -7,6 +7,7 @@ var UglifyJS = require("../tools/node");
 var sys = require("util");
 var optimist = require("optimist");
 var fs = require("fs");
+var path = require("path");
 var async = require("async");
 var acorn;
 var ARGS = optimist
@@ -25,7 +26,9 @@ mangling you need to use `-c` and `-m`.\
     .describe("screw-ie8", "Pass this flag if you don't care about full compliance with Internet Explorer 6-8 quirks (by default UglifyJS will try to be IE-proof).")
     .describe("expr", "Parse a single expression, rather than a program (for parsing JSON)")
     .describe("p", "Skip prefix for original filenames that appear in source maps. \
-For example -p 3 will drop 3 directories from file names and ensure they are relative paths.")
+For example -p 3 will drop 3 directories from file names and ensure they are relative paths. \
+You can also specify -p relative, which will make UglifyJS figure out itself the relative paths between original sources, \
+the source map and the output file.")
     .describe("o", "Output file (default STDOUT).")
     .describe("b", "Beautify output/specify output options.")
     .describe("m", "Mangle names/pass mangler options.")
@@ -77,6 +80,7 @@ You need to pass an argument to this option to specify the name that your module
     .string("e")
     .string("comments")
     .string("wrap")
+    .string("p")
 
     .boolean("expr")
     .boolean("screw-ie8")
@@ -199,9 +203,10 @@ if (files.filter(function(el){ return el == "-" }).length > 1) {
 var STATS = {};
 var OUTPUT_FILE = ARGS.o;
 var TOPLEVEL = null;
+var P_RELATIVE = ARGS.p && ARGS.p == "relative";
 
 var SOURCE_MAP = ARGS.source_map ? UglifyJS.SourceMap({
-    file: OUTPUT_FILE,
+    file: P_RELATIVE ? path.relative(path.dirname(ARGS.source_map), OUTPUT_FILE) : OUTPUT_FILE,
     root: ARGS.source_map_root,
     orig: ORIG_MAP,
 }) : null;
@@ -227,7 +232,14 @@ async.eachLimit(files, 1, function (file, cb) {
             process.exit(1);
         }
         if (ARGS.p != null) {
-            file = file.replace(/^\/+/, "").split(/\/+/).slice(ARGS.p).join("/");
+            if (P_RELATIVE) {
+                file = path.relative(path.dirname(ARGS.source_map), file);
+            } else {
+                var p = parseInt(ARGS.p, 10);
+                if (!isNaN(p)) {
+                    file = file.replace(/^\/+/, "").split(/\/+/).slice(ARGS.p).join("/");
+                }
+            }
         }
         time_it("parse", function(){
             if (ARGS.spidermonkey) {
@@ -310,7 +322,12 @@ async.eachLimit(files, 1, function (file, cb) {
 
     if (SOURCE_MAP) {
         fs.writeFileSync(ARGS.source_map, SOURCE_MAP, "utf8");
-        output += "\n//# sourceMappingURL=" + (ARGS.source_map_url || ARGS.source_map);
+        var source_map_url = ARGS.source_map_url || (
+            P_RELATIVE
+                ? path.relative(path.dirname(OUTPUT_FILE), ARGS.source_map)
+                : ARGS.source_map
+        );
+        output += "\n//# sourceMappingURL=" + source_map_url;
     }
 
     if (OUTPUT_FILE) {