Code coverage report for 6to5/file.js

Statements: 90.91% (70 / 77)      Branches: 66.67% (16 / 24)      Functions: 100% (12 / 12)      Lines: 91.89% (68 / 74)      Ignored: none     

All files » 6to5/ » file.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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 1461   1   1 1 1 1 1   1 196 195   195 195 195     1 196   196               196         196 196   195     1 195   195         195       195     1 195 195             195     1 38 38   24 24       24     1 195   195   195 194 185       1 194   194   194 4696       1 185 185   185   185 4     185   184         184 1     184     1   174     174     174 33     174 174   174 174 174 174    
module.exports = File;
 
var SHEBANG_REGEX = /^\#\!.*/;
 
var transform = require("./transform");
var generate  = require("./generator");
var util      = require("./util");
var b         = require("acorn-ast-types").builders;
var _         = require("lodash");
 
function File(opts) {
  this.opts            = File.normaliseOptions(opts);
  this.moduleFormatter = this.getModuleFormatter(opts.modules);
 
  this.declarations = {};
  this.uids         = {};
  this.ast          = {};
}
 
File.normaliseOptions = function (opts) {
  opts = opts || {};
 
  _.defaults(opts, {
    blacklist: [],
    whitelist: [],
    sourceMap: false,
    filename:  "unknown",
    modules:   "common"
  });
 
  _.defaults(opts, {
    sourceFileName: opts.filename,
    sourceMapName:  opts.filename
  });
 
  transform._ensureTransformerNames("blacklist", opts.blacklist);
  transform._ensureTransformerNames("whitelist", opts.whitelist);
 
  return opts;
};
 
File.prototype.getModuleFormatter = function (type) {
  var ModuleLoader = transform.moduleFormatters[type];
 
  Iif (!ModuleLoader) {
    var loc = util.resolve(type);
    if (loc) ModuleLoader = require(loc);
  }
 
  Iif (!ModuleLoader) {
    throw new ReferenceError("unknown module formatter type " + type);
  }
 
  return new ModuleLoader(this);
};
 
File.prototype.parseShebang = function (code) {
  var shebangMatch = code.match(SHEBANG_REGEX);
  Iif (shebangMatch) {
    this.shebang = shebangMatch[0];
 
    // remove shebang
    code = code.replace(SHEBANG_REGEX, "");
  }
 
  return code;
};
 
File.prototype.addDeclaration = function (name) {
  var declar = this.declarations[name];
  if (declar) return declar.uid;
 
  var uid = b.identifier(this.generateUid(name));
  this.declarations[name] = {
    uid: uid,
    node: util.template(name)
  };
  return uid;
};
 
File.prototype.parse = function (code) {
  var self = this;
 
  code = this.parseShebang(code);
 
  return util.parse(this.opts, code, function (tree) {
    self.transform(tree);
    return self.generate();
  });
};
 
File.prototype.transform = function (ast) {
  this.ast = ast;
 
  var self = this;
 
  _.each(transform.transformers, function (transformer) {
    transformer.transform(self);
  });
};
 
File.prototype.generate = function () {
  var opts = this.opts;
  var ast  = this.ast;
 
  var printOpts = {};
 
  if (opts.sourceMap) {
    printOpts.sourceMapName = opts.sourceMapName;
  }
 
  var result = generate(ast, printOpts);
 
  Iif (this.shebang) {
    // add back shebang
    result.code = this.shebang + result.code;
  }
 
  if (opts.sourceMap === "inline") {
    result.code += "\n" + util.sourceMapToComment(result.map);
  }
 
  return result;
};
 
File.prototype.generateUid = function (name) {
  // replace all non-valid identifiers with dashes
  name = name.replace(/[^a-zA-Z0-9]/g, "-");
 
  // remove all dashes and numbers from start of name
  name = name.replace(/^[-0-9]+/, "");
 
  // camel case
  name = name.replace(/[-_\s]+(.)?/g, function (match, c) {
    return c ? c.toUpperCase() : "";
  });
 
  var uids = this.uids;
  var i = uids[name] || 1;
 
  var id = name;
  if (i > 1) id += i;
  uids[name] = i + 1;
  return "_" + id;
};