UNPKG

enzyme-adapter-react-16

Version:

JavaScript Testing utilities for React

1,182 lines (1,015 loc) 112 kB
'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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