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

Use terser (uglify-js fork) to support minification of more permissive babel presets #857

Merged
merged 2 commits into from
May 21, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 29 additions & 18 deletions lib/output.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,22 @@ var fs = require('fs');
var Promise = require('bluebird');
var asp = require('bluebird').promisify;
var extend = require('./utils').extend;
var terser = require('terser');

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

// Ugly hack to get around terser's strange code loading and export system
// (inherited from uglify-js), and the fact that their SourceMap wrapper is
// not exported
var TerserSourceMap = new Function('MOZ_SourceMap', "exports", "require", function() {
var code = ['terser/lib/utils.js', 'terser/lib/sourcemap.js'].map(function(file) {
return fs.readFileSync(require.resolve(file), 'utf8');
});
code.push('return SourceMap;');
return code.join('\n');
}())(require('source-map'), terser, require);

function countLines(str) {
return str.split(/\r\n|\r|\n/).length;
}
Expand Down Expand Up @@ -72,36 +84,35 @@ function createOutput(outFile, outputs, basePath, sourceMaps, sourceMapContents)
}

function minify(output, fileName, mangle, uglifyOpts) {
var uglify = require('uglify-js');
var ast;
var files = {};
files[fileName] = output.source;
var result;
try{
ast = uglify.parse(output.source, { filename: fileName });
result = terser.minify(files, {
parse: {},
compress: uglifyOpts.compress,
mangle: mangle,
output: { ast: true, code: false }
});
} catch(e){
throw new Error(e);
}
ast.figure_out_scope();

ast = ast.transform(uglify.Compressor(uglifyOpts.compress));
ast.figure_out_scope();
if (mangle !== false)
ast.mangle_names();

if (result.error) {
throw new Error(result.error);
}

var ast = result.ast;

var sourceMap;
if (output.sourceMap) {
if (typeof output.sourceMap === 'string')
output.sourceMap = JSON.parse(output.sourceMap);

var sourceMapIn = output.sourceMap;
sourceMap = uglify.SourceMap({
sourceMap = TerserSourceMap({
file: fileName,
orig: sourceMapIn
orig: output.sourceMap
});

if (uglifyOpts.sourceMapIncludeSources && sourceMapIn && Array.isArray(sourceMapIn.sourcesContent)) {
sourceMapIn.sourcesContent.forEach(function(content, idx) {
sourceMap.get().setSourceContent(sourceMapIn.sources[idx], content);
});
}
}

var outputOptions = uglifyOpts.beautify;
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
"rollup": "^0.58.2",
"source-map": "^0.5.3",
"systemjs": "^0.19.46",
"traceur": "0.0.105",
"uglify-js": "^2.6.1"
"terser": "^3.8.1",
"traceur": "0.0.105"
},
"devDependencies": {
"babel": "^5.8.38",
Expand Down
2 changes: 1 addition & 1 deletion test/arithmetic.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ suite('Bundle Expressions', function() {
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), [
'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',
'cjs-resolve.js', 'cjs.js', 'component.jsx!jsx.js', 'example.js', 'file.json', 'first.js',
'cjs-resolve.js', 'cjs.js', 'class-def.js', 'component.jsx!jsx.js', 'example.js', 'file.json', 'first.js',
'global-inner.js', 'global-outer.js', 'global.js', 'jquery-cdn', 'jquery.js', 'json-plugin.js', 'jsx.js', 'plugin.js', 'register.js', 'runtime.js',
'second.js', 'some.js!plugin.js', 'text-plugin.js', 'text.txt!text-plugin.js', 'third.js', 'umd.js']);
})
Expand Down
13 changes: 13 additions & 0 deletions test/fixtures/test-tree/class-def.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
class Foo {
constructor() {
this.bar = 'bar';
}
static get baz() { return 'baz'; }
}

const foo = new Foo();

module.exports = {
foo: foo,
barbaz: `${foo.bar}${Foo.baz}`,
};
18 changes: 18 additions & 0 deletions test/test-build.js
Original file line number Diff line number Diff line change
Expand Up @@ -243,3 +243,21 @@ suite('Bundle Format', function() {
});
});
});

suite('Test ES6 minification', function() {
test('ES6 syntax minify, unmangled', function() {
builder.reset();
return builder.bundle('class-def.js', { minify: true , mangle: false })
.then(function(output) {
assert.match(output.source, /class Foo{constructor\(\){/, 'source contains literal class');
});
});

test('ES6 syntax minify, mangled', function() {
builder.reset();
return builder.bundle('class-def.js', { minify: true , mangle: true })
.then(function(output) {
assert.match(output.source, /class \w{constructor\(\){/, 'source contains literal class, mangled');
});
});
});
3 changes: 1 addition & 2 deletions test/test-sfx.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@
<div id="mocha">
<script>
window.$ = { jquery: 1 };
window.DEBUG = false;
</script>
<script src="output/sfx.js"></script>
<script>
mocha.setup('tdd');

DEBUG = false;

function assert(assertion, msg) {
if (!assertion)
throw new Error(msg || 'Assertion failed');
Expand Down