steal-es6-module-loader
Version:
An ES6 Module Loader shim
123 lines (105 loc) • 3.82 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 = 'babel';
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) {
babel = babel.Babel || babel.babel || babel;
var options = this.babelOptions || {};
options.sourceMap = 'inline';
options.filename = load.address;
options.code = true;
options.ast = false;
var babelVersion = babel.version ? +babel.version.split(".")[0] : 6;
if(!babelVersion) babelVersion = 6;
if(babelVersion >= 6) {
// delete the old babel options if they are present in config
delete options.optional;
delete options.whitelist;
delete options.blacklist;
// If the user didn't provide presets/plugins, use the defaults
if(!options.presets && !options.plugins) {
options.presets = [
"es2015-no-commonjs", "react", "stage-0"
];
options.plugins = [
"transform-es2015-modules-systemjs"
];
}
} else {
options.modules = 'system';
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);