/* * 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; })();