Code coverage report for 6to5/lib/6to5/transformation/modules/common.js

Statements: 100% (40 / 40)      Branches: 100% (19 / 19)      Functions: 100% (7 / 7)      Lines: 100% (38 / 38)      Ignored: none     

All files » 6to5/lib/6to5/transformation/modules/ » common.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 1061   1 1 1 1   1 385   385 385   11110     385     1   1 39     39 15               24   4                   20                 1   12         1 156 27 27     27     27   27 24         24 24               3     3   3       132     1 32 16      
module.exports = CommonJSFormatter;
 
var DefaultFormatter = require("./_default");
var traverse         = require("../../traverse");
var util             = require("../../util");
var t                = require("../../types");
 
function CommonJSFormatter(file) {
  DefaultFormatter.apply(this, arguments);
 
  var hasNonDefaultExports = false;
  traverse(file.ast, {
    enter: function (node) {
      if (t.isExportDeclaration(node) && !node.default) hasNonDefaultExports = true;
    }
  });
  this.hasNonDefaultExports = hasNonDefaultExports;
}
 
util.inherits(CommonJSFormatter, DefaultFormatter);
 
CommonJSFormatter.prototype.importSpecifier = function (specifier, node, nodes) {
  var variableName = t.getSpecifierName(specifier);
 
  // import foo from "foo";
  if (t.isSpecifierDefault(specifier)) {
    nodes.push(t.variableDeclaration("var", [
      t.variableDeclarator(variableName,
        t.callExpression(this.file.addHelper("interop-require"), [util.template("require", {
          MODULE_NAME: node.source
        })])
      )
    ]));
  } else {
    if (specifier.type === "ImportBatchSpecifier") {
      // import * as bar from "foo";
      nodes.push(t.variableDeclaration("var", [
        t.variableDeclarator(
          variableName,
          t.callExpression(this.file.addHelper("interop-require-wildcard"), [
            t.callExpression(t.identifier("require"), [node.source])
          ])
        )
      ]));
    } else {
      // import foo from "foo";
      nodes.push(util.template("require-assign-key", {
        VARIABLE_NAME: variableName,
        MODULE_NAME:   node.source,
        KEY:           specifier.id
      }));
    }
  }
};
 
CommonJSFormatter.prototype.importDeclaration = function (node, nodes) {
  // import "foo";
  nodes.push(util.template("require", {
    MODULE_NAME: node.source
  }, true));
};
 
CommonJSFormatter.prototype.exportDeclaration = function (node, nodes) {
  if (node.default && !this.noInteropRequire && !this.noInteropExport) {
    var declar = node.declaration;
    var assign;
 
    // module.exports = VALUE;
    var templateName = "exports-default-module";
 
    // exports = module.exports = VALUE;
    if (this.hasNonDefaultExports) templateName = "exports-default-module-override";
 
    if (t.isFunctionDeclaration(declar) || !this.hasNonDefaultExports) {
      assign = util.template(templateName, {
        VALUE: this._pushStatement(declar, nodes)
      }, true);
 
      // hoist to the top if this default is a function
      nodes.push(this._hoistExport(declar, assign, 3));
      return;
    } else {
      // this export isn't a function so we can't hoist it to the top so we need to set it
      // at the very end of the file with something like:
      //
      //   module.exports = _extends(exports["default"], exports)
      //
 
      assign = util.template("common-export-default-assign", {
        EXTENDS_HELPER: this.file.addHelper("extends")
      }, true);
      assign._blockHoist = 0;
 
      nodes.push(assign);
    }
  }
 
  DefaultFormatter.prototype.exportDeclaration.apply(this, arguments);
};
 
CommonJSFormatter.prototype.exportSpecifier = function (specifier, node, nodes) {
  this._exportSpecifier(function () {
    return t.callExpression(t.identifier("require"), [node.source]);
  }, specifier, node, nodes);
};