all files / src/ Utils.js

83.51% Statements 81/97
58.11% Branches 43/74
92.31% Functions 12/13
90.24% Lines 74/82
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                  934×     934×                                                             27× 27× 27× 23× 23× 23× 23× 21× 21× 17× 14×         14×                                   205×               12× 12× 20×        
/* eslint no-use-before-define:0 */
'use strict';
 
Object.defineProperty(exports, '__esModule', {
  value: true
});
exports.propsOfNode = propsOfNode;
exports.onPrototype = onPrototype;
exports.getNode = getNode;
exports.childrenEqual = childrenEqual;
exports.nodeEqual = nodeEqual;
exports.propFromEvent = propFromEvent;
exports.withSetStateAllowed = withSetStateAllowed;
exports.splitSelector = splitSelector;
exports.isSimpleSelector = isSimpleSelector;
exports.selectorError = selectorError;
exports.AND = AND;
 
var _underscore = require('underscore');
 
var _reactCompat = require('./react-compat');
 
var _version = require('./version');
 
function propsOfNode(node) {
  Iif (_version.REACT013) {
    return node && node._store && node._store.props || {};
  }
  return node && node.props || {};
}
 
function onPrototype(Component, lifecycle, method) {
  var proto = Component.prototype;
  Object.getOwnPropertyNames(proto).forEach(function (name) {
    Iif (typeof proto[name] !== 'function') return;
    switch (name) {
      case 'componentDidMount':
      case 'componentWillMount':
      case 'componentDidUnmount':
      case 'componentWillUnmount':
      case 'componentWillReceiveProps':
      case 'componentDidUpdate':
      case 'componentWillUpdate':
      case 'shouldComponentUpdate':
      case 'render':
        Eif (lifecycle) lifecycle(proto, name);
        break;
      case 'constructor':
        // don't spy on the constructor, even though it shows up in the prototype
        break;
      default:
        Eif (method) method(proto, name);
        break;
    }
  });
}
 
function getNode(node) {
  return (0, _reactCompat.isDOMComponent)(node) ? (0, _reactCompat.findDOMNode)(node) : node;
}
 
function childrenEqual(a, b) {
  Iif (a === b) return true;
  Eif (!Array.isArray(a) && !Array.isArray(b)) {
    return nodeEqual(a, b);
  }
  if (!a && !b) return true;
  if (a.length !== b.length) return false;
  if (a.length === 0 && b.length === 0) return true;
  for (var i = 0; i < a.length; i++) {
    if (!nodeEqual(a[i], b[i])) return false;
  }
  return true;
}
 
function nodeEqual(a, b) {
  Iif (a === b) return true;
  Iif (!a || !b) return false;
  if (a.type !== b.type) return false;
  var left = propsOfNode(a);
  var leftKeys = Object.keys(left);
  var right = propsOfNode(b);
  for (var i = 0; i < leftKeys.length; i++) {
    var prop = leftKeys[i];
    if (!(prop in right)) return false;
    if (prop === 'children') {
      if (!childrenEqual(left.children, right.children)) return false;
    } else if (right[prop] === left[prop]) {
      // continue;
    } else if (typeof right[prop] === typeof left[prop] && typeof left[prop] === 'object') {
        if (!(0, _underscore.isEqual)(left[prop], right[prop])) return false;
      } else {
        return false;
      }
  }
  return leftKeys.length === Object.keys(right).length;
}
 
// 'click' => 'onClick'
// 'mouseEnter' => 'onMouseEnter'
 
function propFromEvent(event) {
  return 'on' + event[0].toUpperCase() + event.substring(1);
}
 
function withSetStateAllowed(fn) {
  // NOTE(lmr):
  // this is currently here to circumvent a React bug where `setState()` is
  // not allowed without global being defined.
  var cleanup = false;
  Eif (typeof global.document === 'undefined') {
    cleanup = true;
    global.document = {};
  }
  fn();
  Eif (cleanup) {
    delete global.document;
  }
}
 
function splitSelector(selector) {
  return selector.split(/(?=\.)/);
}
 
function isSimpleSelector(selector) {
  // any of these characters pretty much guarantee it's a complex selector
  return !/[~\s\[\]:>]/.test(selector);
}
 
function selectorError(selector) {
  return new TypeError('Enzyme received a complex CSS selector (\'' + selector + '\') that it does not currently support');
}
 
var isCompoundSelector = /[a-z]\.[a-z]/i;
 
exports.isCompoundSelector = isCompoundSelector;
 
function AND(fns) {
  return function (x) {
    var i = fns.length;
    while (i--) {
      if (!fns[i](x)) return false;
    }
    return true;
  };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9sZWxhbmRfcmljaGFyZHNvbi9jb2RlL3JlYWdlbnQvc3JjL1V0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkFDd0IsWUFBWTs7MkJBSTdCLGdCQUFnQjs7dUJBQ0UsV0FBVzs7QUFFN0IsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFO0FBQ2hDLHlCQUFjO0FBQ1osV0FBTyxBQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFLLEVBQUUsQ0FBQztHQUN6RDtBQUNELFNBQU8sQUFBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSyxFQUFFLENBQUM7Q0FDbkM7O0FBRU0sU0FBUyxXQUFXLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7QUFDeEQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztBQUNsQyxRQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsSUFBSSxFQUFLO0FBQ2xELFFBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFLE9BQU87QUFDOUMsWUFBUSxJQUFJO0FBQ1osV0FBSyxtQkFBbUIsQ0FBQztBQUN6QixXQUFLLG9CQUFvQixDQUFDO0FBQzFCLFdBQUsscUJBQXFCLENBQUM7QUFDM0IsV0FBSyxzQkFBc0IsQ0FBQztBQUM1QixXQUFLLDJCQUEyQixDQUFDO0FBQ2pDLFdBQUssb0JBQW9CLENBQUM7QUFDMUIsV0FBSyxxQkFBcUIsQ0FBQztBQUMzQixXQUFLLHVCQUF1QixDQUFDO0FBQzdCLFdBQUssUUFBUTtBQUNYLFlBQUksU0FBUyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEMsY0FBTTtBQUFBLEFBQ1IsV0FBSyxhQUFhOztBQUVoQixjQUFNO0FBQUEsQUFDUjtBQUNFLFlB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VUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEtBQUssQ0FBQztLQUM5QjtBQUNELFdBQU8sSUFBSSxDQUFDO0dBQ2IsQ0FBQztDQUNIIiwiZmlsZSI6Ii9Vc2Vycy9sZWxhbmRfcmljaGFyZHNvbi9jb2RlL3JlYWdlbnQvc3JjL1V0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLXVzZS1iZWZvcmUtZGVmaW5lOjAgKi9cbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tICd1bmRlcnNjb3JlJztcbmltcG9ydCB7XG4gIGlzRE9NQ29tcG9uZW50LFxuICBmaW5kRE9NTm9kZSxcbn0gZnJvbSAnLi9yZWFjdC1jb21wYXQnO1xuaW1wb3J0IHsgUkVBQ1QwMTMgfSBmcm9tICcuL3ZlcnNpb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJvcHNPZk5vZGUobm9kZSkge1xuICBpZiAoUkVBQ1QwMTMpIHtcbiAgICByZXR1cm4gKG5vZGUgJiYgbm9kZS5fc3RvcmUgJiYgbm9kZS5fc3RvcmUucHJvcHMpIHx8IHt9O1xuICB9XG4gIHJldHVybiAobm9kZSAmJiBub2RlLnByb3BzKSB8fCB7fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uUHJvdG90eXBlKENvbXBvbmVudCwgbGlmZWN5Y2xlLCBtZXRob2QpIHtcbiAgY29uc3QgcHJvdG8gPSBDb21wb25lbnQucHJvdG90eXBlO1xuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90bykuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgcHJvdG9bbmFtZV0gIT09ICdmdW5jdGlvbicpIHJldHVybjtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlICdjb21wb25lbnREaWRNb3VudCc6XG4gICAgY2FzZSAnY29tcG9uZW50V2lsbE1vdW50JzpcbiAgICBjYXNlICdjb21wb25lbnREaWRVbm1vdW50JzpcbiAgICBjYXNlICdjb21wb25lbnRXaWxsVW5tb3VudCc6XG4gICAgY2FzZSAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc6XG4gICAgY2FzZSAnY29tcG9uZW50RGlkVXBkYXRlJzpcbiAgICBjYXNlICdjb21wb25lbnRXaWxsVXBkYXRlJzpcbiAgICBjYXNlICdzaG91bGRDb21wb25lbnRVcGRhdGUnOlxuICAgIGNhc2UgJ3JlbmRlcic6XG4gICAgICBpZiAobGlmZWN5Y2xlKSBsaWZlY3ljbGUocHJvdG8sIG5hbWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY29uc3RydWN0b3InOlxuICAgICAgLy8gZG9uJ3Qgc3B5IG9uIHRoZSBjb25zdHJ1Y3RvciwgZXZlbiB0aG91Z2ggaXQgc2hvd3MgdXAgaW4gdGhlIHByb3RvdHlwZVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChtZXRob2QpIG1ldGhvZChwcm90bywgbmFtZSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZShub2RlKSB7XG4gIHJldHVybiBpc0RPTUNvbXBvbmVudChub2RlKSA/IGZpbmRET01Ob2RlKG5vZGUpIDogbm9kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaWxkcmVuRXF1YWwoYSwgYikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGlmICghQXJyYXkuaXNBcnJheShhKSAmJiAhQXJyYXkuaXNBcnJheShiKSkge1xuICAgIHJldHVybiBub2RlRXF1YWwoYSwgYik7XG4gIH1cbiAgaWYgKCFhICYmICFiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5sZW5ndGggPT09IDAgJiYgYi5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIW5vZGVFcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9kZUVxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoIWEgfHwgIWIpIHJldHVybiBmYWxzZTtcbiAgaWYgKGEudHlwZSAhPT0gYi50eXBlKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGxlZnQgPSBwcm9wc09mTm9kZShhKTtcbiAgY29uc3QgbGVmdEtleXMgPSBPYmplY3Qua2V5cyhsZWZ0KTtcbiAgY29uc3QgcmlnaHQgPSBwcm9wc09mTm9kZShiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWZ0S2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHByb3AgPSBsZWZ0S2V5c1tpXTtcbiAgICBpZiAoIShwcm9wIGluIHJpZ2h0KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChwcm9wID09PSAnY2hpbGRyZW4nKSB7XG4gICAgICBpZiAoIWNoaWxkcmVuRXF1YWwobGVmdC5jaGlsZHJlbiwgcmlnaHQuY2hpbGRyZW4pKSByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChyaWdodFtwcm9wXSA9PT0gbGVmdFtwcm9wXSkge1xuICAgICAgLy8gY29udGludWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmlnaHRbcHJvcF0gPT09IHR5cGVvZiBsZWZ0W3Byb3BdICYmIHR5cGVvZiBsZWZ0W3Byb3BdID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKCFpc0VxdWFsKGxlZnRbcHJvcF0sIHJpZ2h0W3Byb3BdKSkgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBsZWZ0S2V5cy5sZW5ndGggPT09IE9iamVjdC5rZXlzKHJpZ2h0KS5sZW5ndGg7XG59XG5cbi8vICdjbGljaycgPT4gJ29uQ2xpY2snXG4vLyAnbW91c2VFbnRlcicgPT4gJ29uTW91c2VFbnRlcidcbmV4cG9ydCBmdW5jdGlvbiBwcm9wRnJvbUV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiBgb24ke2V2ZW50WzBdLnRvVXBwZXJDYXNlKCl9JHtldmVudC5zdWJzdHJpbmcoMSl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTZXRTdGF0ZUFsbG93ZWQoZm4pIHtcbiAgLy8gTk9URShsbXIpOlxuICAvLyB0aGlzIGlzIGN1cnJlbnRseSBoZXJlIHRvIGNpcmN1bXZlbnQgYSBSZWFjdCBidWcgd2hlcmUgYHNldFN0YXRlKClgIGlzXG4gIC8vIG5vdCBhbGxvd2VkIHdpdGhvdXQgZ2xvYmFsIGJlaW5nIGRlZmluZWQuXG4gIGxldCBjbGVhbnVwID0gZmFsc2U7XG4gIGlmICh0eXBlb2YgZ2xvYmFsLmRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIGNsZWFudXAgPSB0cnVlO1xuICAgIGdsb2JhbC5kb2N1bWVudCA9IHt9O1xuICB9XG4gIGZuKCk7XG4gIGlmIChjbGVhbnVwKSB7XG4gICAgZGVsZXRlIGdsb2JhbC5kb2N1bWVudDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTZWxlY3RvcihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3Iuc3BsaXQoLyg/PVxcLikvKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2ltcGxlU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgLy8gYW55IG9mIHRoZXNlIGNoYXJhY3RlcnMgcHJldHR5IG11Y2ggZ3VhcmFudGVlIGl0J3MgYSBjb21wbGV4IHNlbGVjdG9yXG4gIHJldHVybiAhL1t+XFxzXFxbXFxdOj5dLy50ZXN0KHNlbGVjdG9yKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdG9yRXJyb3Ioc2VsZWN0b3IpIHtcbiAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoXG4gICAgYFJlYWdlbnQgcmVjZWl2ZWQgYSBjb21wbGV4IENTUyBzZWxlY3RvciAoJyR7c2VsZWN0b3J9JykgdGhhdCBpdCBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGBcbiAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzQ29tcG91bmRTZWxlY3RvciA9IC9bYS16XVxcLlthLXpdL2k7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIEFORChmbnMpIHtcbiAgcmV0dXJuIHggPT4ge1xuICAgIGxldCBpID0gZm5zLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBpZiAoIWZuc1tpXSh4KSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cbiJdfQ==