From 8065e27a7d0d2a11946b33b36e05f3709c032da0 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Sat, 2 Apr 2022 14:59:28 +0100 Subject: [PATCH] patch `export default` within sandbox correctly (#5400) fixes #5399 --- test/mocha/reduce.js | 20 +++++++++++++++++++- test/sandbox.js | 10 ++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/test/mocha/reduce.js b/test/mocha/reduce.js index 1023ed38..dcc0993f 100644 --- a/test/mocha/reduce.js +++ b/test/mocha/reduce.js @@ -434,7 +434,7 @@ describe("test/reduce.js", function() { "// }", ].join("\n")); }); - it("Should transform `export default` correctly", function() { + it("Should transform `export default class` correctly", function() { var result = reduce_test(read("test/input/reduce/export_default.js"), { compress: false, toplevel: true, @@ -448,4 +448,22 @@ describe("test/reduce.js", function() { "// }", ].join("\n")); }); + it("Should transform `export default function` correctly", function() { + var code = [ + "for (var k in this)", + " console.log(k);", + "export default (function f() {});", + "console.log(k);", + ].join("\n"); + var result = reduce_test(code, { + mangle: false, + }); + if (result.error) throw result.error; + assert.strictEqual(result.code, [ + "// Can't reproduce test failure", + "// minify options: {", + '// "mangle": false', + "// }", + ].join("\n")); + }); }); diff --git a/test/sandbox.js b/test/sandbox.js index 7aff539d..c1932269 100644 --- a/test/sandbox.js +++ b/test/sandbox.js @@ -52,12 +52,14 @@ exports.same_stdout = semver.satisfies(process.version, "0.12") ? function(expec return typeof expected == typeof actual && strip_func_ids(expected) == strip_func_ids(actual); }; exports.patch_module_statements = function(code) { - var count = 0, imports = []; + var count = 0, has_default = "", imports = []; code = code.replace(/\bexport(?:\s*\{[^{}]*}\s*?(?:$|\n|;)|\s+default\b(?:\s*(\(|\{|class\s*\{|class\s+(?=extends\b)|(?:async\s+)?function\s*(?:\*\s*)?\())?|\b)/g, function(match, header) { if (!header) return ""; + has_default = "var _uglify_export_default_;"; if (header.length == 1) return "0, " + header; - do { - var name = "_export_default_" + ++count; + var name = "_uglify_export_default_"; + if (/^class\b/.test(header)) do { + name = "_uglify_export_default_" + ++count; } while (code.indexOf(name) >= 0); return header.slice(0, -1) + " " + name + header.slice(-1); }).replace(/\bimport\.meta\b/g, function() { @@ -76,7 +78,7 @@ exports.patch_module_statements = function(code) { return ""; }); imports.push(""); - return imports.join("\n") + code; + return has_default + imports.join("\n") + code; }; function is_error(result) {