fix source map offset (#1993)
Account for whitespace insertions. fixes #505 fixes #890
This commit is contained in:
@@ -189,12 +189,43 @@ function OutputStream(options) {
|
|||||||
var might_need_semicolon = false;
|
var might_need_semicolon = false;
|
||||||
var might_add_newline = 0;
|
var might_add_newline = 0;
|
||||||
var last = "";
|
var last = "";
|
||||||
|
var mapping_token, mapping_name, mappings = options.source_map && [];
|
||||||
|
|
||||||
|
var do_add_mapping = mappings ? function() {
|
||||||
|
mappings.forEach(function(mapping) {
|
||||||
|
try {
|
||||||
|
options.source_map.add(
|
||||||
|
mapping.token.file,
|
||||||
|
mapping.line, mapping.col,
|
||||||
|
mapping.token.line, mapping.token.col,
|
||||||
|
!mapping.name && mapping.token.type == "name" ? mapping.token.value : mapping.name
|
||||||
|
);
|
||||||
|
} catch(ex) {
|
||||||
|
AST_Node.warn("Couldn't figure out mapping for {file}:{line},{col} → {cline},{ccol} [{name}]", {
|
||||||
|
file: mapping.token.file,
|
||||||
|
line: mapping.token.line,
|
||||||
|
col: mapping.token.col,
|
||||||
|
cline: mapping.line,
|
||||||
|
ccol: mapping.col,
|
||||||
|
name: mapping.name || ""
|
||||||
|
})
|
||||||
|
}
|
||||||
|
});
|
||||||
|
mappings = [];
|
||||||
|
} : noop;
|
||||||
|
|
||||||
var ensure_line_len = options.max_line_len ? function() {
|
var ensure_line_len = options.max_line_len ? function() {
|
||||||
if (current_col > options.max_line_len) {
|
if (current_col > options.max_line_len) {
|
||||||
if (might_add_newline) {
|
if (might_add_newline) {
|
||||||
var left = OUTPUT.slice(0, might_add_newline);
|
var left = OUTPUT.slice(0, might_add_newline);
|
||||||
var right = OUTPUT.slice(might_add_newline);
|
var right = OUTPUT.slice(might_add_newline);
|
||||||
|
if (mappings) {
|
||||||
|
var delta = right.length - current_col;
|
||||||
|
mappings.forEach(function(mapping) {
|
||||||
|
mapping.line++;
|
||||||
|
mapping.col += delta;
|
||||||
|
});
|
||||||
|
}
|
||||||
OUTPUT = left + "\n" + right;
|
OUTPUT = left + "\n" + right;
|
||||||
current_line++;
|
current_line++;
|
||||||
current_pos++;
|
current_pos++;
|
||||||
@@ -204,7 +235,10 @@ function OutputStream(options) {
|
|||||||
AST_Node.warn("Output exceeds {max_line_len} characters", options);
|
AST_Node.warn("Output exceeds {max_line_len} characters", options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
might_add_newline = 0;
|
if (might_add_newline) {
|
||||||
|
might_add_newline = 0;
|
||||||
|
do_add_mapping();
|
||||||
|
}
|
||||||
} : noop;
|
} : noop;
|
||||||
|
|
||||||
var requireSemicolonChars = makePredicate("( [ + * / - , .");
|
var requireSemicolonChars = makePredicate("( [ + * / - , .");
|
||||||
@@ -264,6 +298,18 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
might_need_space = false;
|
might_need_space = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mapping_token) {
|
||||||
|
mappings.push({
|
||||||
|
token: mapping_token,
|
||||||
|
name: mapping_name,
|
||||||
|
line: current_line,
|
||||||
|
col: current_col
|
||||||
|
});
|
||||||
|
mapping_token = false;
|
||||||
|
if (!might_add_newline) do_add_mapping();
|
||||||
|
}
|
||||||
|
|
||||||
OUTPUT += str;
|
OUTPUT += str;
|
||||||
current_pos += str.length;
|
current_pos += str.length;
|
||||||
var a = str.split(/\r?\n/), n = a.length - 1;
|
var a = str.split(/\r?\n/), n = a.length - 1;
|
||||||
@@ -358,24 +404,9 @@ function OutputStream(options) {
|
|||||||
space();
|
space();
|
||||||
};
|
};
|
||||||
|
|
||||||
var add_mapping = options.source_map ? function(token, name) {
|
var add_mapping = mappings ? function(token, name) {
|
||||||
try {
|
mapping_token = token;
|
||||||
if (token) options.source_map.add(
|
mapping_name = name;
|
||||||
token.file || "?",
|
|
||||||
current_line, current_col,
|
|
||||||
token.line, token.col,
|
|
||||||
(!name && token.type == "name") ? token.value : name
|
|
||||||
);
|
|
||||||
} catch(ex) {
|
|
||||||
AST_Node.warn("Couldn't figure out mapping for {file}:{line},{col} → {cline},{ccol} [{name}]", {
|
|
||||||
file: token.file,
|
|
||||||
line: token.line,
|
|
||||||
col: token.col,
|
|
||||||
cline: current_line,
|
|
||||||
ccol: current_col,
|
|
||||||
name: name || ""
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} : noop;
|
} : noop;
|
||||||
|
|
||||||
function get() {
|
function get() {
|
||||||
|
|||||||
5
test/input/issue-505/input.js
Normal file
5
test/input/issue-505/input.js
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
function test(callback) {
|
||||||
|
'aaaaaaaaaaaaaaaa';
|
||||||
|
callback(err, data);
|
||||||
|
callback(err, data);
|
||||||
|
}
|
||||||
5
test/input/issue-505/output.js
Normal file
5
test/input/issue-505/output.js
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
function test(a){
|
||||||
|
"aaaaaaaaaaaaaaaa"
|
||||||
|
;a(err,data),a(err,data)
|
||||||
|
}
|
||||||
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjAiXSwibmFtZXMiOlsidGVzdCIsImNhbGxiYWNrIiwiZXJyIiwiZGF0YSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsS0FBS0M7QUFDVjtDQUNBQSxFQUFTQyxJQUFLQyxNQUNkRixFQUFTQyxJQUFLQyJ9
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
new function(){console.log(3)};
|
new function(){console.log(3)};
|
||||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIl0sIm5hbWVzIjpbImNvbnNvbGUiLCJsb2ciXSwibWFwcGluZ3MiOiJBQUErQyxHQUFyQyxZQUFnQkEsUUFBUUMsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEZvbyB7IGNvbnN0cnVjdG9yKCl7Y29uc29sZS5sb2coMSsyKTt9IH0gbmV3IEZvbygpO1xuIl19
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIl0sIm5hbWVzIjpbImNvbnNvbGUiLCJsb2ciXSwibWFwcGluZ3MiOiJBQUErQyxJQUFyQyxXQUFnQkEsUUFBUUMsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEZvbyB7IGNvbnN0cnVjdG9yKCl7Y29uc29sZS5sb2coMSsyKTt9IH0gbmV3IEZvbygpO1xuIl19
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, "var bar=function(){function foo(bar){return bar}return foo}();\n" +
|
assert.strictEqual(stdout, "var bar=function(){function foo(bar){return bar}return foo}();\n" +
|
||||||
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW5wdXQvaXNzdWUtMTMyMy9zYW1wbGUuanMiXSwibmFtZXMiOlsiYmFyIiwiZm9vIl0sIm1hcHBpbmdzIjoiQUFBQSxHQUFJQSxLQUFNLFdBQ04sUUFBU0MsS0FBS0QsS0FDVixNQUFPQSxLQUdYLE1BQU9DIn0=\n");
|
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW5wdXQvaXNzdWUtMTMyMy9zYW1wbGUuanMiXSwibmFtZXMiOlsiYmFyIiwiZm9vIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxJQUFNLFdBQ04sU0FBU0MsSUFBS0QsS0FDVixPQUFPQSxJQUdYLE9BQU9DIn0=\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -175,7 +175,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
|
|
||||||
assert.strictEqual(stdout, [
|
assert.strictEqual(stdout, [
|
||||||
"var bar=function(){function foo(bar){return bar}return foo}();",
|
"var bar=function(){function foo(bar){return bar}return foo}();",
|
||||||
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW5wdXQvaXNzdWUtMTMyMy9zYW1wbGUuanMiXSwibmFtZXMiOlsiYmFyIiwiZm9vIl0sIm1hcHBpbmdzIjoiQUFBQSxHQUFJQSxLQUFNLFdBQ04sUUFBU0MsS0FBS0QsS0FDVixNQUFPQSxLQUdYLE1BQU9DIn0=",
|
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW5wdXQvaXNzdWUtMTMyMy9zYW1wbGUuanMiXSwibmFtZXMiOlsiYmFyIiwiZm9vIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxJQUFNLFdBQ04sU0FBU0MsSUFBS0QsS0FDVixPQUFPQSxJQUdYLE9BQU9DIn0=",
|
||||||
"",
|
"",
|
||||||
].join("\n"));
|
].join("\n"));
|
||||||
assert.strictEqual(stderr, "WARN: inline source map not found\n");
|
assert.strictEqual(stderr, "WARN: inline source map not found\n");
|
||||||
@@ -514,7 +514,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
|
|
||||||
assert.strictEqual(stdout, [
|
assert.strictEqual(stdout, [
|
||||||
'"use strict";var foo=function foo(x){return"foo "+x};console.log(foo("bar"));',
|
'"use strict";var foo=function foo(x){return"foo "+x};console.log(foo("bar"));',
|
||||||
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImZvbyIsIngiLCJjb25zb2xlIiwibG9nIl0sIm1hcHBpbmdzIjoiWUFBQSxJQUFJQSxLQUFNLFFBQU5BLEtBQU1DLEdBQUEsTUFBSyxPQUFTQSxFQUN4QkMsU0FBUUMsSUFBSUgsSUFBSSJ9",
|
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImZvbyIsIngiLCJjb25zb2xlIiwibG9nIl0sIm1hcHBpbmdzIjoiYUFBQSxJQUFJQSxJQUFNLFNBQU5BLElBQU1DLEdBQUEsTUFBSyxPQUFTQSxHQUN4QkMsUUFBUUMsSUFBSUgsSUFBSSJ9",
|
||||||
""
|
""
|
||||||
].join("\n"));
|
].join("\n"));
|
||||||
done();
|
done();
|
||||||
|
|||||||
@@ -138,13 +138,25 @@ describe("minify", function() {
|
|||||||
});
|
});
|
||||||
var code = result.code;
|
var code = result.code;
|
||||||
assert.strictEqual(code, "var a=function(n){return n};\n" +
|
assert.strictEqual(code, "var a=function(n){return n};\n" +
|
||||||
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjAiXSwibmFtZXMiOlsiYSIsImZvbyJdLCJtYXBwaW5ncyI6IkFBQUEsR0FBSUEsR0FBSSxTQUFTQyxHQUFPLE1BQU9BIn0=");
|
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjAiXSwibmFtZXMiOlsiYSIsImZvbyJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBSUEsRUFBSSxTQUFTQyxHQUFPLE9BQU9BIn0=");
|
||||||
});
|
});
|
||||||
it("should not append source map to output js when sourceMapInline is not enabled", function() {
|
it("should not append source map to output js when sourceMapInline is not enabled", function() {
|
||||||
var result = Uglify.minify('var a = function(foo) { return foo; };');
|
var result = Uglify.minify('var a = function(foo) { return foo; };');
|
||||||
var code = result.code;
|
var code = result.code;
|
||||||
assert.strictEqual(code, "var a=function(n){return n};");
|
assert.strictEqual(code, "var a=function(n){return n};");
|
||||||
});
|
});
|
||||||
|
it("should work with max_line_len", function() {
|
||||||
|
var result = Uglify.minify(read("./test/input/issue-505/input.js"), {
|
||||||
|
output: {
|
||||||
|
max_line_len: 20
|
||||||
|
},
|
||||||
|
sourceMap: {
|
||||||
|
url: "inline"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
assert.strictEqual(result.error, undefined);
|
||||||
|
assert.strictEqual(result.code, read("./test/input/issue-505/output.js"));
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("#__PURE__", function() {
|
describe("#__PURE__", function() {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
var UglifyJS = require("./node");
|
var UglifyJS = require("..");
|
||||||
var ok = require("assert");
|
var ok = require("assert");
|
||||||
|
|
||||||
module.exports = function () {
|
module.exports = function () {
|
||||||
@@ -26,11 +26,11 @@ module.exports = function () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function source_map(js) {
|
function source_map(js) {
|
||||||
var source_map = UglifyJS.SourceMap();
|
return JSON.parse(UglifyJS.minify(js, {
|
||||||
var stream = UglifyJS.OutputStream({ source_map: source_map });
|
compress: false,
|
||||||
var parsed = UglifyJS.parse(js);
|
mangle: false,
|
||||||
parsed.print(stream);
|
sourceMap: true
|
||||||
return JSON.parse(source_map.toString());
|
}).map);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run standalone
|
// Run standalone
|
||||||
|
|||||||
Reference in New Issue
Block a user