text: /*
   * 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) {
        // traceur throws an error array
        throw e[0];
      }
    }
  
    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;
  })();
  