funcunit
Version:
<!-- @hide title
92 lines (75 loc) • 3.11 kB
JavaScript
/*
* Extension to detect ES6 and auto-load Traceur or Babel for processing
*/
function es6(loader) {
loader._extensions.push(es6);
// good enough ES6 detection regex - format detections not designed to be accurate, but to handle the 99% use case
var es6RegEx = /(^\s*|[}\);\n]\s*)(import\s+(['"]|(\*\s+as\s+)?[^"'\(\)\n;]+\s+from\s+['"]|\{)|export\s+\*\s+from\s+["']|export\s+(\{|default|function|class|var|const|let|async\s+function))/;
var traceurRuntimeRegEx = /\$traceurRuntime\s*\./;
var babelHelpersRegEx = /babelHelpers\s*\./;
var transpilerNormalized, transpilerRuntimeNormalized;
var firstLoad = true;
var nodeResolver = typeof process != 'undefined' && typeof require != 'undefined' && require.resolve;
function setConfig(loader, module, nodeModule) {
loader.meta[module] = {format: 'global'};
if (nodeResolver && !loader.paths[module]) {
try {
loader.paths[module] = require.resolve(nodeModule || module);
}
catch(e) {}
}
}
var loaderLocate = loader.locate;
loader.locate = function(load) {
var self = this;
if (firstLoad) {
if (self.transpiler == 'traceur') {
setConfig(self, 'traceur', 'traceur/bin/traceur.js');
self.meta['traceur'].exports = 'traceur';
setConfig(self, 'traceur-runtime', 'traceur/bin/traceur-runtime.js');
}
else if (self.transpiler == 'babel') {
setConfig(self, 'babel', 'babel-core/browser.js');
setConfig(self, 'babel-runtime', 'babel-core/external-helpers.js');
}
firstLoad = false;
}
return loaderLocate.call(self, load);
};
var loaderTranslate = loader.translate;
loader.translate = function(load) {
var loader = this;
return loaderTranslate.call(loader, load)
.then(function(source) {
// detect ES6
if (load.metadata.format == 'es6' || !load.metadata.format && source.match(es6RegEx)) {
load.metadata.format = 'es6';
return source;
}
if (load.metadata.format == 'register') {
if (!loader.global.$traceurRuntime && load.source.match(traceurRuntimeRegEx)) {
return loader['import']('traceur-runtime').then(function() {
return source;
});
}
if (!loader.global.babelHelpers && load.source.match(babelHelpersRegEx)) {
return loader['import']('babel/external-helpers').then(function() {
return source;
});
}
}
// ensure Traceur doesn't clobber the System global
if (loader.transpiler == 'traceur')
return Promise.all([
transpilerNormalized || (transpilerNormalized = loader.normalize(loader.transpiler)),
transpilerRuntimeNormalized || (transpilerRuntimeNormalized = loader.normalize(loader.transpiler + '-runtime'))
])
.then(function(normalized) {
if (load.name == normalized[0] || load.name == normalized[1])
return '(function() { var curSystem = System; ' + source + '\nSystem = curSystem; })();';
return source;
});
return source;
});
};
}