Source code
Revision control
Copy as Markdown
Other Tools
/** @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(['resource://devtools/client/shared/vendor/react.js'], 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;
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:
*
* 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
*/
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;
})));