Skip to content
This repository was archived by the owner on Oct 9, 2020. It is now read-only.

Commit 76c130a

Browse files
authored
Merge pull request #857 from fdintino/add-es6-minify-support
Use terser (uglify-js fork) to support minification of more permissive babel presets
2 parents e874ec6 + a2e7901 commit 76c130a

File tree

6 files changed

+64
-23
lines changed

6 files changed

+64
-23
lines changed

lib/output.js

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,22 @@ var fs = require('fs');
44
var Promise = require('bluebird');
55
var asp = require('bluebird').promisify;
66
var extend = require('./utils').extend;
7+
var terser = require('terser');
78

89
var fromFileURL = require('./utils').fromFileURL;
910
var toFileURL = require('./utils').toFileURL;
1011

12+
// Ugly hack to get around terser's strange code loading and export system
13+
// (inherited from uglify-js), and the fact that their SourceMap wrapper is
14+
// not exported
15+
var TerserSourceMap = new Function('MOZ_SourceMap', "exports", "require", function() {
16+
var code = ['terser/lib/utils.js', 'terser/lib/sourcemap.js'].map(function(file) {
17+
return fs.readFileSync(require.resolve(file), 'utf8');
18+
});
19+
code.push('return SourceMap;');
20+
return code.join('\n');
21+
}())(require('source-map'), terser, require);
22+
1123
function countLines(str) {
1224
return str.split(/\r\n|\r|\n/).length;
1325
}
@@ -72,36 +84,35 @@ function createOutput(outFile, outputs, basePath, sourceMaps, sourceMapContents)
7284
}
7385

7486
function minify(output, fileName, mangle, uglifyOpts) {
75-
var uglify = require('uglify-js');
76-
var ast;
87+
var files = {};
88+
files[fileName] = output.source;
89+
var result;
7790
try{
78-
ast = uglify.parse(output.source, { filename: fileName });
91+
result = terser.minify(files, {
92+
parse: {},
93+
compress: uglifyOpts.compress,
94+
mangle: mangle,
95+
output: { ast: true, code: false }
96+
});
7997
} catch(e){
8098
throw new Error(e);
8199
}
82-
ast.figure_out_scope();
83-
84-
ast = ast.transform(uglify.Compressor(uglifyOpts.compress));
85-
ast.figure_out_scope();
86-
if (mangle !== false)
87-
ast.mangle_names();
100+
101+
if (result.error) {
102+
throw new Error(result.error);
103+
}
104+
105+
var ast = result.ast;
88106

89107
var sourceMap;
90108
if (output.sourceMap) {
91109
if (typeof output.sourceMap === 'string')
92110
output.sourceMap = JSON.parse(output.sourceMap);
93111

94-
var sourceMapIn = output.sourceMap;
95-
sourceMap = uglify.SourceMap({
112+
sourceMap = TerserSourceMap({
96113
file: fileName,
97-
orig: sourceMapIn
114+
orig: output.sourceMap
98115
});
99-
100-
if (uglifyOpts.sourceMapIncludeSources && sourceMapIn && Array.isArray(sourceMapIn.sourcesContent)) {
101-
sourceMapIn.sourcesContent.forEach(function(content, idx) {
102-
sourceMap.get().setSourceContent(sourceMapIn.sources[idx], content);
103-
});
104-
}
105116
}
106117

107118
var outputOptions = uglifyOpts.beautify;

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
"rollup": "^0.58.2",
2020
"source-map": "^0.5.3",
2121
"systemjs": "^0.19.46",
22-
"traceur": "0.0.105",
23-
"uglify-js": "^2.6.1"
22+
"terser": "^3.8.1",
23+
"traceur": "0.0.105"
2424
},
2525
"devDependencies": {
2626
"babel": "^5.8.38",

test/arithmetic.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ suite('Bundle Expressions', function() {
3737
.then(function(tree) {
3838
assert.deepEqual(Object.keys(tree).sort(), [
3939
'Buffer.js', 'amd.js', 'babel', 'babel.js', 'cjs space.js', 'cjs-1.js', 'cjs-2.js', 'cjs-3.js', 'cjs-4.js', 'cjs-5.js', 'cjs-globals.js', 'cjs-in-12.js', 'cjs-in-13.js',
40-
'cjs-resolve.js', 'cjs.js', 'component.jsx!jsx.js', 'example.js', 'file.json', 'first.js',
40+
'cjs-resolve.js', 'cjs.js', 'class-def.js', 'component.jsx!jsx.js', 'example.js', 'file.json', 'first.js',
4141
'global-inner.js', 'global-outer.js', 'global.js', 'jquery-cdn', 'jquery.js', 'json-plugin.js', 'jsx.js', 'plugin.js', 'register.js', 'runtime.js',
4242
'second.js', 'some.js!plugin.js', 'text-plugin.js', 'text.txt!text-plugin.js', 'third.js', 'umd.js']);
4343
})
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Foo {
2+
constructor() {
3+
this.bar = 'bar';
4+
}
5+
static get baz() { return 'baz'; }
6+
}
7+
8+
const foo = new Foo();
9+
10+
module.exports = {
11+
foo: foo,
12+
barbaz: `${foo.bar}${Foo.baz}`,
13+
};

test/test-build.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,3 +243,21 @@ suite('Bundle Format', function() {
243243
});
244244
});
245245
});
246+
247+
suite('Test ES6 minification', function() {
248+
test('ES6 syntax minify, unmangled', function() {
249+
builder.reset();
250+
return builder.bundle('class-def.js', { minify: true , mangle: false })
251+
.then(function(output) {
252+
assert.match(output.source, /class Foo{constructor\(\){/, 'source contains literal class');
253+
});
254+
});
255+
256+
test('ES6 syntax minify, mangled', function() {
257+
builder.reset();
258+
return builder.bundle('class-def.js', { minify: true , mangle: true })
259+
.then(function(output) {
260+
assert.match(output.source, /class \w{constructor\(\){/, 'source contains literal class, mangled');
261+
});
262+
});
263+
});

test/test-sfx.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@
66
<div id="mocha">
77
<script>
88
window.$ = { jquery: 1 };
9+
window.DEBUG = false;
910
</script>
1011
<script src="output/sfx.js"></script>
1112
<script>
1213
mocha.setup('tdd');
1314

14-
DEBUG = false;
15-
1615
function assert(assertion, msg) {
1716
if (!assertion)
1817
throw new Error(msg || 'Assertion failed');

0 commit comments

Comments
 (0)