2018-09-20 02:56:13 +02:00
/ * * @ l i c e n s e R e a c t v 1 6 . 5 . 2
2017-10-14 18:40:54 +02:00
* react . development . js
*
2018-09-20 02:56:13 +02:00
* Copyright ( c ) Facebook , Inc . and its affiliates .
2017-10-14 18:40:54 +02:00
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree .
* /
2017-12-10 21:51:33 +01:00
'use strict' ;
2017-10-14 18:40:54 +02:00
( function ( global , factory ) {
typeof exports === 'object' && typeof module !== 'undefined' ? module . exports = factory ( ) :
typeof define === 'function' && define . amd ? define ( factory ) :
( global . React = factory ( ) ) ;
} ( this , ( function ( ) { 'use strict' ;
2018-09-20 02:56:13 +02:00
// TODO: this is special because it gets imported during build.
var ReactVersion = '16.5.2' ;
// 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 _FORWARD _REF _TYPE = hasSymbol ? Symbol . for ( 'react.forward_ref' ) : 0xead0 ;
var REACT _PLACEHOLDER _TYPE = hasSymbol ? Symbol . for ( 'react.placeholder' ) : 0xead1 ;
var MAYBE _ITERATOR _SYMBOL = typeof Symbol === 'function' && Symbol . iterator ;
var FAUX _ITERATOR _SYMBOL = '@@iterator' ;
function getIteratorFn ( maybeIterable ) {
if ( maybeIterable === null || typeof maybeIterable !== 'object' ) {
return null ;
}
var maybeIterator = MAYBE _ITERATOR _SYMBOL && maybeIterable [ MAYBE _ITERATOR _SYMBOL ] || maybeIterable [ FAUX _ITERATOR _SYMBOL ] ;
if ( typeof maybeIterator === 'function' ) {
return maybeIterator ;
}
return null ;
}
// Exports ReactDOM.createRoot
// Experimental error-boundary API that can recover from errors within a single
// render phase
// Suspense
var enableSuspense = false ;
// Helps identify side effects in begin-phase lifecycle hooks and setState reducers:
// In some cases, StrictMode should also double-render lifecycles.
// This can be confusing for tests though,
// And it can be bad for performance in production.
// This feature flag can be used to control the behavior:
// To preserve the "Pause on caught exceptions" behavior of the debugger, we
// replay the begin phase of a failed component inside invokeGuardedCallback.
// Warn about deprecated, async-unsafe lifecycles; relates to RFC #6:
// Warn about legacy context API
// Gather advanced timing metrics for Profiler subtrees.
// Trace which interactions trigger each commit.
var enableSchedulerTracing = true ;
// Only used in www builds.
// Only used in www builds.
// React Fire: prevent the value and checked attributes from syncing
// with their related DOM properties
2017-10-14 18:40:54 +02:00
/ *
object - assign
( c ) Sindre Sorhus
@ license MIT
* /
2017-12-10 21:51:33 +01:00
2017-10-14 18:40:54 +02:00
/* eslint-disable no-unused-vars */
var getOwnPropertySymbols = Object . getOwnPropertySymbols ;
var hasOwnProperty = Object . prototype . hasOwnProperty ;
var propIsEnumerable = Object . prototype . propertyIsEnumerable ;
function toObject ( val ) {
if ( val === null || val === undefined ) {
throw new TypeError ( 'Object.assign cannot be called with null or undefined' ) ;
}
return Object ( val ) ;
}
function shouldUseNative ( ) {
try {
if ( ! Object . assign ) {
return false ;
}
// Detect buggy property enumeration order in older V8 versions.
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
var test1 = new String ( 'abc' ) ; // eslint-disable-line no-new-wrappers
test1 [ 5 ] = 'de' ;
if ( Object . getOwnPropertyNames ( test1 ) [ 0 ] === '5' ) {
return false ;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test2 = { } ;
for ( var i = 0 ; i < 10 ; i ++ ) {
test2 [ '_' + String . fromCharCode ( i ) ] = i ;
}
var order2 = Object . getOwnPropertyNames ( test2 ) . map ( function ( n ) {
return test2 [ n ] ;
} ) ;
if ( order2 . join ( '' ) !== '0123456789' ) {
return false ;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test3 = { } ;
'abcdefghijklmnopqrst' . split ( '' ) . forEach ( function ( letter ) {
test3 [ letter ] = letter ;
} ) ;
if ( Object . keys ( Object . assign ( { } , test3 ) ) . join ( '' ) !==
'abcdefghijklmnopqrst' ) {
return false ;
}
return true ;
} catch ( err ) {
// We don't expect any of the above to throw, but better to be safe.
return false ;
}
}
2017-12-10 21:51:33 +01:00
var objectAssign = shouldUseNative ( ) ? Object . assign : function ( target , source ) {
2017-10-14 18:40:54 +02:00
var from ;
var to = toObject ( target ) ;
var symbols ;
for ( var s = 1 ; s < arguments . length ; s ++ ) {
from = Object ( arguments [ s ] ) ;
for ( var key in from ) {
if ( hasOwnProperty . call ( from , key ) ) {
to [ key ] = from [ key ] ;
}
}
if ( getOwnPropertySymbols ) {
symbols = getOwnPropertySymbols ( from ) ;
for ( var i = 0 ; i < symbols . length ; i ++ ) {
if ( propIsEnumerable . call ( from , symbols [ i ] ) ) {
to [ symbols [ i ] ] = from [ symbols [ i ] ] ;
}
}
}
}
return to ;
} ;
2017-12-10 21:51:33 +01:00
/ * *
* 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 .
* /
2018-09-20 02:56:13 +02:00
var validateFormat = function ( ) { } ;
2017-12-10 21:51:33 +01:00
{
2018-09-20 02:56:13 +02:00
validateFormat = function ( format ) {
2017-12-10 21:51:33 +01:00
if ( format === undefined ) {
throw new Error ( 'invariant requires an error message argument' ) ;
}
} ;
}
function invariant ( condition , format , a , b , c , d , e , f ) {
validateFormat ( format ) ;
if ( ! condition ) {
2018-09-20 02:56:13 +02:00
var error = void 0 ;
2017-12-10 21:51:33 +01:00
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 ;
}
}
2018-09-20 02:56:13 +02:00
// Relying on the `invariant()` implementation lets us
// preserve the format and params in the www builds.
2017-12-10 21:51:33 +01:00
/ * *
* 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 .
* /
var lowPriorityWarning = function ( ) { } ;
{
var printWarning = function ( format ) {
for ( var _len = arguments . length , args = Array ( _len > 1 ? _len - 1 : 0 ) , _key = 1 ; _key < _len ; _key ++ ) {
args [ _key - 1 ] = arguments [ _key ] ;
}
var argIndex = 0 ;
var message = 'Warning: ' + format . replace ( /%s/g , function ( ) {
return args [ argIndex ++ ] ;
} ) ;
if ( typeof console !== 'undefined' ) {
console . warn ( message ) ;
}
try {
// --- Welcome to debugging React ---
// This error was thrown as a convenience so that you can use this stack
// to find the callsite that caused this warning to fire.
throw new Error ( message ) ;
} catch ( x ) { }
} ;
lowPriorityWarning = function ( condition , format ) {
if ( format === undefined ) {
2018-09-20 02:56:13 +02:00
throw new Error ( '`lowPriorityWarning(condition, format, ...args)` requires a warning ' + 'message argument' ) ;
2017-12-10 21:51:33 +01:00
}
if ( ! condition ) {
for ( var _len2 = arguments . length , args = Array ( _len2 > 2 ? _len2 - 2 : 0 ) , _key2 = 2 ; _key2 < _len2 ; _key2 ++ ) {
args [ _key2 - 2 ] = arguments [ _key2 ] ;
}
printWarning . apply ( undefined , [ format ] . concat ( args ) ) ;
}
} ;
}
var lowPriorityWarning$1 = lowPriorityWarning ;
2017-10-14 18:40:54 +02:00
/ * *
* 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 .
* /
2018-09-20 02:56:13 +02:00
var warningWithoutStack = function ( ) { } ;
2017-10-14 18:40:54 +02:00
{
2018-09-20 02:56:13 +02:00
warningWithoutStack = function ( condition , format ) {
for ( var _len = arguments . length , args = Array ( _len > 2 ? _len - 2 : 0 ) , _key = 2 ; _key < _len ; _key ++ ) {
args [ _key - 2 ] = arguments [ _key ] ;
2017-10-14 18:40:54 +02:00
}
2018-09-20 02:56:13 +02:00
if ( format === undefined ) {
throw new Error ( '`warningWithoutStack(condition, format, ...args)` requires a warning ' + 'message argument' ) ;
}
if ( args . length > 8 ) {
// Check before the condition to catch violations early.
throw new Error ( 'warningWithoutStack() currently supports at most 8 arguments.' ) ;
}
if ( condition ) {
return ;
}
2017-10-14 18:40:54 +02:00
if ( typeof console !== 'undefined' ) {
2018-09-20 02:56:13 +02:00
var _args$map = args . map ( function ( item ) {
return '' + item ;
} ) ,
a = _args$map [ 0 ] ,
b = _args$map [ 1 ] ,
c = _args$map [ 2 ] ,
d = _args$map [ 3 ] ,
e = _args$map [ 4 ] ,
f = _args$map [ 5 ] ,
g = _args$map [ 6 ] ,
h = _args$map [ 7 ] ;
var message = 'Warning: ' + format ;
// We intentionally don't use spread (or .apply) because it breaks IE9:
// https://github.com/facebook/react/issues/13610
switch ( args . length ) {
case 0 :
console . error ( message ) ;
break ;
case 1 :
console . error ( message , a ) ;
break ;
case 2 :
console . error ( message , a , b ) ;
break ;
case 3 :
console . error ( message , a , b , c ) ;
break ;
case 4 :
console . error ( message , a , b , c , d ) ;
break ;
case 5 :
console . error ( message , a , b , c , d , e ) ;
break ;
case 6 :
console . error ( message , a , b , c , d , e , f ) ;
break ;
case 7 :
console . error ( message , a , b , c , d , e , f , g ) ;
break ;
case 8 :
console . error ( message , a , b , c , d , e , f , g , h ) ;
break ;
default :
throw new Error ( 'warningWithoutStack() currently supports at most 8 arguments.' ) ;
}
2017-10-14 18:40:54 +02:00
}
try {
// --- Welcome to debugging React ---
// This error was thrown as a convenience so that you can use this stack
// to find the callsite that caused this warning to fire.
2018-09-20 02:56:13 +02:00
var argIndex = 0 ;
var _message = 'Warning: ' + format . replace ( /%s/g , function ( ) {
return args [ argIndex ++ ] ;
} ) ;
throw new Error ( _message ) ;
2017-10-14 18:40:54 +02:00
} catch ( x ) { }
} ;
}
2018-09-20 02:56:13 +02:00
var warningWithoutStack$1 = warningWithoutStack ;
2017-10-14 18:40:54 +02:00
2017-12-10 21:51:33 +01:00
var didWarnStateUpdateForUnmountedComponent = { } ;
2017-10-14 18:40:54 +02:00
function warnNoop ( publicInstance , callerName ) {
{
2018-09-20 02:56:13 +02:00
var _constructor = publicInstance . constructor ;
var componentName = _constructor && ( _constructor . displayName || _constructor . name ) || 'ReactClass' ;
2017-12-10 21:51:33 +01:00
var warningKey = componentName + '.' + callerName ;
if ( didWarnStateUpdateForUnmountedComponent [ warningKey ] ) {
return ;
}
2018-09-20 02:56:13 +02:00
warningWithoutStack$1 ( false , "Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.' , callerName , componentName ) ;
2017-12-10 21:51:33 +01:00
didWarnStateUpdateForUnmountedComponent [ warningKey ] = true ;
2017-10-14 18:40:54 +02:00
}
}
/ * *
* This is the abstract API for an update queue .
* /
var ReactNoopUpdateQueue = {
/ * *
* Checks whether or not this composite component is mounted .
* @ param { ReactClass } publicInstance The instance we want to test .
* @ return { boolean } True if mounted , false otherwise .
* @ protected
* @ final
* /
isMounted : function ( publicInstance ) {
return false ;
} ,
/ * *
* Forces an update . This should only be invoked when it is known with
* certainty that we are * * not * * in a DOM transaction .
*
* You may want to call this when you know that some deeper aspect of the
* component ' s state has changed but ` setState ` was not called .
*
* This will not invoke ` shouldComponentUpdate ` , but it will invoke
* ` componentWillUpdate ` and ` componentDidUpdate ` .
*
* @ param { ReactClass } publicInstance The instance that should rerender .
* @ param { ? function } callback Called after component is updated .
* @ param { ? string } callerName name of the calling function in the public API .
* @ internal
* /
enqueueForceUpdate : function ( publicInstance , callback , callerName ) {
warnNoop ( publicInstance , 'forceUpdate' ) ;
} ,
/ * *
* Replaces all of the state . Always use this or ` setState ` to mutate state .
* You should treat ` this.state ` as immutable .
*
* There is no guarantee that ` this.state ` will be immediately updated , so
* accessing ` this.state ` after calling this method may return the old value .
*
* @ param { ReactClass } publicInstance The instance that should rerender .
* @ param { object } completeState Next state .
* @ param { ? function } callback Called after component is updated .
* @ param { ? string } callerName name of the calling function in the public API .
* @ internal
* /
enqueueReplaceState : function ( publicInstance , completeState , callback , callerName ) {
warnNoop ( publicInstance , 'replaceState' ) ;
} ,
/ * *
* Sets a subset of the state . This only exists because _pendingState is
* internal . This provides a merging strategy that is not available to deep
2017-12-10 21:51:33 +01:00
* properties which is confusing . TODO : Expose pendingState or don ' t use it
* during the merge .
*
* @ param { ReactClass } publicInstance The instance that should rerender .
* @ param { object } partialState Next partial state to be merged with state .
* @ param { ? function } callback Called after component is updated .
* @ param { ? string } Name of the calling function in the public API .
* @ internal
* /
enqueueSetState : function ( publicInstance , partialState , callback , callerName ) {
warnNoop ( publicInstance , 'setState' ) ;
}
} ;
2017-10-14 18:40:54 +02:00
2018-09-20 02:56:13 +02:00
var emptyObject = { } ;
{
Object . freeze ( emptyObject ) ;
}
2017-10-14 18:40:54 +02:00
/ * *
* Base class helpers for the updating state of a component .
* /
2017-12-10 21:51:33 +01:00
function Component ( props , context , updater ) {
2017-10-14 18:40:54 +02:00
this . props = props ;
this . context = context ;
2018-09-20 02:56:13 +02:00
// If a component has string refs, we will assign a different object later.
this . refs = emptyObject ;
2017-10-14 18:40:54 +02:00
// We initialize the default updater but the real one gets injected by the
// renderer.
2017-12-10 21:51:33 +01:00
this . updater = updater || ReactNoopUpdateQueue ;
2017-10-14 18:40:54 +02:00
}
2017-12-10 21:51:33 +01:00
Component . prototype . isReactComponent = { } ;
2017-10-14 18:40:54 +02:00
/ * *
* Sets a subset of the state . Always use this to mutate
* state . You should treat ` this.state ` as immutable .
*
* There is no guarantee that ` this.state ` will be immediately updated , so
* accessing ` this.state ` after calling this method may return the old value .
*
* There is no guarantee that calls to ` setState ` will run synchronously ,
* as they may eventually be batched together . You can provide an optional
* callback that will be executed when the call to setState is actually
* completed .
*
* When a function is provided to setState , it will be called at some point in
* the future ( not synchronously ) . It will be called with the up to date
* component arguments ( state , props , context ) . These values can be different
* from this . * because your function may be called after receiveProps but before
* shouldComponentUpdate , and this new state , props , and context will not yet be
* assigned to this .
*
* @ param { object | function } partialState Next partial state or function to
* produce next partial state to be merged with current state .
* @ param { ? function } callback Called after state is updated .
* @ final
* @ protected
* /
2017-12-10 21:51:33 +01:00
Component . prototype . setState = function ( partialState , callback ) {
2018-09-20 02:56:13 +02:00
! ( typeof partialState === 'object' || typeof partialState === 'function' || partialState == null ) ? invariant ( false , 'setState(...): takes an object of state variables to update or a function which returns an object of state variables.' ) : void 0 ;
2017-10-14 18:40:54 +02:00
this . updater . enqueueSetState ( this , partialState , callback , 'setState' ) ;
} ;
/ * *
* Forces an update . This should only be invoked when it is known with
* certainty that we are * * not * * in a DOM transaction .
*
* You may want to call this when you know that some deeper aspect of the
* component ' s state has changed but ` setState ` was not called .
*
* This will not invoke ` shouldComponentUpdate ` , but it will invoke
* ` componentWillUpdate ` and ` componentDidUpdate ` .
*
* @ param { ? function } callback Called after update is complete .
* @ final
* @ protected
* /
2017-12-10 21:51:33 +01:00
Component . prototype . forceUpdate = function ( callback ) {
2017-10-14 18:40:54 +02:00
this . updater . enqueueForceUpdate ( this , callback , 'forceUpdate' ) ;
} ;
/ * *
* Deprecated APIs . These APIs used to exist on classic React classes but since
* we would like to deprecate them , we ' re not going to move them over to this
* modern base class . Instead , we define a getter that warns if it ' s accessed .
* /
{
var deprecatedAPIs = {
isMounted : [ 'isMounted' , 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.' ] ,
replaceState : [ 'replaceState' , 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).' ]
} ;
var defineDeprecationWarning = function ( methodName , info ) {
2017-12-10 21:51:33 +01:00
Object . defineProperty ( Component . prototype , methodName , {
2017-10-14 18:40:54 +02:00
get : function ( ) {
2017-12-10 21:51:33 +01:00
lowPriorityWarning$1 ( false , '%s(...) is deprecated in plain JavaScript React classes. %s' , info [ 0 ] , info [ 1 ] ) ;
2017-10-14 18:40:54 +02:00
return undefined ;
}
2018-09-20 02:56:13 +02:00
} ) ;
} ;
for ( var fnName in deprecatedAPIs ) {
if ( deprecatedAPIs . hasOwnProperty ( fnName ) ) {
defineDeprecationWarning ( fnName , deprecatedAPIs [ fnName ] ) ;
}
}
}
function ComponentDummy ( ) { }
ComponentDummy . prototype = Component . prototype ;
/ * *
* Convenience component with default shallow equality check for sCU .
* /
function PureComponent ( props , context , updater ) {
this . props = props ;
this . context = context ;
// If a component has string refs, we will assign a different object later.
this . refs = emptyObject ;
this . updater = updater || ReactNoopUpdateQueue ;
}
var pureComponentPrototype = PureComponent . prototype = new ComponentDummy ( ) ;
pureComponentPrototype . constructor = PureComponent ;
// Avoid an extra prototype jump for these methods.
objectAssign ( pureComponentPrototype , Component . prototype ) ;
pureComponentPrototype . isPureReactComponent = true ;
// an immutable object with a single mutable value
function createRef ( ) {
var refObject = {
current : null
} ;
{
Object . seal ( refObject ) ;
}
return refObject ;
}
/* eslint-disable no-var */
// TODO: Currently there's only a single priority level, Deferred. Will add
// additional priorities.
var DEFERRED _TIMEOUT = 5000 ;
// Callbacks are stored as a circular, doubly linked list.
var firstCallbackNode = null ;
var isPerformingWork = false ;
var isHostCallbackScheduled = false ;
var hasNativePerformanceNow = typeof performance === 'object' && typeof performance . now === 'function' ;
var timeRemaining ;
if ( hasNativePerformanceNow ) {
timeRemaining = function ( ) {
// We assume that if we have a performance timer that the rAF callback
// gets a performance timer value. Not sure if this is always true.
var remaining = getFrameDeadline ( ) - performance . now ( ) ;
return remaining > 0 ? remaining : 0 ;
} ;
} else {
timeRemaining = function ( ) {
// Fallback to Date.now()
var remaining = getFrameDeadline ( ) - Date . now ( ) ;
return remaining > 0 ? remaining : 0 ;
} ;
}
var deadlineObject = {
timeRemaining : timeRemaining ,
didTimeout : false
} ;
function ensureHostCallbackIsScheduled ( ) {
if ( isPerformingWork ) {
// Don't schedule work yet; wait until the next time we yield.
return ;
}
// Schedule the host callback using the earliest timeout in the list.
var timesOutAt = firstCallbackNode . timesOutAt ;
if ( ! isHostCallbackScheduled ) {
isHostCallbackScheduled = true ;
} else {
// Cancel the existing host callback.
cancelCallback ( ) ;
}
requestCallback ( flushWork , timesOutAt ) ;
}
function flushFirstCallback ( node ) {
var flushedNode = firstCallbackNode ;
// Remove the node from the list before calling the callback. That way the
// list is in a consistent state even if the callback throws.
var next = firstCallbackNode . next ;
if ( firstCallbackNode === next ) {
// This is the last callback in the list.
firstCallbackNode = null ;
next = null ;
} else {
var previous = firstCallbackNode . previous ;
firstCallbackNode = previous . next = next ;
next . previous = previous ;
}
flushedNode . next = flushedNode . previous = null ;
// Now it's safe to call the callback.
var callback = flushedNode . callback ;
callback ( deadlineObject ) ;
}
function flushWork ( didTimeout ) {
isPerformingWork = true ;
deadlineObject . didTimeout = didTimeout ;
try {
if ( didTimeout ) {
// Flush all the timed out callbacks without yielding.
while ( firstCallbackNode !== null ) {
// Read the current time. Flush all the callbacks that expire at or
// earlier than that time. Then read the current time again and repeat.
// This optimizes for as few performance.now calls as possible.
var currentTime = getCurrentTime ( ) ;
if ( firstCallbackNode . timesOutAt <= currentTime ) {
do {
flushFirstCallback ( ) ;
} while ( firstCallbackNode !== null && firstCallbackNode . timesOutAt <= currentTime ) ;
continue ;
}
break ;
}
} else {
// Keep flushing callbacks until we run out of time in the frame.
if ( firstCallbackNode !== null ) {
do {
flushFirstCallback ( ) ;
} while ( firstCallbackNode !== null && getFrameDeadline ( ) - getCurrentTime ( ) > 0 ) ;
}
}
} finally {
isPerformingWork = false ;
if ( firstCallbackNode !== null ) {
// There's still work remaining. Request another callback.
ensureHostCallbackIsScheduled ( firstCallbackNode ) ;
} else {
isHostCallbackScheduled = false ;
}
}
}
function unstable _scheduleWork ( callback , options ) {
var currentTime = getCurrentTime ( ) ;
var timesOutAt ;
if ( options !== undefined && options !== null && options . timeout !== null && options . timeout !== undefined ) {
// Check for an explicit timeout
timesOutAt = currentTime + options . timeout ;
} else {
// Compute an absolute timeout using the default constant.
timesOutAt = currentTime + DEFERRED _TIMEOUT ;
}
var newNode = {
callback : callback ,
timesOutAt : timesOutAt ,
next : null ,
previous : null
} ;
// Insert the new callback into the list, sorted by its timeout.
if ( firstCallbackNode === null ) {
// This is the first callback in the list.
firstCallbackNode = newNode . next = newNode . previous = newNode ;
ensureHostCallbackIsScheduled ( firstCallbackNode ) ;
} else {
var next = null ;
var node = firstCallbackNode ;
do {
if ( node . timesOutAt > timesOutAt ) {
// The new callback times out before this one.
next = node ;
break ;
}
node = node . next ;
} while ( node !== firstCallbackNode ) ;
if ( next === null ) {
// No callback with a later timeout was found, which means the new
// callback has the latest timeout in the list.
next = firstCallbackNode ;
} else if ( next === firstCallbackNode ) {
// The new callback has the earliest timeout in the entire list.
firstCallbackNode = newNode ;
ensureHostCallbackIsScheduled ( firstCallbackNode ) ;
}
var previous = next . previous ;
previous . next = next . previous = newNode ;
newNode . next = next ;
newNode . previous = previous ;
}
return newNode ;
}
function unstable _cancelScheduledWork ( callbackNode ) {
var next = callbackNode . next ;
if ( next === null ) {
// Already cancelled.
return ;
}
if ( next === callbackNode ) {
// This is the only scheduled callback. Clear the list.
firstCallbackNode = null ;
} else {
// Remove the callback from its position in the list.
if ( callbackNode === firstCallbackNode ) {
firstCallbackNode = next ;
}
var previous = callbackNode . previous ;
previous . next = next ;
next . previous = previous ;
}
callbackNode . next = callbackNode . previous = null ;
}
// The remaining code is essentially a polyfill for requestIdleCallback. It
// works by scheduling a requestAnimationFrame, storing the time for the start
// of the frame, then scheduling a postMessage which gets scheduled after paint.
// Within the postMessage handler do as much work as possible until time + frame
// rate. By separating the idle call into a separate event tick we ensure that
// layout, paint and other browser work is counted against the available time.
// The frame rate is dynamically adjusted.
// We capture a local reference to any global, in case it gets polyfilled after
// this module is initially evaluated. We want to be using a
// consistent implementation.
var localDate = Date ;
// This initialization code may run even on server environments if a component
// just imports ReactDOM (e.g. for findDOMNode). Some environments might not
// have setTimeout or clearTimeout. However, we always expect them to be defined
// on the client. https://github.com/facebook/react/pull/13088
var localSetTimeout = typeof setTimeout === 'function' ? setTimeout : undefined ;
var localClearTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined ;
// We don't expect either of these to necessarily be defined, but we will error
// later if they are missing on the client.
var localRequestAnimationFrame = typeof requestAnimationFrame === 'function' ? requestAnimationFrame : undefined ;
var localCancelAnimationFrame = typeof cancelAnimationFrame === 'function' ? cancelAnimationFrame : undefined ;
var getCurrentTime ;
// requestAnimationFrame does not run when the tab is in the background. If
// we're backgrounded we prefer for that work to happen so that the page
// continues to load in the background. So we also schedule a 'setTimeout' as
// a fallback.
// TODO: Need a better heuristic for backgrounded work.
var ANIMATION _FRAME _TIMEOUT = 100 ;
var rAFID ;
var rAFTimeoutID ;
var requestAnimationFrameWithTimeout = function ( callback ) {
// schedule rAF and also a setTimeout
rAFID = localRequestAnimationFrame ( function ( timestamp ) {
// cancel the setTimeout
localClearTimeout ( rAFTimeoutID ) ;
callback ( timestamp ) ;
} ) ;
rAFTimeoutID = localSetTimeout ( function ( ) {
// cancel the requestAnimationFrame
localCancelAnimationFrame ( rAFID ) ;
callback ( getCurrentTime ( ) ) ;
} , ANIMATION _FRAME _TIMEOUT ) ;
} ;
if ( hasNativePerformanceNow ) {
var Performance = performance ;
getCurrentTime = function ( ) {
return Performance . now ( ) ;
} ;
} else {
getCurrentTime = function ( ) {
return localDate . now ( ) ;
} ;
}
var requestCallback ;
var cancelCallback ;
var getFrameDeadline ;
if ( typeof window === 'undefined' ) {
// If this accidentally gets imported in a non-browser environment, fallback
// to a naive implementation.
var timeoutID = - 1 ;
requestCallback = function ( callback , absoluteTimeout ) {
timeoutID = setTimeout ( callback , 0 , true ) ;
} ;
cancelCallback = function ( ) {
clearTimeout ( timeoutID ) ;
} ;
getFrameDeadline = function ( ) {
return 0 ;
} ;
} else if ( window . _schedMock ) {
// Dynamic injection, only for testing purposes.
var impl = window . _schedMock ;
requestCallback = impl [ 0 ] ;
cancelCallback = impl [ 1 ] ;
getFrameDeadline = impl [ 2 ] ;
} else {
if ( typeof console !== 'undefined' ) {
if ( typeof localRequestAnimationFrame !== 'function' ) {
console . error ( "This browser doesn't support requestAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills' ) ;
}
if ( typeof localCancelAnimationFrame !== 'function' ) {
console . error ( "This browser doesn't support cancelAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills' ) ;
}
}
var scheduledCallback = null ;
var isIdleScheduled = false ;
var timeoutTime = - 1 ;
var isAnimationFrameScheduled = false ;
var isPerformingIdleWork = false ;
var frameDeadline = 0 ;
// We start out assuming that we run at 30fps but then the heuristic tracking
// will adjust this value to a faster fps if we get more frequent animation
// frames.
var previousFrameTime = 33 ;
var activeFrameTime = 33 ;
getFrameDeadline = function ( ) {
return frameDeadline ;
} ;
// We use the postMessage trick to defer idle work until after the repaint.
var messageKey = '__reactIdleCallback$' + Math . random ( ) . toString ( 36 ) . slice ( 2 ) ;
var idleTick = function ( event ) {
if ( event . source !== window || event . data !== messageKey ) {
return ;
}
isIdleScheduled = false ;
var currentTime = getCurrentTime ( ) ;
var didTimeout = false ;
if ( frameDeadline - currentTime <= 0 ) {
// There's no time left in this idle period. Check if the callback has
// a timeout and whether it's been exceeded.
if ( timeoutTime !== - 1 && timeoutTime <= currentTime ) {
// Exceeded the timeout. Invoke the callback even though there's no
// time left.
didTimeout = true ;
} else {
// No timeout.
if ( ! isAnimationFrameScheduled ) {
// Schedule another animation callback so we retry later.
isAnimationFrameScheduled = true ;
requestAnimationFrameWithTimeout ( animationTick ) ;
}
// Exit without invoking the callback.
return ;
}
}
timeoutTime = - 1 ;
var callback = scheduledCallback ;
scheduledCallback = null ;
if ( callback !== null ) {
isPerformingIdleWork = true ;
try {
callback ( didTimeout ) ;
} finally {
isPerformingIdleWork = false ;
}
}
} ;
// Assumes that we have addEventListener in this environment. Might need
// something better for old IE.
window . addEventListener ( 'message' , idleTick , false ) ;
var animationTick = function ( rafTime ) {
isAnimationFrameScheduled = false ;
var nextFrameTime = rafTime - frameDeadline + activeFrameTime ;
if ( nextFrameTime < activeFrameTime && previousFrameTime < activeFrameTime ) {
if ( nextFrameTime < 8 ) {
// Defensive coding. We don't support higher frame rates than 120hz.
// If we get lower than that, it is probably a bug.
nextFrameTime = 8 ;
}
// If one frame goes long, then the next one can be short to catch up.
// If two frames are short in a row, then that's an indication that we
// actually have a higher frame rate than what we're currently optimizing.
// We adjust our heuristic dynamically accordingly. For example, if we're
// running on 120hz display or 90hz VR display.
// Take the max of the two in case one of them was an anomaly due to
// missed frame deadlines.
activeFrameTime = nextFrameTime < previousFrameTime ? previousFrameTime : nextFrameTime ;
} else {
previousFrameTime = nextFrameTime ;
}
frameDeadline = rafTime + activeFrameTime ;
if ( ! isIdleScheduled ) {
isIdleScheduled = true ;
window . postMessage ( messageKey , '*' ) ;
}
} ;
requestCallback = function ( callback , absoluteTimeout ) {
scheduledCallback = callback ;
timeoutTime = absoluteTimeout ;
if ( isPerformingIdleWork ) {
// If we're already performing idle work, an error must have been thrown.
// Don't wait for the next frame. Continue working ASAP, in a new event.
window . postMessage ( messageKey , '*' ) ;
} else if ( ! isAnimationFrameScheduled ) {
// If rAF didn't already schedule one, we need to schedule a frame.
// TODO: If this rAF doesn't materialize because the browser throttles, we
// might want to still have setTimeout trigger rIC as a backup to ensure
// that we keep performing work.
isAnimationFrameScheduled = true ;
requestAnimationFrameWithTimeout ( animationTick ) ;
}
} ;
cancelCallback = function ( ) {
scheduledCallback = null ;
isIdleScheduled = false ;
timeoutTime = - 1 ;
} ;
}
var DEFAULT _THREAD _ID = 0 ;
// Counters used to generate unique IDs.
var interactionIDCounter = 0 ;
var threadIDCounter = 0 ;
// Set of currently traced interactions.
// Interactions "stack"–
// Meaning that newly traced interactions are appended to the previously active set.
// When an interaction goes out of scope, the previous set (if any) is restored.
var interactionsRef = null ;
// Listener(s) to notify when interactions begin and end.
var subscriberRef = null ;
if ( enableSchedulerTracing ) {
interactionsRef = {
current : new Set ( )
} ;
subscriberRef = {
current : null
} ;
}
function unstable _clear ( callback ) {
if ( ! enableSchedulerTracing ) {
return callback ( ) ;
}
var prevInteractions = interactionsRef . current ;
interactionsRef . current = new Set ( ) ;
try {
return callback ( ) ;
} finally {
interactionsRef . current = prevInteractions ;
}
}
function unstable _getCurrent ( ) {
if ( ! enableSchedulerTracing ) {
return null ;
} else {
return interactionsRef . current ;
}
}
function unstable _getThreadID ( ) {
return ++ threadIDCounter ;
}
function unstable _trace ( name , timestamp , callback ) {
var threadID = arguments . length > 3 && arguments [ 3 ] !== undefined ? arguments [ 3 ] : DEFAULT _THREAD _ID ;
if ( ! enableSchedulerTracing ) {
return callback ( ) ;
}
var interaction = {
_ _count : 1 ,
id : interactionIDCounter ++ ,
name : name ,
timestamp : timestamp
} ;
var prevInteractions = interactionsRef . current ;
// Traced interactions should stack/accumulate.
// To do that, clone the current interactions.
// The previous set will be restored upon completion.
var interactions = new Set ( prevInteractions ) ;
interactions . add ( interaction ) ;
interactionsRef . current = interactions ;
var subscriber = subscriberRef . current ;
var returnValue = void 0 ;
try {
if ( subscriber !== null ) {
subscriber . onInteractionTraced ( interaction ) ;
}
} finally {
try {
if ( subscriber !== null ) {
subscriber . onWorkStarted ( interactions , threadID ) ;
}
} finally {
try {
returnValue = callback ( ) ;
} finally {
interactionsRef . current = prevInteractions ;
try {
if ( subscriber !== null ) {
subscriber . onWorkStopped ( interactions , threadID ) ;
}
} finally {
interaction . _ _count -- ;
// If no async work was scheduled for this interaction,
// Notify subscribers that it's completed.
if ( subscriber !== null && interaction . _ _count === 0 ) {
subscriber . onInteractionScheduledWorkCompleted ( interaction ) ;
}
}
}
}
}
return returnValue ;
}
function unstable _wrap ( callback ) {
var threadID = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : DEFAULT _THREAD _ID ;
if ( ! enableSchedulerTracing ) {
return callback ;
}
var wrappedInteractions = interactionsRef . current ;
var subscriber = subscriberRef . current ;
if ( subscriber !== null ) {
subscriber . onWorkScheduled ( wrappedInteractions , threadID ) ;
}
// Update the pending async work count for the current interactions.
// Update after calling subscribers in case of error.
wrappedInteractions . forEach ( function ( interaction ) {
interaction . _ _count ++ ;
} ) ;
var hasRun = false ;
function wrapped ( ) {
var prevInteractions = interactionsRef . current ;
interactionsRef . current = wrappedInteractions ;
subscriber = subscriberRef . current ;
try {
var returnValue = void 0 ;
try {
if ( subscriber !== null ) {
subscriber . onWorkStarted ( wrappedInteractions , threadID ) ;
}
} finally {
try {
returnValue = callback . apply ( undefined , arguments ) ;
} finally {
interactionsRef . current = prevInteractions ;
if ( subscriber !== null ) {
subscriber . onWorkStopped ( wrappedInteractions , threadID ) ;
}
}
}
return returnValue ;
} finally {
if ( ! hasRun ) {
// We only expect a wrapped function to be executed once,
// But in the event that it's executed more than once–
// Only decrement the outstanding interaction counts once.
hasRun = true ;
// Update pending async counts for all wrapped interactions.
// If this was the last scheduled async work for any of them,
// Mark them as completed.
wrappedInteractions . forEach ( function ( interaction ) {
interaction . _ _count -- ;
if ( subscriber !== null && interaction . _ _count === 0 ) {
subscriber . onInteractionScheduledWorkCompleted ( interaction ) ;
}
} ) ;
}
}
}
wrapped . cancel = function cancel ( ) {
subscriber = subscriberRef . current ;
try {
if ( subscriber !== null ) {
subscriber . onWorkCanceled ( wrappedInteractions , threadID ) ;
}
} finally {
// Update pending async counts for all wrapped interactions.
// If this was the last scheduled async work for any of them,
// Mark them as completed.
wrappedInteractions . forEach ( function ( interaction ) {
interaction . _ _count -- ;
if ( subscriber && interaction . _ _count === 0 ) {
subscriber . onInteractionScheduledWorkCompleted ( interaction ) ;
}
} ) ;
}
} ;
return wrapped ;
}
var subscribers = null ;
if ( enableSchedulerTracing ) {
subscribers = new Set ( ) ;
}
function unstable _subscribe ( subscriber ) {
if ( enableSchedulerTracing ) {
subscribers . add ( subscriber ) ;
if ( subscribers . size === 1 ) {
subscriberRef . current = {
onInteractionScheduledWorkCompleted : onInteractionScheduledWorkCompleted ,
onInteractionTraced : onInteractionTraced ,
onWorkCanceled : onWorkCanceled ,
onWorkScheduled : onWorkScheduled ,
onWorkStarted : onWorkStarted ,
onWorkStopped : onWorkStopped
} ;
}
}
}
function unstable _unsubscribe ( subscriber ) {
if ( enableSchedulerTracing ) {
subscribers . delete ( subscriber ) ;
if ( subscribers . size === 0 ) {
subscriberRef . current = null ;
}
}
}
function onInteractionTraced ( interaction ) {
var didCatchError = false ;
var caughtError = null ;
subscribers . forEach ( function ( subscriber ) {
try {
subscriber . onInteractionTraced ( interaction ) ;
} catch ( error ) {
if ( ! didCatchError ) {
didCatchError = true ;
caughtError = error ;
}
}
} ) ;
if ( didCatchError ) {
throw caughtError ;
}
}
function onInteractionScheduledWorkCompleted ( interaction ) {
var didCatchError = false ;
var caughtError = null ;
subscribers . forEach ( function ( subscriber ) {
try {
subscriber . onInteractionScheduledWorkCompleted ( interaction ) ;
} catch ( error ) {
if ( ! didCatchError ) {
didCatchError = true ;
caughtError = error ;
}
}
} ) ;
if ( didCatchError ) {
throw caughtError ;
}
}
function onWorkScheduled ( interactions , threadID ) {
var didCatchError = false ;
var caughtError = null ;
subscribers . forEach ( function ( subscriber ) {
try {
subscriber . onWorkScheduled ( interactions , threadID ) ;
} catch ( error ) {
if ( ! didCatchError ) {
didCatchError = true ;
caughtError = error ;
}
2017-10-14 18:40:54 +02:00
}
2018-09-20 02:56:13 +02:00
} ) ;
if ( didCatchError ) {
throw caughtError ;
2017-10-14 18:40:54 +02:00
}
}
2018-09-20 02:56:13 +02:00
function onWorkStarted ( interactions , threadID ) {
var didCatchError = false ;
var caughtError = null ;
subscribers . forEach ( function ( subscriber ) {
try {
subscriber . onWorkStarted ( interactions , threadID ) ;
} catch ( error ) {
if ( ! didCatchError ) {
didCatchError = true ;
caughtError = error ;
}
}
} ) ;
if ( didCatchError ) {
throw caughtError ;
}
2017-10-14 18:40:54 +02:00
}
2018-09-20 02:56:13 +02:00
function onWorkStopped ( interactions , threadID ) {
var didCatchError = false ;
var caughtError = null ;
2017-10-14 18:40:54 +02:00
2018-09-20 02:56:13 +02:00
subscribers . forEach ( function ( subscriber ) {
try {
subscriber . onWorkStopped ( interactions , threadID ) ;
} catch ( error ) {
if ( ! didCatchError ) {
didCatchError = true ;
caughtError = error ;
}
}
} ) ;
if ( didCatchError ) {
throw caughtError ;
}
2017-10-14 18:40:54 +02:00
}
2018-09-20 02:56:13 +02:00
function onWorkCanceled ( interactions , threadID ) {
var didCatchError = false ;
var caughtError = null ;
subscribers . forEach ( function ( subscriber ) {
try {
subscriber . onWorkCanceled ( interactions , threadID ) ;
} catch ( error ) {
if ( ! didCatchError ) {
didCatchError = true ;
caughtError = error ;
}
}
} ) ;
if ( didCatchError ) {
throw caughtError ;
}
}
2017-10-14 18:40:54 +02:00
/ * *
* Keeps track of the current owner .
*
* The current owner is the component who should own any components that are
* currently being constructed .
* /
var ReactCurrentOwner = {
/ * *
* @ internal
* @ type { ReactComponent }
* /
2018-09-20 02:56:13 +02:00
current : null ,
currentDispatcher : null
} ;
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 , '' ) ;
{
// In DEV, include code for a common special case:
// prefer "folder/index.js" instead of just "index.js".
if ( /^index\./ . test ( fileName ) ) {
var match = path . match ( BEFORE _SLASH _RE ) ;
if ( match ) {
var pathBeforeSlash = match [ 1 ] ;
if ( pathBeforeSlash ) {
var folderName = pathBeforeSlash . replace ( BEFORE _SLASH _RE , '' ) ;
fileName = folderName + '/' + fileName ;
}
}
}
}
sourceInfo = ' (at ' + fileName + ':' + source . lineNumber + ')' ;
} else if ( ownerName ) {
sourceInfo = ' (created by ' + ownerName + ')' ;
}
return '\n in ' + ( name || 'Unknown' ) + sourceInfo ;
2017-10-14 18:40:54 +02:00
} ;
2018-09-20 02:56:13 +02:00
var Resolved = 1 ;
function refineResolvedThenable ( thenable ) {
return thenable . _reactStatus === Resolved ? thenable . _reactResult : null ;
}
function getComponentName ( type ) {
if ( type == null ) {
// Host root, text node or just invalid type.
return null ;
}
{
if ( typeof type . tag === 'number' ) {
warningWithoutStack$1 ( false , 'Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.' ) ;
}
}
if ( typeof type === 'function' ) {
return type . displayName || type . name || null ;
}
if ( typeof type === 'string' ) {
return type ;
}
switch ( type ) {
case REACT _ASYNC _MODE _TYPE :
return 'AsyncMode' ;
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 _PLACEHOLDER _TYPE :
return 'Placeholder' ;
}
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 :
var renderFn = type . render ;
var functionName = renderFn . displayName || renderFn . name || '' ;
return type . displayName || ( functionName !== '' ? 'ForwardRef(' + functionName + ')' : 'ForwardRef' ) ;
}
if ( typeof type . then === 'function' ) {
var thenable = type ;
var resolvedThenable = refineResolvedThenable ( thenable ) ;
if ( resolvedThenable ) {
return getComponentName ( resolvedThenable ) ;
}
}
}
return null ;
}
var ReactDebugCurrentFrame = { } ;
var currentlyValidatingElement = null ;
function setCurrentlyValidatingElement ( element ) {
{
currentlyValidatingElement = element ;
}
}
{
// Stack implementation injected by the current renderer.
ReactDebugCurrentFrame . getCurrentStack = null ;
ReactDebugCurrentFrame . getStackAddendum = function ( ) {
var stack = '' ;
// Add an extra top frame while an element is being validated
if ( currentlyValidatingElement ) {
var name = getComponentName ( currentlyValidatingElement . type ) ;
var owner = currentlyValidatingElement . _owner ;
stack += describeComponentFrame ( name , currentlyValidatingElement . _source , owner && getComponentName ( owner . type ) ) ;
}
// Delegate to the injected renderer-specific implementation
var impl = ReactDebugCurrentFrame . getCurrentStack ;
if ( impl ) {
stack += impl ( ) || '' ;
}
return stack ;
} ;
}
var ReactSharedInternals = {
ReactCurrentOwner : ReactCurrentOwner ,
// Used by renderers to avoid bundling object-assign twice in UMD bundles:
assign : objectAssign
} ;
{
// Re-export the schedule API(s) for UMD bundles.
// This avoids introducing a dependency on a new UMD global in a minor update,
// Since that would be a breaking change (e.g. for all existing CodeSandboxes).
// This re-export is only required for UMD bundles;
// CJS bundles use the shared NPM package.
objectAssign ( ReactSharedInternals , {
Schedule : {
unstable _cancelScheduledWork : unstable _cancelScheduledWork ,
unstable _now : getCurrentTime ,
unstable _scheduleWork : unstable _scheduleWork
} ,
ScheduleTracing : {
_ _interactionsRef : interactionsRef ,
_ _subscriberRef : subscriberRef ,
unstable _clear : unstable _clear ,
unstable _getCurrent : unstable _getCurrent ,
unstable _getThreadID : unstable _getThreadID ,
unstable _subscribe : unstable _subscribe ,
unstable _trace : unstable _trace ,
unstable _unsubscribe : unstable _unsubscribe ,
unstable _wrap : unstable _wrap
}
} ) ;
}
{
objectAssign ( ReactSharedInternals , {
// These should not be included in production.
ReactDebugCurrentFrame : ReactDebugCurrentFrame ,
// Shim for React DOM 16.0.0 which still destructured (but not used) this.
// TODO: remove in React 17.0.
ReactComponentTreeHook : { }
} ) ;
}
/ * *
* 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 warning = warningWithoutStack$1 ;
{
warning = function ( condition , format ) {
if ( condition ) {
return ;
}
var ReactDebugCurrentFrame = ReactSharedInternals . ReactDebugCurrentFrame ;
var stack = ReactDebugCurrentFrame . getStackAddendum ( ) ;
// eslint-disable-next-line react-internal/warning-and-invariant-args
for ( var _len = arguments . length , args = Array ( _len > 2 ? _len - 2 : 0 ) , _key = 2 ; _key < _len ; _key ++ ) {
args [ _key - 2 ] = arguments [ _key ] ;
}
warningWithoutStack$1 . apply ( undefined , [ false , format + '%s' ] . concat ( args , [ stack ] ) ) ;
} ;
}
var warning$1 = warning ;
2017-10-14 18:40:54 +02:00
var hasOwnProperty$1 = Object . prototype . hasOwnProperty ;
var RESERVED _PROPS = {
key : true ,
ref : true ,
_ _self : true ,
_ _source : true
} ;
2018-09-20 02:56:13 +02:00
var specialPropKeyWarningShown = void 0 ;
var specialPropRefWarningShown = void 0 ;
2017-10-14 18:40:54 +02:00
function hasValidRef ( config ) {
{
if ( hasOwnProperty$1 . call ( config , 'ref' ) ) {
var getter = Object . getOwnPropertyDescriptor ( config , 'ref' ) . get ;
if ( getter && getter . isReactWarning ) {
return false ;
}
}
}
return config . ref !== undefined ;
}
function hasValidKey ( config ) {
{
if ( hasOwnProperty$1 . call ( config , 'key' ) ) {
var getter = Object . getOwnPropertyDescriptor ( config , 'key' ) . get ;
if ( getter && getter . isReactWarning ) {
return false ;
}
}
}
return config . key !== undefined ;
}
function defineKeyPropWarningGetter ( props , displayName ) {
var warnAboutAccessingKey = function ( ) {
if ( ! specialPropKeyWarningShown ) {
specialPropKeyWarningShown = true ;
2018-09-20 02:56:13 +02:00
warningWithoutStack$1 ( false , '%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)' , displayName ) ;
2017-10-14 18:40:54 +02:00
}
} ;
warnAboutAccessingKey . isReactWarning = true ;
Object . defineProperty ( props , 'key' , {
get : warnAboutAccessingKey ,
configurable : true
} ) ;
}
function defineRefPropWarningGetter ( props , displayName ) {
var warnAboutAccessingRef = function ( ) {
if ( ! specialPropRefWarningShown ) {
specialPropRefWarningShown = true ;
2018-09-20 02:56:13 +02:00
warningWithoutStack$1 ( false , '%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)' , displayName ) ;
2017-10-14 18:40:54 +02:00
}
} ;
warnAboutAccessingRef . isReactWarning = true ;
Object . defineProperty ( props , 'ref' , {
get : warnAboutAccessingRef ,
configurable : true
} ) ;
}
/ * *
* Factory method to create a new React element . This no longer adheres to
* the class pattern , so do not use new to call it . Also , no instanceof check
* will work . Instead test $$typeof field against Symbol . for ( 'react.element' ) to check
* if something is a React Element .
*
* @ param { * } type
* @ param { * } key
* @ param { string | object } ref
* @ param { * } self A * temporary * helper to detect places where ` this ` is
* different from the ` owner ` when React . createElement is called , so that we
* can warn . We want to get rid of owner and replace string ` ref ` s with arrow
* functions , and as long as ` this ` and owner are the same , there will be no
* change in behavior .
* @ param { * } source An annotation object ( added by a transpiler or otherwise )
* indicating filename , line number , and / or other information .
* @ param { * } owner
* @ param { * } props
* @ internal
* /
var ReactElement = function ( type , key , ref , self , source , owner , props ) {
var element = {
2018-09-20 02:56:13 +02:00
// This tag allows us to uniquely identify this as a React Element
2017-12-10 21:51:33 +01:00
$$typeof : REACT _ELEMENT _TYPE ,
2017-10-14 18:40:54 +02:00
// Built-in properties that belong on the element
type : type ,
key : key ,
ref : ref ,
props : props ,
// Record the component responsible for creating this element.
_owner : owner
} ;
{
// The validation flag is currently mutative. We put it on
// an external backing store so that we can freeze the whole object.
// This can be replaced with a WeakMap once they are implemented in
// commonly used development environments.
element . _store = { } ;
// To make comparing ReactElements easier for testing purposes, we make
// the validation flag non-enumerable (where possible, which should
// include every environment we run tests in), so the test framework
// ignores it.
Object . defineProperty ( element . _store , 'validated' , {
configurable : false ,
enumerable : false ,
writable : true ,
value : false
} ) ;
// self and source are DEV only properties.
Object . defineProperty ( element , '_self' , {
configurable : false ,
enumerable : false ,
writable : false ,
value : self
} ) ;
// Two elements created in two different places should be considered
// equal for testing purposes and therefore we hide it from enumeration.
Object . defineProperty ( element , '_source' , {
configurable : false ,
enumerable : false ,
writable : false ,
value : source
} ) ;
if ( Object . freeze ) {
Object . freeze ( element . props ) ;
Object . freeze ( element ) ;
}
}
return element ;
} ;
/ * *
* Create and return a new ReactElement of the given type .
2017-12-10 21:51:33 +01:00
* See https : //reactjs.org/docs/react-api.html#createelement
2017-10-14 18:40:54 +02:00
* /
2017-12-10 21:51:33 +01:00
function createElement ( type , config , children ) {
2018-09-20 02:56:13 +02:00
var propName = void 0 ;
2017-10-14 18:40:54 +02:00
// Reserved names are extracted
var props = { } ;
var key = null ;
var ref = null ;
var self = null ;
var source = null ;
if ( config != null ) {
if ( hasValidRef ( config ) ) {
ref = config . ref ;
}
if ( hasValidKey ( config ) ) {
key = '' + config . key ;
}
self = config . _ _self === undefined ? null : config . _ _self ;
source = config . _ _source === undefined ? null : config . _ _source ;
// Remaining properties are added to a new props object
for ( propName in config ) {
if ( hasOwnProperty$1 . call ( config , propName ) && ! RESERVED _PROPS . hasOwnProperty ( propName ) ) {
props [ propName ] = config [ propName ] ;
}
}
}
// Children can be more than one argument, and those are transferred onto
// the newly allocated props object.
var childrenLength = arguments . length - 2 ;
if ( childrenLength === 1 ) {
props . children = children ;
} else if ( childrenLength > 1 ) {
var childArray = Array ( childrenLength ) ;
for ( var i = 0 ; i < childrenLength ; i ++ ) {
childArray [ i ] = arguments [ i + 2 ] ;
}
{
if ( Object . freeze ) {
Object . freeze ( childArray ) ;
}
}
props . children = childArray ;
}
// Resolve default props
if ( type && type . defaultProps ) {
var defaultProps = type . defaultProps ;
for ( propName in defaultProps ) {
if ( props [ propName ] === undefined ) {
props [ propName ] = defaultProps [ propName ] ;
}
}
}
{
if ( key || ref ) {
2018-09-20 02:56:13 +02:00
var displayName = typeof type === 'function' ? type . displayName || type . name || 'Unknown' : type ;
if ( key ) {
defineKeyPropWarningGetter ( props , displayName ) ;
}
if ( ref ) {
defineRefPropWarningGetter ( props , displayName ) ;
2017-10-14 18:40:54 +02:00
}
}
}
2017-12-10 21:51:33 +01:00
return ReactElement ( type , key , ref , self , source , ReactCurrentOwner . current , props ) ;
}
2017-10-14 18:40:54 +02:00
/ * *
* Return a function that produces ReactElements of a given type .
2017-12-10 21:51:33 +01:00
* See https : //reactjs.org/docs/react-api.html#createfactory
2017-10-14 18:40:54 +02:00
* /
2017-12-10 21:51:33 +01:00
function cloneAndReplaceKey ( oldElement , newKey ) {
2017-10-14 18:40:54 +02:00
var newElement = ReactElement ( oldElement . type , newKey , oldElement . ref , oldElement . _self , oldElement . _source , oldElement . _owner , oldElement . props ) ;
return newElement ;
2017-12-10 21:51:33 +01:00
}
2017-10-14 18:40:54 +02:00
/ * *
* Clone and return a new ReactElement using element as the starting point .
2017-12-10 21:51:33 +01:00
* See https : //reactjs.org/docs/react-api.html#cloneelement
2017-10-14 18:40:54 +02:00
* /
2017-12-10 21:51:33 +01:00
function cloneElement ( element , config , children ) {
2018-09-20 02:56:13 +02:00
! ! ( element === null || element === undefined ) ? invariant ( false , 'React.cloneElement(...): The argument must be a React element, but you passed %s.' , element ) : void 0 ;
var propName = void 0 ;
2017-10-14 18:40:54 +02:00
// Original props are copied
2017-12-10 21:51:33 +01:00
var props = objectAssign ( { } , element . props ) ;
2017-10-14 18:40:54 +02:00
// Reserved names are extracted
var key = element . key ;
var ref = element . ref ;
// Self is preserved since the owner is preserved.
var self = element . _self ;
// Source is preserved since cloneElement is unlikely to be targeted by a
// transpiler, and the original source is probably a better indicator of the
// true owner.
var source = element . _source ;
// Owner will be preserved, unless ref is overridden
var owner = element . _owner ;
if ( config != null ) {
if ( hasValidRef ( config ) ) {
// Silently steal the ref from the parent.
ref = config . ref ;
2017-12-10 21:51:33 +01:00
owner = ReactCurrentOwner . current ;
2017-10-14 18:40:54 +02:00
}
if ( hasValidKey ( config ) ) {
key = '' + config . key ;
}
// Remaining properties override existing props
2018-09-20 02:56:13 +02:00
var defaultProps = void 0 ;
2017-10-14 18:40:54 +02:00
if ( element . type && element . type . defaultProps ) {
defaultProps = element . type . defaultProps ;
}
for ( propName in config ) {
if ( hasOwnProperty$1 . call ( config , propName ) && ! RESERVED _PROPS . hasOwnProperty ( propName ) ) {
if ( config [ propName ] === undefined && defaultProps !== undefined ) {
// Resolve default props
props [ propName ] = defaultProps [ propName ] ;
} else {
props [ propName ] = config [ propName ] ;
}
}
}
}
// Children can be more than one argument, and those are transferred onto
// the newly allocated props object.
var childrenLength = arguments . length - 2 ;
if ( childrenLength === 1 ) {
props . children = children ;
} else if ( childrenLength > 1 ) {
var childArray = Array ( childrenLength ) ;
for ( var i = 0 ; i < childrenLength ; i ++ ) {
childArray [ i ] = arguments [ i + 2 ] ;
}
props . children = childArray ;
}
return ReactElement ( element . type , key , ref , self , source , owner , props ) ;
2017-12-10 21:51:33 +01:00
}
2017-10-14 18:40:54 +02:00
/ * *
* Verifies the object is a ReactElement .
2017-12-10 21:51:33 +01:00
* See https : //reactjs.org/docs/react-api.html#isvalidelement
2017-10-14 18:40:54 +02:00
* @ param { ? object } object
2018-09-20 02:56:13 +02:00
* @ return { boolean } True if ` object ` is a ReactElement .
2017-10-14 18:40:54 +02:00
* @ final
* /
2017-12-10 21:51:33 +01:00
function isValidElement ( object ) {
return typeof object === 'object' && object !== null && object . $$typeof === REACT _ELEMENT _TYPE ;
}
2017-10-14 18:40:54 +02:00
var SEPARATOR = '.' ;
var SUBSEPARATOR = ':' ;
/ * *
* Escape and wrap key so it is safe to use as a reactid
*
* @ param { string } key to be escaped .
* @ return { string } the escaped key .
* /
function escape ( key ) {
var escapeRegex = /[=:]/g ;
var escaperLookup = {
'=' : '=0' ,
':' : '=2'
} ;
var escapedString = ( '' + key ) . replace ( escapeRegex , function ( match ) {
return escaperLookup [ match ] ;
} ) ;
return '$' + escapedString ;
}
/ * *
* TODO : Test that a single child and an array with one item have the same key
* pattern .
* /
var didWarnAboutMaps = false ;
var userProvidedKeyEscapeRegex = /\/+/g ;
function escapeUserProvidedKey ( text ) {
return ( '' + text ) . replace ( userProvidedKeyEscapeRegex , '$&/' ) ;
}
var POOL _SIZE = 10 ;
var traverseContextPool = [ ] ;
function getPooledTraverseContext ( mapResult , keyPrefix , mapFunction , mapContext ) {
if ( traverseContextPool . length ) {
var traverseContext = traverseContextPool . pop ( ) ;
traverseContext . result = mapResult ;
traverseContext . keyPrefix = keyPrefix ;
traverseContext . func = mapFunction ;
traverseContext . context = mapContext ;
traverseContext . count = 0 ;
return traverseContext ;
} else {
return {
result : mapResult ,
keyPrefix : keyPrefix ,
func : mapFunction ,
context : mapContext ,
count : 0
} ;
}
}
function releaseTraverseContext ( traverseContext ) {
traverseContext . result = null ;
traverseContext . keyPrefix = null ;
traverseContext . func = null ;
traverseContext . context = null ;
traverseContext . count = 0 ;
if ( traverseContextPool . length < POOL _SIZE ) {
traverseContextPool . push ( traverseContext ) ;
}
}
/ * *
* @ param { ? * } children Children tree container .
* @ param { ! string } nameSoFar Name of the key path so far .
* @ param { ! function } callback Callback to invoke with each child found .
* @ param { ? * } traverseContext Used to pass information throughout the traversal
* process .
* @ return { ! number } The number of children in this subtree .
* /
function traverseAllChildrenImpl ( children , nameSoFar , callback , traverseContext ) {
var type = typeof children ;
if ( type === 'undefined' || type === 'boolean' ) {
// All of the above are perceived as null.
children = null ;
}
2017-12-10 21:51:33 +01:00
var invokeCallback = false ;
if ( children === null ) {
invokeCallback = true ;
} else {
switch ( type ) {
case 'string' :
case 'number' :
invokeCallback = true ;
break ;
case 'object' :
switch ( children . $$typeof ) {
case REACT _ELEMENT _TYPE :
case REACT _PORTAL _TYPE :
invokeCallback = true ;
}
}
}
if ( invokeCallback ) {
2017-10-14 18:40:54 +02:00
callback ( traverseContext , children ,
// If it's the only child, treat the name as if it was wrapped in an array
// so that it's consistent if the number of children grows.
nameSoFar === '' ? SEPARATOR + getComponentKey ( children , 0 ) : nameSoFar ) ;
return 1 ;
}
2018-09-20 02:56:13 +02:00
var child = void 0 ;
var nextName = void 0 ;
2017-10-14 18:40:54 +02:00
var subtreeCount = 0 ; // Count of children found in the current subtree.
var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR ;
if ( Array . isArray ( children ) ) {
for ( var i = 0 ; i < children . length ; i ++ ) {
child = children [ i ] ;
nextName = nextNamePrefix + getComponentKey ( child , i ) ;
subtreeCount += traverseAllChildrenImpl ( child , nextName , callback , traverseContext ) ;
}
} else {
2017-12-10 21:51:33 +01:00
var iteratorFn = getIteratorFn ( children ) ;
2017-10-14 18:40:54 +02:00
if ( typeof iteratorFn === 'function' ) {
{
// Warn about using Maps as children
if ( iteratorFn === children . entries ) {
2018-09-20 02:56:13 +02:00
! didWarnAboutMaps ? warning$1 ( false , 'Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.' ) : void 0 ;
2017-10-14 18:40:54 +02:00
didWarnAboutMaps = true ;
}
}
var iterator = iteratorFn . call ( children ) ;
2018-09-20 02:56:13 +02:00
var step = void 0 ;
2017-10-14 18:40:54 +02:00
var ii = 0 ;
while ( ! ( step = iterator . next ( ) ) . done ) {
child = step . value ;
nextName = nextNamePrefix + getComponentKey ( child , ii ++ ) ;
subtreeCount += traverseAllChildrenImpl ( child , nextName , callback , traverseContext ) ;
}
} else if ( type === 'object' ) {
var addendum = '' ;
{
2017-12-10 21:51:33 +01:00
addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + ReactDebugCurrentFrame . getStackAddendum ( ) ;
2017-10-14 18:40:54 +02:00
}
var childrenString = '' + children ;
2018-09-20 02:56:13 +02:00
invariant ( false , 'Objects are not valid as a React child (found: %s).%s' , childrenString === '[object Object]' ? 'object with keys {' + Object . keys ( children ) . join ( ', ' ) + '}' : childrenString , addendum ) ;
2017-10-14 18:40:54 +02:00
}
}
return subtreeCount ;
}
/ * *
* Traverses children that are typically specified as ` props.children ` , but
* might also be specified through attributes :
*
* - ` traverseAllChildren(this.props.children, ...) `
* - ` traverseAllChildren(this.props.leftPanelChildren, ...) `
*
* The ` traverseContext ` is an optional argument that is passed through the
* entire traversal . It can be used to store accumulations or anything else that
* the callback might find relevant .
*
* @ param { ? * } children Children tree object .
* @ param { ! function } callback To invoke upon traversing each child .
* @ param { ? * } traverseContext Context for traversal .
* @ return { ! number } The number of children in this subtree .
* /
function traverseAllChildren ( children , callback , traverseContext ) {
if ( children == null ) {
return 0 ;
}
return traverseAllChildrenImpl ( children , '' , callback , traverseContext ) ;
}
/ * *
* Generate a key string that identifies a component within a set .
*
* @ param { * } component A component that could contain a manual key .
* @ param { number } index Index that is used if a manual key is not provided .
* @ return { string }
* /
function getComponentKey ( component , index ) {
// Do some typechecking here since we call this blindly. We want to ensure
// that we don't block potential future ES APIs.
if ( typeof component === 'object' && component !== null && component . key != null ) {
// Explicit key
return escape ( component . key ) ;
}
// Implicit key determined by the index in the set
return index . toString ( 36 ) ;
}
function forEachSingleChild ( bookKeeping , child , name ) {
var func = bookKeeping . func ,
context = bookKeeping . context ;
func . call ( context , child , bookKeeping . count ++ ) ;
}
/ * *
* Iterates through children that are typically specified as ` props.children ` .
*
2018-09-20 02:56:13 +02:00
* See https : //reactjs.org/docs/react-api.html#reactchildrenforeach
2017-10-14 18:40:54 +02:00
*
* The provided forEachFunc ( child , index ) will be called for each
* leaf child .
*
* @ param { ? * } children Children tree container .
* @ param { function ( * , int ) } forEachFunc
* @ param { * } forEachContext Context for forEachContext .
* /
function forEachChildren ( children , forEachFunc , forEachContext ) {
if ( children == null ) {
return children ;
}
var traverseContext = getPooledTraverseContext ( null , null , forEachFunc , forEachContext ) ;
traverseAllChildren ( children , forEachSingleChild , traverseContext ) ;
releaseTraverseContext ( traverseContext ) ;
}
function mapSingleChildIntoContext ( bookKeeping , child , childKey ) {
var result = bookKeeping . result ,
keyPrefix = bookKeeping . keyPrefix ,
func = bookKeeping . func ,
context = bookKeeping . context ;
var mappedChild = func . call ( context , child , bookKeeping . count ++ ) ;
if ( Array . isArray ( mappedChild ) ) {
2018-09-20 02:56:13 +02:00
mapIntoWithKeyPrefixInternal ( mappedChild , result , childKey , function ( c ) {
return c ;
} ) ;
2017-10-14 18:40:54 +02:00
} else if ( mappedChild != null ) {
2017-12-10 21:51:33 +01:00
if ( isValidElement ( mappedChild ) ) {
mappedChild = cloneAndReplaceKey ( mappedChild ,
2017-10-14 18:40:54 +02:00
// Keep both the (mapped) and old keys if they differ, just as
// traverseAllChildren used to do for objects as children
keyPrefix + ( mappedChild . key && ( ! child || child . key !== mappedChild . key ) ? escapeUserProvidedKey ( mappedChild . key ) + '/' : '' ) + childKey ) ;
}
result . push ( mappedChild ) ;
}
}
function mapIntoWithKeyPrefixInternal ( children , array , prefix , func , context ) {
var escapedPrefix = '' ;
if ( prefix != null ) {
escapedPrefix = escapeUserProvidedKey ( prefix ) + '/' ;
}
var traverseContext = getPooledTraverseContext ( array , escapedPrefix , func , context ) ;
traverseAllChildren ( children , mapSingleChildIntoContext , traverseContext ) ;
releaseTraverseContext ( traverseContext ) ;
}
/ * *
* Maps children that are typically specified as ` props.children ` .
*
2018-09-20 02:56:13 +02:00
* See https : //reactjs.org/docs/react-api.html#reactchildrenmap
2017-10-14 18:40:54 +02:00
*
* The provided mapFunction ( child , key , index ) will be called for each
* leaf child .
*
* @ param { ? * } children Children tree container .
* @ param { function ( * , int ) } func The map function .
* @ param { * } context Context for mapFunction .
* @ return { object } Object containing the ordered map of results .
* /
function mapChildren ( children , func , context ) {
if ( children == null ) {
return children ;
}
var result = [ ] ;
mapIntoWithKeyPrefixInternal ( children , result , null , func , context ) ;
return result ;
}
/ * *
* Count the number of children that are typically specified as
* ` props.children ` .
*
2018-09-20 02:56:13 +02:00
* See https : //reactjs.org/docs/react-api.html#reactchildrencount
2017-10-14 18:40:54 +02:00
*
* @ param { ? * } children Children tree container .
* @ return { number } The number of children .
* /
2018-09-20 02:56:13 +02:00
function countChildren ( children ) {
return traverseAllChildren ( children , function ( ) {
return null ;
} , null ) ;
2017-10-14 18:40:54 +02:00
}
/ * *
* Flatten a children object ( typically specified as ` props.children ` ) and
* return an array with appropriately re - keyed children .
*
2018-09-20 02:56:13 +02:00
* See https : //reactjs.org/docs/react-api.html#reactchildrentoarray
2017-10-14 18:40:54 +02:00
* /
function toArray ( children ) {
var result = [ ] ;
2018-09-20 02:56:13 +02:00
mapIntoWithKeyPrefixInternal ( children , result , null , function ( child ) {
return child ;
} ) ;
2017-10-14 18:40:54 +02:00
return result ;
}
/ * *
* Returns the first child in a collection of children and verifies that there
* is only one child in the collection .
*
2018-09-20 02:56:13 +02:00
* See https : //reactjs.org/docs/react-api.html#reactchildrenonly
2017-10-14 18:40:54 +02:00
*
* The current implementation of this function assumes that a single child gets
* passed without a wrapper , but the purpose of this helper function is to
* abstract away the particular structure of children .
*
* @ param { ? object } children Child collection structure .
* @ return { ReactElement } The first and only ` ReactElement ` contained in the
* structure .
* /
function onlyChild ( children ) {
2018-09-20 02:56:13 +02:00
! isValidElement ( children ) ? invariant ( false , 'React.Children.only expected to receive a single React element child.' ) : void 0 ;
2017-10-14 18:40:54 +02:00
return children ;
}
2018-09-20 02:56:13 +02:00
function readContext ( context , observedBits ) {
var dispatcher = ReactCurrentOwner . currentDispatcher ;
! ( dispatcher !== null ) ? invariant ( false , 'Context.unstable_read(): Context can only be read while React is rendering, e.g. inside the render method or getDerivedStateFromProps.' ) : void 0 ;
return dispatcher . readContext ( context , observedBits ) ;
}
2017-12-10 21:51:33 +01:00
2018-09-20 02:56:13 +02:00
function createContext ( defaultValue , calculateChangedBits ) {
if ( calculateChangedBits === undefined ) {
calculateChangedBits = null ;
} else {
{
! ( calculateChangedBits === null || typeof calculateChangedBits === 'function' ) ? warningWithoutStack$1 ( false , 'createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s' , calculateChangedBits ) : void 0 ;
}
}
2017-12-10 21:51:33 +01:00
2018-09-20 02:56:13 +02:00
var context = {
$$typeof : REACT _CONTEXT _TYPE ,
_calculateChangedBits : calculateChangedBits ,
// As a workaround to support multiple concurrent renderers, we categorize
// some renderers as primary and others as secondary. We only expect
// there to be two concurrent renderers at most: React Native (primary) and
// Fabric (secondary); React DOM (primary) and React ART (secondary).
// Secondary renderers store their context values on separate fields.
_currentValue : defaultValue ,
_currentValue2 : defaultValue ,
// These are circular
Provider : null ,
Consumer : null ,
unstable _read : null
} ;
context . Provider = {
$$typeof : REACT _PROVIDER _TYPE ,
_context : context
} ;
context . Consumer = context ;
context . unstable _read = readContext . bind ( null , context ) ;
{
context . _currentRenderer = null ;
context . _currentRenderer2 = null ;
2017-12-10 21:51:33 +01:00
}
2018-09-20 02:56:13 +02:00
return context ;
}
function lazy ( ctor ) {
var thenable = null ;
return {
then : function ( resolve , reject ) {
if ( thenable === null ) {
// Lazily create thenable by wrapping in an extra thenable.
thenable = ctor ( ) ;
ctor = null ;
}
return thenable . then ( resolve , reject ) ;
} ,
// React uses these fields to store the result.
_reactStatus : - 1 ,
_reactResult : null
} ;
}
function forwardRef ( render ) {
{
if ( typeof render !== 'function' ) {
warningWithoutStack$1 ( false , 'forwardRef requires a render function but was given %s.' , render === null ? 'null' : typeof render ) ;
} else {
! (
// Do not warn for 0 arguments because it could be due to usage of the 'arguments' object
render . length === 0 || render . length === 2 ) ? warningWithoutStack$1 ( false , 'forwardRef render functions accept exactly two parameters: props and ref. %s' , render . length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.' ) : void 0 ;
}
if ( render != null ) {
! ( render . defaultProps == null && render . propTypes == null ) ? warningWithoutStack$1 ( false , 'forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?' ) : void 0 ;
}
2017-12-10 21:51:33 +01:00
}
2018-09-20 02:56:13 +02:00
return {
$$typeof : REACT _FORWARD _REF _TYPE ,
render : render
} ;
}
function isValidElementType ( type ) {
return typeof type === 'string' || typeof type === 'function' ||
// Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.
type === REACT _FRAGMENT _TYPE || type === REACT _ASYNC _MODE _TYPE || type === REACT _PROFILER _TYPE || type === REACT _STRICT _MODE _TYPE || type === REACT _PLACEHOLDER _TYPE || typeof type === 'object' && type !== null && ( typeof type . then === 'function' || type . $$typeof === REACT _PROVIDER _TYPE || type . $$typeof === REACT _CONTEXT _TYPE || type . $$typeof === REACT _FORWARD _REF _TYPE ) ;
2017-12-10 21:51:33 +01:00
}
2017-10-14 18:40:54 +02:00
/ * *
* 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 .
* /
2017-12-10 21:51:33 +01:00
2017-10-14 18:40:54 +02:00
var ReactPropTypesSecret$1 = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED' ;
var ReactPropTypesSecret _1 = ReactPropTypesSecret$1 ;
2017-12-10 21:51:33 +01:00
/ * *
* 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 .
* /
2018-09-20 02:56:13 +02:00
var printWarning$1 = function ( ) { } ;
2017-10-14 18:40:54 +02:00
{
var ReactPropTypesSecret = ReactPropTypesSecret _1 ;
var loggedTypeFailures = { } ;
2018-09-20 02:56:13 +02:00
printWarning$1 = function ( text ) {
var message = 'Warning: ' + text ;
if ( typeof console !== 'undefined' ) {
console . error ( message ) ;
}
try {
// --- Welcome to debugging React ---
// This error was thrown as a convenience so that you can use this stack
// to find the callsite that caused this warning to fire.
throw new Error ( message ) ;
} catch ( x ) { }
} ;
2017-10-14 18:40:54 +02:00
}
/ * *
* 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
* /
2017-12-10 21:51:33 +01:00
function checkPropTypes ( typeSpecs , values , location , componentName , getStack ) {
2017-10-14 18:40:54 +02:00
{
for ( var typeSpecName in typeSpecs ) {
if ( typeSpecs . hasOwnProperty ( typeSpecName ) ) {
var error ;
// Prop type validation may throw. In case they do, we don't want to
// fail the render phase where it didn't fail before. So we log it.
// After these have been cleaned up, we'll let them throw.
try {
// This is intentionally an invariant that gets caught. It's the same
// behavior as without this statement except with a better message.
2018-09-20 02:56:13 +02:00
if ( typeof typeSpecs [ typeSpecName ] !== 'function' ) {
var err = Error (
( componentName || 'React class' ) + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs [ typeSpecName ] + '`.'
) ;
err . name = 'Invariant Violation' ;
throw err ;
}
2017-10-14 18:40:54 +02:00
error = typeSpecs [ typeSpecName ] ( values , typeSpecName , componentName , location , null , ReactPropTypesSecret ) ;
} catch ( ex ) {
error = ex ;
}
2018-09-20 02:56:13 +02:00
if ( error && ! ( error instanceof Error ) ) {
printWarning$1 (
( componentName || 'React class' ) + ': type specification of ' +
location + ' `' + typeSpecName + '` is invalid; the type checker ' +
'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
'You may have forgotten to pass an argument to the type checker ' +
'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
'shape all require an argument).'
) ;
}
2017-10-14 18:40:54 +02:00
if ( error instanceof Error && ! ( error . message in loggedTypeFailures ) ) {
// Only monitor this failure once because there tends to be a lot of the
// same error.
loggedTypeFailures [ error . message ] = true ;
var stack = getStack ? getStack ( ) : '' ;
2018-09-20 02:56:13 +02:00
printWarning$1 (
'Failed ' + location + ' type: ' + error . message + ( stack != null ? stack : '' )
) ;
2017-10-14 18:40:54 +02:00
}
}
}
}
}
2017-12-10 21:51:33 +01:00
var checkPropTypes _1 = checkPropTypes ;
2017-10-14 18:40:54 +02:00
/ * *
2017-12-10 21:51:33 +01:00
* ReactElementValidator provides a wrapper around a element factory
* which validates the props passed to the element . This is intended to be
* used only in DEV and could be replaced by a static type checker for languages
* that support it .
2017-10-14 18:40:54 +02:00
* /
2018-09-20 02:56:13 +02:00
var propTypesMisspellWarningShown = void 0 ;
2017-10-14 18:40:54 +02:00
2018-09-20 02:56:13 +02:00
{
propTypesMisspellWarningShown = false ;
2017-12-10 21:51:33 +01:00
}
2017-10-14 18:40:54 +02:00
function getDeclarationErrorAddendum ( ) {
2017-12-10 21:51:33 +01:00
if ( ReactCurrentOwner . current ) {
2018-09-20 02:56:13 +02:00
var name = getComponentName ( ReactCurrentOwner . current . type ) ;
2017-10-14 18:40:54 +02:00
if ( name ) {
return '\n\nCheck the render method of `' + name + '`.' ;
}
}
return '' ;
}
function getSourceInfoErrorAddendum ( elementProps ) {
if ( elementProps !== null && elementProps !== undefined && elementProps . _ _source !== undefined ) {
var source = elementProps . _ _source ;
var fileName = source . fileName . replace ( /^.*[\\\/]/ , '' ) ;
var lineNumber = source . lineNumber ;
return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.' ;
}
return '' ;
}
/ * *
* Warn if there ' s no key explicitly set on dynamic arrays of children or
* object keys are not valid . This allows us to keep track of children between
* updates .
* /
var ownerHasKeyUseWarning = { } ;
function getCurrentComponentErrorInfo ( parentType ) {
var info = getDeclarationErrorAddendum ( ) ;
if ( ! info ) {
var parentName = typeof parentType === 'string' ? parentType : parentType . displayName || parentType . name ;
if ( parentName ) {
info = '\n\nCheck the top-level render call using <' + parentName + '>.' ;
}
}
return info ;
}
/ * *
* Warn if the element doesn ' t have an explicit key assigned to it .
* This element is in an array . The array could grow and shrink or be
* reordered . All children that haven ' t already been validated are required to
* have a "key" property assigned to it . Error statuses are cached so a warning
* will only be shown once .
*
* @ internal
* @ param { ReactElement } element Element that requires a key .
* @ param { * } parentType element 's parent' s type .
* /
function validateExplicitKey ( element , parentType ) {
if ( ! element . _store || element . _store . validated || element . key != null ) {
return ;
}
element . _store . validated = true ;
var currentComponentErrorInfo = getCurrentComponentErrorInfo ( parentType ) ;
if ( ownerHasKeyUseWarning [ currentComponentErrorInfo ] ) {
return ;
}
ownerHasKeyUseWarning [ currentComponentErrorInfo ] = true ;
// Usually the current owner is the offender, but if it accepts children as a
// property, it may be the creator of the child that's responsible for
// assigning it a key.
var childOwner = '' ;
2017-12-10 21:51:33 +01:00
if ( element && element . _owner && element . _owner !== ReactCurrentOwner . current ) {
2017-10-14 18:40:54 +02:00
// Give the component that originally created this child.
2018-09-20 02:56:13 +02:00
childOwner = ' It was passed a child from ' + getComponentName ( element . _owner . type ) + '.' ;
2017-10-14 18:40:54 +02:00
}
2018-09-20 02:56:13 +02:00
setCurrentlyValidatingElement ( element ) ;
2017-10-14 18:40:54 +02:00
{
2018-09-20 02:56:13 +02:00
warning$1 ( false , 'Each child in an array or iterator should have a unique "key" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.' , currentComponentErrorInfo , childOwner ) ;
2017-10-14 18:40:54 +02:00
}
2018-09-20 02:56:13 +02:00
setCurrentlyValidatingElement ( null ) ;
2017-10-14 18:40:54 +02:00
}
/ * *
* Ensure that every element either is passed in a static location , in an
* array with an explicit keys property defined , or in an object literal
* with valid key property .
*
* @ internal
* @ param { ReactNode } node Statically passed child of any type .
* @ param { * } parentType node 's parent' s type .
* /
function validateChildKeys ( node , parentType ) {
if ( typeof node !== 'object' ) {
return ;
}
if ( Array . isArray ( node ) ) {
for ( var i = 0 ; i < node . length ; i ++ ) {
var child = node [ i ] ;
2017-12-10 21:51:33 +01:00
if ( isValidElement ( child ) ) {
2017-10-14 18:40:54 +02:00
validateExplicitKey ( child , parentType ) ;
}
}
2017-12-10 21:51:33 +01:00
} else if ( isValidElement ( node ) ) {
2017-10-14 18:40:54 +02:00
// This element was passed in a valid location.
if ( node . _store ) {
node . _store . validated = true ;
}
} else if ( node ) {
2017-12-10 21:51:33 +01:00
var iteratorFn = getIteratorFn ( node ) ;
2017-10-14 18:40:54 +02:00
if ( typeof iteratorFn === 'function' ) {
// Entry iterators used to provide implicit keys,
// but now we print a separate warning for them later.
if ( iteratorFn !== node . entries ) {
var iterator = iteratorFn . call ( node ) ;
2018-09-20 02:56:13 +02:00
var step = void 0 ;
2017-10-14 18:40:54 +02:00
while ( ! ( step = iterator . next ( ) ) . done ) {
2017-12-10 21:51:33 +01:00
if ( isValidElement ( step . value ) ) {
2017-10-14 18:40:54 +02:00
validateExplicitKey ( step . value , parentType ) ;
}
}
}
}
}
}
/ * *
* Given an element , validate that its props follow the propTypes definition ,
* provided by the type .
*
* @ param { ReactElement } element
* /
function validatePropTypes ( element ) {
2018-09-20 02:56:13 +02:00
var type = element . type ;
var name = void 0 ,
propTypes = void 0 ;
if ( typeof type === 'function' ) {
// Class or functional component
name = type . displayName || type . name ;
propTypes = type . propTypes ;
} else if ( typeof type === 'object' && type !== null && type . $$typeof === REACT _FORWARD _REF _TYPE ) {
// ForwardRef
var functionName = type . render . displayName || type . render . name || '' ;
name = type . displayName || ( functionName !== '' ? 'ForwardRef(' + functionName + ')' : 'ForwardRef' ) ;
propTypes = type . propTypes ;
} else {
2017-10-14 18:40:54 +02:00
return ;
}
if ( propTypes ) {
2018-09-20 02:56:13 +02:00
setCurrentlyValidatingElement ( element ) ;
checkPropTypes _1 ( propTypes , element . props , 'prop' , name , ReactDebugCurrentFrame . getStackAddendum ) ;
setCurrentlyValidatingElement ( null ) ;
} else if ( type . PropTypes !== undefined && ! propTypesMisspellWarningShown ) {
2017-12-10 21:51:33 +01:00
propTypesMisspellWarningShown = true ;
2018-09-20 02:56:13 +02:00
warningWithoutStack$1 ( false , 'Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?' , name || 'Unknown' ) ;
2017-10-14 18:40:54 +02:00
}
2018-09-20 02:56:13 +02:00
if ( typeof type . getDefaultProps === 'function' ) {
! type . getDefaultProps . isReactClassApproved ? warningWithoutStack$1 ( false , 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.' ) : void 0 ;
2017-10-14 18:40:54 +02:00
}
}
2017-12-10 21:51:33 +01:00
/ * *
* Given a fragment , validate that it can only be provided with fragment props
* @ param { ReactElement } fragment
* /
function validateFragmentProps ( fragment ) {
2018-09-20 02:56:13 +02:00
setCurrentlyValidatingElement ( fragment ) ;
var keys = Object . keys ( fragment . props ) ;
for ( var i = 0 ; i < keys . length ; i ++ ) {
var key = keys [ i ] ;
if ( key !== 'children' && key !== 'key' ) {
warning$1 ( false , 'Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.' , key ) ;
break ;
2017-10-14 18:40:54 +02:00
}
2017-12-10 21:51:33 +01:00
}
2017-10-14 18:40:54 +02:00
2017-12-10 21:51:33 +01:00
if ( fragment . ref !== null ) {
2018-09-20 02:56:13 +02:00
warning$1 ( false , 'Invalid attribute `ref` supplied to `React.Fragment`.' ) ;
2017-12-10 21:51:33 +01:00
}
2017-10-14 18:40:54 +02:00
2018-09-20 02:56:13 +02:00
setCurrentlyValidatingElement ( null ) ;
2017-12-10 21:51:33 +01:00
}
2017-10-14 18:40:54 +02:00
2017-12-10 21:51:33 +01:00
function createElementWithValidation ( type , props , children ) {
2018-09-20 02:56:13 +02:00
var validType = isValidElementType ( type ) ;
2017-12-10 21:51:33 +01:00
// We warn in this case but don't throw. We expect the element creation to
// succeed and there will likely be errors in render.
if ( ! validType ) {
var info = '' ;
if ( type === undefined || typeof type === 'object' && type !== null && Object . keys ( type ) . length === 0 ) {
info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports." ;
2017-10-14 18:40:54 +02:00
}
2017-12-10 21:51:33 +01:00
var sourceInfo = getSourceInfoErrorAddendum ( props ) ;
if ( sourceInfo ) {
info += sourceInfo ;
} else {
info += getDeclarationErrorAddendum ( ) ;
2017-10-14 18:40:54 +02:00
}
2018-09-20 02:56:13 +02:00
var typeString = void 0 ;
if ( type === null ) {
typeString = 'null' ;
} else if ( Array . isArray ( type ) ) {
typeString = 'array' ;
} else if ( type !== undefined && type . $$typeof === REACT _ELEMENT _TYPE ) {
typeString = '<' + ( getComponentName ( type . type ) || 'Unknown' ) + ' />' ;
info = ' Did you accidentally export a JSX literal instead of a component?' ;
} else {
typeString = typeof type ;
}
2017-10-14 18:40:54 +02:00
2018-09-20 02:56:13 +02:00
warning$1 ( false , 'React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s' , typeString , info ) ;
2017-10-14 18:40:54 +02:00
}
2017-12-10 21:51:33 +01:00
var element = createElement . apply ( this , arguments ) ;
2017-10-14 18:40:54 +02:00
2017-12-10 21:51:33 +01:00
// The result can be nullish if a mock or a custom function is used.
// TODO: Drop this when these are no longer allowed as the type argument.
if ( element == null ) {
return element ;
}
2017-10-14 18:40:54 +02:00
2017-12-10 21:51:33 +01:00
// Skip key warning if the type isn't valid since our key validation logic
// doesn't expect a non-string/function type and can throw confusing errors.
// We don't want exception behavior to differ between dev and prod.
// (Rendering will throw with a helpful message and as soon as the type is
// fixed, the key warnings will appear.)
if ( validType ) {
for ( var i = 2 ; i < arguments . length ; i ++ ) {
validateChildKeys ( arguments [ i ] , type ) ;
}
2017-10-14 18:40:54 +02:00
}
2018-09-20 02:56:13 +02:00
if ( type === REACT _FRAGMENT _TYPE ) {
2017-12-10 21:51:33 +01:00
validateFragmentProps ( element ) ;
2017-10-14 18:40:54 +02:00
} else {
2017-12-10 21:51:33 +01:00
validatePropTypes ( element ) ;
2017-10-14 18:40:54 +02:00
}
2017-12-10 21:51:33 +01:00
return element ;
2017-10-14 18:40:54 +02:00
}
2017-12-10 21:51:33 +01:00
function createFactoryWithValidation ( type ) {
var validatedFactory = createElementWithValidation . bind ( null , type ) ;
validatedFactory . type = type ;
2018-09-20 02:56:13 +02:00
// Legacy hook: remove it
2017-12-10 21:51:33 +01:00
{
Object . defineProperty ( validatedFactory , 'type' , {
enumerable : false ,
get : function ( ) {
lowPriorityWarning$1 ( false , 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.' ) ;
Object . defineProperty ( this , 'type' , {
value : type
} ) ;
return type ;
2017-10-14 18:40:54 +02:00
}
2017-12-10 21:51:33 +01:00
} ) ;
}
2017-10-14 18:40:54 +02:00
2017-12-10 21:51:33 +01:00
return validatedFactory ;
}
2017-10-14 18:40:54 +02:00
2017-12-10 21:51:33 +01:00
function cloneElementWithValidation ( element , props , children ) {
var newElement = cloneElement . apply ( this , arguments ) ;
for ( var i = 2 ; i < arguments . length ; i ++ ) {
validateChildKeys ( arguments [ i ] , newElement . type ) ;
}
validatePropTypes ( newElement ) ;
return newElement ;
2017-10-14 18:40:54 +02:00
}
var React = {
Children : {
2017-12-10 21:51:33 +01:00
map : mapChildren ,
forEach : forEachChildren ,
count : countChildren ,
toArray : toArray ,
only : onlyChild
2017-10-14 18:40:54 +02:00
} ,
2018-09-20 02:56:13 +02:00
createRef : createRef ,
2017-12-10 21:51:33 +01:00
Component : Component ,
PureComponent : PureComponent ,
2018-09-20 02:56:13 +02:00
createContext : createContext ,
forwardRef : forwardRef ,
2017-10-14 18:40:54 +02:00
2017-12-10 21:51:33 +01:00
Fragment : REACT _FRAGMENT _TYPE ,
2018-09-20 02:56:13 +02:00
StrictMode : REACT _STRICT _MODE _TYPE ,
unstable _AsyncMode : REACT _ASYNC _MODE _TYPE ,
unstable _Profiler : REACT _PROFILER _TYPE ,
2017-10-14 18:40:54 +02:00
2017-12-10 21:51:33 +01:00
createElement : createElementWithValidation ,
cloneElement : cloneElementWithValidation ,
createFactory : createFactoryWithValidation ,
isValidElement : isValidElement ,
2017-10-14 18:40:54 +02:00
version : ReactVersion ,
2018-09-20 02:56:13 +02:00
_ _SECRET _INTERNALS _DO _NOT _USE _OR _YOU _WILL _BE _FIRED : ReactSharedInternals
2017-10-14 18:40:54 +02:00
} ;
2018-09-20 02:56:13 +02:00
if ( enableSuspense ) {
React . Placeholder = REACT _PLACEHOLDER _TYPE ;
React . lazy = lazy ;
2017-10-14 18:40:54 +02:00
}
2017-12-10 21:51:33 +01:00
var React$2 = Object . freeze ( {
default : React
} ) ;
var React$3 = ( React$2 && React ) || React$2 ;
// TODO: decide on the top-level export form.
// This is hacky but makes it work with both Rollup and Jest.
2018-09-20 02:56:13 +02:00
var react = React$3 . default || React$3 ;
2017-12-10 21:51:33 +01:00
return react ;
2017-10-14 18:40:54 +02:00
} ) ) ) ;