funcunit
Version:
<!-- @hide title
103 lines (86 loc) • 3.15 kB
JavaScript
/*
* Traceur and Babel transpile hook for Loader
*/
(function(Loader) {
var g = __global;
function getTranspilerModule(loader, globalName) {
return loader.newModule({ 'default': g[globalName], __useDefault: true });
}
// use Traceur by default
Loader.prototype.transpiler = 'traceur';
Loader.prototype.transpile = function(load) {
var self = this;
// pick up Transpiler modules from existing globals on first run if set
if (!self.transpilerHasRun) {
if (g.traceur && !self.has('traceur'))
self.set('traceur', getTranspilerModule(self, 'traceur'));
if (g.babel && !self.has('babel'))
self.set('babel', getTranspilerModule(self, 'babel'));
self.transpilerHasRun = true;
}
return self['import'](self.transpiler).then(function(transpiler) {
if (transpiler.__useDefault)
transpiler = transpiler['default'];
return 'var __moduleAddress = "' + load.address + '";' + (transpiler.Compiler ? traceurTranspile : babelTranspile).call(self, load, transpiler);
});
};
Loader.prototype.instantiate = function(load) {
var self = this;
return Promise.resolve(self.normalize(self.transpiler))
.then(function(transpilerNormalized) {
// load transpiler as a global (avoiding System clobbering)
if (load.name === transpilerNormalized) {
return {
deps: [],
execute: function() {
var curSystem = g.System;
var curLoader = g.Reflect.Loader;
// ensure not detected as CommonJS
__eval('(function(require,exports,module){' + load.source + '})();', g, load);
g.System = curSystem;
g.Reflect.Loader = curLoader;
return getTranspilerModule(self, load.name);
}
};
}
});
};
function traceurTranspile(load, traceur) {
var options = this.traceurOptions || {};
options.modules = 'instantiate';
options.script = false;
options.sourceMaps = 'inline';
options.filename = load.address;
options.inputSourceMap = load.metadata.sourceMap;
options.moduleName = false;
var compiler = new traceur.Compiler(options);
var source = doTraceurCompile(load.source, compiler, options.filename);
// add "!eval" to end of Traceur sourceURL
// I believe this does something?
source += '!eval';
return source;
}
function doTraceurCompile(source, compiler, filename) {
try {
return compiler.compile(source, filename);
}
catch(e) {
// traceur throws an error array
throw e[0];
}
}
function babelTranspile(load, babel) {
var options = this.babelOptions || {};
options.modules = 'system';
options.sourceMap = 'inline';
options.filename = load.address;
options.code = true;
options.ast = false;
if (!options.blacklist)
options.blacklist = ['react'];
var source = babel.transform(load.source, options).code;
// add "!eval" to end of Babel sourceURL
// I believe this does something?
return source + '\n//# sourceURL=' + load.address + '!eval';
}
})(__global.LoaderPolyfill);