87 lines
2.6 KiB
JavaScript
87 lines
2.6 KiB
JavaScript
/*
|
|
* Traceur, Babel and TypeScript transpile hook for Loader
|
|
*/
|
|
var transpile = (function() {
|
|
|
|
// use Traceur by default
|
|
Loader.prototype.transpiler = 'traceur';
|
|
|
|
function transpile(load) {
|
|
var self = this;
|
|
|
|
return Promise.resolve(__global[self.transpiler == 'typescript' ? 'ts' : self.transpiler]
|
|
|| (self.pluginLoader || self)['import'](self.transpiler))
|
|
.then(function(transpiler) {
|
|
if (transpiler.__useDefault)
|
|
transpiler = transpiler['default'];
|
|
|
|
var transpileFunction;
|
|
if (transpiler.Compiler)
|
|
transpileFunction = traceurTranspile;
|
|
else if (transpiler.createLanguageService)
|
|
transpileFunction = typescriptTranspile;
|
|
else
|
|
transpileFunction = babelTranspile;
|
|
|
|
// note __moduleName will be part of the transformer meta in future when we have the spec for this
|
|
return '(function(__moduleName){' + transpileFunction.call(self, load, transpiler) + '\n})("' + load.name + '");\n//# sourceURL=' + load.address + '!transpiled';
|
|
});
|
|
};
|
|
|
|
function traceurTranspile(load, traceur) {
|
|
var options = this.traceurOptions || {};
|
|
options.modules = 'instantiate';
|
|
options.script = false;
|
|
if (options.sourceMaps === undefined)
|
|
options.sourceMaps = 'inline';
|
|
options.filename = load.address;
|
|
options.inputSourceMap = load.metadata.sourceMap;
|
|
options.moduleName = false;
|
|
|
|
var compiler = new traceur.Compiler(options);
|
|
|
|
return doTraceurCompile(load.source, compiler, options.filename);
|
|
}
|
|
function doTraceurCompile(source, compiler, filename) {
|
|
try {
|
|
return compiler.compile(source, filename);
|
|
}
|
|
catch(e) {
|
|
// on older versions of traceur (<0.9.3), an array of errors is thrown
|
|
// rather than a single error.
|
|
if (e.length) {
|
|
throw e[0];
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
function babelTranspile(load, babel) {
|
|
var options = this.babelOptions || {};
|
|
options.modules = 'system';
|
|
if (options.sourceMap === undefined)
|
|
options.sourceMap = 'inline';
|
|
options.inputSourceMap = load.metadata.sourceMap;
|
|
options.filename = load.address;
|
|
options.code = true;
|
|
options.ast = false;
|
|
|
|
return babel.transform(load.source, options).code;
|
|
}
|
|
|
|
function typescriptTranspile(load, ts) {
|
|
var options = this.typescriptOptions || {};
|
|
options.target = options.target || ts.ScriptTarget.ES5;
|
|
if (options.sourceMap === undefined)
|
|
options.sourceMap = true;
|
|
if (options.sourceMap && options.inlineSourceMap !== false)
|
|
options.inlineSourceMap = true;
|
|
|
|
options.module = ts.ModuleKind.System;
|
|
|
|
return ts.transpile(load.source, options, load.address);
|
|
}
|
|
|
|
return transpile;
|
|
})();
|