225 lines
9.1 KiB
JavaScript
225 lines
9.1 KiB
JavaScript
var assert = require("assert");
|
|
var readFileSync = require("fs").readFileSync;
|
|
var Uglify = require("../../");
|
|
|
|
function read(path) {
|
|
return readFileSync(path, "utf8");
|
|
}
|
|
|
|
function source_map(code) {
|
|
return JSON.parse(Uglify.minify(code, {
|
|
compress: false,
|
|
mangle: false,
|
|
sourceMap: true,
|
|
}).map);
|
|
}
|
|
|
|
describe("sourcemaps", function() {
|
|
it("Should give correct version", function() {
|
|
var map = source_map("var x = 1 + 1;");
|
|
assert.strictEqual(map.version, 3);
|
|
assert.deepEqual(map.names, [ "x" ]);
|
|
});
|
|
|
|
it("Should give correct names", function() {
|
|
var map = source_map([
|
|
"({",
|
|
" get enabled() {",
|
|
" return 3;",
|
|
" },",
|
|
" set enabled(x) {",
|
|
" ;",
|
|
" }",
|
|
"});",
|
|
].join("\n"));
|
|
assert.deepEqual(map.names, [ "enabled", "x" ]);
|
|
});
|
|
|
|
it("Should mark array/object literals", function() {
|
|
var result = Uglify.minify([
|
|
"var obj = {};",
|
|
"obj.wat([]);",
|
|
].join("\n"), {
|
|
sourceMap: true,
|
|
toplevel: true,
|
|
});
|
|
if (result.error) throw result.error;
|
|
assert.strictEqual(result.code, "({}).wat([]);");
|
|
assert.strictEqual(result.map, '{"version":3,"sources":["0"],"names":["wat"],"mappings":"CAAU,IACNA,IAAI"}');
|
|
});
|
|
|
|
it("Should give correct sourceRoot", function() {
|
|
var code = "console.log(42);";
|
|
var result = Uglify.minify(code, {
|
|
sourceMap: {
|
|
root: "//foo.bar/",
|
|
},
|
|
});
|
|
if (result.error) throw result.error;
|
|
assert.strictEqual(result.code, code);
|
|
assert.strictEqual(result.map, '{"version":3,"sources":["0"],"names":["console","log"],"mappings":"AAAAA,QAAQC,IAAI","sourceRoot":"//foo.bar/"}');
|
|
});
|
|
|
|
describe("inSourceMap", function() {
|
|
it("Should read the given string filename correctly when sourceMapIncludeSources is enabled (#1236)", function() {
|
|
var result = Uglify.minify(read("./test/input/issue-1236/simple.js"), {
|
|
sourceMap: {
|
|
content: read("./test/input/issue-1236/simple.js.map"),
|
|
filename: "simple.min.js",
|
|
includeSources: true
|
|
}
|
|
});
|
|
if (result.error) throw result.error;
|
|
var map = JSON.parse(result.map);
|
|
assert.equal(map.file, "simple.min.js");
|
|
assert.equal(map.sourcesContent.length, 1);
|
|
assert.equal(map.sourcesContent[0], 'let foo = x => "foo " + x;\nconsole.log(foo("bar"));');
|
|
});
|
|
it("Should process inline source map", function() {
|
|
var result = Uglify.minify(read("./test/input/issue-520/input.js"), {
|
|
compress: { toplevel: true },
|
|
sourceMap: {
|
|
content: "inline",
|
|
includeSources: true,
|
|
url: "inline"
|
|
}
|
|
});
|
|
if (result.error) throw result.error;
|
|
assert.strictEqual(result.code + "\n", readFileSync("test/input/issue-520/output.js", "utf8"));
|
|
});
|
|
it("Should warn for missing inline source map", function() {
|
|
var warn_function = Uglify.AST_Node.warn_function;
|
|
var warnings = [];
|
|
Uglify.AST_Node.warn_function = function(txt) {
|
|
warnings.push(txt);
|
|
};
|
|
try {
|
|
var result = Uglify.minify(read("./test/input/issue-1323/sample.js"), {
|
|
mangle: false,
|
|
sourceMap: {
|
|
content: "inline"
|
|
}
|
|
});
|
|
assert.strictEqual(result.code, "var bar=function(bar){return bar};");
|
|
assert.strictEqual(warnings.length, 1);
|
|
assert.strictEqual(warnings[0], "inline source map not found: 0");
|
|
} finally {
|
|
Uglify.AST_Node.warn_function = warn_function;
|
|
}
|
|
});
|
|
it("Should handle multiple input and inline source map", function() {
|
|
var warn_function = Uglify.AST_Node.warn_function;
|
|
var warnings = [];
|
|
Uglify.AST_Node.warn_function = function(txt) {
|
|
warnings.push(txt);
|
|
};
|
|
try {
|
|
var result = Uglify.minify([
|
|
read("./test/input/issue-520/input.js"),
|
|
read("./test/input/issue-1323/sample.js"),
|
|
], {
|
|
sourceMap: {
|
|
content: "inline",
|
|
url: "inline",
|
|
}
|
|
});
|
|
if (result.error) throw result.error;
|
|
assert.strictEqual(result.code, [
|
|
"var Foo=function(){console.log(3)};new Foo;var bar=function(o){return o};",
|
|
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIiwiMSJdLCJuYW1lcyI6WyJGb28iLCJjb25zb2xlIiwibG9nIiwiYmFyIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxJQUFJLFdBQWdCQyxRQUFRQyxJQUFJLElBQVMsSUFBSUYsSUNBbkQsSUFBSUcsSUFDQSxTQUFjQSxHQUNWLE9BQU9BIn0=",
|
|
].join("\n"));
|
|
assert.strictEqual(warnings.length, 1);
|
|
assert.strictEqual(warnings[0], "inline source map not found: 1");
|
|
} finally {
|
|
Uglify.AST_Node.warn_function = warn_function;
|
|
}
|
|
});
|
|
it("Should drop source contents for includeSources=false", function() {
|
|
var result = Uglify.minify(read("./test/input/issue-520/input.js"), {
|
|
compress: false,
|
|
mangle: false,
|
|
sourceMap: {
|
|
content: "inline",
|
|
includeSources: true,
|
|
},
|
|
});
|
|
if (result.error) throw result.error;
|
|
var map = JSON.parse(result.map);
|
|
assert.strictEqual(map.sourcesContent.length, 1);
|
|
result = Uglify.minify(result.code, {
|
|
compress: false,
|
|
mangle: false,
|
|
sourceMap: {
|
|
content: result.map,
|
|
},
|
|
});
|
|
if (result.error) throw result.error;
|
|
map = JSON.parse(result.map);
|
|
assert.ok(!("sourcesContent" in map));
|
|
});
|
|
});
|
|
|
|
describe("sourceMapInline", function() {
|
|
it("Should append source map to output js when sourceMapInline is enabled", function() {
|
|
var result = Uglify.minify('var a = function(foo) { return foo; };', {
|
|
sourceMap: {
|
|
url: "inline"
|
|
}
|
|
});
|
|
if (result.error) throw result.error;
|
|
var code = result.code;
|
|
assert.strictEqual(code, "var a=function(n){return n};\n" +
|
|
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjAiXSwibmFtZXMiOlsiYSIsImZvbyJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBSUEsRUFBSSxTQUFTQyxHQUFPLE9BQU9BIn0=");
|
|
});
|
|
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; };');
|
|
if (result.error) throw result.error;
|
|
var code = result.code;
|
|
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"
|
|
}
|
|
});
|
|
if (result.error) throw result.error;
|
|
assert.strictEqual(result.code, read("./test/input/issue-505/output.js"));
|
|
});
|
|
it("Should work with unicode characters", function() {
|
|
var code = [
|
|
"var tëst = '→unicøde←';",
|
|
"alert(tëst);",
|
|
].join("\n");
|
|
var result = Uglify.minify(code, {
|
|
sourceMap: {
|
|
includeSources: true,
|
|
url: "inline",
|
|
}
|
|
});
|
|
if (result.error) throw result.error;
|
|
var map = JSON.parse(result.map);
|
|
assert.strictEqual(map.sourcesContent.length, 1);
|
|
assert.strictEqual(map.sourcesContent[0], code);
|
|
var encoded = result.code.slice(result.code.lastIndexOf(",") + 1);
|
|
map = JSON.parse(new Buffer(encoded, "base64").toString());
|
|
assert.strictEqual(map.sourcesContent.length, 1);
|
|
assert.strictEqual(map.sourcesContent[0], code);
|
|
result = Uglify.minify(result.code, {
|
|
sourceMap: {
|
|
content: "inline",
|
|
includeSources: true,
|
|
}
|
|
});
|
|
if (result.error) throw result.error;
|
|
map = JSON.parse(result.map);
|
|
assert.strictEqual(map.names.length, 2);
|
|
assert.strictEqual(map.names[0], "tëst");
|
|
assert.strictEqual(map.names[1], "alert");
|
|
});
|
|
});
|
|
});
|