diff --git a/lib/minify.js b/lib/minify.js index 82d9ca3dd..32db64bd5 100644 --- a/lib/minify.js +++ b/lib/minify.js @@ -271,18 +271,15 @@ async function minify(files, options, _fs_module) { } if (!HOP(options.format, "code") || options.format.code) { if (options.sourceMap) { - options.format.source_map = await SourceMap({ + if (options.sourceMap.includeSources && files instanceof AST_Toplevel) { + throw new Error("original source content unavailable"); + } + options.format.source_map = SourceMap({ file: options.sourceMap.filename, orig: options.sourceMap.content, - root: options.sourceMap.root + root: options.sourceMap.root, + files: options.sourceMap.includeSources ? files : null, }); - if (options.sourceMap.includeSources) { - if (files instanceof AST_Toplevel) { - throw new Error("original source content unavailable"); - } else for (var name in files) if (HOP(files, name)) { - options.format.source_map.get().setSourceContent(name, files[name]); - } - } } delete options.format.ast; delete options.format.code; @@ -291,11 +288,21 @@ async function minify(files, options, _fs_module) { toplevel.print(stream); result.code = stream.get(); if (options.sourceMap) { - if(options.sourceMap.asObject) { - result.map = options.format.source_map.get().toJSON(); - } else { - result.map = options.format.source_map.toString(); - } + Object.defineProperty(result, "map", { + configurable: true, + enumerable: true, + get() { + const map = options.format.source_map.getEncoded(); + return (result.map = options.sourceMap.asObject ? map : JSON.stringify(map)); + }, + set(value) { + Object.defineProperty(result, "map", { + value, + writable: true, + }); + } + }); + result.decodedMap = options.format.source_map.getDecoded(); if (options.sourceMap.url == "inline") { var sourceMap = typeof result.map === "object" ? JSON.stringify(result.map) : result.map; result.code += "\n//# sourceMappingURL=data:application/json;charset=utf-8;base64," + to_base64(sourceMap); @@ -310,9 +317,6 @@ async function minify(files, options, _fs_module) { options.nameCache.props = cache_to_json(options.mangle.properties.cache); } } - if (options.format && options.format.source_map) { - options.format.source_map.destroy(); - } if (timings) { timings.end = Date.now(); result.timings = { diff --git a/lib/sourcemap.js b/lib/sourcemap.js index 598babce6..6376725cc 100644 --- a/lib/sourcemap.js +++ b/lib/sourcemap.js @@ -43,9 +43,9 @@ "use strict"; -import MOZ_SourceMap from "source-map"; +import {GenMapping, maybeAddMapping, toDecodedMap, toEncodedMap, setSourceContent} from "@jridgewell/gen-mapping"; import {AnyMap, originalPositionFor} from "@jridgewell/trace-mapping"; -import {defaults} from "./utils/index.js"; +import {defaults, HOP} from "./utils/index.js"; // a small wrapper around source-map and @jridgewell/trace-mapping function SourceMap(options) { @@ -53,24 +53,27 @@ function SourceMap(options) { file : null, root : null, orig : null, - - orig_line_diff : 0, - dest_line_diff : 0, + files: {}, }); var orig_map; - var generator = new MOZ_SourceMap.SourceMapGenerator({ + var generator = new GenMapping({ file : options.file, sourceRoot : options.root }); + let sourcesContent = {__proto__: null}; + let files = options.files; + for (var name in files) if (HOP(files, name)) { + sourcesContent[name] = files[name]; + } if (options.orig) { orig_map = new AnyMap(options.orig); if (orig_map.sourcesContent) { orig_map.resolvedSources.forEach(function(source, i) { - var sourceContent = orig_map.sourcesContent[i]; - if (sourceContent) { - generator.setSourceContent(source, sourceContent); + var content = orig_map.sourcesContent[i]; + if (content) { + sourcesContent[source] = content; } }); } @@ -90,19 +93,27 @@ function SourceMap(options) { orig_col = info.column; name = info.name || name; } - generator.addMapping({ - generated : { line: gen_line + options.dest_line_diff, column: gen_col }, - original : { line: orig_line + options.orig_line_diff, column: orig_col }, + maybeAddMapping(generator, { + generated : { line: gen_line, column: gen_col }, + original : { line: orig_line, column: orig_col }, source : source, name : name }); + setSourceContent(generator, source, sourcesContent[source]); + } + + function clean(map) { + const allNull = map.sourcesContent.every(c => c == null); + if (allNull) delete map.sourcesContent; + if (map.file === undefined) delete map.file; + if (map.sourceRoot === undefined) delete map.sourceRoot; + return map; } return { - add : add, - get : function() { return generator; }, - toString : function() { return generator.toString(); }, - destroy : function() {} + add : add, + getDecoded : function() { return clean(toDecodedMap(generator)); }, + getEncoded : function() { return clean(toEncodedMap(generator)); }, }; } diff --git a/package-lock.json b/package-lock.json index 46ee7e167..d4b5c785b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,11 +83,37 @@ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.0.tgz", + "integrity": "sha512-bFDbLEZ84DtNwXILbufXeQMz3tcGSfy+ROgvnB9jUm+t48G4Po+1UhhyFh6GIsFOE2R31Ab0ddeMv+Z9gcYC4g==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, "@jridgewell/resolve-uri": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" }, + "@jridgewell/set-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", + "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==" + }, "@jridgewell/sourcemap-codec": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", @@ -931,11 +957,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -1270,7 +1291,8 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "random-int": { "version": "2.0.1", @@ -1509,14 +1531,6 @@ } } }, - "source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "requires": { - "whatwg-url": "^7.0.0" - } - }, "source-map-support": { "version": "0.5.20", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", @@ -1650,14 +1664,6 @@ "is-number": "^7.0.0" } }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "requires": { - "punycode": "^2.1.0" - } - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -1728,21 +1734,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 10d0514fb..9e334174a 100644 --- a/package.json +++ b/package.json @@ -43,10 +43,10 @@ "main.js" ], "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.5", "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "devDependencies": { diff --git a/test/input/issue-505/output.js b/test/input/issue-505/output.js index 5a1bc018b..14f8febaa 100644 --- a/test/input/issue-505/output.js +++ b/test/input/issue-505/output.js @@ -2,4 +2,4 @@ function test(a){ "aaaaaaaaaaaaaaaa" ;a(err,data),a(err,data) } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjAiXSwibmFtZXMiOlsidGVzdCIsImNhbGxiYWNrIiwiZXJyIiwiZGF0YSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsS0FBS0M7QUFDVjtDQUNBQSxFQUFTQyxJQUFLQyxNQUNkRixFQUFTQyxJQUFLQyJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0ZXN0IiwiY2FsbGJhY2siLCJlcnIiLCJkYXRhIl0sInNvdXJjZXMiOlsiMCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsS0FBS0M7QUFDVjtDQUNBQSxFQUFTQyxJQUFLQyxNQUNkRixFQUFTQyxJQUFLQyJ9 \ No newline at end of file diff --git a/test/input/issue-520/output.js b/test/input/issue-520/output.js index f6d138047..0aa3c9632 100644 --- a/test/input/issue-520/output.js +++ b/test/input/issue-520/output.js @@ -1,2 +1,2 @@ new function(){console.log(3)}; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIl0sIm5hbWVzIjpbImNvbnNvbGUiLCJsb2ciXSwibWFwcGluZ3MiOiJBQUErQyxJQUFyQyxXQUFnQkEsUUFBUUMsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEZvbyB7IGNvbnN0cnVjdG9yKCl7Y29uc29sZS5sb2coMSsyKTt9IH0gbmV3IEZvbygpO1xuIl19 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb25zb2xlIiwibG9nIl0sInNvdXJjZXMiOlsic3RkaW4iXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgRm9vIHsgY29uc3RydWN0b3IoKXtjb25zb2xlLmxvZygxKzIpO30gfSBuZXcgRm9vKCk7XG4iXSwibWFwcGluZ3MiOiJBQUErQyxJQUFyQyxXQUFnQkEsUUFBUUMsSUFBSSJ9 diff --git a/test/input/source-maps/expect.js b/test/input/source-maps/expect.js index b911f3f8d..57cce7b94 100644 --- a/test/input/source-maps/expect.js +++ b/test/input/source-maps/expect.js @@ -1,2 +1,2 @@ function _toConsumableArray(arr){if(Array.isArray(arr)){for(var i=0,arr2=Array(arr.length);i { @@ -191,8 +212,8 @@ describe("sourcemaps", function() { 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"));'); + assert.deepEqual(map.sources, ["index.js"]); + assert.deepEqual(map.sourcesContent, ['let foo = x => "foo " + x;\nconsole.log(foo("bar"));']); }); it("Should process inline source map", async function() { var result = await minify(read("./test/input/issue-520/input.js"), {