support export statements properly (#2126)

- mangle & compress correctly with `toplevel`
- retain non-toplevel import/export
- parse & output `export { variable as name }`
- remove extraneous spaces from `beautify`


fixes #2038
fixes #2124
This commit is contained in:
Alex Lam S.L
2017-06-21 00:51:36 +08:00
committed by GitHub
parent 849ba79dee
commit 62d1fbf645
7 changed files with 199 additions and 57 deletions

97
test/compress/export.js Normal file
View File

@@ -0,0 +1,97 @@
issue_2038_1: {
options = {
toplevel: true,
unused: true,
}
mangle = {
toplevel: true,
}
input: {
export var V = 1;
export let L = 2;
export const C = 3;
}
expect: {
export var V = 1;
export let L = 2;
export const C = 3;
}
}
issue_2038_2: {
options = {
toplevel: true,
unused: true,
}
mangle = {
toplevel: true,
}
input: {
let LET = 1;
const CONST = 2;
var VAR = 3;
export { LET, CONST, VAR };
}
expect: {
let a = 1;
const c = 2;
var n = 3;
export { a as LET, c as CONST, n as VAR };
}
}
issue_2124: {
options = {
unused: true,
}
input: {
{
export var V = 1;
}
{
export let L = 2;
}
{
export const C = 3;
}
}
expect: {
{
export var V = 1;
}
{
export let L = 2;
}
{
export const C = 3;
}
}
}
issue_2126: {
mangle = {
toplevel: true,
}
input: {
import { foo as bar, cat as dog } from "stuff";
console.log(bar, dog);
export { bar as qux };
export { dog };
}
expect: {
import { foo as o, cat as f } from "stuff";
console.log(o, f);
export { o as qux };
export { f as dog };
}
}
beautify: {
beautify = {
beautify: true,
}
input: {
export { A as B, C as D };
}
expect_exact: "export { A as B, C as D };"
}

View File

@@ -2,8 +2,7 @@ var assert = require("assert");
var uglify = require("../node");
describe("Export", function() {
it ("Should parse export directives", function() {
it("Should parse export directives", function() {
var inputs = [
['export * from "a.js"', ['*'], "a.js"],
['export {A} from "a.js"', ['A'], "a.js"],
@@ -12,17 +11,17 @@ describe("Export", function() {
['export {A, B} from "a.js"', ['A', 'B'], "a.js"],
];
var test = function(code) {
function test(code) {
return uglify.parse(code);
};
}
var extractNames = function(symbols) {
function extractNames(symbols) {
var ret = [];
for (var i = 0; i < symbols.length; i++) {
ret.push(symbols[i].name.name)
ret.push(symbols[i].foreign_name.name);
}
return ret;
};
}
for (var i = 0; i < inputs.length; i++) {
var ast = test(inputs[i][0]);
@@ -34,7 +33,7 @@ describe("Export", function() {
assert(st instanceof uglify.AST_Export);
var actualNames = extractNames(st.exported_names);
assert.deepEqual(actualNames, names);
assert.equal(st.module_name.value, filename)
assert.equal(st.module_name.value, filename);
}
})
});
});
});