diff options
Diffstat (limited to 'devtools/client/shared/vendor/react-test-renderer-shallow.js')
-rw-r--r-- | devtools/client/shared/vendor/react-test-renderer-shallow.js | 955 |
1 files changed, 955 insertions, 0 deletions
diff --git a/devtools/client/shared/vendor/react-test-renderer-shallow.js b/devtools/client/shared/vendor/react-test-renderer-shallow.js new file mode 100644 index 0000000000..38db5e125a --- /dev/null +++ b/devtools/client/shared/vendor/react-test-renderer-shallow.js @@ -0,0 +1,955 @@ +/** @license React v16.8.6 + * react-test-renderer-shallow.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require("resource://devtools/client/shared/vendor/react.js")) : + typeof define === 'function' && define.amd ? define(['devtools/client/shared/vendor/react'], factory) : + (global.ReactShallowRenderer = factory(global.React)); +}(this, (function (React) { 'use strict'; + +/** + * Use invariant() to assert state which your program assumes to be true. + * + * Provide sprintf-style format (only %s is supported) and arguments + * to provide information about what broke and what you were + * expecting. + * + * The invariant message will be stripped in production, but the invariant + * will remain to ensure logic does not differ in production. + */ + +function invariant(condition, format, a, b, c, d, e, f) { + if (!condition) { + var error = void 0; + if (format === undefined) { + error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.'); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error(format.replace(/%s/g, function () { + return args[argIndex++]; + })); + error.name = 'Invariant Violation'; + } + + error.framesToPop = 1; // we don't care about invariant's own frame + throw error; + } +} + +// Relying on the `invariant()` implementation lets us +// preserve the format and params in the www builds. +/** + * WARNING: DO NOT manually require this module. + * This is a replacement for `invariant(...)` used by the error code system + * and will _only_ be required by the corresponding babel pass. + * It always throws. + */ +function reactProdInvariant(code) { + var argCount = arguments.length - 1; + var url = 'https://reactjs.org/docs/error-decoder.html?invariant=' + code; + for (var argIdx = 0; argIdx < argCount; argIdx++) { + url += '&args[]=' + encodeURIComponent(arguments[argIdx + 1]); + } + // Rename it so that our build transform doesn't attempt + // to replace this invariant() call with reactProdInvariant(). + var i = invariant; + i(false, + // The error code is intentionally part of the message (and + // not the format argument) so that we could deduplicate + // different errors in logs based on the code. + 'Minified React error #' + code + '; visit %s ' + 'for the full message or use the non-minified dev environment ' + 'for full errors and additional helpful warnings. ', url); +} + +var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + +var _assign = ReactInternals.assign; + +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var hasSymbol = typeof Symbol === 'function' && Symbol.for; + +var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; +var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; +var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; +var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; +var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; +var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; +var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; +var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; +var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; +var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; +var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; +var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; +var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; + +/** + * Forked from fbjs/warning: + * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js + * + * Only change is we use console.warn instead of console.error, + * and do nothing when 'console' is not supported. + * This really simplifies the code. + * --- + * Similar to invariant but only logs a warning if the condition is not met. + * This can be used to log issues in development environments in critical + * paths. Removing the logging code for production environments will keep the + * same logic and follow the same code paths. + */ + +function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + + switch (type) { + case REACT_ASYNC_MODE_TYPE: + case REACT_CONCURRENT_MODE_TYPE: + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + return type; + default: + var $$typeofType = type && type.$$typeof; + + switch ($$typeofType) { + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + default: + return $$typeof; + } + } + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + + return undefined; +} + +// AsyncMode is deprecated along with isAsyncMode + + + + + +var ForwardRef = REACT_FORWARD_REF_TYPE; + + + + + + + + +// AsyncMode should be deprecated + + + + + +function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; +} + + +function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; +} + +var BEFORE_SLASH_RE = /^(.*)[\\\/]/; + +var describeComponentFrame = function (name, source, ownerName) { + var sourceInfo = ''; + if (source) { + var path = source.fileName; + var fileName = path.replace(BEFORE_SLASH_RE, ''); + sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')'; + } else if (ownerName) { + sourceInfo = ' (created by ' + ownerName + ')'; + } + return '\n in ' + (name || 'Unknown') + sourceInfo; +}; + +/** + * Similar to invariant but only logs a warning if the condition is not met. + * This can be used to log issues in development environments in critical + * paths. Removing the logging code for production environments will keep the + * same logic and follow the same code paths. + */ + +var Resolved = 1; + + +function refineResolvedLazyComponent(lazyComponent) { + return lazyComponent._status === Resolved ? lazyComponent._result : null; +} + +function getWrappedName(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ''; + return outerType.displayName || (functionName !== '' ? wrapperName + '(' + functionName + ')' : wrapperName); +} + +function getComponentName(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; + } + if (typeof type === 'function') { + return type.displayName || type.name || null; + } + if (typeof type === 'string') { + return type; + } + switch (type) { + case REACT_CONCURRENT_MODE_TYPE: + return 'ConcurrentMode'; + case REACT_FRAGMENT_TYPE: + return 'Fragment'; + case REACT_PORTAL_TYPE: + return 'Portal'; + case REACT_PROFILER_TYPE: + return 'Profiler'; + case REACT_STRICT_MODE_TYPE: + return 'StrictMode'; + case REACT_SUSPENSE_TYPE: + return 'Suspense'; + } + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + return 'Context.Consumer'; + case REACT_PROVIDER_TYPE: + return 'Context.Provider'; + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); + case REACT_MEMO_TYPE: + return getComponentName(type.type); + case REACT_LAZY_TYPE: + { + var thenable = type; + var resolvedThenable = refineResolvedLazyComponent(thenable); + if (resolvedThenable) { + return getComponentName(resolvedThenable); + } + } + } + } + return null; +} + +/** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ +function is(x, y) { + return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare + ; +} + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +/** + * Performs equality by iterating through keys on an object and returning false + * when any key has values which are not strictly equal between the arguments. + * Returns true when the values of all keys are strictly equal. + */ +function shallowEqual(objA, objB) { + if (is(objA, objB)) { + return true; + } + + if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { + return false; + } + + var keysA = Object.keys(objA); + var keysB = Object.keys(objB); + + if (keysA.length !== keysB.length) { + return false; + } + + // Test for A's keys different from B. + for (var i = 0; i < keysA.length; i++) { + if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) { + return false; + } + } + + return true; +} + +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +/** + * Assert that the values match with the type specs. + * Error messages are memorized and will only be shown once. + * + * @param {object} typeSpecs Map of name to a ReactPropType + * @param {object} values Runtime values that need to be type-checked + * @param {string} location e.g. "prop", "context", "child context" + * @param {string} componentName Name of the component for error messages. + * @param {?Function} getStack Returns the component stack. + * @private + */ +function checkPropTypes(typeSpecs, values, location, componentName, getStack) { + +} + +var checkPropTypes_1 = checkPropTypes; + +var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + +// Prevent newer renderers from RTE when used with older react package versions. +// Current owner and dispatcher used to share the same ref, +// but PR #14548 split them out to better support the react-debug-tools package. +if (!ReactSharedInternals.hasOwnProperty('ReactCurrentDispatcher')) { + ReactSharedInternals.ReactCurrentDispatcher = { + current: null + }; +} + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; + + +var RE_RENDER_LIMIT = 25; + +var emptyObject = {}; +function areHookInputsEqual(nextDeps, prevDeps) { + if (prevDeps === null) { + return false; + } + + // Don't bother comparing lengths in prod because these arrays should be + // passed inline. + if (nextDeps.length !== prevDeps.length) { + + } + for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) { + if (is(nextDeps[i], prevDeps[i])) { + continue; + } + return false; + } + return true; +} + +var Updater = function () { + function Updater(renderer) { + _classCallCheck(this, Updater); + + this._renderer = renderer; + this._callbacks = []; + } + + Updater.prototype._enqueueCallback = function _enqueueCallback(callback, publicInstance) { + if (typeof callback === 'function' && publicInstance) { + this._callbacks.push({ + callback: callback, + publicInstance: publicInstance + }); + } + }; + + Updater.prototype._invokeCallbacks = function _invokeCallbacks() { + var callbacks = this._callbacks; + this._callbacks = []; + + callbacks.forEach(function (_ref) { + var callback = _ref.callback, + publicInstance = _ref.publicInstance; + + callback.call(publicInstance); + }); + }; + + Updater.prototype.isMounted = function isMounted(publicInstance) { + return !!this._renderer._element; + }; + + Updater.prototype.enqueueForceUpdate = function enqueueForceUpdate(publicInstance, callback, callerName) { + this._enqueueCallback(callback, publicInstance); + this._renderer._forcedUpdate = true; + this._renderer.render(this._renderer._element, this._renderer._context); + }; + + Updater.prototype.enqueueReplaceState = function enqueueReplaceState(publicInstance, completeState, callback, callerName) { + this._enqueueCallback(callback, publicInstance); + this._renderer._newState = completeState; + this._renderer.render(this._renderer._element, this._renderer._context); + }; + + Updater.prototype.enqueueSetState = function enqueueSetState(publicInstance, partialState, callback, callerName) { + this._enqueueCallback(callback, publicInstance); + var currentState = this._renderer._newState || publicInstance.state; + + if (typeof partialState === 'function') { + partialState = partialState.call(publicInstance, currentState, publicInstance.props); + } + + // Null and undefined are treated as no-ops. + if (partialState === null || partialState === undefined) { + return; + } + + this._renderer._newState = _assign({}, currentState, partialState); + + this._renderer.render(this._renderer._element, this._renderer._context); + }; + + return Updater; +}(); + +function createHook() { + return { + memoizedState: null, + queue: null, + next: null + }; +} + +function basicStateReducer(state, action) { + return typeof action === 'function' ? action(state) : action; +} + +var ReactShallowRenderer = function () { + function ReactShallowRenderer() { + _classCallCheck(this, ReactShallowRenderer); + + this._reset(); + } + + ReactShallowRenderer.prototype._reset = function _reset() { + this._context = null; + this._element = null; + this._instance = null; + this._newState = null; + this._rendered = null; + this._rendering = false; + this._forcedUpdate = false; + this._updater = new Updater(this); + this._dispatcher = this._createDispatcher(); + this._workInProgressHook = null; + this._firstWorkInProgressHook = null; + this._isReRender = false; + this._didScheduleRenderPhaseUpdate = false; + this._renderPhaseUpdates = null; + this._numberOfReRenders = 0; + }; + + ReactShallowRenderer.prototype._validateCurrentlyRenderingComponent = function _validateCurrentlyRenderingComponent() { + !(this._rendering && !this._instance) ? reactProdInvariant('321') : void 0; + }; + + ReactShallowRenderer.prototype._createDispatcher = function _createDispatcher() { + var _this = this; + + var useReducer = function (reducer, initialArg, init) { + _this._validateCurrentlyRenderingComponent(); + _this._createWorkInProgressHook(); + var workInProgressHook = _this._workInProgressHook; + + if (_this._isReRender) { + // This is a re-render. + var _queue = workInProgressHook.queue; + var _dispatch = _queue.dispatch; + if (_this._numberOfReRenders > 0) { + // Apply the new render phase updates to the previous current hook. + if (_this._renderPhaseUpdates !== null) { + // Render phase updates are stored in a map of queue -> linked list + var firstRenderPhaseUpdate = _this._renderPhaseUpdates.get(_queue); + if (firstRenderPhaseUpdate !== undefined) { + _this._renderPhaseUpdates.delete(_queue); + var _newState = workInProgressHook.memoizedState; + var _update = firstRenderPhaseUpdate; + do { + var _action = _update.action; + _newState = reducer(_newState, _action); + _update = _update.next; + } while (_update !== null); + workInProgressHook.memoizedState = _newState; + return [_newState, _dispatch]; + } + } + return [workInProgressHook.memoizedState, _dispatch]; + } + // Process updates outside of render + var newState = workInProgressHook.memoizedState; + var update = _queue.first; + if (update !== null) { + do { + var _action2 = update.action; + newState = reducer(newState, _action2); + update = update.next; + } while (update !== null); + _queue.first = null; + workInProgressHook.memoizedState = newState; + } + return [newState, _dispatch]; + } else { + var initialState = void 0; + if (reducer === basicStateReducer) { + // Special case for `useState`. + initialState = typeof initialArg === 'function' ? initialArg() : initialArg; + } else { + initialState = init !== undefined ? init(initialArg) : initialArg; + } + workInProgressHook.memoizedState = initialState; + var _queue2 = workInProgressHook.queue = { + first: null, + dispatch: null + }; + var _dispatch2 = _queue2.dispatch = _this._dispatchAction.bind(_this, _queue2); + return [workInProgressHook.memoizedState, _dispatch2]; + } + }; + + var useState = function (initialState) { + return useReducer(basicStateReducer, + // useReducer has a special case to support lazy useState initializers + initialState); + }; + + var useMemo = function (nextCreate, deps) { + _this._validateCurrentlyRenderingComponent(); + _this._createWorkInProgressHook(); + + var nextDeps = deps !== undefined ? deps : null; + + if (_this._workInProgressHook !== null && _this._workInProgressHook.memoizedState !== null) { + var prevState = _this._workInProgressHook.memoizedState; + var prevDeps = prevState[1]; + if (nextDeps !== null) { + if (areHookInputsEqual(nextDeps, prevDeps)) { + return prevState[0]; + } + } + } + + var nextValue = nextCreate(); + _this._workInProgressHook.memoizedState = [nextValue, nextDeps]; + return nextValue; + }; + + var useRef = function (initialValue) { + _this._validateCurrentlyRenderingComponent(); + _this._createWorkInProgressHook(); + var previousRef = _this._workInProgressHook.memoizedState; + if (previousRef === null) { + var ref = { current: initialValue }; + _this._workInProgressHook.memoizedState = ref; + return ref; + } else { + return previousRef; + } + }; + + var readContext = function (context, observedBits) { + return context._currentValue; + }; + + var noOp = function () { + _this._validateCurrentlyRenderingComponent(); + }; + + var identity = function (fn) { + return fn; + }; + + return { + readContext: readContext, + useCallback: identity, + useContext: function (context) { + _this._validateCurrentlyRenderingComponent(); + return readContext(context); + }, + useDebugValue: noOp, + useEffect: noOp, + useImperativeHandle: noOp, + useLayoutEffect: noOp, + useMemo: useMemo, + useReducer: useReducer, + useRef: useRef, + useState: useState + }; + }; + + ReactShallowRenderer.prototype._dispatchAction = function _dispatchAction(queue, action) { + !(this._numberOfReRenders < RE_RENDER_LIMIT) ? reactProdInvariant('301') : void 0; + + if (this._rendering) { + // This is a render phase update. Stash it in a lazily-created map of + // queue -> linked list of updates. After this render pass, we'll restart + // and apply the stashed updates on top of the work-in-progress hook. + this._didScheduleRenderPhaseUpdate = true; + var update = { + action: action, + next: null + }; + var renderPhaseUpdates = this._renderPhaseUpdates; + if (renderPhaseUpdates === null) { + this._renderPhaseUpdates = renderPhaseUpdates = new Map(); + } + var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue); + if (firstRenderPhaseUpdate === undefined) { + renderPhaseUpdates.set(queue, update); + } else { + // Append the update to the end of the list. + var lastRenderPhaseUpdate = firstRenderPhaseUpdate; + while (lastRenderPhaseUpdate.next !== null) { + lastRenderPhaseUpdate = lastRenderPhaseUpdate.next; + } + lastRenderPhaseUpdate.next = update; + } + } else { + var _update2 = { + action: action, + next: null + }; + + // Append the update to the end of the list. + var last = queue.first; + if (last === null) { + queue.first = _update2; + } else { + while (last.next !== null) { + last = last.next; + } + last.next = _update2; + } + + // Re-render now. + this.render(this._element, this._context); + } + }; + + ReactShallowRenderer.prototype._createWorkInProgressHook = function _createWorkInProgressHook() { + if (this._workInProgressHook === null) { + // This is the first hook in the list + if (this._firstWorkInProgressHook === null) { + this._isReRender = false; + this._firstWorkInProgressHook = this._workInProgressHook = createHook(); + } else { + // There's already a work-in-progress. Reuse it. + this._isReRender = true; + this._workInProgressHook = this._firstWorkInProgressHook; + } + } else { + if (this._workInProgressHook.next === null) { + this._isReRender = false; + // Append to the end of the list + this._workInProgressHook = this._workInProgressHook.next = createHook(); + } else { + // There's already a work-in-progress. Reuse it. + this._isReRender = true; + this._workInProgressHook = this._workInProgressHook.next; + } + } + return this._workInProgressHook; + }; + + ReactShallowRenderer.prototype._finishHooks = function _finishHooks(element, context) { + if (this._didScheduleRenderPhaseUpdate) { + // Updates were scheduled during the render phase. They are stored in + // the `renderPhaseUpdates` map. Call the component again, reusing the + // work-in-progress hooks and applying the additional updates on top. Keep + // restarting until no more updates are scheduled. + this._didScheduleRenderPhaseUpdate = false; + this._numberOfReRenders += 1; + + // Start over from the beginning of the list + this._workInProgressHook = null; + this._rendering = false; + this.render(element, context); + } else { + this._workInProgressHook = null; + this._renderPhaseUpdates = null; + this._numberOfReRenders = 0; + } + }; + + ReactShallowRenderer.prototype.getMountedInstance = function getMountedInstance() { + return this._instance; + }; + + ReactShallowRenderer.prototype.getRenderOutput = function getRenderOutput() { + return this._rendered; + }; + + ReactShallowRenderer.prototype.render = function render(element) { + var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : emptyObject; + + !React.isValidElement(element) ? reactProdInvariant('12', typeof element === 'function' ? ' Instead of passing a component class, make sure to instantiate ' + 'it by passing it to React.createElement.' : '') : void 0; + element = element; + // Show a special message for host elements since it's a common case. + !(typeof element.type !== 'string') ? reactProdInvariant('13', element.type) : void 0; + !(isForwardRef(element) || typeof element.type === 'function' || isMemo(element.type)) ? reactProdInvariant('249', Array.isArray(element.type) ? 'array' : element.type === null ? 'null' : typeof element.type) : void 0; + + if (this._rendering) { + return; + } + if (this._element != null && this._element.type !== element.type) { + this._reset(); + } + + var elementType = isMemo(element.type) ? element.type.type : element.type; + var previousElement = this._element; + + this._rendering = true; + this._element = element; + this._context = getMaskedContext(elementType.contextTypes, context); + + // Inner memo component props aren't currently validated in createElement. + if (isMemo(element.type) && elementType.propTypes) { + currentlyValidatingElement = element; + checkPropTypes_1(elementType.propTypes, element.props, 'prop', getComponentName(elementType), getStackAddendum); + } + + if (this._instance) { + this._updateClassComponent(elementType, element, this._context); + } else { + if (shouldConstruct(elementType)) { + this._instance = new elementType(element.props, this._context, this._updater); + if (typeof elementType.getDerivedStateFromProps === 'function') { + var partialState = elementType.getDerivedStateFromProps.call(null, element.props, this._instance.state); + if (partialState != null) { + this._instance.state = _assign({}, this._instance.state, partialState); + } + } + + if (elementType.contextTypes) { + currentlyValidatingElement = element; + checkPropTypes_1(elementType.contextTypes, this._context, 'context', getName(elementType, this._instance), getStackAddendum); + + currentlyValidatingElement = null; + } + + this._mountClassComponent(elementType, element, this._context); + } else { + var shouldRender = true; + if (isMemo(element.type) && previousElement !== null) { + // This is a Memo component that is being re-rendered. + var compare = element.type.compare || shallowEqual; + if (compare(previousElement.props, element.props)) { + shouldRender = false; + } + } + if (shouldRender) { + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = this._dispatcher; + try { + // elementType could still be a ForwardRef if it was + // nested inside Memo. + if (elementType.$$typeof === ForwardRef) { + !(typeof elementType.render === 'function') ? reactProdInvariant('322', typeof elementType.render) : void 0; + this._rendered = elementType.render.call(undefined, element.props, element.ref); + } else { + this._rendered = elementType(element.props, this._context); + } + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + this._finishHooks(element, context); + } + } + } + + this._rendering = false; + this._updater._invokeCallbacks(); + + return this.getRenderOutput(); + }; + + ReactShallowRenderer.prototype.unmount = function unmount() { + if (this._instance) { + if (typeof this._instance.componentWillUnmount === 'function') { + this._instance.componentWillUnmount(); + } + } + this._reset(); + }; + + ReactShallowRenderer.prototype._mountClassComponent = function _mountClassComponent(elementType, element, context) { + this._instance.context = context; + this._instance.props = element.props; + this._instance.state = this._instance.state || null; + this._instance.updater = this._updater; + + if (typeof this._instance.UNSAFE_componentWillMount === 'function' || typeof this._instance.componentWillMount === 'function') { + var beforeState = this._newState; + + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + if (typeof elementType.getDerivedStateFromProps !== 'function' && typeof this._instance.getSnapshotBeforeUpdate !== 'function') { + if (typeof this._instance.componentWillMount === 'function') { + this._instance.componentWillMount(); + } + if (typeof this._instance.UNSAFE_componentWillMount === 'function') { + this._instance.UNSAFE_componentWillMount(); + } + } + + // setState may have been called during cWM + if (beforeState !== this._newState) { + this._instance.state = this._newState || emptyObject; + } + } + + this._rendered = this._instance.render(); + // Intentionally do not call componentDidMount() + // because DOM refs are not available. + }; + + ReactShallowRenderer.prototype._updateClassComponent = function _updateClassComponent(elementType, element, context) { + var props = element.props; + + + var oldState = this._instance.state || emptyObject; + var oldProps = this._instance.props; + + if (oldProps !== props) { + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + if (typeof elementType.getDerivedStateFromProps !== 'function' && typeof this._instance.getSnapshotBeforeUpdate !== 'function') { + if (typeof this._instance.componentWillReceiveProps === 'function') { + this._instance.componentWillReceiveProps(props, context); + } + if (typeof this._instance.UNSAFE_componentWillReceiveProps === 'function') { + this._instance.UNSAFE_componentWillReceiveProps(props, context); + } + } + } + + // Read state after cWRP in case it calls setState + var state = this._newState || oldState; + if (typeof elementType.getDerivedStateFromProps === 'function') { + var partialState = elementType.getDerivedStateFromProps.call(null, props, state); + if (partialState != null) { + state = _assign({}, state, partialState); + } + } + + var shouldUpdate = true; + if (this._forcedUpdate) { + shouldUpdate = true; + this._forcedUpdate = false; + } else if (typeof this._instance.shouldComponentUpdate === 'function') { + shouldUpdate = !!this._instance.shouldComponentUpdate(props, state, context); + } else if (elementType.prototype && elementType.prototype.isPureReactComponent) { + shouldUpdate = !shallowEqual(oldProps, props) || !shallowEqual(oldState, state); + } + + if (shouldUpdate) { + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + if (typeof elementType.getDerivedStateFromProps !== 'function' && typeof this._instance.getSnapshotBeforeUpdate !== 'function') { + if (typeof this._instance.componentWillUpdate === 'function') { + this._instance.componentWillUpdate(props, state, context); + } + if (typeof this._instance.UNSAFE_componentWillUpdate === 'function') { + this._instance.UNSAFE_componentWillUpdate(props, state, context); + } + } + } + + this._instance.context = context; + this._instance.props = props; + this._instance.state = state; + this._newState = null; + + if (shouldUpdate) { + this._rendered = this._instance.render(); + } + // Intentionally do not call componentDidUpdate() + // because DOM refs are not available. + }; + + return ReactShallowRenderer; +}(); + +ReactShallowRenderer.createRenderer = function () { + return new ReactShallowRenderer(); +}; + +var currentlyValidatingElement = null; + +function getDisplayName(element) { + if (element == null) { + return '#empty'; + } else if (typeof element === 'string' || typeof element === 'number') { + return '#text'; + } else if (typeof element.type === 'string') { + return element.type; + } else { + var elementType = isMemo(element.type) ? element.type.type : element.type; + return elementType.displayName || elementType.name || 'Unknown'; + } +} + +function getStackAddendum() { + var stack = ''; + if (currentlyValidatingElement) { + var name = getDisplayName(currentlyValidatingElement); + var owner = currentlyValidatingElement._owner; + stack += describeComponentFrame(name, currentlyValidatingElement._source, owner && getComponentName(owner.type)); + } + return stack; +} + +function getName(type, instance) { + var constructor = instance && instance.constructor; + return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null; +} + +function shouldConstruct(Component) { + return !!(Component.prototype && Component.prototype.isReactComponent); +} + +function getMaskedContext(contextTypes, unmaskedContext) { + if (!contextTypes || !unmaskedContext) { + return emptyObject; + } + var context = {}; + for (var key in contextTypes) { + context[key] = unmaskedContext[key]; + } + return context; +} + + + +var ReactShallowRenderer$2 = ({ + default: ReactShallowRenderer +}); + +var ReactShallowRenderer$3 = ( ReactShallowRenderer$2 && ReactShallowRenderer ) || ReactShallowRenderer$2; + +// TODO: decide on the top-level export form. +// This is hacky but makes it work with both Rollup and Jest. +var shallow = ReactShallowRenderer$3.default || ReactShallowRenderer$3; + +return shallow; + +}))); |