Code coverage report for 6to5/transformation/transformers/constants.js

Statements: 100% (27 / 27)      Branches: 100% (15 / 15)      Functions: 100% (8 / 8)      Lines: 100% (25 / 25)      Ignored: none     

All files » 6to5/transformation/transformers/ » constants.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 501 1 1   1         458   458 99 81 6         458 94     458 1033 17 17 22 22     17     17 17       458   14 341   307 77        
var traverse = require("../../traverse");
var t        = require("../../types");
var _        = require("lodash");
 
exports.Program =
exports.BlockStatement =
exports.ForInStatement =
exports.ForOfStatement =
exports.ForStatement = function (node, parent, file) {
  var constants = [];
 
  var check = function (node, names) {
    _.each(names, function (name) {
      if (constants.indexOf(name) >= 0) {
        throw file.errorWithNode(node, name + " is read-only");
      }
    });
  };
 
  var getIds = function (node) {
    return t.getIds(node, false, ["MemberExpression"]);
  };
 
  _.each(node.body, function (child) {
    if (child && t.isVariableDeclaration(child, { kind: "const" })) {
      _.each(child.declarations, function (declar) {
        _.each(getIds(declar), function (name) {
          check(declar, [name]);
          constants.push(name);
        });
 
        declar._ignoreConstant = true;
      });
 
      child._ignoreConstant = true;
      child.kind = "let";
    }
  });
 
  if (!constants.length) return;
 
  traverse(node, function (child) {
    if (child._ignoreConstant) return;
 
    if (t.isVariableDeclarator(child) || t.isDeclaration(child) || t.isAssignmentExpression(child)) {
      check(child, getIds(child));
    }
  });
};