Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc059579c3 | ||
|
|
787b343f67 | ||
|
|
2279843ef9 | ||
|
|
a2cc3c38e2 | ||
|
|
36c2939372 | ||
|
|
0f2f90bd9a | ||
|
|
da4e85567b | ||
|
|
eb6e752cab | ||
|
|
ba245f6f9b | ||
|
|
6f2ea73978 | ||
|
|
4ccf58a94d | ||
|
|
7a27ebd52a | ||
|
|
6b99c6f9d3 | ||
|
|
59dac9d7a6 | ||
|
|
0c80977061 | ||
|
|
fa8e67893f | ||
|
|
59b39056d9 | ||
|
|
18ba36d891 | ||
|
|
43044757e5 | ||
|
|
2c3f5fb97b |
55
CHANGELOG.md
55
CHANGELOG.md
@@ -4,25 +4,78 @@
|
||||
Changes that have landed in master but are not yet released.
|
||||
Click to see more.
|
||||
</summary>
|
||||
</details>
|
||||
|
||||
## 16.3.0 (March 29, 2018)
|
||||
|
||||
### React
|
||||
|
||||
* Add a new officially supported context API. ([@acdlite](https://github.com/acdlite) in [#11818](https://github.com/facebook/react/pull/11818))
|
||||
* Add a new `React.createRef()` API as an ergonomic alternative to callback refs. ([@trueadm](https://github.com/trueadm) in [#12162](https://github.com/facebook/react/pull/12162))
|
||||
* Add a new `React.forwardRef()` API to let components forward their refs to a child. ([@bvaughn](https://github.com/bvaughn) in [#12346](https://github.com/facebook/react/pull/12346))
|
||||
* Fix a false positive warning in IE11 when using `React.Fragment`. ([@XaveScor](https://github.com/XaveScor) in [#11823](https://github.com/facebook/react/pull/11823))
|
||||
* Replace `React.unstable_AsyncComponent` with `React.unstable_AsyncMode`. ([@acdlite](https://github.com/acdlite) in [#12117](https://github.com/facebook/react/pull/12117))
|
||||
* Improve the error message when calling `setState()` on an unmounted component. ([@sophiebits](https://github.com/sophiebits) in [#12347](https://github.com/facebook/react/pull/12347))
|
||||
|
||||
### React DOM
|
||||
|
||||
* Add a new `getDerivedStateFromProps()` lifecycle and `UNSAFE_` aliases for the legacy lifecycles. ([@bvaughn](https://github.com/bvaughn) in [#12028](https://github.com/facebook/react/pull/12028))
|
||||
* Add a new `getSnapshotBeforeUpdate()` lifecycle. ([@bvaughn](https://github.com/bvaughn) in [#12404](https://github.com/facebook/react/pull/12404))
|
||||
* Add a new `<React.StrictMode>` wrapper to help prepare apps for async rendering. ([@bvaughn](https://github.com/bvaughn) in [#12083](https://github.com/facebook/react/pull/12083))
|
||||
* Add support for `onLoad` and `onError` events on the `<link>` tag. ([@roderickhsiao](https://github.com/roderickhsiao) in [#11825](https://github.com/facebook/react/pull/11825))
|
||||
* Add support for `noModule` boolean attribute on the `<script>` tag. ([@aweary](https://github.com/aweary) in [#11900](https://github.com/facebook/react/pull/11900))
|
||||
* Fix minor DOM input bugs in IE and Safari. ([@nhunzaker](https://github.com/nhunzaker) in [#11534](https://github.com/facebook/react/pull/11534))
|
||||
* Correctly detect Ctrl + Enter in `onKeyPress` in more browsers. ([@nstraub](https://github.com/nstraub) in [#10514](https://github.com/facebook/react/pull/10514))
|
||||
* Fix containing elements getting focused on SSR markup mismatch. ([@koba04](https://github.com/koba04) in [#11737](https://github.com/facebook/react/pull/11737))
|
||||
* Fix `value` and `defaultValue` to ignore Symbol values. ([@nhunzaker](https://github.com/nhunzaker) in [#11741](https://github.com/facebook/react/pull/11741))
|
||||
* Fix refs to class components not getting cleaned up when the attribute is removed. ([@bvaughn](https://github.com/bvaughn) in [#12178](https://github.com/facebook/react/pull/12178))
|
||||
* Fix an IE/Edge issue when rendering inputs into a different window. ([@M-ZubairAhmed](https://github.com/M-ZubairAhmed) in [#11870](https://github.com/facebook/react/pull/11870))
|
||||
* Throw with a meaningful message if the component runs after jsdom has been destroyed. ([@gaearon](https://github.com/gaearon) in [#11677](https://github.com/facebook/react/pull/11677))
|
||||
* Don't crash if there is a global variable called `opera` with a `null` value. [@alisherdavronov](https://github.com/alisherdavronov) in [#11854](https://github.com/facebook/react/pull/11854))
|
||||
* Don't check for old versions of Opera. ([@skiritsis](https://github.com/skiritsis) in [#11921](https://github.com/facebook/react/pull/11921))
|
||||
* Deduplicate warning messages about `<option selected>`. ([@watadarkstar](https://github.com/watadarkstar) in [#11821](https://github.com/facebook/react/pull/11821))
|
||||
* Deduplicate warning messages about invalid callback. ([@yenshih](https://github.com/yenshih) in [#11833](https://github.com/facebook/react/pull/11833))
|
||||
* Deprecate `ReactDOM.unstable_createPortal()` in favor of `ReactDOM.createPortal()`. ([@prometheansacrifice](https://github.com/prometheansacrifice) in [#11747](https://github.com/facebook/react/pull/11747))
|
||||
* Don't emit User Timing entries for context types. ([@abhaynikam](https://github.com/abhaynikam) in [#12250](https://github.com/facebook/react/pull/12250))
|
||||
* Improve the error message when context consumer child isn't a function. ([@raunofreiberg](https://github.com/raunofreiberg) in [#12267](https://github.com/facebook/react/pull/12267))
|
||||
* Improve the error message when adding a ref to a functional component. ([@skiritsis](https://github.com/skiritsis) in [#11782](https://github.com/facebook/react/pull/11782))
|
||||
|
||||
### React DOM Server
|
||||
|
||||
* Prevent an infinite loop when attempting to render portals with SSR. ([@gaearon](https://github.com/gaearon) in [#11709](https://github.com/facebook/react/pull/11709))
|
||||
* Warn if a class doesn't extend `React.Component`. ([@wyze](https://github.com/wyze) in [#11993](https://github.com/facebook/react/pull/11993))
|
||||
* Fix an issue with `this.state` of different components getting mixed up. ([@sophiebits](https://github.com/sophiebits) in [#12323](https://github.com/facebook/react/pull/12323))
|
||||
* Provide a better message when component type is undefined. ([@HeroProtagonist](https://github.com/HeroProtagonist) in [#11966](https://github.com/facebook/react/pull/11966))
|
||||
|
||||
</details>
|
||||
## React Test Renderer
|
||||
|
||||
* Fix handling of fragments in `toTree()`. ([@maciej-ka](https://github.com/maciej-ka) in [#12107](https://github.com/facebook/react/pull/12107) and [@gaearon](https://github.com/gaearon) in [#12154](https://github.com/facebook/react/pull/12154))
|
||||
* Shallow renderer should assign state to `null` for components that don't set it. ([@jwbay](https://github.com/jwbay) in [#11965](https://github.com/facebook/react/pull/11965))
|
||||
* Shallow renderer should filter legacy context according to `contextTypes`. ([@koba04](https://github.com/koba04) in [#11922](https://github.com/facebook/react/pull/11922))
|
||||
* Add an unstable API for testing asynchronous rendering. ([@acdlite](https://github.com/acdlite) in [#12478](https://github.com/facebook/react/pull/12478))
|
||||
|
||||
### React Is (New)
|
||||
|
||||
* First release of the [new package](https://github.com/facebook/react/tree/master/packages/react-is) that libraries can use to detect different React node types. ([@bvaughn](https://github.com/bvaughn) in [#12199](https://github.com/facebook/react/pull/12199))
|
||||
* Add `ReactIs.isValidElementType()` to help higher-order components validate their inputs. ([@jamesreggio](https://github.com/jamesreggio) in [#12483](https://github.com/facebook/react/pull/12483))
|
||||
|
||||
### React Lifecycles Compat (New)
|
||||
|
||||
* First release of the [new package](https://github.com/reactjs/react-lifecycles-compat) to help library developers target multiple versions of React. ([@bvaughn](https://github.com/bvaughn) in [#12105](https://github.com/facebook/react/pull/12105))
|
||||
|
||||
### Create Subscription (New)
|
||||
|
||||
* First release of the [new package](https://github.com/facebook/react/tree/master/packages/create-subscription) to subscribe to external data sources safely for async rendering. ([@bvaughn](https://github.com/bvaughn) in [#12325](https://github.com/facebook/react/pull/12325))
|
||||
|
||||
### React Reconciler (Experimental)
|
||||
|
||||
* Expose `react-reconciler/persistent` for building renderers that use persistent data structures. ([@gaearon](https://github.com/gaearon) in [#12156](https://github.com/facebook/react/pull/12156))
|
||||
* Pass host context to `finalizeInitialChildren()`. ([@jquense](https://github.com/jquense) in [#11970](https://github.com/facebook/react/pull/11970))
|
||||
* Remove `useSyncScheduling` from the host config. ([@acdlite](https://github.com/acdlite) in [#11771](https://github.com/facebook/react/pull/11771))
|
||||
|
||||
### React Call Return (Experimental)
|
||||
|
||||
* Fix a crash on updates. ([@rmhartog](https://github.com/rmhartog) in [#11955](https://github.com/facebook/react/pull/11955))
|
||||
|
||||
## 16.2.0 (November 28, 2017)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"private": true,
|
||||
"version": "16.3.0",
|
||||
"version": "16.3.1",
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
],
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "create-subscription",
|
||||
"description": "utility for subscribing to external data sources inside React components",
|
||||
"version": "0.1.0",
|
||||
"version": "16.3.1",
|
||||
"repository": "facebook/react",
|
||||
"files": [
|
||||
"LICENSE",
|
||||
@@ -13,7 +13,7 @@
|
||||
"fbjs": "^0.8.16"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^16.3.0-alpha.1"
|
||||
"react": "^16.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"rxjs": "^5.5.6"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "react-art",
|
||||
"description": "React ART is a JavaScript library for drawing vector graphics using React. It provides declarative and reactive bindings to the ART library. Using the same declarative API you can render the output to either Canvas, SVG or VML (IE8).",
|
||||
"version": "16.3.0",
|
||||
"version": "16.3.1",
|
||||
"main": "index.js",
|
||||
"repository": "facebook/react",
|
||||
"keywords": [
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "react-call-return",
|
||||
"description": "Experimental APIs for multi-pass rendering in React.",
|
||||
"version": "0.6.0",
|
||||
"version": "0.7.0",
|
||||
"repository": "facebook/react",
|
||||
"files": [
|
||||
"LICENSE",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "react-dom",
|
||||
"version": "16.3.0",
|
||||
"version": "16.3.1",
|
||||
"description": "React package for working with the DOM.",
|
||||
"main": "index.js",
|
||||
"repository": "facebook/react",
|
||||
|
||||
@@ -214,10 +214,10 @@ describe('ReactComponentLifeCycle', () => {
|
||||
expect(() => {
|
||||
ReactTestUtils.renderIntoDocument(<StatefulComponent />);
|
||||
}).toWarnDev(
|
||||
'Warning: setState(...): Can only update a mounted or ' +
|
||||
'mounting component. This usually means you called setState() on an ' +
|
||||
'unmounted component. This is a no-op.\n\nPlease check the code for the ' +
|
||||
'StatefulComponent component.',
|
||||
"Warning: Can't call setState 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 StatefulComponent component.',
|
||||
);
|
||||
|
||||
// Check deduplication; (no extra warnings should be logged).
|
||||
|
||||
@@ -225,6 +225,54 @@ describe('ReactCompositeComponent', () => {
|
||||
expect(inputProps.prop).not.toBeDefined();
|
||||
});
|
||||
|
||||
it('should warn about `forceUpdate` on not-yet-mounted components', () => {
|
||||
class MyComponent extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.forceUpdate();
|
||||
}
|
||||
render() {
|
||||
return <div />;
|
||||
}
|
||||
}
|
||||
|
||||
const container = document.createElement('div');
|
||||
expect(() => ReactDOM.render(<MyComponent />, container)).toWarnDev(
|
||||
"Warning: Can't call forceUpdate 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 MyComponent component.',
|
||||
);
|
||||
|
||||
// No additional warning should be recorded
|
||||
const container2 = document.createElement('div');
|
||||
ReactDOM.render(<MyComponent />, container2);
|
||||
});
|
||||
|
||||
it('should warn about `setState` on not-yet-mounted components', () => {
|
||||
class MyComponent extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.setState();
|
||||
}
|
||||
render() {
|
||||
return <div />;
|
||||
}
|
||||
}
|
||||
|
||||
const container = document.createElement('div');
|
||||
expect(() => ReactDOM.render(<MyComponent />, container)).toWarnDev(
|
||||
"Warning: Can't call setState 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 MyComponent component.',
|
||||
);
|
||||
|
||||
// No additional warning should be recorded
|
||||
const container2 = document.createElement('div');
|
||||
ReactDOM.render(<MyComponent />, container2);
|
||||
});
|
||||
|
||||
it('should warn about `forceUpdate` on unmounted components', () => {
|
||||
const container = document.createElement('div');
|
||||
document.body.appendChild(container);
|
||||
|
||||
@@ -675,7 +675,7 @@ class ReactDOMServerRenderer {
|
||||
pushProvider<T>(provider: ReactProvider<T>): void {
|
||||
this.providerIndex += 1;
|
||||
this.providerStack[this.providerIndex] = provider;
|
||||
const context: ReactContext<any> = provider.type.context;
|
||||
const context: ReactContext<any> = provider.type._context;
|
||||
context._currentValue = provider.props.value;
|
||||
}
|
||||
|
||||
@@ -689,7 +689,7 @@ class ReactDOMServerRenderer {
|
||||
}
|
||||
this.providerStack[this.providerIndex] = null;
|
||||
this.providerIndex -= 1;
|
||||
const context: ReactContext<any> = provider.type.context;
|
||||
const context: ReactContext<any> = provider.type._context;
|
||||
if (this.providerIndex < 0) {
|
||||
context._currentValue = context._defaultValue;
|
||||
} else {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "react-is",
|
||||
"version": "16.3.0",
|
||||
"version": "16.3.1",
|
||||
"description": "Brand checking of React Elements.",
|
||||
"main": "index.js",
|
||||
"repository": "facebook/react",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "react-reconciler",
|
||||
"description": "React package for creating custom renderers.",
|
||||
"version": "0.8.0",
|
||||
"version": "0.9.0",
|
||||
"keywords": [
|
||||
"react"
|
||||
],
|
||||
|
||||
@@ -369,7 +369,10 @@ export function startWorkLoopTimer(nextUnitOfWork: Fiber | null): void {
|
||||
}
|
||||
}
|
||||
|
||||
export function stopWorkLoopTimer(interruptedBy: Fiber | null): void {
|
||||
export function stopWorkLoopTimer(
|
||||
interruptedBy: Fiber | null,
|
||||
didCompleteRoot: boolean,
|
||||
): void {
|
||||
if (enableUserTimingAPI) {
|
||||
if (!supportsUserTiming) {
|
||||
return;
|
||||
@@ -388,13 +391,12 @@ export function stopWorkLoopTimer(interruptedBy: Fiber | null): void {
|
||||
warning = 'There were cascading updates';
|
||||
}
|
||||
commitCountInCurrentWorkLoop = 0;
|
||||
let label = didCompleteRoot
|
||||
? '(React Tree Reconciliation: Completed Root)'
|
||||
: '(React Tree Reconciliation: Yielded)';
|
||||
// Pause any measurements until the next loop.
|
||||
pauseTimers();
|
||||
endMark(
|
||||
'(React Tree Reconciliation)',
|
||||
'(React Tree Reconciliation)',
|
||||
warning,
|
||||
);
|
||||
endMark(label, '(React Tree Reconciliation)', warning);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
44
packages/react-reconciler/src/ReactFiber.js
vendored
44
packages/react-reconciler/src/ReactFiber.js
vendored
@@ -471,3 +471,47 @@ export function createFiberFromPortal(
|
||||
};
|
||||
return fiber;
|
||||
}
|
||||
|
||||
// Used for stashing WIP properties to replay failed work in DEV.
|
||||
export function assignFiberPropertiesInDEV(
|
||||
target: Fiber | null,
|
||||
source: Fiber,
|
||||
): Fiber {
|
||||
if (target === null) {
|
||||
// This Fiber's initial properties will always be overwritten.
|
||||
// We only use a Fiber to ensure the same hidden class so DEV isn't slow.
|
||||
target = createFiber(IndeterminateComponent, null, null, NoContext);
|
||||
}
|
||||
|
||||
// This is intentionally written as a list of all properties.
|
||||
// We tried to use Object.assign() instead but this is called in
|
||||
// the hottest path, and Object.assign() was too slow:
|
||||
// https://github.com/facebook/react/issues/12502
|
||||
// This code is DEV-only so size is not a concern.
|
||||
|
||||
target.tag = source.tag;
|
||||
target.key = source.key;
|
||||
target.type = source.type;
|
||||
target.stateNode = source.stateNode;
|
||||
target.return = source.return;
|
||||
target.child = source.child;
|
||||
target.sibling = source.sibling;
|
||||
target.index = source.index;
|
||||
target.ref = source.ref;
|
||||
target.pendingProps = source.pendingProps;
|
||||
target.memoizedProps = source.memoizedProps;
|
||||
target.updateQueue = source.updateQueue;
|
||||
target.memoizedState = source.memoizedState;
|
||||
target.mode = source.mode;
|
||||
target.effectTag = source.effectTag;
|
||||
target.nextEffect = source.nextEffect;
|
||||
target.firstEffect = source.firstEffect;
|
||||
target.lastEffect = source.lastEffect;
|
||||
target.expirationTime = source.expirationTime;
|
||||
target.alternate = source.alternate;
|
||||
target._debugID = source._debugID;
|
||||
target._debugSource = source._debugSource;
|
||||
target._debugOwner = source._debugOwner;
|
||||
target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming;
|
||||
return target;
|
||||
}
|
||||
|
||||
@@ -868,7 +868,7 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
|
||||
renderExpirationTime,
|
||||
) {
|
||||
const providerType: ReactProviderType<any> = workInProgress.type;
|
||||
const context: ReactContext<any> = providerType.context;
|
||||
const context: ReactContext<any> = providerType._context;
|
||||
|
||||
const newProps = workInProgress.pendingProps;
|
||||
const oldProps = workInProgress.memoizedProps;
|
||||
|
||||
@@ -839,6 +839,17 @@ export default function(
|
||||
newState === null || newState === undefined
|
||||
? derivedStateFromProps
|
||||
: Object.assign({}, newState, derivedStateFromProps);
|
||||
|
||||
// Update the base state of the update queue.
|
||||
// FIXME: This is getting ridiculous. Refactor plz!
|
||||
const updateQueue = workInProgress.updateQueue;
|
||||
if (updateQueue !== null) {
|
||||
updateQueue.baseState = Object.assign(
|
||||
{},
|
||||
updateQueue.baseState,
|
||||
derivedStateFromProps,
|
||||
);
|
||||
}
|
||||
}
|
||||
if (derivedStateFromCatch !== null && derivedStateFromCatch !== undefined) {
|
||||
// Render-phase updates (like this) should not be added to the update queue,
|
||||
@@ -848,6 +859,17 @@ export default function(
|
||||
newState === null || newState === undefined
|
||||
? derivedStateFromCatch
|
||||
: Object.assign({}, newState, derivedStateFromCatch);
|
||||
|
||||
// Update the base state of the update queue.
|
||||
// FIXME: This is getting ridiculous. Refactor plz!
|
||||
const updateQueue = workInProgress.updateQueue;
|
||||
if (updateQueue !== null) {
|
||||
updateQueue.baseState = Object.assign(
|
||||
{},
|
||||
updateQueue.baseState,
|
||||
derivedStateFromCatch,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
@@ -1016,6 +1038,17 @@ export default function(
|
||||
newState === null || newState === undefined
|
||||
? derivedStateFromProps
|
||||
: Object.assign({}, newState, derivedStateFromProps);
|
||||
|
||||
// Update the base state of the update queue.
|
||||
// FIXME: This is getting ridiculous. Refactor plz!
|
||||
const updateQueue = workInProgress.updateQueue;
|
||||
if (updateQueue !== null) {
|
||||
updateQueue.baseState = Object.assign(
|
||||
{},
|
||||
updateQueue.baseState,
|
||||
derivedStateFromProps,
|
||||
);
|
||||
}
|
||||
}
|
||||
if (derivedStateFromCatch !== null && derivedStateFromCatch !== undefined) {
|
||||
// Render-phase updates (like this) should not be added to the update queue,
|
||||
@@ -1025,6 +1058,17 @@ export default function(
|
||||
newState === null || newState === undefined
|
||||
? derivedStateFromCatch
|
||||
: Object.assign({}, newState, derivedStateFromCatch);
|
||||
|
||||
// Update the base state of the update queue.
|
||||
// FIXME: This is getting ridiculous. Refactor plz!
|
||||
const updateQueue = workInProgress.updateQueue;
|
||||
if (updateQueue !== null) {
|
||||
updateQueue.baseState = Object.assign(
|
||||
{},
|
||||
updateQueue.baseState,
|
||||
derivedStateFromCatch,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
|
||||
@@ -60,12 +60,19 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
|
||||
// Push current root instance onto the stack;
|
||||
// This allows us to reset root when portals are popped.
|
||||
push(rootInstanceStackCursor, nextRootInstance, fiber);
|
||||
|
||||
const nextRootContext = getRootHostContext(nextRootInstance);
|
||||
|
||||
// Track the context and the Fiber that provided it.
|
||||
// This enables us to pop only Fibers that provide unique contexts.
|
||||
push(contextFiberStackCursor, fiber, fiber);
|
||||
|
||||
// Finally, we need to push the host context to the stack.
|
||||
// However, we can't just call getRootHostContext() and push it because
|
||||
// we'd have a different number of entries on the stack depending on
|
||||
// whether getRootHostContext() throws somewhere in renderer code or not.
|
||||
// So we push an empty value first. This lets us safely unwind on errors.
|
||||
push(contextStackCursor, NO_CONTEXT, fiber);
|
||||
const nextRootContext = getRootHostContext(nextRootInstance);
|
||||
// Now that we know this function doesn't throw, replace it.
|
||||
pop(contextStackCursor, fiber);
|
||||
push(contextStackCursor, nextRootContext, fiber);
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ export default function(stack: Stack) {
|
||||
}
|
||||
|
||||
function pushProvider(providerFiber: Fiber): void {
|
||||
const context: ReactContext<any> = providerFiber.type.context;
|
||||
const context: ReactContext<any> = providerFiber.type._context;
|
||||
|
||||
push(changedBitsCursor, context._changedBits, providerFiber);
|
||||
push(valueCursor, context._currentValue, providerFiber);
|
||||
@@ -60,7 +60,7 @@ export default function(stack: Stack) {
|
||||
pop(valueCursor, providerFiber);
|
||||
pop(changedBitsCursor, providerFiber);
|
||||
|
||||
const context: ReactContext<any> = providerFiber.type.context;
|
||||
const context: ReactContext<any> = providerFiber.type._context;
|
||||
context._currentValue = currentValue;
|
||||
context._changedBits = changedBits;
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ import {
|
||||
startCommitLifeCyclesTimer,
|
||||
stopCommitLifeCyclesTimer,
|
||||
} from './ReactDebugFiberPerf';
|
||||
import {createWorkInProgress} from './ReactFiber';
|
||||
import {createWorkInProgress, assignFiberPropertiesInDEV} from './ReactFiber';
|
||||
import {onCommitRoot} from './ReactFiberDevToolsHook';
|
||||
import {
|
||||
NoWork,
|
||||
@@ -263,11 +263,23 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
|
||||
|
||||
let stashedWorkInProgressProperties;
|
||||
let replayUnitOfWork;
|
||||
let isReplayingFailedUnitOfWork;
|
||||
let originalReplayError;
|
||||
let rethrowOriginalError;
|
||||
if (__DEV__ && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
|
||||
stashedWorkInProgressProperties = null;
|
||||
replayUnitOfWork = (failedUnitOfWork: Fiber, isAsync: boolean) => {
|
||||
// Retore the original state of the work-in-progress
|
||||
Object.assign(failedUnitOfWork, stashedWorkInProgressProperties);
|
||||
isReplayingFailedUnitOfWork = false;
|
||||
originalReplayError = null;
|
||||
replayUnitOfWork = (
|
||||
failedUnitOfWork: Fiber,
|
||||
error: mixed,
|
||||
isAsync: boolean,
|
||||
) => {
|
||||
// Restore the original state of the work-in-progress
|
||||
assignFiberPropertiesInDEV(
|
||||
failedUnitOfWork,
|
||||
stashedWorkInProgressProperties,
|
||||
);
|
||||
switch (failedUnitOfWork.tag) {
|
||||
case HostRoot:
|
||||
popHostContainer(failedUnitOfWork);
|
||||
@@ -287,14 +299,22 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
|
||||
break;
|
||||
}
|
||||
// Replay the begin phase.
|
||||
isReplayingFailedUnitOfWork = true;
|
||||
originalReplayError = error;
|
||||
invokeGuardedCallback(null, workLoop, null, isAsync);
|
||||
isReplayingFailedUnitOfWork = false;
|
||||
originalReplayError = null;
|
||||
if (hasCaughtError()) {
|
||||
clearCaughtError();
|
||||
} else {
|
||||
// This should be unreachable because the render phase is
|
||||
// idempotent
|
||||
// If the begin phase did not fail the second time, set this pointer
|
||||
// back to the original value.
|
||||
nextUnitOfWork = failedUnitOfWork;
|
||||
}
|
||||
};
|
||||
rethrowOriginalError = () => {
|
||||
throw originalReplayError;
|
||||
};
|
||||
}
|
||||
|
||||
function resetStack() {
|
||||
@@ -846,12 +866,21 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
|
||||
}
|
||||
|
||||
if (__DEV__ && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
|
||||
stashedWorkInProgressProperties = Object.assign({}, workInProgress);
|
||||
stashedWorkInProgressProperties = assignFiberPropertiesInDEV(
|
||||
stashedWorkInProgressProperties,
|
||||
workInProgress,
|
||||
);
|
||||
}
|
||||
let next = beginWork(current, workInProgress, nextRenderExpirationTime);
|
||||
|
||||
if (__DEV__) {
|
||||
ReactDebugCurrentFiber.resetCurrentFiber();
|
||||
if (isReplayingFailedUnitOfWork) {
|
||||
// Currently replaying a failed unit of work. This should be unreachable,
|
||||
// because the render phase is meant to be idempotent, and it should
|
||||
// have thrown again. Since it didn't, rethrow the original error, so
|
||||
// React's internal stack is not misaligned.
|
||||
rethrowOriginalError();
|
||||
}
|
||||
}
|
||||
if (__DEV__ && ReactFiberInstrumentation.debugTool) {
|
||||
ReactFiberInstrumentation.debugTool.onBeginWork(workInProgress);
|
||||
@@ -929,7 +958,7 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
|
||||
|
||||
if (__DEV__ && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
|
||||
const failedUnitOfWork = nextUnitOfWork;
|
||||
replayUnitOfWork(failedUnitOfWork, isAsync);
|
||||
replayUnitOfWork(failedUnitOfWork, thrownValue, isAsync);
|
||||
}
|
||||
|
||||
const sourceFiber: Fiber = nextUnitOfWork;
|
||||
@@ -952,12 +981,13 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
|
||||
} while (true);
|
||||
|
||||
// We're done performing work. Time to clean up.
|
||||
stopWorkLoopTimer(interruptedBy);
|
||||
interruptedBy = null;
|
||||
let didCompleteRoot = false;
|
||||
isWorking = false;
|
||||
|
||||
// Yield back to main thread.
|
||||
if (didFatal) {
|
||||
stopWorkLoopTimer(interruptedBy, didCompleteRoot);
|
||||
interruptedBy = null;
|
||||
// There was a fatal error.
|
||||
if (__DEV__) {
|
||||
stack.resetStackAfterFatalErrorInDev();
|
||||
@@ -966,12 +996,17 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
|
||||
} else if (nextUnitOfWork === null) {
|
||||
// We reached the root.
|
||||
if (isRootReadyForCommit) {
|
||||
didCompleteRoot = true;
|
||||
stopWorkLoopTimer(interruptedBy, didCompleteRoot);
|
||||
interruptedBy = null;
|
||||
// The root successfully completed. It's ready for commit.
|
||||
root.pendingCommitExpirationTime = expirationTime;
|
||||
const finishedWork = root.current.alternate;
|
||||
return finishedWork;
|
||||
} else {
|
||||
// The root did not complete.
|
||||
stopWorkLoopTimer(interruptedBy, didCompleteRoot);
|
||||
interruptedBy = null;
|
||||
invariant(
|
||||
false,
|
||||
'Expired work should have completed. This error is likely caused ' +
|
||||
@@ -979,6 +1014,8 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
|
||||
);
|
||||
}
|
||||
} else {
|
||||
stopWorkLoopTimer(interruptedBy, didCompleteRoot);
|
||||
interruptedBy = null;
|
||||
// There's more work to do, but we ran out of time. Yield back to
|
||||
// the renderer.
|
||||
return null;
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @jest-environment node
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
describe('ReactIncrementalErrorReplay-test', () => {
|
||||
it('copies all keys when stashing potentially failing work', () => {
|
||||
// Note: this test is fragile and relies on internals.
|
||||
// We almost always try to avoid such tests, but here the cost of
|
||||
// the list getting out of sync (and causing subtle bugs in rare cases)
|
||||
// is higher than the cost of maintaing the test.
|
||||
const {
|
||||
// Any Fiber factory function will do.
|
||||
createHostRootFiber,
|
||||
// This is the method we're going to test.
|
||||
// If this is no longer used, you can delete this test file.
|
||||
assignFiberPropertiesInDEV,
|
||||
} = require('../ReactFiber');
|
||||
|
||||
// Get a real fiber.
|
||||
const realFiber = createHostRootFiber(false);
|
||||
const stash = assignFiberPropertiesInDEV(null, realFiber);
|
||||
|
||||
// Verify we get all the same fields.
|
||||
expect(realFiber).toEqual(stash);
|
||||
|
||||
// Mutate the original.
|
||||
for (let key in realFiber) {
|
||||
realFiber[key] = key + '_' + Math.random();
|
||||
}
|
||||
expect(realFiber).not.toEqual(stash);
|
||||
|
||||
// Verify we can still "revert" to the stashed properties.
|
||||
expect(assignFiberPropertiesInDEV(realFiber, stash)).toBe(realFiber);
|
||||
expect(realFiber).toEqual(stash);
|
||||
});
|
||||
});
|
||||
59
packages/react-reconciler/src/__tests__/ReactIncrementalErrorReplay-test.js
vendored
Normal file
59
packages/react-reconciler/src/__tests__/ReactIncrementalErrorReplay-test.js
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @emails react-core
|
||||
* @jest-environment node
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
let React;
|
||||
let ReactNoop;
|
||||
|
||||
describe('ReactIncrementalErrorReplay', () => {
|
||||
beforeEach(() => {
|
||||
jest.resetModules();
|
||||
React = require('react');
|
||||
ReactNoop = require('react-noop-renderer');
|
||||
});
|
||||
|
||||
function div(...children) {
|
||||
children = children.map(c => (typeof c === 'string' ? {text: c} : c));
|
||||
return {type: 'div', children, prop: undefined};
|
||||
}
|
||||
|
||||
function span(prop) {
|
||||
return {type: 'span', children: [], prop};
|
||||
}
|
||||
|
||||
it('should fail gracefully on error in the host environment', () => {
|
||||
ReactNoop.simulateErrorInHostConfig(() => {
|
||||
ReactNoop.render(<span />);
|
||||
expect(() => ReactNoop.flush()).toThrow('Error in host config.');
|
||||
});
|
||||
});
|
||||
|
||||
it('should fail gracefully on error that does not reproduce on replay', () => {
|
||||
let didInit = false;
|
||||
|
||||
function badLazyInit() {
|
||||
const needsInit = !didInit;
|
||||
didInit = true;
|
||||
if (needsInit) {
|
||||
throw new Error('Hi');
|
||||
}
|
||||
}
|
||||
|
||||
class App extends React.Component {
|
||||
render() {
|
||||
badLazyInit();
|
||||
return <div />;
|
||||
}
|
||||
}
|
||||
ReactNoop.render(<App />);
|
||||
expect(() => ReactNoop.flush()).toThrow('Hi');
|
||||
});
|
||||
});
|
||||
@@ -373,4 +373,52 @@ describe('ReactIncrementalUpdates', () => {
|
||||
});
|
||||
ReactNoop.flush();
|
||||
});
|
||||
|
||||
it('getDerivedStateFromProps should update base state of updateQueue (based on product bug)', () => {
|
||||
// Based on real-world bug.
|
||||
|
||||
let foo;
|
||||
class Foo extends React.Component {
|
||||
state = {value: 'initial state'};
|
||||
static getDerivedStateFromProps() {
|
||||
return {value: 'derived state'};
|
||||
}
|
||||
render() {
|
||||
foo = this;
|
||||
return (
|
||||
<React.Fragment>
|
||||
<span prop={this.state.value} />
|
||||
<Bar />
|
||||
</React.Fragment>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
let bar;
|
||||
class Bar extends React.Component {
|
||||
render() {
|
||||
bar = this;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
ReactNoop.flushSync(() => {
|
||||
ReactNoop.render(<Foo />);
|
||||
});
|
||||
expect(ReactNoop.getChildren()).toEqual([span('derived state')]);
|
||||
|
||||
ReactNoop.flushSync(() => {
|
||||
// Triggers getDerivedStateFromProps again
|
||||
ReactNoop.render(<Foo />);
|
||||
// The noop callback is needed to trigger the specific internal path that
|
||||
// led to this bug. Removing it causes it to "accidentally" work.
|
||||
foo.setState({value: 'update state'}, function noop() {});
|
||||
});
|
||||
expect(ReactNoop.getChildren()).toEqual([span('derived state')]);
|
||||
|
||||
ReactNoop.flushSync(() => {
|
||||
bar.setState({});
|
||||
});
|
||||
expect(ReactNoop.getChildren()).toEqual([span('derived state')]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -4,7 +4,7 @@ exports[`ReactDebugFiberPerf captures all lifecycles 1`] = `
|
||||
"⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Mount
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ AllLifecycles [mount]
|
||||
⚛ AllLifecycles.componentWillMount
|
||||
⚛ AllLifecycles.getChildContext
|
||||
@@ -18,7 +18,7 @@ exports[`ReactDebugFiberPerf captures all lifecycles 1`] = `
|
||||
⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Update
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ AllLifecycles [update]
|
||||
⚛ AllLifecycles.componentWillReceiveProps
|
||||
⚛ AllLifecycles.shouldComponentUpdate
|
||||
@@ -34,7 +34,7 @@ exports[`ReactDebugFiberPerf captures all lifecycles 1`] = `
|
||||
⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Unmount
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
|
||||
⚛ (Committing Changes)
|
||||
⚛ (Committing Snapshot Effects: 0 Total)
|
||||
@@ -48,7 +48,7 @@ exports[`ReactDebugFiberPerf deduplicates lifecycle names during commit to reduc
|
||||
"⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// The commit phase should mention A and B just once
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Parent [update]
|
||||
⚛ A [update]
|
||||
⚛ B [update]
|
||||
@@ -66,7 +66,7 @@ exports[`ReactDebugFiberPerf deduplicates lifecycle names during commit to reduc
|
||||
|
||||
// Because of deduplication, we don't know B was cascading,
|
||||
// but we should still see the warning for the commit phase.
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Parent [update]
|
||||
⚛ A [update]
|
||||
⚛ B [update]
|
||||
@@ -80,7 +80,7 @@ exports[`ReactDebugFiberPerf deduplicates lifecycle names during commit to reduc
|
||||
⚛ A.componentDidUpdate
|
||||
⚛ B.componentDidUpdate
|
||||
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ B [update]
|
||||
|
||||
⚛ (Committing Changes)
|
||||
@@ -92,7 +92,7 @@ exports[`ReactDebugFiberPerf deduplicates lifecycle names during commit to reduc
|
||||
`;
|
||||
|
||||
exports[`ReactDebugFiberPerf does not schedule an extra callback if setState is called during a synchronous commit phase 1`] = `
|
||||
"⚛ (React Tree Reconciliation)
|
||||
"⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Component [mount]
|
||||
|
||||
⛔ (Committing Changes) Warning: Lifecycle hook scheduled a cascading update
|
||||
@@ -101,7 +101,7 @@ exports[`ReactDebugFiberPerf does not schedule an extra callback if setState is
|
||||
⚛ (Calling Lifecycle Methods: 1 Total)
|
||||
⛔ Component.componentDidMount Warning: Scheduled a cascading update
|
||||
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Component [update]
|
||||
|
||||
⚛ (Committing Changes)
|
||||
@@ -115,7 +115,7 @@ exports[`ReactDebugFiberPerf does not treat setState from cWM or cWRP as cascadi
|
||||
"⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Should not print a warning
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Parent [mount]
|
||||
⚛ NotCascading [mount]
|
||||
⚛ NotCascading.componentWillMount
|
||||
@@ -128,7 +128,7 @@ exports[`ReactDebugFiberPerf does not treat setState from cWM or cWRP as cascadi
|
||||
⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Should not print a warning
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Parent [update]
|
||||
⚛ NotCascading [update]
|
||||
⚛ NotCascading.componentWillReceiveProps
|
||||
@@ -144,7 +144,7 @@ exports[`ReactDebugFiberPerf measures a simple reconciliation 1`] = `
|
||||
"⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Mount
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Parent [mount]
|
||||
⚛ Child [mount]
|
||||
|
||||
@@ -156,7 +156,7 @@ exports[`ReactDebugFiberPerf measures a simple reconciliation 1`] = `
|
||||
⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Update
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Parent [update]
|
||||
⚛ Child [update]
|
||||
|
||||
@@ -168,7 +168,7 @@ exports[`ReactDebugFiberPerf measures a simple reconciliation 1`] = `
|
||||
⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Unmount
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
|
||||
⚛ (Committing Changes)
|
||||
⚛ (Committing Snapshot Effects: 0 Total)
|
||||
@@ -181,7 +181,7 @@ exports[`ReactDebugFiberPerf measures deferred work in chunks 1`] = `
|
||||
"⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Start mounting Parent and A
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Yielded)
|
||||
⚛ Parent [mount]
|
||||
⚛ A [mount]
|
||||
⚛ Child [mount]
|
||||
@@ -189,14 +189,14 @@ exports[`ReactDebugFiberPerf measures deferred work in chunks 1`] = `
|
||||
⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Mount B just a little (but not enough to memoize)
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Yielded)
|
||||
⚛ Parent [mount]
|
||||
⚛ B [mount]
|
||||
|
||||
⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Complete B and Parent
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Parent [mount]
|
||||
⚛ B [mount]
|
||||
⚛ Child [mount]
|
||||
@@ -210,7 +210,7 @@ exports[`ReactDebugFiberPerf measures deferred work in chunks 1`] = `
|
||||
|
||||
exports[`ReactDebugFiberPerf measures deprioritized work 1`] = `
|
||||
"// Flush the parent
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Parent [mount]
|
||||
|
||||
⚛ (Committing Changes)
|
||||
@@ -221,7 +221,7 @@ exports[`ReactDebugFiberPerf measures deprioritized work 1`] = `
|
||||
⚛ (Waiting for async callback... will force flush in 10737418210 ms)
|
||||
|
||||
// Flush the child
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Child [mount]
|
||||
|
||||
⚛ (Committing Changes)
|
||||
@@ -235,13 +235,13 @@ exports[`ReactDebugFiberPerf recovers from caught errors 1`] = `
|
||||
"⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Stop on Baddie and restart from Boundary
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Yielded)
|
||||
⚛ Parent [mount]
|
||||
⛔ Boundary [mount] Warning: An error was thrown inside this error boundary
|
||||
⚛ Parent [mount]
|
||||
⚛ Baddie [mount]
|
||||
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Parent [mount]
|
||||
⚛ Boundary [mount]
|
||||
|
||||
@@ -250,7 +250,7 @@ exports[`ReactDebugFiberPerf recovers from caught errors 1`] = `
|
||||
⚛ (Committing Host Effects: 2 Total)
|
||||
⚛ (Calling Lifecycle Methods: 0 Total)
|
||||
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Boundary [update]
|
||||
⚛ ErrorReport [mount]
|
||||
|
||||
@@ -265,11 +265,11 @@ exports[`ReactDebugFiberPerf recovers from fatal errors 1`] = `
|
||||
"⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Will fatal
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Yielded)
|
||||
⚛ Parent [mount]
|
||||
⚛ Baddie [mount]
|
||||
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
|
||||
⚛ (Committing Changes)
|
||||
⚛ (Committing Snapshot Effects: 0 Total)
|
||||
@@ -279,7 +279,7 @@ exports[`ReactDebugFiberPerf recovers from fatal errors 1`] = `
|
||||
⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Will reconcile from a clean state
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Parent [mount]
|
||||
⚛ Child [mount]
|
||||
|
||||
@@ -294,7 +294,7 @@ exports[`ReactDebugFiberPerf skips parents during setState 1`] = `
|
||||
"⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Should include just A and B, no Parents
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ A [update]
|
||||
⚛ B [update]
|
||||
|
||||
@@ -308,7 +308,7 @@ exports[`ReactDebugFiberPerf skips parents during setState 1`] = `
|
||||
exports[`ReactDebugFiberPerf supports portals 1`] = `
|
||||
"⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Parent [mount]
|
||||
⚛ Child [mount]
|
||||
|
||||
@@ -322,7 +322,7 @@ exports[`ReactDebugFiberPerf supports portals 1`] = `
|
||||
exports[`ReactDebugFiberPerf supports returns 1`] = `
|
||||
"⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ App [mount]
|
||||
⚛ CoParent [mount]
|
||||
⚛ Indirection [mount]
|
||||
@@ -341,18 +341,18 @@ exports[`ReactDebugFiberPerf supports returns 1`] = `
|
||||
exports[`ReactDebugFiberPerf warns if an in-progress update is interrupted 1`] = `
|
||||
"⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Yielded)
|
||||
⚛ Foo [mount]
|
||||
|
||||
⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
⛔ (React Tree Reconciliation) Warning: A top-level update interrupted the previous render
|
||||
⛔ (React Tree Reconciliation: Completed Root) Warning: A top-level update interrupted the previous render
|
||||
⚛ Foo [mount]
|
||||
⚛ (Committing Changes)
|
||||
⚛ (Committing Snapshot Effects: 0 Total)
|
||||
⚛ (Committing Host Effects: 1 Total)
|
||||
⚛ (Calling Lifecycle Methods: 0 Total)
|
||||
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
|
||||
⚛ (Committing Changes)
|
||||
⚛ (Committing Snapshot Effects: 0 Total)
|
||||
@@ -364,7 +364,7 @@ exports[`ReactDebugFiberPerf warns if an in-progress update is interrupted 1`] =
|
||||
exports[`ReactDebugFiberPerf warns if async work expires (starvation) 1`] = `
|
||||
"⛔ (Waiting for async callback... will force flush in 5230 ms) Warning: React was blocked by main thread
|
||||
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Foo [mount]
|
||||
|
||||
⚛ (Committing Changes)
|
||||
@@ -378,7 +378,7 @@ exports[`ReactDebugFiberPerf warns on cascading renders from setState 1`] = `
|
||||
"⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Should print a warning
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Parent [mount]
|
||||
⚛ Cascading [mount]
|
||||
|
||||
@@ -388,7 +388,7 @@ exports[`ReactDebugFiberPerf warns on cascading renders from setState 1`] = `
|
||||
⚛ (Calling Lifecycle Methods: 1 Total)
|
||||
⛔ Cascading.componentDidMount Warning: Scheduled a cascading update
|
||||
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Cascading [update]
|
||||
|
||||
⚛ (Committing Changes)
|
||||
@@ -402,7 +402,7 @@ exports[`ReactDebugFiberPerf warns on cascading renders from top-level render 1`
|
||||
"⚛ (Waiting for async callback... will force flush in 5230 ms)
|
||||
|
||||
// Rendering the first root
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Cascading [mount]
|
||||
|
||||
⛔ (Committing Changes) Warning: Lifecycle hook scheduled a cascading update
|
||||
@@ -412,7 +412,7 @@ exports[`ReactDebugFiberPerf warns on cascading renders from top-level render 1`
|
||||
⛔ Cascading.componentDidMount Warning: Scheduled a cascading update
|
||||
|
||||
// Scheduling another root from componentDidMount
|
||||
⚛ (React Tree Reconciliation)
|
||||
⚛ (React Tree Reconciliation: Completed Root)
|
||||
⚛ Child [mount]
|
||||
|
||||
⚛ (Committing Changes)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "react-test-renderer",
|
||||
"version": "16.3.0",
|
||||
"version": "16.3.1",
|
||||
"description": "React package for snapshot testing.",
|
||||
"main": "index.js",
|
||||
"repository": "facebook/react",
|
||||
@@ -18,7 +18,7 @@
|
||||
"fbjs": "^0.8.16",
|
||||
"object-assign": "^4.1.1",
|
||||
"prop-types": "^15.6.0",
|
||||
"react-is": "^16.3.0"
|
||||
"react-is": "^16.3.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^16.0.0"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"keywords": [
|
||||
"react"
|
||||
],
|
||||
"version": "16.3.0",
|
||||
"version": "16.3.1",
|
||||
"homepage": "https://reactjs.org/",
|
||||
"bugs": "https://github.com/facebook/react/issues",
|
||||
"license": "MIT",
|
||||
|
||||
@@ -44,7 +44,7 @@ export function createContext<T>(
|
||||
|
||||
context.Provider = {
|
||||
$$typeof: REACT_PROVIDER_TYPE,
|
||||
context,
|
||||
_context: context,
|
||||
};
|
||||
context.Consumer = context;
|
||||
|
||||
|
||||
@@ -30,8 +30,6 @@ let propTypesMisspellWarningShown;
|
||||
let getDisplayName = () => {};
|
||||
let getStackAddendum = () => {};
|
||||
|
||||
let VALID_FRAGMENT_PROPS;
|
||||
|
||||
if (__DEV__) {
|
||||
currentlyValidatingElement = null;
|
||||
|
||||
@@ -65,8 +63,6 @@ if (__DEV__) {
|
||||
stack += ReactDebugCurrentFrame.getStackAddendum() || '';
|
||||
return stack;
|
||||
};
|
||||
|
||||
VALID_FRAGMENT_PROPS = new Map([['children', true], ['key', true]]);
|
||||
}
|
||||
|
||||
function getDeclarationErrorAddendum() {
|
||||
@@ -257,7 +253,7 @@ function validateFragmentProps(fragment) {
|
||||
const keys = Object.keys(fragment.props);
|
||||
for (let i = 0; i < keys.length; i++) {
|
||||
const key = keys[i];
|
||||
if (!VALID_FRAGMENT_PROPS.has(key)) {
|
||||
if (key !== 'children' && key !== 'key') {
|
||||
warning(
|
||||
false,
|
||||
'Invalid prop `%s` supplied to `React.Fragment`. ' +
|
||||
|
||||
@@ -21,10 +21,10 @@ function warnNoop(publicInstance, callerName) {
|
||||
}
|
||||
warning(
|
||||
false,
|
||||
'%s(...): Can only update a mounted or mounting component. ' +
|
||||
'This usually means you called %s() on an unmounted component. ' +
|
||||
'This is a no-op.\n\nPlease check the code for the %s component.',
|
||||
callerName,
|
||||
"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,
|
||||
);
|
||||
|
||||
@@ -62,7 +62,7 @@ export type ReactProvider<T> = {
|
||||
|
||||
export type ReactProviderType<T> = {
|
||||
$$typeof: Symbol | number,
|
||||
context: ReactContext<T>,
|
||||
_context: ReactContext<T>,
|
||||
};
|
||||
|
||||
export type ReactConsumer<T> = {
|
||||
|
||||
@@ -8,4 +8,4 @@
|
||||
'use strict';
|
||||
|
||||
// TODO: this is special because it gets imported during build.
|
||||
module.exports = '16.3.0';
|
||||
module.exports = '16.3.1';
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "simple-cache-provider",
|
||||
"description": "A basic cache for React applications",
|
||||
"version": "0.3.0",
|
||||
"version": "0.4.0",
|
||||
"repository": "facebook/react",
|
||||
"files": [
|
||||
"LICENSE",
|
||||
|
||||
@@ -4,85 +4,85 @@
|
||||
"filename": "react.development.js",
|
||||
"bundleType": "UMD_DEV",
|
||||
"packageName": "react",
|
||||
"size": 56156,
|
||||
"gzip": 15387
|
||||
"size": 56109,
|
||||
"gzip": 15450
|
||||
},
|
||||
{
|
||||
"filename": "react.production.min.js",
|
||||
"bundleType": "UMD_PROD",
|
||||
"packageName": "react",
|
||||
"size": 6867,
|
||||
"gzip": 2942
|
||||
"size": 6868,
|
||||
"gzip": 2943
|
||||
},
|
||||
{
|
||||
"filename": "react.development.js",
|
||||
"bundleType": "NODE_DEV",
|
||||
"packageName": "react",
|
||||
"size": 46575,
|
||||
"gzip": 13051
|
||||
"size": 46528,
|
||||
"gzip": 13045
|
||||
},
|
||||
{
|
||||
"filename": "react.production.min.js",
|
||||
"bundleType": "NODE_PROD",
|
||||
"packageName": "react",
|
||||
"size": 5663,
|
||||
"size": 5664,
|
||||
"gzip": 2488
|
||||
},
|
||||
{
|
||||
"filename": "React-dev.js",
|
||||
"bundleType": "FB_DEV",
|
||||
"packageName": "react",
|
||||
"size": 46006,
|
||||
"gzip": 12568
|
||||
"size": 45932,
|
||||
"gzip": 12533
|
||||
},
|
||||
{
|
||||
"filename": "React-prod.js",
|
||||
"bundleType": "FB_PROD",
|
||||
"packageName": "react",
|
||||
"size": 13371,
|
||||
"gzip": 3647
|
||||
"size": 13342,
|
||||
"gzip": 3632
|
||||
},
|
||||
{
|
||||
"filename": "react-dom.development.js",
|
||||
"bundleType": "UMD_DEV",
|
||||
"packageName": "react-dom",
|
||||
"size": 617206,
|
||||
"gzip": 142288
|
||||
"size": 621978,
|
||||
"gzip": 143326
|
||||
},
|
||||
{
|
||||
"filename": "react-dom.production.min.js",
|
||||
"bundleType": "UMD_PROD",
|
||||
"packageName": "react-dom",
|
||||
"size": 101970,
|
||||
"gzip": 32501
|
||||
"size": 102120,
|
||||
"gzip": 32529
|
||||
},
|
||||
{
|
||||
"filename": "react-dom.development.js",
|
||||
"bundleType": "NODE_DEV",
|
||||
"packageName": "react-dom",
|
||||
"size": 601203,
|
||||
"gzip": 138035
|
||||
"size": 605975,
|
||||
"gzip": 139071
|
||||
},
|
||||
{
|
||||
"filename": "react-dom.production.min.js",
|
||||
"bundleType": "NODE_PROD",
|
||||
"packageName": "react-dom",
|
||||
"size": 100686,
|
||||
"gzip": 31778
|
||||
"size": 100836,
|
||||
"gzip": 31830
|
||||
},
|
||||
{
|
||||
"filename": "ReactDOM-dev.js",
|
||||
"bundleType": "FB_DEV",
|
||||
"packageName": "react-dom",
|
||||
"size": 622696,
|
||||
"gzip": 140591
|
||||
"size": 627643,
|
||||
"gzip": 141697
|
||||
},
|
||||
{
|
||||
"filename": "ReactDOM-prod.js",
|
||||
"bundleType": "FB_PROD",
|
||||
"packageName": "react-dom",
|
||||
"size": 298323,
|
||||
"gzip": 55488
|
||||
"size": 299593,
|
||||
"gzip": 55668
|
||||
},
|
||||
{
|
||||
"filename": "react-dom-test-utils.development.js",
|
||||
@@ -96,7 +96,7 @@
|
||||
"bundleType": "UMD_PROD",
|
||||
"packageName": "react-dom",
|
||||
"size": 10641,
|
||||
"gzip": 3954
|
||||
"gzip": 3955
|
||||
},
|
||||
{
|
||||
"filename": "react-dom-test-utils.development.js",
|
||||
@@ -116,22 +116,22 @@
|
||||
"filename": "ReactTestUtils-dev.js",
|
||||
"bundleType": "FB_DEV",
|
||||
"packageName": "react-dom",
|
||||
"size": 37255,
|
||||
"gzip": 10630
|
||||
"size": 37217,
|
||||
"gzip": 10615
|
||||
},
|
||||
{
|
||||
"filename": "react-dom-unstable-native-dependencies.development.js",
|
||||
"bundleType": "UMD_DEV",
|
||||
"packageName": "react-dom",
|
||||
"size": 62617,
|
||||
"gzip": 16437
|
||||
"gzip": 16436
|
||||
},
|
||||
{
|
||||
"filename": "react-dom-unstable-native-dependencies.production.min.js",
|
||||
"bundleType": "UMD_PROD",
|
||||
"packageName": "react-dom",
|
||||
"size": 11337,
|
||||
"gzip": 3913
|
||||
"gzip": 3916
|
||||
},
|
||||
{
|
||||
"filename": "react-dom-unstable-native-dependencies.development.js",
|
||||
@@ -151,148 +151,148 @@
|
||||
"filename": "ReactDOMUnstableNativeDependencies-dev.js",
|
||||
"bundleType": "FB_DEV",
|
||||
"packageName": "react-dom",
|
||||
"size": 57841,
|
||||
"gzip": 14786
|
||||
"size": 57783,
|
||||
"gzip": 14756
|
||||
},
|
||||
{
|
||||
"filename": "ReactDOMUnstableNativeDependencies-prod.js",
|
||||
"bundleType": "FB_PROD",
|
||||
"packageName": "react-dom",
|
||||
"size": 26798,
|
||||
"gzip": 5389
|
||||
"size": 26739,
|
||||
"gzip": 5365
|
||||
},
|
||||
{
|
||||
"filename": "react-dom-server.browser.development.js",
|
||||
"bundleType": "UMD_DEV",
|
||||
"packageName": "react-dom",
|
||||
"size": 103772,
|
||||
"gzip": 27137
|
||||
"size": 103774,
|
||||
"gzip": 27138
|
||||
},
|
||||
{
|
||||
"filename": "react-dom-server.browser.production.min.js",
|
||||
"bundleType": "UMD_PROD",
|
||||
"packageName": "react-dom",
|
||||
"size": 15304,
|
||||
"gzip": 5869
|
||||
"size": 15306,
|
||||
"gzip": 5871
|
||||
},
|
||||
{
|
||||
"filename": "react-dom-server.browser.development.js",
|
||||
"bundleType": "NODE_DEV",
|
||||
"packageName": "react-dom",
|
||||
"size": 92816,
|
||||
"gzip": 24837
|
||||
"size": 92818,
|
||||
"gzip": 24838
|
||||
},
|
||||
{
|
||||
"filename": "react-dom-server.browser.production.min.js",
|
||||
"bundleType": "NODE_PROD",
|
||||
"packageName": "react-dom",
|
||||
"size": 14941,
|
||||
"gzip": 5711
|
||||
"size": 14943,
|
||||
"gzip": 5712
|
||||
},
|
||||
{
|
||||
"filename": "ReactDOMServer-dev.js",
|
||||
"bundleType": "FB_DEV",
|
||||
"packageName": "react-dom",
|
||||
"size": 95927,
|
||||
"gzip": 24505
|
||||
"size": 95891,
|
||||
"gzip": 24487
|
||||
},
|
||||
{
|
||||
"filename": "ReactDOMServer-prod.js",
|
||||
"bundleType": "FB_PROD",
|
||||
"packageName": "react-dom",
|
||||
"size": 33559,
|
||||
"gzip": 8341
|
||||
"size": 33522,
|
||||
"gzip": 8329
|
||||
},
|
||||
{
|
||||
"filename": "react-dom-server.node.development.js",
|
||||
"bundleType": "NODE_DEV",
|
||||
"packageName": "react-dom",
|
||||
"size": 94784,
|
||||
"gzip": 25394
|
||||
"size": 94786,
|
||||
"gzip": 25396
|
||||
},
|
||||
{
|
||||
"filename": "react-dom-server.node.production.min.js",
|
||||
"bundleType": "NODE_PROD",
|
||||
"packageName": "react-dom",
|
||||
"size": 15765,
|
||||
"gzip": 6011
|
||||
"size": 15767,
|
||||
"gzip": 6013
|
||||
},
|
||||
{
|
||||
"filename": "react-art.development.js",
|
||||
"bundleType": "UMD_DEV",
|
||||
"packageName": "react-art",
|
||||
"size": 415570,
|
||||
"gzip": 89989
|
||||
"size": 420342,
|
||||
"gzip": 91083
|
||||
},
|
||||
{
|
||||
"filename": "react-art.production.min.js",
|
||||
"bundleType": "UMD_PROD",
|
||||
"packageName": "react-art",
|
||||
"size": 91910,
|
||||
"gzip": 28028
|
||||
"size": 92061,
|
||||
"gzip": 28038
|
||||
},
|
||||
{
|
||||
"filename": "react-art.development.js",
|
||||
"bundleType": "NODE_DEV",
|
||||
"packageName": "react-art",
|
||||
"size": 339627,
|
||||
"gzip": 70836
|
||||
"size": 344399,
|
||||
"gzip": 71874
|
||||
},
|
||||
{
|
||||
"filename": "react-art.production.min.js",
|
||||
"bundleType": "NODE_PROD",
|
||||
"packageName": "react-art",
|
||||
"size": 55895,
|
||||
"gzip": 17190
|
||||
"size": 56045,
|
||||
"gzip": 17231
|
||||
},
|
||||
{
|
||||
"filename": "ReactART-dev.js",
|
||||
"bundleType": "FB_DEV",
|
||||
"packageName": "react-art",
|
||||
"size": 345948,
|
||||
"gzip": 70267
|
||||
"size": 350895,
|
||||
"gzip": 71370
|
||||
},
|
||||
{
|
||||
"filename": "ReactART-prod.js",
|
||||
"bundleType": "FB_PROD",
|
||||
"packageName": "react-art",
|
||||
"size": 175903,
|
||||
"gzip": 29509
|
||||
"size": 176846,
|
||||
"gzip": 29583
|
||||
},
|
||||
{
|
||||
"filename": "ReactNativeRenderer-dev.js",
|
||||
"bundleType": "RN_DEV",
|
||||
"packageName": "react-native-renderer",
|
||||
"size": 471820,
|
||||
"gzip": 101164
|
||||
"size": 476799,
|
||||
"gzip": 102295
|
||||
},
|
||||
{
|
||||
"filename": "ReactNativeRenderer-prod.js",
|
||||
"bundleType": "RN_PROD",
|
||||
"packageName": "react-native-renderer",
|
||||
"size": 227511,
|
||||
"gzip": 38646
|
||||
"size": 228487,
|
||||
"gzip": 38740
|
||||
},
|
||||
{
|
||||
"filename": "react-test-renderer.development.js",
|
||||
"bundleType": "NODE_DEV",
|
||||
"packageName": "react-test-renderer",
|
||||
"size": 338031,
|
||||
"gzip": 69843
|
||||
"size": 342803,
|
||||
"gzip": 70878
|
||||
},
|
||||
{
|
||||
"filename": "react-test-renderer.production.min.js",
|
||||
"bundleType": "NODE_PROD",
|
||||
"packageName": "react-test-renderer",
|
||||
"size": 54858,
|
||||
"gzip": 16618
|
||||
"size": 55008,
|
||||
"gzip": 16673
|
||||
},
|
||||
{
|
||||
"filename": "ReactTestRenderer-dev.js",
|
||||
"bundleType": "FB_DEV",
|
||||
"packageName": "react-test-renderer",
|
||||
"size": 344543,
|
||||
"gzip": 69349
|
||||
"size": 349481,
|
||||
"gzip": 70442
|
||||
},
|
||||
{
|
||||
"filename": "react-test-renderer-shallow.development.js",
|
||||
@@ -312,8 +312,8 @@
|
||||
"filename": "ReactShallowRenderer-dev.js",
|
||||
"bundleType": "FB_DEV",
|
||||
"packageName": "react-test-renderer",
|
||||
"size": 14132,
|
||||
"gzip": 3452
|
||||
"size": 14088,
|
||||
"gzip": 3437
|
||||
},
|
||||
{
|
||||
"filename": "react-noop-renderer.development.js",
|
||||
@@ -333,15 +333,15 @@
|
||||
"filename": "react-reconciler.development.js",
|
||||
"bundleType": "NODE_DEV",
|
||||
"packageName": "react-reconciler",
|
||||
"size": 317945,
|
||||
"gzip": 65189
|
||||
"size": 322717,
|
||||
"gzip": 66224
|
||||
},
|
||||
{
|
||||
"filename": "react-reconciler.production.min.js",
|
||||
"bundleType": "NODE_PROD",
|
||||
"packageName": "react-reconciler",
|
||||
"size": 47573,
|
||||
"gzip": 14577
|
||||
"size": 47723,
|
||||
"gzip": 14603
|
||||
},
|
||||
{
|
||||
"filename": "react-reconciler-reflection.development.js",
|
||||
@@ -375,29 +375,29 @@
|
||||
"filename": "ReactFabric-dev.js",
|
||||
"bundleType": "RN_DEV",
|
||||
"packageName": "react-native-renderer",
|
||||
"size": 456666,
|
||||
"gzip": 97695
|
||||
"size": 461645,
|
||||
"gzip": 98803
|
||||
},
|
||||
{
|
||||
"filename": "ReactFabric-prod.js",
|
||||
"bundleType": "RN_PROD",
|
||||
"packageName": "react-native-renderer",
|
||||
"size": 211795,
|
||||
"gzip": 35906
|
||||
"size": 212373,
|
||||
"gzip": 35987
|
||||
},
|
||||
{
|
||||
"filename": "react-reconciler-persistent.development.js",
|
||||
"bundleType": "NODE_DEV",
|
||||
"packageName": "react-reconciler",
|
||||
"size": 317264,
|
||||
"gzip": 64950
|
||||
"size": 322036,
|
||||
"gzip": 65980
|
||||
},
|
||||
{
|
||||
"filename": "react-reconciler-persistent.production.min.js",
|
||||
"bundleType": "NODE_PROD",
|
||||
"packageName": "react-reconciler",
|
||||
"size": 46469,
|
||||
"gzip": 14360
|
||||
"size": 46619,
|
||||
"gzip": 14375
|
||||
},
|
||||
{
|
||||
"filename": "react-is.development.js",
|
||||
@@ -460,7 +460,7 @@
|
||||
"bundleType": "NODE_DEV",
|
||||
"packageName": "create-subscription",
|
||||
"size": 5701,
|
||||
"gzip": 2023
|
||||
"gzip": 2024
|
||||
},
|
||||
{
|
||||
"filename": "create-subscription.production.min.js",
|
||||
@@ -473,15 +473,15 @@
|
||||
"filename": "ReactIs-dev.js",
|
||||
"bundleType": "FB_DEV",
|
||||
"packageName": "react-is",
|
||||
"size": 4262,
|
||||
"gzip": 1212
|
||||
"size": 4231,
|
||||
"gzip": 1200
|
||||
},
|
||||
{
|
||||
"filename": "ReactIs-prod.js",
|
||||
"bundleType": "FB_PROD",
|
||||
"packageName": "react-is",
|
||||
"size": 3414,
|
||||
"gzip": 947
|
||||
"size": 3382,
|
||||
"gzip": 932
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -93,7 +93,6 @@ ${source}`;
|
||||
${license}
|
||||
*
|
||||
* @noflow
|
||||
* @providesModule ${globalName}-dev
|
||||
* @preventMunge
|
||||
*/
|
||||
|
||||
@@ -112,7 +111,6 @@ ${source}
|
||||
${license}
|
||||
*
|
||||
* @noflow
|
||||
* @providesModule ${globalName}-prod
|
||||
* @preventMunge
|
||||
*/
|
||||
|
||||
|
||||
@@ -5603,8 +5603,8 @@ whatwg-encoding@^1.0.1:
|
||||
iconv-lite "0.4.13"
|
||||
|
||||
whatwg-fetch@>=0.10.0:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f"
|
||||
|
||||
whatwg-url@^6.3.0:
|
||||
version "6.4.0"
|
||||
|
||||
Reference in New Issue
Block a user