163 lines
3.7 KiB
JavaScript
163 lines
3.7 KiB
JavaScript
Error.stackTraceLimit = Infinity;
|
|
|
|
var jsTrans = require("jstransform");
|
|
var traceur = require("traceur");
|
|
var es6tr = require("es6-transpiler");
|
|
var es6now = require("es6now");
|
|
var esnext = require("esnext");
|
|
var to5 = require("../lib/6to5");
|
|
|
|
var uglify = require("uglify-js");
|
|
var matcha = require("matcha");
|
|
var stream = require("stream");
|
|
var path = require("path");
|
|
var zlib = require("zlib");
|
|
var fs = require("fs");
|
|
var vm = require("vm");
|
|
var _ = require("lodash");
|
|
|
|
var readResolve = function (filename) {
|
|
return fs.readFileSync(require.resolve(filename), "utf8");
|
|
};
|
|
|
|
var getVersion = function (name) {
|
|
return require(name + "/package.json").version;
|
|
};
|
|
|
|
var jsTransVisitors = [];
|
|
|
|
_.each([
|
|
"arrow-function-visitors", "class-visitors", "destructuring-visitors",
|
|
"object-concise-method-visitors", "object-short-notation-visitors",
|
|
"rest-param-visitors", "template-visitors"
|
|
], function (name) {
|
|
var mod = require("jstransform/visitors/es6-" + name);
|
|
jsTransVisitors = jsTransVisitors.concat(mod.visitorList);
|
|
});
|
|
|
|
|
|
var compilers = {
|
|
"6to5": {
|
|
compile: function (code, filename) {
|
|
return to5.transform(code, { filename: filename }).code;
|
|
}
|
|
},
|
|
|
|
traceur: {
|
|
runtime: readResolve("traceur/bin/traceur-runtime.js"),
|
|
compile: function (code, filename) {
|
|
return traceur.compile(code, {
|
|
modules: "commonjs",
|
|
experimental: true
|
|
});
|
|
}
|
|
},
|
|
|
|
esnext: {
|
|
runtime: readResolve("esnext/node_modules/regenerator/runtime.js"),
|
|
compile: function (code, filename) {
|
|
return esnext.compile(code).code;
|
|
}
|
|
},
|
|
|
|
es6now: {
|
|
runtime: readResolve("es6now/runtime/ES6.js"),
|
|
compile: function (code, filename) {
|
|
return es6now.translate(code);
|
|
}
|
|
},
|
|
|
|
"es6-transpiler": {
|
|
compile: function (code, filename) {
|
|
var result = es6tr.run({ src: code });
|
|
if (result.errors.length) throw new Error(result.join("; "));
|
|
return result.src;
|
|
}
|
|
},
|
|
|
|
jstransform: {
|
|
compile: function (code, filename) {
|
|
return jsTrans.transform(jsTransVisitors, code).code;
|
|
}
|
|
}
|
|
};
|
|
|
|
// versions
|
|
|
|
var uglifyTitle = "uglify v" + getVersion("uglify-js");
|
|
|
|
_.each(compilers, function (compiler, name) {
|
|
compiler.title = name + " v" + getVersion(name);
|
|
});
|
|
|
|
//
|
|
|
|
var sizeBenchmark = function (code, loc, name, compiler) {
|
|
var log = function (output, title) {
|
|
title = [compiler.title].concat(title || []).join(" + ");
|
|
|
|
var kilo = (output.length / 1024).toFixed(2);
|
|
|
|
var text;
|
|
var color;
|
|
if (output === false) {
|
|
text = "error";
|
|
color = "red";
|
|
} else {
|
|
text = kilo + "KB";
|
|
color = "cyan";
|
|
}
|
|
|
|
text = matcha.utils.color(matcha.utils.padBefore(text, 22), color);
|
|
|
|
console.log(text, matcha.utils.color("» " + title, "gray"));
|
|
};
|
|
|
|
var go = function (getOutput, title) {
|
|
var code;
|
|
try {
|
|
code = getOutput();
|
|
} catch (err) {
|
|
log(false, title);
|
|
return;
|
|
}
|
|
|
|
log(code, title);
|
|
};
|
|
|
|
var output;
|
|
go(function () {
|
|
return output = output || compiler.compile(code, loc);
|
|
});
|
|
if (!output) return;
|
|
|
|
go(function () {
|
|
return uglify.minify(output, { fromString: true }).code;
|
|
}, uglifyTitle);
|
|
};
|
|
|
|
//
|
|
|
|
_.each(fs.readdirSync(__dirname + "/fixtures"), function (name) {
|
|
var alias = path.basename(name, path.extname(name));
|
|
|
|
suite(alias, function () {
|
|
set("delay", 0);
|
|
|
|
var loc = __dirname + "/fixtures/" + name;
|
|
var code = fs.readFileSync(loc, "utf8");
|
|
|
|
before(function () {
|
|
_.each(compilers, function (compiler, name) {
|
|
sizeBenchmark(code, loc, name, compiler);
|
|
});
|
|
});
|
|
|
|
_.each(compilers, function (compiler, name) {
|
|
bench(compiler.title, function () {
|
|
compiler.compile(code, loc);
|
|
});
|
|
});
|
|
});
|
|
});
|