From: Alex Lam S.L Date: Thu, 10 Oct 2019 19:52:33 +0000 (+0800) Subject: improve source map handling (#3464) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=6d57ca1a59449cd11de296d091a35551ce9cbee7;p=UglifyJS.git improve source map handling (#3464) fixes #2947 fixes #3277 fixes #3411 --- diff --git a/lib/minify.js b/lib/minify.js index 9eebc373..93f1295e 100644 --- a/lib/minify.js +++ b/lib/minify.js @@ -1,19 +1,39 @@ "use strict"; -var to_ascii = typeof atob == "undefined" ? function(b64) { - return new Buffer(b64, "base64").toString(); -} : atob; -var to_base64 = typeof btoa == "undefined" ? function(str) { - return new Buffer(str).toString("base64"); -} : btoa; +var to_ascii, to_base64; +if (typeof Buffer == "undefined") { + to_ascii = atob; + to_base64 = btoa; +} else if (typeof Buffer.alloc == "undefined") { + to_ascii = function(b64) { + return new Buffer(b64, "base64").toString(); + }; + to_base64 = function(str) { + return new Buffer(str).toString("base64"); + }; +} else { + to_ascii = function(b64) { + return Buffer.from(b64, "base64").toString(); + }; + to_base64 = function(str) { + return Buffer.from(str).toString("base64"); + }; +} -function read_source_map(name, code) { - var match = /\n\/\/# sourceMappingURL=data:application\/json(;.*?)?;base64,(\S+)\s*$/.exec(code); - if (!match) { - AST_Node.warn("inline source map not found: " + name); - return null; +function read_source_map(name, toplevel) { + var comments = toplevel.end.comments_after; + for (var i = comments.length; --i >= 0;) { + var comment = comments[i]; + if (comment.type != "comment1") break; + var match = /^# ([^\s=]+)=(\S+)\s*$/.exec(comment.value); + if (!match) break; + if (match[1] == "sourceMappingURL") { + match = /^data:application\/json(;.*?)?;base64,(\S+)$/.exec(match[2]); + if (!match) break; + return to_ascii(match[2]); + } } - return to_ascii(match[2]); + AST_Node.warn("inline source map not found: " + name); } function parse_source_map(content) { @@ -134,10 +154,10 @@ function minify(files, options) { source_maps = source_map_content && Object.create(null); for (var name in files) if (HOP(files, name)) { options.parse.filename = name; - options.parse.toplevel = parse(files[name], options.parse); + options.parse.toplevel = toplevel = parse(files[name], options.parse); if (source_maps) { if (source_map_content == "inline") { - var inlined_content = read_source_map(name, files[name]); + var inlined_content = read_source_map(name, toplevel); if (inlined_content) { source_maps[name] = parse_source_map(inlined_content); } @@ -146,7 +166,6 @@ function minify(files, options) { } } } - toplevel = options.parse.toplevel; } if (quoted_props) { reserve_quoted_keys(toplevel, quoted_props); diff --git a/test/input/issue-3441/input.js b/test/input/issue-3441/input.js new file mode 100644 index 00000000..c9ca8e77 --- /dev/null +++ b/test/input/issue-3441/input.js @@ -0,0 +1,8 @@ +// Generated by CoffeeScript 2.4.1 +(function() { + console.log('hello'); + +}).call(this); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1haW4uY29mZmVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtFQUFBLE9BQU8sQ0FBQyxHQUFSLENBQVksT0FBWjtBQUFBIiwic291cmNlc0NvbnRlbnQiOlsiY29uc29sZS5sb2cgJ2hlbGxvJ1xuIl19 +//# sourceURL=/Users/mohamed/Downloads/main.coffee diff --git a/test/mocha/sourcemaps.js b/test/mocha/sourcemaps.js index 78e100ba..aff2b009 100644 --- a/test/mocha/sourcemaps.js +++ b/test/mocha/sourcemaps.js @@ -181,6 +181,18 @@ describe("sourcemaps", function() { if (result.error) throw result.error; assert.strictEqual(result.code + "\n", readFileSync("test/input/issue-3294/output.js", "utf8")); }); + it("Should work in presence of unrecognised annotations", function() { + var result = UglifyJS.minify(read("./test/input/issue-3441/input.js"), { + compress: false, + mangle: false, + sourceMap: { + content: "inline", + }, + }); + if (result.error) throw result.error; + assert.strictEqual(result.code, '(function(){console.log("hello")}).call(this);'); + assert.strictEqual(result.map, '{"version":3,"sources":["main.coffee"],"names":["console","log"],"mappings":"CAAA,WAAAA,QAAQC,IAAI"}'); + }); }); describe("sourceMapInline", function() {