all files / src/ ShallowTraversal.js

87.5% Statements 77/88
74.55% Branches 41/55
88.89% Functions 16/18
89.02% Lines 73/82
1 branch Ignored     
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 146 147                    438× 437× 437× 437× 365×   437×     414× 414×     361× 361× 268×       87× 87× 344× 192×     87×       38× 38×   38×   29×   29×     29×                       21× 21× 21×       102×     10×       97×     97×   95×   89× 335×               21×               19×       19×     10×        
'use strict';
 
Object.defineProperty(exports, '__esModule', {
  value: true
});
exports.childrenOfNode = childrenOfNode;
exports.hasClassName = hasClassName;
exports.treeForEach = treeForEach;
exports.treeFilter = treeFilter;
exports.pathToNode = pathToNode;
exports.parentsOfNode = parentsOfNode;
exports.nodeHasId = nodeHasId;
exports.nodeHasType = nodeHasType;
exports.buildPredicate = buildPredicate;
exports.getTextFromNode = getTextFromNode;
// istanbul ignore next
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 
var _react = require('react');
 
var _react2 = _interopRequireDefault(_react);
 
var _Utils = require('./Utils');
 
function childrenOfNode(node) {
  if (!node) return [];
  var maybeArray = (0, _Utils.propsOfNode)(node).children;
  var result = [];
  _react2['default'].Children.forEach(maybeArray, function (child) {
    return result.push(child);
  });
  return result;
}
 
function hasClassName(node, className) {
  var classes = (0, _Utils.propsOfNode)(node).className || '';
  return (' ' + classes + ' ').indexOf(' ' + className + ' ') > -1;
}
 
function treeForEach(tree, fn) {
  fn(tree);
  childrenOfNode(tree).forEach(function (node) {
    return treeForEach(node, fn);
  });
}
 
function treeFilter(tree, fn) {
  var results = [];
  treeForEach(tree, function (node) {
    if (fn(node)) {
      results.push(node);
    }
  });
  return results;
}
 
function pathToNode(node, root) {
  var queue = [root];
  var path = [];
 
  while (queue.length) {
    var current = queue.pop();
    var children = childrenOfNode(current);
 
    if (current === node) return path;
 
    path.push(current);
 
    if (children.length === 0) {
      // leaf node. if it isn't the node we are looking for, we pop.
      path.pop();
    }
    queue.push.apply(queue, children);
  }
 
  return null;
}
 
function parentsOfNode(node, root) {
  return pathToNode(node, root).reverse();
}
 
function nodeHasId(node, id) {
  var maybeId = node && node._store && node._store.props && node._store.props.id;
  return maybeId === id;
}
 
function nodeHasType(node, type) {
  Iif (!type || !node) return false;
  Iif (!node.type) return false;
  Eif (typeof node.type === 'string') return node.type === type;
  return node.type.name === type || node.type.displayName === type;
}
 
function buildPredicate(selector) {
  switch (typeof selector) {
    case 'function':
      // selector is a component constructor
      return function (node) {
        return node && node.type === selector;
      };
 
    case 'string':
      Iif (!(0, _Utils.isSimpleSelector)(selector)) {
        throw (0, _Utils.selectorError)(selector);
      }
      if (_Utils.isCompoundSelector.test(selector)) {
        return (0, _Utils.AND)((0, _Utils.splitSelector)(selector).map(buildPredicate));
      }
      if (selector[0] === '.') {
        // selector is a class name
        return function (node) {
          return hasClassName(node, selector.substr(1));
        };
      } else Iif (selector[0] === '#') {
        // selector is an id name
        return function (node) {
          return nodeHasId(node, selector.substr(1));
        };
      }
      // selector is a string. match to DOM tag or constructor displayName
      return function (node) {
        return nodeHasType(node, selector);
      };
 
    default:
      throw new TypeError('Expecting a string or Component Constructor');
  }
}
 
function getTextFromNode(node) {
  Iif (node === null || node === undefined) {
    return '';
  }
 
  if (typeof node === 'string' || typeof node === 'number') {
    return '' + node;
  }
 
  if (node.type && typeof node.type === 'function') {
    return '<' + (node.type.name || node.type.displayName) + ' />';
  }
 
  return childrenOfNode(node).map(getTextFromNode).join('').replace(/\s+/, ' ');
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9sZWxhbmRfcmljaGFyZHNvbi9jb2RlL3JlYWdlbnQvc3JjL1NoYWxsb3dUcmF2ZXJzYWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztxQkFBa0IsT0FBTzs7OztxQkFRbEIsU0FBUzs7QUFFVCxTQUFTLGNBQWMsQ0FBQyxJQUFJLEVBQUU7QUFDbkMsTUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUNyQixNQUFNLFVBQVUsR0FBRyx3QkFBWSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDOUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLHFCQUFNLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLFVBQUEsS0FBSztXQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0dBQUEsQ0FBQyxDQUFDO0FBQ2hFLFNBQU8sTUFBTSxDQUFDO0NBQ2Y7O0FBRU0sU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUM1QyxNQUFNLE9BQU8sR0FBRyx3QkFBWSxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO0FBQ2xELFNBQU8sQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQSxDQUFFLE9BQU8sQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ2xFOztBQUVNLFNBQVMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDcEMsSUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ1QsZ0JBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJO1dBQUksV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7R0FBQSxDQUFDLENBQUM7Q0FDN0Q7O0FBRU0sU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUNuQyxNQUFNLE9BQU8sR0FB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RCxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTs7QUFFOUIsZUFBTyxVQUFBLElBQUk7aUJBQUksU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQUEsQ0FBQztPQUNwRDs7QUFFRCxhQUFPLFVBQUEsSUFBSTtlQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDO09BQUEsQ0FBQzs7QUFBQSxBQUU3QztBQUNFLFlBQU0sSUFBSSxTQUFTLENBQUMsNkNBQTZDLENBQUMsQ0FBQztBQUFBLEdBQ3BFO0NBQ0Y7O0FBRU0sU0FBUyxlQUFlLENBQUMsSUFBSSxFQUFFO0FBQ3BDLE1BQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO0FBQ3ZDLFdBQU8sRUFBRSxDQUFDO0dBQ1g7O0FBRUQsTUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO0FBQ3hELFdBQU8sRUFBRSxHQUFHLElBQUksQ0FBQztHQUNsQjs7QUFFRCxNQUFJLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtBQUNoRCxrQkFBVyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQSxTQUFNO0dBQ3pEOztBQUVELFNBQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztDQUMvRSIsImZpbGUiOiIvVXNlcnMvbGVsYW5kX3JpY2hhcmRzb24vY29kZS9yZWFnZW50L3NyYy9TaGFsbG93VHJhdmVyc2FsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7XG4gIHByb3BzT2ZOb2RlLFxuICBpc1NpbXBsZVNlbGVjdG9yLFxuICBzcGxpdFNlbGVjdG9yLFxuICBzZWxlY3RvckVycm9yLFxuICBpc0NvbXBvdW5kU2VsZWN0b3IsXG4gIEFORCxcbn0gZnJvbSAnLi9VdGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZHJlbk9mTm9kZShub2RlKSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIFtdO1xuICBjb25zdCBtYXliZUFycmF5ID0gcHJvcHNPZk5vZGUobm9kZSkuY2hpbGRyZW47XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKG1heWJlQXJyYXksIGNoaWxkID0+IHJlc3VsdC5wdXNoKGNoaWxkKSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNDbGFzc05hbWUobm9kZSwgY2xhc3NOYW1lKSB7XG4gIGNvbnN0IGNsYXNzZXMgPSBwcm9wc09mTm9kZShub2RlKS5jbGFzc05hbWUgfHwgJyc7XG4gIHJldHVybiAoJyAnICsgY2xhc3NlcyArICcgJykuaW5kZXhPZignICcgKyBjbGFzc05hbWUgKyAnICcpID4gLTE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmVlRm9yRWFjaCh0cmVlLCBmbikge1xuICBmbih0cmVlKTtcbiAgY2hpbGRyZW5PZk5vZGUodHJlZSkuZm9yRWFjaChub2RlID0+IHRyZWVGb3JFYWNoKG5vZGUsIGZuKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmVlRmlsdGVyKHRyZWUsIGZuKSB7XG4gIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgdHJlZUZvckVhY2godHJlZSwgbm9kZSA9PiB7XG4gICAgaWYgKGZuKG5vZGUpKSB7XG4gICAgICByZXN1bHRzLnB1c2gobm9kZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoVG9Ob2RlKG5vZGUsIHJvb3QpIHtcbiAgY29uc3QgcXVldWUgPSBbcm9vdF07XG4gIGNvbnN0IHBhdGggPSBbXTtcblxuICB3aGlsZSAocXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHF1ZXVlLnBvcCgpO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5PZk5vZGUoY3VycmVudCk7XG5cbiAgICBpZiAoY3VycmVudCA9PT0gbm9kZSkgcmV0dXJuIHBhdGg7XG5cbiAgICBwYXRoLnB1c2goY3VycmVudCk7XG5cbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBsZWFmIG5vZGUuIGlmIGl0IGlzbid0IHRoZSBub2RlIHdlIGFyZSBsb29raW5nIGZvciwgd2UgcG9wLlxuICAgICAgcGF0aC5wb3AoKTtcbiAgICB9XG4gICAgcXVldWUucHVzaC5hcHBseShxdWV1ZSwgY2hpbGRyZW4pO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJlbnRzT2ZOb2RlKG5vZGUsIHJvb3QpIHtcbiAgcmV0dXJuIHBhdGhUb05vZGUobm9kZSwgcm9vdCkucmV2ZXJzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9kZUhhc0lkKG5vZGUsIGlkKSB7XG4gIGNvbnN0IG1heWJlSWQgPSBub2RlICYmIG5vZGUuX3N0b3JlICYmIG5vZGUuX3N0b3JlLnByb3BzICYmIG5vZGUuX3N0b3JlLnByb3BzLmlkO1xuICByZXR1cm4gbWF5YmVJZCA9PT0gaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub2RlSGFzVHlwZShub2RlLCB0eXBlKSB7XG4gIGlmICghdHlwZSB8fCAhbm9kZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIW5vZGUudHlwZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIG5vZGUudHlwZSA9PT0gJ3N0cmluZycpIHJldHVybiBub2RlLnR5cGUgPT09IHR5cGU7XG4gIHJldHVybiBub2RlLnR5cGUubmFtZSA9PT0gdHlwZSB8fCBub2RlLnR5cGUuZGlzcGxheU5hbWUgPT09IHR5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByZWRpY2F0ZShzZWxlY3Rvcikge1xuICBzd2l0Y2ggKHR5cGVvZiBzZWxlY3Rvcikge1xuICBjYXNlICdmdW5jdGlvbic6XG4gICAgLy8gc2VsZWN0b3IgaXMgYSBjb21wb25lbnQgY29uc3RydWN0b3JcbiAgICByZXR1cm4gbm9kZSA9PiBub2RlICYmIG5vZGUudHlwZSA9PT0gc2VsZWN0b3I7XG5cbiAgY2FzZSAnc3RyaW5nJzpcbiAgICBpZiAoIWlzU2ltcGxlU2VsZWN0b3Ioc2VsZWN0b3IpKSB7XG4gICAgICB0aHJvdyBzZWxlY3RvckVycm9yKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgaWYgKGlzQ29tcG91bmRTZWxlY3Rvci50ZXN0KHNlbGVjdG9yKSkge1xuICAgICAgcmV0dXJuIEFORChzcGxpdFNlbGVjdG9yKHNlbGVjdG9yKS5tYXAoYnVpbGRQcmVkaWNhdGUpKTtcbiAgICB9XG4gICAgaWYgKHNlbGVjdG9yWzBdID09PSAnLicpIHtcbiAgICAgIC8vIHNlbGVjdG9yIGlzIGEgY2xhc3MgbmFtZVxuICAgICAgcmV0dXJuIG5vZGUgPT4gaGFzQ2xhc3NOYW1lKG5vZGUsIHNlbGVjdG9yLnN1YnN0cigxKSk7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RvclswXSA9PT0gJyMnKSB7XG4gICAgICAvLyBzZWxlY3RvciBpcyBhbiBpZCBuYW1lXG4gICAgICByZXR1cm4gbm9kZSA9PiBub2RlSGFzSWQobm9kZSwgc2VsZWN0b3Iuc3Vic3RyKDEpKTtcbiAgICB9XG4gICAgLy8gc2VsZWN0b3IgaXMgYSBzdHJpbmcuIG1hdGNoIHRvIERPTSB0YWcgb3IgY29uc3RydWN0b3IgZGlzcGxheU5hbWVcbiAgICByZXR1cm4gbm9kZSA9PiBub2RlSGFzVHlwZShub2RlLCBzZWxlY3Rvcik7XG5cbiAgZGVmYXVsdDpcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RpbmcgYSBzdHJpbmcgb3IgQ29tcG9uZW50IENvbnN0cnVjdG9yJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHRGcm9tTm9kZShub2RlKSB7XG4gIGlmIChub2RlID09PSBudWxsIHx8IG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5vZGUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuICcnICsgbm9kZTtcbiAgfVxuXG4gIGlmIChub2RlLnR5cGUgJiYgdHlwZW9mIG5vZGUudHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBgPCR7bm9kZS50eXBlLm5hbWUgfHwgbm9kZS50eXBlLmRpc3BsYXlOYW1lfSAvPmA7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW5PZk5vZGUobm9kZSkubWFwKGdldFRleHRGcm9tTm9kZSkuam9pbignJykucmVwbGFjZSgvXFxzKy8sICcgJyk7XG59XG4iXX0=