enzyme-adapter-react-16
Version:
JavaScript Testing utilities for React
1,182 lines (1,015 loc) • 112 kB
JavaScript
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _object = require('object.assign');
var _object2 = _interopRequireDefault(_object);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _server = require('react-dom/server');
var _server2 = _interopRequireDefault(_server);
var _shallow = require('react-test-renderer/shallow');
var _shallow2 = _interopRequireDefault(_shallow);
var _package = require('react-test-renderer/package.json');
var _testUtils = require('react-dom/test-utils');
var _testUtils2 = _interopRequireDefault(_testUtils);
var _semver = require('semver');
var _semver2 = _interopRequireDefault(_semver);
var _checkPropTypes2 = require('prop-types/checkPropTypes');
var _checkPropTypes3 = _interopRequireDefault(_checkPropTypes2);
var _has = require('has');
var _has2 = _interopRequireDefault(_has);
var _reactIs = require('react-is');
var _enzyme = require('enzyme');
var _Utils = require('enzyme/build/Utils');
var _enzymeShallowEqual = require('enzyme-shallow-equal');
var _enzymeShallowEqual2 = _interopRequireDefault(_enzymeShallowEqual);
var _enzymeAdapterUtils = require('enzyme-adapter-utils');
var _findCurrentFiberUsingSlowPath = require('./findCurrentFiberUsingSlowPath');
var _findCurrentFiberUsingSlowPath2 = _interopRequireDefault(_findCurrentFiberUsingSlowPath);
var _detectFiberTags = require('./detectFiberTags');
var _detectFiberTags2 = _interopRequireDefault(_detectFiberTags);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint no-use-before-define: 0 */
// eslint-disable-next-line import/no-unresolved
// eslint-disable-next-line import/no-unresolved
// eslint-disable-next-line import/no-unresolved
var is164 = !!_testUtils2['default'].Simulate.touchStart; // 16.4+
var is165 = !!_testUtils2['default'].Simulate.auxClick; // 16.5+
var is166 = is165 && !_react2['default'].unstable_AsyncMode; // 16.6+
var is168 = is166 && typeof _testUtils2['default'].act === 'function';
var hasShouldComponentUpdateBug = _semver2['default'].satisfies(_package.version, '< 16.8');
// Lazily populated if DOM is available.
var FiberTags = null;
function nodeAndSiblingsArray(nodeWithSibling) {
var array = [];
var node = nodeWithSibling;
while (node != null) {
array.push(node);
node = node.sibling;
}
return array;
}
function flatten(arr) {
var result = [];
var stack = [{ i: 0, array: arr }];
while (stack.length) {
var n = stack.pop();
while (n.i < n.array.length) {
var el = n.array[n.i];
n.i += 1;
if (Array.isArray(el)) {
stack.push(n);
stack.push({ i: 0, array: el });
break;
}
result.push(el);
}
}
return result;
}
function nodeTypeFromType(type) {
if (type === _reactIs.Portal) {
return 'portal';
}
return (0, _enzymeAdapterUtils.nodeTypeFromType)(type);
}
function isMemo(type) {
return (0, _enzymeAdapterUtils.compareNodeTypeOf)(type, _reactIs.Memo);
}
function isLazy(type) {
return (0, _enzymeAdapterUtils.compareNodeTypeOf)(type, _reactIs.Lazy);
}
function unmemoType(type) {
return isMemo(type) ? type.type : type;
}
function elementToTree(el) {
if (!(0, _reactIs.isPortal)(el)) {
return (0, _enzymeAdapterUtils.elementToTree)(el, elementToTree);
}
var children = el.children,
containerInfo = el.containerInfo;
var props = { children: children, containerInfo: containerInfo };
return {
nodeType: 'portal',
type: _reactIs.Portal,
props: props,
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(el.key),
ref: el.ref || null,
instance: null,
rendered: elementToTree(el.children)
};
}
function _toTree(vnode) {
if (vnode == null) {
return null;
}
// TODO(lmr): I'm not really sure I understand whether or not this is what
// i should be doing, or if this is a hack for something i'm doing wrong
// somewhere else. Should talk to sebastian about this perhaps
var node = (0, _findCurrentFiberUsingSlowPath2['default'])(vnode);
switch (node.tag) {
case FiberTags.HostRoot:
return childrenToTree(node.child);
case FiberTags.HostPortal:
{
var containerInfo = node.stateNode.containerInfo,
children = node.memoizedProps;
var props = { containerInfo: containerInfo, children: children };
return {
nodeType: 'portal',
type: _reactIs.Portal,
props: props,
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: null,
rendered: childrenToTree(node.child)
};
}
case FiberTags.ClassComponent:
return {
nodeType: 'class',
type: node.type,
props: (0, _object2['default'])({}, node.memoizedProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: node.stateNode,
rendered: childrenToTree(node.child)
};
case FiberTags.FunctionalComponent:
return {
nodeType: 'function',
type: node.type,
props: (0, _object2['default'])({}, node.memoizedProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: null,
rendered: childrenToTree(node.child)
};
case FiberTags.MemoClass:
return {
nodeType: 'class',
type: node.elementType.type,
props: (0, _object2['default'])({}, node.memoizedProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: node.stateNode,
rendered: childrenToTree(node.child.child)
};
case FiberTags.MemoSFC:
{
var renderedNodes = flatten(nodeAndSiblingsArray(node.child).map(_toTree));
if (renderedNodes.length === 0) {
renderedNodes = [node.memoizedProps.children];
}
return {
nodeType: 'function',
type: node.elementType,
props: (0, _object2['default'])({}, node.memoizedProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: null,
rendered: renderedNodes
};
}
case FiberTags.HostComponent:
{
var _renderedNodes = flatten(nodeAndSiblingsArray(node.child).map(_toTree));
if (_renderedNodes.length === 0) {
_renderedNodes = [node.memoizedProps.children];
}
return {
nodeType: 'host',
type: node.type,
props: (0, _object2['default'])({}, node.memoizedProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: node.stateNode,
rendered: _renderedNodes
};
}
case FiberTags.HostText:
return node.memoizedProps;
case FiberTags.Fragment:
case FiberTags.Mode:
case FiberTags.ContextProvider:
case FiberTags.ContextConsumer:
return childrenToTree(node.child);
case FiberTags.Profiler:
case FiberTags.ForwardRef:
{
return {
nodeType: 'function',
type: node.type,
props: (0, _object2['default'])({}, node.pendingProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: null,
rendered: childrenToTree(node.child)
};
}
case FiberTags.Suspense:
{
return {
nodeType: 'function',
type: _reactIs.Suspense,
props: (0, _object2['default'])({}, node.memoizedProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: null,
rendered: childrenToTree(node.child)
};
}
case FiberTags.Lazy:
return childrenToTree(node.child);
default:
throw new Error('Enzyme Internal Error: unknown node with tag ' + String(node.tag));
}
}
function childrenToTree(node) {
if (!node) {
return null;
}
var children = nodeAndSiblingsArray(node);
if (children.length === 0) {
return null;
}
if (children.length === 1) {
return _toTree(children[0]);
}
return flatten(children.map(_toTree));
}
function _nodeToHostNode(_node) {
// NOTE(lmr): node could be a function component
// which wont have an instance prop, but we can get the
// host node associated with its return value at that point.
// Although this breaks down if the return value is an array,
// as is possible with React 16.
var node = _node;
while (node && !Array.isArray(node) && node.instance === null) {
node = node.rendered;
}
// if the SFC returned null effectively, there is no host node.
if (!node) {
return null;
}
var mapper = function mapper(item) {
if (item && item.instance) return _reactDom2['default'].findDOMNode(item.instance);
return null;
};
if (Array.isArray(node)) {
return node.map(mapper);
}
if (Array.isArray(node.rendered) && node.nodeType === 'class') {
return node.rendered.map(mapper);
}
return mapper(node);
}
function replaceLazyWithFallback(node, fallback) {
if (!node) {
return null;
}
if (Array.isArray(node)) {
return node.map(function (el) {
return replaceLazyWithFallback(el, fallback);
});
}
if (isLazy(node.type)) {
return fallback;
}
return (0, _object2['default'])({}, node, {
props: (0, _object2['default'])({}, node.props, {
children: replaceLazyWithFallback(node.props.children, fallback)
})
});
}
var eventOptions = {
animation: true,
pointerEvents: is164,
auxClick: is165
};
function getEmptyStateValue() {
// this handles a bug in React 16.0 - 16.2
// see https://github.com/facebook/react/commit/39be83565c65f9c522150e52375167568a2a1459
// also see https://github.com/facebook/react/pull/11965
// eslint-disable-next-line react/prefer-stateless-function
var EmptyState = function (_React$Component) {
_inherits(EmptyState, _React$Component);
function EmptyState() {
_classCallCheck(this, EmptyState);
return _possibleConstructorReturn(this, (EmptyState.__proto__ || Object.getPrototypeOf(EmptyState)).apply(this, arguments));
}
_createClass(EmptyState, [{
key: 'render',
value: function () {
function render() {
return null;
}
return render;
}()
}]);
return EmptyState;
}(_react2['default'].Component);
var testRenderer = new _shallow2['default']();
testRenderer.render(_react2['default'].createElement(EmptyState));
return testRenderer._instance.state;
}
function wrapAct(fn) {
if (!is168) {
return fn();
}
var returnVal = void 0;
_testUtils2['default'].act(function () {
returnVal = fn();
});
return returnVal;
}
function getProviderDefaultValue(Provider) {
// React stores references to the Provider's defaultValue differently across versions.
if ('_defaultValue' in Provider._context) {
return Provider._context._defaultValue;
}
if ('_currentValue' in Provider._context) {
return Provider._context._currentValue;
}
throw new Error('Enzyme Internal Error: can’t figure out how to get Provider’s default value');
}
function makeFakeElement(type) {
return { $$typeof: _reactIs.Element, type: type };
}
function isStateful(Component) {
return Component.prototype && (Component.prototype.isReactComponent || Array.isArray(Component.__reactAutoBindPairs) // fallback for createClass components
);
}
var ReactSixteenAdapter = function (_EnzymeAdapter) {
_inherits(ReactSixteenAdapter, _EnzymeAdapter);
function ReactSixteenAdapter() {
_classCallCheck(this, ReactSixteenAdapter);
var _this2 = _possibleConstructorReturn(this, (ReactSixteenAdapter.__proto__ || Object.getPrototypeOf(ReactSixteenAdapter)).call(this));
var lifecycles = _this2.options.lifecycles;
_this2.options = (0, _object2['default'])({}, _this2.options, {
enableComponentDidUpdateOnSetState: true, // TODO: remove, semver-major
legacyContextMode: 'parent',
lifecycles: (0, _object2['default'])({}, lifecycles, {
componentDidUpdate: {
onSetState: true
},
getDerivedStateFromProps: {
hasShouldComponentUpdateBug: hasShouldComponentUpdateBug
},
getSnapshotBeforeUpdate: true,
setState: {
skipsComponentDidUpdateOnNullish: true
},
getChildContext: {
calledByRenderer: false
},
getDerivedStateFromError: is166
})
});
return _this2;
}
_createClass(ReactSixteenAdapter, [{
key: 'createMountRenderer',
value: function () {
function createMountRenderer(options) {
(0, _enzymeAdapterUtils.assertDomAvailable)('mount');
if ((0, _has2['default'])(options, 'suspenseFallback')) {
throw new TypeError('`suspenseFallback` is not supported by the `mount` renderer');
}
if (FiberTags === null) {
// Requires DOM.
FiberTags = (0, _detectFiberTags2['default'])();
}
var attachTo = options.attachTo,
hydrateIn = options.hydrateIn,
wrappingComponentProps = options.wrappingComponentProps;
var domNode = hydrateIn || attachTo || global.document.createElement('div');
var instance = null;
var adapter = this;
return (0, _object2['default'])({
render: function () {
function render(el, context, callback) {
return wrapAct(function () {
if (instance === null) {
var type = el.type,
props = el.props,
ref = el.ref;
var wrapperProps = (0, _object2['default'])({
Component: type,
props: props,
wrappingComponentProps: wrappingComponentProps,
context: context
}, ref && { refProp: ref });
var ReactWrapperComponent = (0, _enzymeAdapterUtils.createMountWrapper)(el, (0, _object2['default'])({}, options, { adapter: adapter }));
var wrappedEl = _react2['default'].createElement(ReactWrapperComponent, wrapperProps);
instance = hydrateIn ? _reactDom2['default'].hydrate(wrappedEl, domNode) : _reactDom2['default'].render(wrappedEl, domNode);
if (typeof callback === 'function') {
callback();
}
} else {
instance.setChildProps(el.props, context, callback);
}
});
}
return render;
}(),
unmount: function () {
function unmount() {
_reactDom2['default'].unmountComponentAtNode(domNode);
instance = null;
}
return unmount;
}(),
getNode: function () {
function getNode() {
if (!instance) {
return null;
}
return (0, _enzymeAdapterUtils.getNodeFromRootFinder)(adapter.isCustomComponent, _toTree(instance._reactInternalFiber), options);
}
return getNode;
}(),
simulateError: function () {
function simulateError(nodeHierarchy, rootNode, error) {
var isErrorBoundary = function () {
function isErrorBoundary(_ref) {
var elInstance = _ref.instance,
type = _ref.type;
if (is166 && type && type.getDerivedStateFromError) {
return true;
}
return elInstance && elInstance.componentDidCatch;
}
return isErrorBoundary;
}();
var _ref2 = nodeHierarchy.find(isErrorBoundary) || {},
catchingInstance = _ref2.instance,
catchingType = _ref2.type;
(0, _enzymeAdapterUtils.simulateError)(error, catchingInstance, rootNode, nodeHierarchy, nodeTypeFromType, adapter.displayNameOfNode, is166 ? catchingType : undefined);
}
return simulateError;
}(),
simulateEvent: function () {
function simulateEvent(node, event, mock) {
var mappedEvent = (0, _enzymeAdapterUtils.mapNativeEventNames)(event, eventOptions);
var eventFn = _testUtils2['default'].Simulate[mappedEvent];
if (!eventFn) {
throw new TypeError('ReactWrapper::simulate() event \'' + String(event) + '\' does not exist');
}
wrapAct(function () {
eventFn(adapter.nodeToHostNode(node), mock);
});
}
return simulateEvent;
}(),
batchedUpdates: function () {
function batchedUpdates(fn) {
return fn();
// return ReactDOM.unstable_batchedUpdates(fn);
}
return batchedUpdates;
}(),
getWrappingComponentRenderer: function () {
function getWrappingComponentRenderer() {
return (0, _object2['default'])({}, this, (0, _enzymeAdapterUtils.getWrappingComponentMountRenderer)({
toTree: function () {
function toTree(inst) {
return _toTree(inst._reactInternalFiber);
}
return toTree;
}(),
getMountWrapperInstance: function () {
function getMountWrapperInstance() {
return instance;
}
return getMountWrapperInstance;
}()
}));
}
return getWrappingComponentRenderer;
}()
}, is168 && { wrapInvoke: wrapAct });
}
return createMountRenderer;
}()
}, {
key: 'createShallowRenderer',
value: function () {
function createShallowRenderer() {
var _this4 = this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var adapter = this;
var renderer = new _shallow2['default']();
var suspenseFallback = options.suspenseFallback;
if (typeof suspenseFallback !== 'undefined' && typeof suspenseFallback !== 'boolean') {
throw TypeError('`options.suspenseFallback` should be boolean or undefined');
}
var isDOM = false;
var cachedNode = null;
var lastComponent = null;
var wrappedComponent = null;
var sentinel = {};
// wrap memo components with a PureComponent, or a class component with sCU
var wrapPureComponent = function () {
function wrapPureComponent(Component, compare) {
if (!is166) {
throw new RangeError('this function should not be called in React < 16.6. Please report this!');
}
if (lastComponent !== Component) {
if (isStateful(Component)) {
wrappedComponent = function (_Component) {
_inherits(wrappedComponent, _Component);
function wrappedComponent() {
_classCallCheck(this, wrappedComponent);
return _possibleConstructorReturn(this, (wrappedComponent.__proto__ || Object.getPrototypeOf(wrappedComponent)).apply(this, arguments));
}
return wrappedComponent;
}(Component); // eslint-disable-line react/prefer-stateless-function
if (compare) {
wrappedComponent.prototype.shouldComponentUpdate = function (nextProps) {
return !compare(_this4.props, nextProps);
};
} else {
wrappedComponent.prototype.isPureReactComponent = true;
}
} else {
var memoized = sentinel;
var prevProps = void 0;
wrappedComponent = function () {
function wrappedComponent(props) {
var shouldUpdate = memoized === sentinel || (compare ? !compare(prevProps, props) : !(0, _enzymeShallowEqual2['default'])(prevProps, props));
if (shouldUpdate) {
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
memoized = Component.apply(undefined, [(0, _object2['default'])({}, Component.defaultProps, props)].concat(args));
prevProps = props;
}
return memoized;
}
return wrappedComponent;
}();
}
(0, _object2['default'])(wrappedComponent, Component, { displayName: adapter.displayNameOfNode({ type: Component }) });
lastComponent = Component;
}
return wrappedComponent;
}
return wrapPureComponent;
}();
// Wrap functional components on versions prior to 16.5,
// to avoid inadvertently pass a `this` instance to it.
var wrapFunctionalComponent = function () {
function wrapFunctionalComponent(Component) {
if (is166 && (0, _has2['default'])(Component, 'defaultProps')) {
if (lastComponent !== Component) {
wrappedComponent = (0, _object2['default'])(
// eslint-disable-next-line new-cap
function (props) {
for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
args[_key2 - 1] = arguments[_key2];
}
return Component.apply(undefined, [(0, _object2['default'])({}, Component.defaultProps, props)].concat(args));
}, Component, { displayName: adapter.displayNameOfNode({ type: Component }) });
lastComponent = Component;
}
return wrappedComponent;
}
if (is165) {
return Component;
}
if (lastComponent !== Component) {
wrappedComponent = (0, _object2['default'])(function () {
return Component.apply(undefined, arguments);
}, // eslint-disable-line new-cap
Component);
lastComponent = Component;
}
return wrappedComponent;
}
return wrapFunctionalComponent;
}();
return {
render: function () {
function render(el, unmaskedContext) {
var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
_ref3$providerValues = _ref3.providerValues,
providerValues = _ref3$providerValues === undefined ? new Map() : _ref3$providerValues;
cachedNode = el;
/* eslint consistent-return: 0 */
if (typeof el.type === 'string') {
isDOM = true;
} else if ((0, _reactIs.isContextProvider)(el)) {
providerValues.set(el.type, el.props.value);
var MockProvider = (0, _object2['default'])(function (props) {
return props.children;
}, el.type);
return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
return renderer.render((0, _object2['default'])({}, el, { type: MockProvider }));
});
} else if ((0, _reactIs.isContextConsumer)(el)) {
var Provider = adapter.getProviderFromConsumer(el.type);
var value = providerValues.has(Provider) ? providerValues.get(Provider) : getProviderDefaultValue(Provider);
var MockConsumer = (0, _object2['default'])(function (props) {
return props.children(value);
}, el.type);
return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
return renderer.render((0, _object2['default'])({}, el, { type: MockConsumer }));
});
} else {
isDOM = false;
var renderedEl = el;
if (isLazy(renderedEl)) {
throw TypeError('`React.lazy` is not supported by shallow rendering.');
}
if ((0, _reactIs.isSuspense)(renderedEl)) {
var children = renderedEl.props.children;
if (suspenseFallback) {
var fallback = renderedEl.props.fallback;
children = replaceLazyWithFallback(children, fallback);
}
var FakeSuspenseWrapper = function () {
function FakeSuspenseWrapper() {
return children;
}
return FakeSuspenseWrapper;
}();
renderedEl = _react2['default'].createElement(FakeSuspenseWrapper, null, children);
}
var _renderedEl = renderedEl,
Component = _renderedEl.type;
var context = (0, _enzymeAdapterUtils.getMaskedContext)(Component.contextTypes, unmaskedContext);
if (isMemo(el.type)) {
var _el$type = el.type,
InnerComp = _el$type.type,
compare = _el$type.compare;
return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
return renderer.render((0, _object2['default'])({}, el, { type: wrapPureComponent(InnerComp, compare) }), context);
});
}
if (!isStateful(Component) && typeof Component === 'function') {
return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
return renderer.render((0, _object2['default'])({}, renderedEl, { type: wrapFunctionalComponent(Component) }), context);
});
}
if (isStateful) {
// fix react bug; see implementation of `getEmptyStateValue`
var emptyStateValue = getEmptyStateValue();
if (emptyStateValue) {
Object.defineProperty(Component.prototype, 'state', {
configurable: true,
enumerable: true,
get: function () {
function get() {
return null;
}
return get;
}(),
set: function () {
function set(value) {
if (value !== emptyStateValue) {
Object.defineProperty(this, 'state', {
configurable: true,
enumerable: true,
value: value,
writable: true
});
}
return true;
}
return set;
}()
});
}
}
return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
return renderer.render(renderedEl, context);
});
}
}
return render;
}(),
unmount: function () {
function unmount() {
renderer.unmount();
}
return unmount;
}(),
getNode: function () {
function getNode() {
if (isDOM) {
return elementToTree(cachedNode);
}
var output = renderer.getRenderOutput();
return {
nodeType: nodeTypeFromType(cachedNode.type),
type: cachedNode.type,
props: cachedNode.props,
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(cachedNode.key),
ref: cachedNode.ref,
instance: renderer._instance,
rendered: Array.isArray(output) ? flatten(output).map(function (el) {
return elementToTree(el);
}) : elementToTree(output)
};
}
return getNode;
}(),
simulateError: function () {
function simulateError(nodeHierarchy, rootNode, error) {
(0, _enzymeAdapterUtils.simulateError)(error, renderer._instance, cachedNode, nodeHierarchy.concat(cachedNode), nodeTypeFromType, adapter.displayNameOfNode, is166 ? cachedNode.type : undefined);
}
return simulateError;
}(),
simulateEvent: function () {
function simulateEvent(node, event) {
for (var _len3 = arguments.length, args = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
args[_key3 - 2] = arguments[_key3];
}
var handler = node.props[(0, _enzymeAdapterUtils.propFromEvent)(event, eventOptions)];
if (handler) {
(0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
// TODO(lmr): create/use synthetic events
// TODO(lmr): emulate React's event propagation
// ReactDOM.unstable_batchedUpdates(() => {
handler.apply(undefined, _toConsumableArray(args));
// });
});
}
}
return simulateEvent;
}(),
batchedUpdates: function () {
function batchedUpdates(fn) {
return fn();
// return ReactDOM.unstable_batchedUpdates(fn);
}
return batchedUpdates;
}(),
checkPropTypes: function () {
function checkPropTypes(typeSpecs, values, location, hierarchy) {
return (0, _checkPropTypes3['default'])(typeSpecs, values, location, (0, _enzymeAdapterUtils.displayNameOfNode)(cachedNode), function () {
return (0, _enzymeAdapterUtils.getComponentStack)(hierarchy.concat([cachedNode]));
});
}
return checkPropTypes;
}()
};
}
return createShallowRenderer;
}()
}, {
key: 'createStringRenderer',
value: function () {
function createStringRenderer(options) {
if ((0, _has2['default'])(options, 'suspenseFallback')) {
throw new TypeError('`suspenseFallback` should not be specified in options of string renderer');
}
return {
render: function () {
function render(el, context) {
if (options.context && (el.type.contextTypes || options.childContextTypes)) {
var childContextTypes = (0, _object2['default'])({}, el.type.contextTypes || {}, options.childContextTypes);
var ContextWrapper = (0, _enzymeAdapterUtils.createRenderWrapper)(el, context, childContextTypes);
return _server2['default'].renderToStaticMarkup(_react2['default'].createElement(ContextWrapper));
}
return _server2['default'].renderToStaticMarkup(el);
}
return render;
}()
};
}
return createStringRenderer;
}()
// Provided a bag of options, return an `EnzymeRenderer`. Some options can be implementation
// specific, like `attach` etc. for React, but not part of this interface explicitly.
// eslint-disable-next-line class-methods-use-this
}, {
key: 'createRenderer',
value: function () {
function createRenderer(options) {
switch (options.mode) {
case _enzyme.EnzymeAdapter.MODES.MOUNT:
return this.createMountRenderer(options);
case _enzyme.EnzymeAdapter.MODES.SHALLOW:
return this.createShallowRenderer(options);
case _enzyme.EnzymeAdapter.MODES.STRING:
return this.createStringRenderer(options);
default:
throw new Error('Enzyme Internal Error: Unrecognized mode: ' + String(options.mode));
}
}
return createRenderer;
}()
}, {
key: 'wrap',
value: function () {
function wrap(element) {
return (0, _enzymeAdapterUtils.wrap)(element);
}
return wrap;
}()
// converts an RSTNode to the corresponding JSX Pragma Element. This will be needed
// in order to implement the `Wrapper.mount()` and `Wrapper.shallow()` methods, but should
// be pretty straightforward for people to implement.
// eslint-disable-next-line class-methods-use-this
}, {
key: 'nodeToElement',
value: function () {
function nodeToElement(node) {
if (!node || (typeof node === 'undefined' ? 'undefined' : _typeof(node)) !== 'object') return null;
var type = node.type;
return _react2['default'].createElement(unmemoType(type), (0, _enzymeAdapterUtils.propsWithKeysAndRef)(node));
}
return nodeToElement;
}()
// eslint-disable-next-line class-methods-use-this
}, {
key: 'matchesElementType',
value: function () {
function matchesElementType(node, matchingType) {
if (!node) {
return node;
}
var type = node.type;
return unmemoType(type) === unmemoType(matchingType);
}
return matchesElementType;
}()
}, {
key: 'elementToNode',
value: function () {
function elementToNode(element) {
return elementToTree(element);
}
return elementToNode;
}()
}, {
key: 'nodeToHostNode',
value: function () {
function nodeToHostNode(node) {
var supportsArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var nodes = _nodeToHostNode(node);
if (Array.isArray(nodes) && !supportsArray) {
return nodes[0];
}
return nodes;
}
return nodeToHostNode;
}()
}, {
key: 'displayNameOfNode',
value: function () {
function displayNameOfNode(node) {
if (!node) return null;
var type = node.type,
$$typeof = node.$$typeof;
var nodeType = type || $$typeof;
// newer node types may be undefined, so only test if the nodeType exists
if (nodeType) {
switch (nodeType) {
case (is166 ? _reactIs.ConcurrentMode : _reactIs.AsyncMode) || NaN:
return is166 ? 'ConcurrentMode' : 'AsyncMode';
case _reactIs.Fragment || NaN:
return 'Fragment';
case _reactIs.StrictMode || NaN:
return 'StrictMode';
case _reactIs.Profiler || NaN:
return 'Profiler';
case _reactIs.Portal || NaN:
return 'Portal';
case _reactIs.Suspense || NaN:
return 'Suspense';
default:
}
}
var $$typeofType = type && type.$$typeof;
switch ($$typeofType) {
case _reactIs.ContextConsumer || NaN:
return 'ContextConsumer';
case _reactIs.ContextProvider || NaN:
return 'ContextProvider';
case _reactIs.Memo || NaN:
{
var nodeName = (0, _enzymeAdapterUtils.displayNameOfNode)(node);
return typeof nodeName === 'string' ? nodeName : 'Memo(' + String((0, _enzymeAdapterUtils.displayNameOfNode)(type)) + ')';
}
case _reactIs.ForwardRef || NaN:
{
if (type.displayName) {
return type.displayName;
}
var name = (0, _enzymeAdapterUtils.displayNameOfNode)({ type: type.render });
return name ? 'ForwardRef(' + String(name) + ')' : 'ForwardRef';
}
case _reactIs.Lazy || NaN:
{
return 'lazy';
}
default:
return (0, _enzymeAdapterUtils.displayNameOfNode)(node);
}
}
return displayNameOfNode;
}()
}, {
key: 'isValidElement',
value: function () {
function isValidElement(element) {
return (0, _reactIs.isElement)(element);
}
return isValidElement;
}()
}, {
key: 'isValidElementType',
value: function () {
function isValidElementType(object) {
return !!object && (0, _reactIs.isValidElementType)(object);
}
return isValidElementType;
}()
}, {
key: 'isFragment',
value: function () {
function isFragment(fragment) {
return (0, _Utils.typeOfNode)(fragment) === _reactIs.Fragment;
}
return isFragment;
}()
}, {
key: 'isCustomComponent',
value: function () {
function isCustomComponent(type) {
var fakeElement = makeFakeElement(type);
return !!type && (typeof type === 'function' || (0, _reactIs.isForwardRef)(fakeElement) || (0, _reactIs.isContextProvider)(fakeElement) || (0, _reactIs.isContextConsumer)(fakeElement) || (0, _reactIs.isSuspense)(fakeElement));
}
return isCustomComponent;
}()
}, {
key: 'isContextConsumer',
value: function () {
function isContextConsumer(type) {
return !!type && (0, _reactIs.isContextConsumer)(makeFakeElement(type));
}
return isContextConsumer;
}()
}, {
key: 'isCustomComponentElement',
value: function () {
function isCustomComponentElement(inst) {
if (!inst || !this.isValidElement(inst)) {
return false;
}
return this.isCustomComponent(inst.type);
}
return isCustomComponentElement;
}()
}, {
key: 'getProviderFromConsumer',
value: function () {
function getProviderFromConsumer(Consumer) {
// React stores references to the Provider on a Consumer differently across versions.
if (Consumer) {
var Provider = void 0;
if (Consumer._context) {
Provider = Consumer._context.Provider; // check this first, to avoid a deprecation warning
} else if (Consumer.Provider) {
Provider = Consumer.Provider;
}
if (Provider) {
return Provider;
}
}
throw new Error('Enzyme Internal Error: can’t figure out how to get Provider from Consumer');
}
return getProviderFromConsumer;
}()
}, {
key: 'createElement',
value: function () {
function createElement() {
return _react2['default'].createElement.apply(_react2['default'], arguments);
}
return createElement;
}()
}, {
key: 'wrapWithWrappingComponent',
value: function () {
function wrapWithWrappingComponent(node, options) {
return {
RootFinder: _enzymeAdapterUtils.RootFinder,
node: (0, _enzymeAdapterUtils.wrapWithWrappingComponent)(_react2['default'].createElement, node, options)
};
}
return wrapWithWrappingComponent;
}()
}]);
return ReactSixteenAdapter;
}(_enzyme.EnzymeAdapter);
module.exports = ReactSixteenAdapter;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9SZWFjdFNpeHRlZW5BZGFwdGVyLmpzIl0sIm5hbWVzIjpbImlzMTY0IiwiVGVzdFV0aWxzIiwiU2ltdWxhdGUiLCJ0b3VjaFN0YXJ0IiwiaXMxNjUiLCJhdXhDbGljayIsImlzMTY2IiwiUmVhY3QiLCJ1bnN0YWJsZV9Bc3luY01vZGUiLCJpczE2OCIsImFjdCIsImhhc1Nob3VsZENvbXBvbmVudFVwZGF0ZUJ1ZyIsInNlbXZlciIsInNhdGlzZmllcyIsInRlc3RSZW5kZXJlclZlcnNpb24iLCJGaWJlclRhZ3MiLCJub2RlQW5kU2libGluZ3NBcnJheSIsIm5vZGVXaXRoU2libGluZyIsImFycmF5Iiwibm9kZSIsInB1c2giLCJzaWJsaW5nIiwiZmxhdHRlbiIsImFyciIsInJlc3VsdCIsInN0YWNrIiwiaSIsImxlbmd0aCIsIm4iLCJwb3AiLCJlbCIsIkFycmF5IiwiaXNBcnJheSIsIm5vZGVUeXBlRnJvbVR5cGUiLCJ0eXBlIiwiUG9ydGFsIiwiaXNNZW1vIiwiTWVtbyIsImlzTGF6eSIsIkxhenkiLCJ1bm1lbW9UeXBlIiwiZWxlbWVudFRvVHJlZSIsImNoaWxkcmVuIiwiY29udGFpbmVySW5mbyIsInByb3BzIiwibm9kZVR5cGUiLCJrZXkiLCJyZWYiLCJpbnN0YW5jZSIsInJlbmRlcmVkIiwidG9UcmVlIiwidm5vZGUiLCJ0YWciLCJIb3N0Um9vdCIsImNoaWxkcmVuVG9UcmVlIiwiY2hpbGQiLCJIb3N0UG9ydGFsIiwic3RhdGVOb2RlIiwibWVtb2l6ZWRQcm9wcyIsIkNsYXNzQ29tcG9uZW50IiwiRnVuY3Rpb25hbENvbXBvbmVudCIsIk1lbW9DbGFzcyIsImVsZW1lbnRUeXBlIiwiTWVtb1NGQyIsInJlbmRlcmVkTm9kZXMiLCJtYXAiLCJIb3N0Q29tcG9uZW50IiwiSG9zdFRleHQiLCJGcmFnbWVudCIsIk1vZGUiLCJDb250ZXh0UHJvdmlkZXIiLCJDb250ZXh0Q29uc3VtZXIiLCJQcm9maWxlciIsIkZvcndhcmRSZWYiLCJwZW5kaW5nUHJvcHMiLCJTdXNwZW5zZSIsIkVycm9yIiwibm9kZVRvSG9zdE5vZGUiLCJfbm9kZSIsIm1hcHBlciIsIml0ZW0iLCJSZWFjdERPTSIsImZpbmRET01Ob2RlIiwicmVwbGFjZUxhenlXaXRoRmFsbGJhY2siLCJmYWxsYmFjayIsImV2ZW50T3B0aW9ucyIsImFuaW1hdGlvbiIsInBvaW50ZXJFdmVudHMiLCJnZXRFbXB0eVN0YXRlVmFsdWUiLCJFbXB0eVN0YXRlIiwiQ29tcG9uZW50IiwidGVzdFJlbmRlcmVyIiwiU2hhbGxvd1JlbmRlcmVyIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIl9pbnN0YW5jZSIsInN0YXRlIiwid3JhcEFjdCIsImZuIiwicmV0dXJuVmFsIiwiZ2V0UHJvdmlkZXJEZWZhdWx0VmFsdWUiLCJQcm92aWRlciIsIl9jb250ZXh0IiwiX2RlZmF1bHRWYWx1ZSIsIl9jdXJyZW50VmFsdWUiLCJtYWtlRmFrZUVsZW1lbnQiLCIkJHR5cGVvZiIsIkVsZW1lbnQiLCJpc1N0YXRlZnVsIiwicHJvdG90eXBlIiwiaXNSZWFjdENvbXBvbmVudCIsIl9fcmVhY3RBdXRvQmluZFBhaXJzIiwiUmVhY3RTaXh0ZWVuQWRhcHRlciIsImxpZmVjeWNsZXMiLCJvcHRpb25zIiwiZW5hYmxlQ29tcG9uZW50RGlkVXBkYXRlT25TZXRTdGF0ZSIsImxlZ2FjeUNvbnRleHRNb2RlIiwiY29tcG9uZW50RGlkVXBkYXRlIiwib25TZXRTdGF0ZSIsImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyIsImdldFNuYXBzaG90QmVmb3JlVXBkYXRlIiwic2V0U3RhdGUiLCJza2lwc0NvbXBvbmVudERpZFVwZGF0ZU9uTnVsbGlzaCIsImdldENoaWxkQ29udGV4dCIsImNhbGxlZEJ5UmVuZGVyZXIiLCJnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IiLCJUeXBlRXJyb3IiLCJhdHRhY2hUbyIsImh5ZHJhdGVJbiIsIndyYXBwaW5nQ29tcG9uZW50UHJvcHMiLCJkb21Ob2RlIiwiZ2xvYmFsIiwiZG9jdW1lbnQiLCJhZGFwdGVyIiwiY29udGV4dCIsImNhbGxiYWNrIiwid3JhcHBlclByb3BzIiwicmVmUHJvcCIsIlJlYWN0V3JhcHBlckNvbXBvbmVudCIsIndyYXBwZWRFbCIsImh5ZHJhdGUiLCJzZXRDaGlsZFByb3BzIiwidW5tb3VudCIsInVubW91bnRDb21wb25lbnRBdE5vZGUiLCJnZXROb2RlIiwiaXNDdXN0b21Db21wb25lbnQiLCJfcmVhY3RJbnRlcm5hbEZpYmVyIiwic2ltdWxhdGVFcnJvciIsIm5vZGVIaWVyYXJjaHkiLCJyb290Tm9kZSIsImVycm9yIiwiaXNFcnJvckJvdW5kYXJ5IiwiZWxJbnN0YW5jZSIsImNvbXBvbmVudERpZENhdGNoIiwiZmluZCIsImNhdGNoaW5nSW5zdGFuY2UiLCJjYXRjaGluZ1R5cGUiLCJkaXNwbGF5TmFtZU9mTm9kZSIsInVuZGVmaW5lZCIsInNpbXVsYXRlRXZlbnQiLCJldmVudCIsIm1vY2siLCJtYXBwZWRFdmVudCIsImV2ZW50Rm4iLCJiYXRjaGVkVXBkYXRlcyIsImdldFdyYXBwaW5nQ29tcG9uZW50UmVuZGVyZXIiLCJpbnN0IiwiZ2V0TW91bnRXcmFwcGVySW5zdGFuY2UiLCJ3cmFwSW52b2tlIiwicmVuZGVyZXIiLCJzdXNwZW5zZUZhbGxiYWNrIiwiaXNET00iLCJjYWNoZWROb2RlIiwibGFzdENvbXBvbmVudCIsIndyYXBwZWRDb21wb25lbnQiLCJzZW50aW5lbCIsIndyYXBQdXJlQ29tcG9uZW50IiwiY29tcGFyZSIsIlJhbmdlRXJyb3IiLCJzaG91bGRDb21wb25lbnRVcGRhdGUiLCJuZXh0UHJvcHMiLCJpc1B1cmVSZWFjdENvbXBvbmVudCIsIm1lbW9pemVkIiwicHJldlByb3BzIiwic2hvdWxkVXBkYXRlIiwiYXJncyIsImRlZmF1bHRQcm9wcyIsImRpc3BsYXlOYW1lIiwid3JhcEZ1bmN0aW9uYWxDb21wb25lbnQiLCJ1bm1hc2tlZENvbnRleHQiLCJwcm92aWRlclZhbHVlcyIsIk1hcCIsInNldCIsInZhbHVlIiwiTW9ja1Byb3ZpZGVyIiwiZ2V0UHJvdmlkZXJGcm9tQ29uc3VtZXIiLCJoYXMiLCJnZXQiLCJNb2NrQ29uc3VtZXIiLCJyZW5kZXJlZEVsIiwiRmFrZVN1c3BlbnNlV3JhcHBlciIsImNvbnRleHRUeXBlcyIsIklubmVyQ29tcCIsImVtcHR5U3RhdGVWYWx1ZSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwib3V0cHV0IiwiZ2V0UmVuZGVyT3V0cHV0IiwiY29uY2F0IiwiaGFuZGxlciIsImNoZWNrUHJvcFR5cGVzIiwidHlwZVNwZWNzIiwidmFsdWVzIiwibG9jYXRpb24iLCJoaWVyYXJjaHkiLCJjaGlsZENvbnRleHRUeXBlcyIsIkNvbnRleHRXcmFwcGVyIiwiUmVhY3RET01TZXJ2ZXIiLCJyZW5kZXJUb1N0YXRpY01hcmt1cCIsIm1vZGUiLCJFbnp5bWVBZGFwdGVyIiwiTU9ERVMiLCJNT1VOVCIsImNyZWF0ZU1vdW50UmVuZGVyZXIiLCJTSEFMTE9XIiwiY3JlYXRlU2hhbGxvd1JlbmRlcmVyIiwiU1RSSU5HIiwiY3JlYXRlU3RyaW5nUmVuZGVyZXIiLCJlbGVtZW50IiwibWF0Y2hpbmdUeXBlIiwic3VwcG9ydHNBcnJheSIsIm5vZGVzIiwiQ29uY3VycmVudE1vZGUiLCJBc3luY01vZGUiLCJOYU4iLCJTdHJpY3RNb2RlIiwiJCR0eXBlb2ZUeXBlIiwibm9kZU5hbWUiLCJuYW1lIiwib2JqZWN0IiwiZnJhZ21lbnQiLCJmYWtlRWxlbWVudCIsImlzVmFsaWRFbGVtZW50IiwiQ29uc3VtZXIiLCJSb290RmluZGVyIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUVBOzs7O0FBQ0E7O0FBRUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFzQkE7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7QUFzQkE7Ozs7QUFDQTs7Ozs7Ozs7Ozs7OytlQTdEQTs7QUFHQTs7QUFF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