From de05d2ededfee911c500a42d02b4661854051b3c Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Thu, 31 Aug 2017 18:23:08 -0700 Subject: [PATCH] Remove disableNewFiberFeatures flag (#10585) --- .../children/__tests__/ReactChildren-test.js | 6 - .../__tests__/ReactComponent-test.js | 4 - .../__tests__/ReactEmptyComponent-test.js | 49 +++--- .../__tests__/ReactStatelessComponent-test.js | 20 ++- src/renderers/__tests__/refs-test.js | 5 - .../dom/ReactDOMNodeStreamRenderer.js | 18 -- src/renderers/dom/ReactDOMStringRenderer.js | 17 -- .../dom/__tests__/ReactDOMProduction-test.js | 5 +- src/renderers/dom/fiber/ReactDOMFiberEntry.js | 34 ---- .../dom/fiber/__tests__/ReactDOMFiber-test.js | 73 -------- .../ReactDOMServerIntegration-test.js | 2 - .../dom/shared/__tests__/ReactMount-test.js | 38 ++--- .../__tests__/ReactServerRendering-test.js | 4 - src/renderers/shared/fiber/ReactChildFiber.js | 157 +++++------------- .../fiber/__tests__/ReactCoroutine-test.js | 3 - .../fiber/__tests__/ReactIncremental-test.js | 4 - .../ReactIncrementalErrorHandling-test.js | 3 - .../__tests__/ReactIncrementalPerf-test.js | 3 - .../ReactIncrementalReflection-test.js | 3 - .../ReactIncrementalScheduling-test.js | 3 - .../ReactIncrementalSideEffects-test.js | 3 - .../ReactIncrementalTriangle-test.js | 4 - .../__tests__/ReactIncrementalUpdates-test.js | 3 - .../__tests__/ReactTopLevelFragment-test.js | 3 - .../fiber/__tests__/ReactTopLevelText-test.js | 3 - .../shared/utils/ReactFeatureFlags.js | 1 - .../__tests__/ReactTestRenderer-test.js | 6 - 27 files changed, 94 insertions(+), 380 deletions(-) diff --git a/src/isomorphic/children/__tests__/ReactChildren-test.js b/src/isomorphic/children/__tests__/ReactChildren-test.js index 9d97007cd1..fc02176a72 100644 --- a/src/isomorphic/children/__tests__/ReactChildren-test.js +++ b/src/isomorphic/children/__tests__/ReactChildren-test.js @@ -16,7 +16,6 @@ const ReactDOMFeatureFlags = require('ReactDOMFeatureFlags'); describe('ReactChildren', () => { var React; var ReactTestUtils; - var ReactFeatureFlags; function normalizeCodeLocInfo(str) { return str && str.replace(/at .+?:\d+/g, 'at **'); @@ -883,11 +882,6 @@ describe('ReactChildren', () => { if (ReactDOMFeatureFlags.useFiber) { describe('with fragments enabled', () => { - beforeEach(() => { - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; - }); - it('warns for keys for arrays of elements in a fragment', () => { spyOn(console, 'error'); class ComponentReturningArray extends React.Component { diff --git a/src/renderers/__tests__/ReactComponent-test.js b/src/renderers/__tests__/ReactComponent-test.js index a5f5ce287f..15d55e7826 100644 --- a/src/renderers/__tests__/ReactComponent-test.js +++ b/src/renderers/__tests__/ReactComponent-test.js @@ -496,10 +496,6 @@ describe('ReactComponent', () => { if (ReactDOMFeatureFlags.useFiber) { describe('with new features', () => { - beforeEach(() => { - require('ReactFeatureFlags').disableNewFiberFeatures = false; - }); - it('warns on function as a return value from a function', () => { function Foo() { return Foo; diff --git a/src/renderers/__tests__/ReactEmptyComponent-test.js b/src/renderers/__tests__/ReactEmptyComponent-test.js index 5368ae06a9..4058e5898a 100644 --- a/src/renderers/__tests__/ReactEmptyComponent-test.js +++ b/src/renderers/__tests__/ReactEmptyComponent-test.js @@ -13,10 +13,11 @@ var React; var ReactDOM; -var ReactDOMFeatureFlags; var ReactTestUtils; var TogglingComponent; +var ReactDOMFeatureFlags = require('ReactDOMFeatureFlags'); + var log; describe('ReactEmptyComponent', () => { @@ -25,7 +26,6 @@ describe('ReactEmptyComponent', () => { React = require('react'); ReactDOM = require('react-dom'); - ReactDOMFeatureFlags = require('ReactDOMFeatureFlags'); ReactTestUtils = require('react-dom/test-utils'); log = jasmine.createSpy(); @@ -71,18 +71,20 @@ describe('ReactEmptyComponent', () => { expect(container2.children.length).toBe(0); }); - it('should still throw when rendering to undefined', () => { - class Component extends React.Component { - render() {} - } + if (ReactDOMFeatureFlags.useFiber) { + it('should still throw when rendering to undefined', () => { + class Component extends React.Component { + render() {} + } - expect(function() { - ReactTestUtils.renderIntoDocument(); - }).toThrowError( - 'Component.render(): A valid React element (or null) must be returned. You may ' + - 'have returned undefined, an array or some other invalid object.', - ); - }); + expect(function() { + ReactTestUtils.renderIntoDocument(); + }).toThrowError( + 'Component(...): Nothing was returned from render. This usually means a return statement is missing. ' + + 'Or, to render nothing, return null.', + ); + }); + } it('should be able to switch between rendering null and a normal tag', () => { var instance1 = ( @@ -232,22 +234,15 @@ describe('ReactEmptyComponent', () => { }); it('can render null at the top level', () => { - var ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; var div = document.createElement('div'); - - try { - if (ReactDOMFeatureFlags.useFiber) { + if (ReactDOMFeatureFlags.useFiber) { + ReactDOM.render(null, div); + expect(div.innerHTML).toBe(''); + } else { + // Stack does not implement this. + expect(function() { ReactDOM.render(null, div); - expect(div.innerHTML).toBe(''); - } else { - // Stack does not implement this. - expect(function() { - ReactDOM.render(null, div); - }).toThrowError('ReactDOM.render(): Invalid component element.'); - } - } finally { - ReactFeatureFlags.disableNewFiberFeatures = true; + }).toThrowError('ReactDOM.render(): Invalid component element.'); } }); diff --git a/src/renderers/__tests__/ReactStatelessComponent-test.js b/src/renderers/__tests__/ReactStatelessComponent-test.js index f3eafc118e..a1e1a59b7b 100644 --- a/src/renderers/__tests__/ReactStatelessComponent-test.js +++ b/src/renderers/__tests__/ReactStatelessComponent-test.js @@ -157,15 +157,17 @@ describe('ReactStatelessComponent', () => { }); } - it('should throw when stateless component returns undefined', () => { - function NotAComponent() {} - expect(function() { - ReactTestUtils.renderIntoDocument(
); - }).toThrowError( - 'NotAComponent(...): A valid React element (or null) must be returned. ' + - 'You may have returned undefined, an array or some other invalid object.', - ); - }); + if (ReactDOMFeatureFlags.useFiber) { + it('should throw when stateless component returns undefined', () => { + function NotAComponent() {} + expect(function() { + ReactTestUtils.renderIntoDocument(
); + }).toThrowError( + 'NotAComponent(...): Nothing was returned from render. ' + + 'This usually means a return statement is missing. Or, to render nothing, return null.', + ); + }); + } it('should throw on string refs in pure functions', () => { function Child() { diff --git a/src/renderers/__tests__/refs-test.js b/src/renderers/__tests__/refs-test.js index 6f16f2fd34..3c920a3c50 100644 --- a/src/renderers/__tests__/refs-test.js +++ b/src/renderers/__tests__/refs-test.js @@ -394,11 +394,6 @@ describe('string refs between fiber and stack', () => { }); describe('root level refs', () => { - beforeEach(() => { - var ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; - }); - it('attaches and detaches root refs', () => { var ReactDOM = require('react-dom'); var inst = null; diff --git a/src/renderers/dom/ReactDOMNodeStreamRenderer.js b/src/renderers/dom/ReactDOMNodeStreamRenderer.js index 7a54db6531..3fa43ead77 100644 --- a/src/renderers/dom/ReactDOMNodeStreamRenderer.js +++ b/src/renderers/dom/ReactDOMNodeStreamRenderer.js @@ -11,11 +11,7 @@ 'use strict'; -var invariant = require('fbjs/lib/invariant'); -var React = require('react'); var ReactPartialRenderer = require('ReactPartialRenderer'); -var ReactFeatureFlags = require('ReactFeatureFlags'); - var Readable = require('stream').Readable; // This is a Readable Node.js stream which wraps the ReactDOMPartialRenderer. @@ -41,13 +37,6 @@ class ReactMarkupReadableStream extends Readable { * See https://facebook.github.io/react/docs/react-dom-stream.html#rendertonodestream */ function renderToNodeStream(element) { - const disableNewFiberFeatures = ReactFeatureFlags.disableNewFiberFeatures; - if (disableNewFiberFeatures) { - invariant( - React.isValidElement(element), - 'renderToNodeStream(): Invalid component element.', - ); - } return new ReactMarkupReadableStream(element, false); } @@ -57,13 +46,6 @@ function renderToNodeStream(element) { * See https://facebook.github.io/react/docs/react-dom-stream.html#rendertostaticnodestream */ function renderToStaticNodeStream(element) { - const disableNewFiberFeatures = ReactFeatureFlags.disableNewFiberFeatures; - if (disableNewFiberFeatures) { - invariant( - React.isValidElement(element), - 'renderToStaticNodeStream(): Invalid component element.', - ); - } return new ReactMarkupReadableStream(element, true); } diff --git a/src/renderers/dom/ReactDOMStringRenderer.js b/src/renderers/dom/ReactDOMStringRenderer.js index 4374e29721..94649df7c0 100644 --- a/src/renderers/dom/ReactDOMStringRenderer.js +++ b/src/renderers/dom/ReactDOMStringRenderer.js @@ -11,10 +11,7 @@ 'use strict'; -var invariant = require('fbjs/lib/invariant'); -var React = require('react'); var ReactPartialRenderer = require('ReactPartialRenderer'); -var ReactFeatureFlags = require('ReactFeatureFlags'); /** * Render a ReactElement to its initial HTML. This should only be used on the @@ -22,13 +19,6 @@ var ReactFeatureFlags = require('ReactFeatureFlags'); * See https://facebook.github.io/react/docs/react-dom-server.html#rendertostring */ function renderToString(element) { - const disableNewFiberFeatures = ReactFeatureFlags.disableNewFiberFeatures; - if (disableNewFiberFeatures) { - invariant( - React.isValidElement(element), - 'renderToString(): Invalid component element.', - ); - } var renderer = new ReactPartialRenderer(element, false); var markup = renderer.read(Infinity); return markup; @@ -40,13 +30,6 @@ function renderToString(element) { * See https://facebook.github.io/react/docs/react-dom-server.html#rendertostaticmarkup */ function renderToStaticMarkup(element) { - const disableNewFiberFeatures = ReactFeatureFlags.disableNewFiberFeatures; - if (disableNewFiberFeatures) { - invariant( - React.isValidElement(element), - 'renderToStaticMarkup(): Invalid component element.', - ); - } var renderer = new ReactPartialRenderer(element, true); var markup = renderer.read(Infinity); return markup; diff --git a/src/renderers/dom/__tests__/ReactDOMProduction-test.js b/src/renderers/dom/__tests__/ReactDOMProduction-test.js index d4fab65a45..422ee37104 100644 --- a/src/renderers/dom/__tests__/ReactDOMProduction-test.js +++ b/src/renderers/dom/__tests__/ReactDOMProduction-test.js @@ -197,6 +197,7 @@ describe('ReactDOMProduction', () => { }); it('should throw with an error code in production', () => { + const errorCode = ReactDOMFeatureFlags.useFiber ? 152 : 109; expect(function() { class Component extends React.Component { render() { @@ -207,8 +208,8 @@ describe('ReactDOMProduction', () => { var container = document.createElement('div'); ReactDOM.render(, container); }).toThrowError( - 'Minified React error #109; visit ' + - 'http://facebook.github.io/react/docs/error-decoder.html?invariant=109&args[]=Component' + + `Minified React error #${errorCode}; visit ` + + `http://facebook.github.io/react/docs/error-decoder.html?invariant=${errorCode}&args[]=Component` + ' for the full message or use the non-minified dev environment' + ' for full errors and additional helpful warnings.', ); diff --git a/src/renderers/dom/fiber/ReactDOMFiberEntry.js b/src/renderers/dom/fiber/ReactDOMFiberEntry.js index f340a2a6de..322a8262df 100644 --- a/src/renderers/dom/fiber/ReactDOMFiberEntry.js +++ b/src/renderers/dom/fiber/ReactDOMFiberEntry.js @@ -21,7 +21,6 @@ var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment'); var ReactBrowserEventEmitter = require('ReactBrowserEventEmitter'); var ReactControlledComponent = require('ReactControlledComponent'); var ReactDOMComponentTree = require('ReactDOMComponentTree'); -var ReactFeatureFlags = require('ReactFeatureFlags'); var ReactDOMFeatureFlags = require('ReactDOMFeatureFlags'); var ReactDOMFiberComponent = require('ReactDOMFiberComponent'); var ReactDOMFrameScheduling = require('ReactDOMFrameScheduling'); @@ -31,7 +30,6 @@ var ReactInputSelection = require('ReactInputSelection'); var ReactInstanceMap = require('ReactInstanceMap'); var ReactPortal = require('ReactPortal'); var ReactVersion = require('ReactVersion'); -var {isValidElement} = require('react'); var {injectInternals} = require('ReactFiberDevToolsHook'); var { ELEMENT_NODE, @@ -659,38 +657,6 @@ var ReactDOMFiber = { container: DOMContainer, callback: ?Function, ) { - if (ReactFeatureFlags.disableNewFiberFeatures) { - // Top-level check occurs here instead of inside child reconciler - // because requirements vary between renderers. E.g. React Art - // allows arrays. - if (!isValidElement(element)) { - if (typeof element === 'string') { - invariant( - false, - 'ReactDOM.render(): Invalid component element. Instead of ' + - "passing a string like 'div', pass " + - "React.createElement('div') or
.", - ); - } else if (typeof element === 'function') { - invariant( - false, - 'ReactDOM.render(): Invalid component element. Instead of ' + - 'passing a class like Foo, pass React.createElement(Foo) ' + - 'or .', - ); - } else if (element != null && typeof element.props !== 'undefined') { - // Check if it quacks like an element - invariant( - false, - 'ReactDOM.render(): Invalid component element. This may be ' + - 'caused by unintentionally loading two independent copies ' + - 'of React.', - ); - } else { - invariant(false, 'ReactDOM.render(): Invalid component element.'); - } - } - } return renderSubtreeIntoContainer( null, element, diff --git a/src/renderers/dom/fiber/__tests__/ReactDOMFiber-test.js b/src/renderers/dom/fiber/__tests__/ReactDOMFiber-test.js index 2910041d9b..aabaeae11f 100644 --- a/src/renderers/dom/fiber/__tests__/ReactDOMFiber-test.js +++ b/src/renderers/dom/fiber/__tests__/ReactDOMFiber-test.js @@ -23,17 +23,9 @@ describe('ReactDOMFiber', () => { } var container; - var ReactFeatureFlags; beforeEach(() => { container = document.createElement('div'); - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; - }); - - afterEach(() => { - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = true; }); it('should render strings as children', () => { @@ -1103,68 +1095,3 @@ describe('ReactDOMFiber', () => { }); } }); - -// disableNewFiberFeatures currently defaults to true in test -describe('disableNewFiberFeatures', () => { - var container; - var ReactFeatureFlags; - - beforeEach(() => { - container = document.createElement('div'); - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = true; - }); - - afterEach(() => { - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; - }); - - it('throws if non-element passed to top-level render', () => { - const message = 'render(): Invalid component element.'; - expect(() => ReactDOM.render(null, container)).toThrow(message, container); - expect(() => ReactDOM.render(undefined, container)).toThrow( - message, - container, - ); - expect(() => ReactDOM.render(false, container)).toThrow(message, container); - expect(() => ReactDOM.render('Hi', container)).toThrow(message, container); - expect(() => ReactDOM.render(999, container)).toThrow(message, container); - expect(() => ReactDOM.render([
], container)).toThrow( - message, - container, - ); - }); - - it('throws if something other than false, null, or an element is returned from render', () => { - function Render(props) { - return props.children; - } - - expect(() => ReactDOM.render(Hi, container)).toThrow( - /You may have returned undefined/, - ); - expect(() => ReactDOM.render({999}, container)).toThrow( - /You may have returned undefined/, - ); - expect(() => - ReactDOM.render([
], container), - ).toThrow(/You may have returned undefined/); - }); - - it('treats mocked render functions as if they return null', () => { - class Mocked extends React.Component {} - Mocked.prototype.render = jest.fn(); - ReactDOM.render(, container); - expect(container.textContent).toEqual(''); - }); - - it('throws if the React package cannot be loaded', () => { - jest.resetModules(); - jest.mock('react', () => undefined); - expect(() => require('react-dom')).toThrow( - 'ReactDOM was loaded before React.', - ); - jest.resetModules(); - }); -}); diff --git a/src/renderers/dom/shared/__tests__/ReactDOMServerIntegration-test.js b/src/renderers/dom/shared/__tests__/ReactDOMServerIntegration-test.js index 0d42561170..4f8b327ad4 100644 --- a/src/renderers/dom/shared/__tests__/ReactDOMServerIntegration-test.js +++ b/src/renderers/dom/shared/__tests__/ReactDOMServerIntegration-test.js @@ -323,7 +323,6 @@ function resetModules() { // TODO: can we express this test with only public API? ExecutionEnvironment = require('ExecutionEnvironment'); - require('ReactFeatureFlags').disableNewFiberFeatures = false; PropTypes = require('prop-types'); React = require('react'); ReactDOM = require('react-dom'); @@ -334,7 +333,6 @@ function resetModules() { // Resetting is important because we want to avoid any shared state // influencing the tests. jest.resetModuleRegistry(); - require('ReactFeatureFlags').disableNewFiberFeatures = false; ReactDOMServer = require('react-dom/server'); } diff --git a/src/renderers/dom/shared/__tests__/ReactMount-test.js b/src/renderers/dom/shared/__tests__/ReactMount-test.js index 458cbd09ff..07b288de27 100644 --- a/src/renderers/dom/shared/__tests__/ReactMount-test.js +++ b/src/renderers/dom/shared/__tests__/ReactMount-test.js @@ -68,29 +68,24 @@ describe('ReactMount', () => { }); }); - it('throws when given a string', () => { - expect(function() { - ReactTestUtils.renderIntoDocument('div'); - }).toThrowError( - 'ReactDOM.render(): Invalid component element. Instead of passing a ' + - "string like 'div', pass React.createElement('div') or
.", - ); - }); - - it('throws when given a factory', () => { - class Component extends React.Component { - render() { - return
; + if (ReactDOMFeatureFlags.useFiber) { + it('warns when given a factory', () => { + spyOn(console, 'error'); + class Component extends React.Component { + render() { + return
; + } } - } - expect(function() { ReactTestUtils.renderIntoDocument(Component); - }).toThrowError( - 'ReactDOM.render(): Invalid component element. Instead of passing a ' + - 'class like Foo, pass React.createElement(Foo) or .', - ); - }); + expectDev(console.error.calls.count()).toBe(1); + expectDev(console.error.calls.argsFor(0)[0]).toContain( + 'Functions are not valid as a React child. ' + + 'This may happen if you return a Component instead of from render. ' + + 'Or maybe you meant to call this function rather than return it.', + ); + }); + } it('should render different components in same root', () => { var container = document.createElement('container'); @@ -401,9 +396,6 @@ describe('ReactMount', () => { let mountPoint; beforeEach(() => { - const ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; - containerDiv = document.createElement('div'); containerDiv.innerHTML = 'AB'; mountPoint = containerDiv.childNodes[1]; diff --git a/src/renderers/dom/shared/__tests__/ReactServerRendering-test.js b/src/renderers/dom/shared/__tests__/ReactServerRendering-test.js index cb3046b5e4..1e273f8ecb 100644 --- a/src/renderers/dom/shared/__tests__/ReactServerRendering-test.js +++ b/src/renderers/dom/shared/__tests__/ReactServerRendering-test.js @@ -19,7 +19,6 @@ var ReactMarkupChecksum; var ReactReconcileTransaction; var ReactTestUtils; var PropTypes; -var ReactFeatureFlags; var ReactDOMFeatureFlags = require('ReactDOMFeatureFlags'); @@ -36,9 +35,6 @@ describe('ReactDOMServer', () => { ReactReconcileTransaction = require('ReactReconcileTransaction'); PropTypes = require('prop-types'); - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; - ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment'); ExecutionEnvironment.canUseDOM = false; ReactDOMServer = require('react-dom/server'); diff --git a/src/renderers/shared/fiber/ReactChildFiber.js b/src/renderers/shared/fiber/ReactChildFiber.js index 9a4157b13e..655e2a1e85 100644 --- a/src/renderers/shared/fiber/ReactChildFiber.js +++ b/src/renderers/shared/fiber/ReactChildFiber.js @@ -27,7 +27,6 @@ var ReactTypeOfWork = require('ReactTypeOfWork'); var emptyObject = require('fbjs/lib/emptyObject'); var invariant = require('fbjs/lib/invariant'); -var ReactFeatureFlags = require('ReactFeatureFlags'); if (__DEV__) { var {getCurrentFiberStackAddendum} = require('ReactDebugCurrentFiber'); @@ -576,8 +575,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { } if (__DEV__) { - const disableNewFiberFeatures = ReactFeatureFlags.disableNewFiberFeatures; - if (!disableNewFiberFeatures && typeof newChild === 'function') { + if (typeof newChild === 'function') { warnOnFunctionType(); } } @@ -656,8 +654,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { } if (__DEV__) { - const disableNewFiberFeatures = ReactFeatureFlags.disableNewFiberFeatures; - if (!disableNewFiberFeatures && typeof newChild === 'function') { + if (typeof newChild === 'function') { warnOnFunctionType(); } } @@ -722,8 +719,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { } if (__DEV__) { - const disableNewFiberFeatures = ReactFeatureFlags.disableNewFiberFeatures; - if (!disableNewFiberFeatures && typeof newChild === 'function') { + if (typeof newChild === 'function') { warnOnFunctionType(); } } @@ -1301,118 +1297,51 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { // not as a fragment. Nested arrays on the other hand will be treated as // fragment nodes. Recursion happens at the normal flow. - const disableNewFiberFeatures = ReactFeatureFlags.disableNewFiberFeatures; - // Handle object types const isObject = typeof newChild === 'object' && newChild !== null; if (isObject) { // Support only the subset of return types that Stack supports. Treat // everything else as empty, but log a warning. - if (disableNewFiberFeatures) { - switch (newChild.$$typeof) { - case REACT_ELEMENT_TYPE: - return placeSingleChild( - reconcileSingleElement( - returnFiber, - currentFirstChild, - newChild, - priority, - ), - ); - - case REACT_PORTAL_TYPE: - return placeSingleChild( - reconcileSinglePortal( - returnFiber, - currentFirstChild, - newChild, - priority, - ), - ); - } - } else { - switch (newChild.$$typeof) { - case REACT_ELEMENT_TYPE: - return placeSingleChild( - reconcileSingleElement( - returnFiber, - currentFirstChild, - newChild, - priority, - ), - ); - - case REACT_COROUTINE_TYPE: - return placeSingleChild( - reconcileSingleCoroutine( - returnFiber, - currentFirstChild, - newChild, - priority, - ), - ); - - case REACT_YIELD_TYPE: - return placeSingleChild( - reconcileSingleYield( - returnFiber, - currentFirstChild, - newChild, - priority, - ), - ); - - case REACT_PORTAL_TYPE: - return placeSingleChild( - reconcileSinglePortal( - returnFiber, - currentFirstChild, - newChild, - priority, - ), - ); - } - } - } - - if (disableNewFiberFeatures) { - // The new child is not an element. If it's not null or false, - // and the return fiber is a composite component, throw an error. - switch (returnFiber.tag) { - case ClassComponent: { - if (__DEV__) { - const instance = returnFiber.stateNode; - if ( - instance.render._isMockFunction && - typeof newChild === 'undefined' - ) { - // We allow auto-mocks to proceed as if they're - // returning null. - break; - } - } - const Component = returnFiber.type; - invariant( - newChild === null || newChild === false, - '%s.render(): A valid React element (or null) must be returned. ' + - 'You may have returned undefined, an array or some other ' + - 'invalid object.', - Component.displayName || Component.name || 'Component', + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + return placeSingleChild( + reconcileSingleElement( + returnFiber, + currentFirstChild, + newChild, + priority, + ), ); - break; - } - case FunctionalComponent: { - // Composites accept elements, portals, null, or false - const Component = returnFiber.type; - invariant( - newChild === null || newChild === false, - '%s(...): A valid React element (or null) must be returned. ' + - 'You may have returned undefined, an array or some other ' + - 'invalid object.', - Component.displayName || Component.name || 'Component', + + case REACT_COROUTINE_TYPE: + return placeSingleChild( + reconcileSingleCoroutine( + returnFiber, + currentFirstChild, + newChild, + priority, + ), + ); + + case REACT_YIELD_TYPE: + return placeSingleChild( + reconcileSingleYield( + returnFiber, + currentFirstChild, + newChild, + priority, + ), + ); + + case REACT_PORTAL_TYPE: + return placeSingleChild( + reconcileSinglePortal( + returnFiber, + currentFirstChild, + newChild, + priority, + ), ); - break; - } } } @@ -1450,11 +1379,11 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { } if (__DEV__) { - if (!disableNewFiberFeatures && typeof newChild === 'function') { + if (typeof newChild === 'function') { warnOnFunctionType(); } } - if (!disableNewFiberFeatures && typeof newChild === 'undefined') { + if (typeof newChild === 'undefined') { // If the new child is undefined, and the return fiber is a composite // component, throw an error. If Fiber return types are disabled, // we already threw above. diff --git a/src/renderers/shared/fiber/__tests__/ReactCoroutine-test.js b/src/renderers/shared/fiber/__tests__/ReactCoroutine-test.js index a331ffcc44..a90433a9e9 100644 --- a/src/renderers/shared/fiber/__tests__/ReactCoroutine-test.js +++ b/src/renderers/shared/fiber/__tests__/ReactCoroutine-test.js @@ -14,7 +14,6 @@ var React; var ReactNoop; var ReactCoroutine; -var ReactFeatureFlags; describe('ReactCoroutine', () => { beforeEach(() => { @@ -23,8 +22,6 @@ describe('ReactCoroutine', () => { ReactNoop = require('react-noop-renderer'); // TODO: can we express this test with only public API? ReactCoroutine = require('ReactCoroutine'); - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; }); function div(...children) { diff --git a/src/renderers/shared/fiber/__tests__/ReactIncremental-test.js b/src/renderers/shared/fiber/__tests__/ReactIncremental-test.js index e1a8dfc54c..ccba6727f5 100644 --- a/src/renderers/shared/fiber/__tests__/ReactIncremental-test.js +++ b/src/renderers/shared/fiber/__tests__/ReactIncremental-test.js @@ -13,7 +13,6 @@ var React; var ReactNoop; -var ReactFeatureFlags; var PropTypes; describe('ReactIncremental', () => { @@ -22,9 +21,6 @@ describe('ReactIncremental', () => { React = require('react'); ReactNoop = require('react-noop-renderer'); PropTypes = require('prop-types'); - - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; }); it('should render a simple component', () => { diff --git a/src/renderers/shared/fiber/__tests__/ReactIncrementalErrorHandling-test.js b/src/renderers/shared/fiber/__tests__/ReactIncrementalErrorHandling-test.js index 433d3d6bc3..cc4882d626 100644 --- a/src/renderers/shared/fiber/__tests__/ReactIncrementalErrorHandling-test.js +++ b/src/renderers/shared/fiber/__tests__/ReactIncrementalErrorHandling-test.js @@ -14,7 +14,6 @@ var PropTypes; var React; var ReactNoop; -var ReactFeatureFlags; describe('ReactIncrementalErrorHandling', () => { beforeEach(() => { @@ -22,8 +21,6 @@ describe('ReactIncrementalErrorHandling', () => { PropTypes = require('prop-types'); React = require('react'); ReactNoop = require('react-noop-renderer'); - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; }); function div(...children) { diff --git a/src/renderers/shared/fiber/__tests__/ReactIncrementalPerf-test.js b/src/renderers/shared/fiber/__tests__/ReactIncrementalPerf-test.js index c04b4782e7..b8908ea4c6 100644 --- a/src/renderers/shared/fiber/__tests__/ReactIncrementalPerf-test.js +++ b/src/renderers/shared/fiber/__tests__/ReactIncrementalPerf-test.js @@ -14,7 +14,6 @@ describe('ReactDebugFiberPerf', () => { let React; let ReactCoroutine; - let ReactFeatureFlags; let ReactNoop; let ReactPortal; let PropTypes; @@ -121,8 +120,6 @@ describe('ReactDebugFiberPerf', () => { // TODO: can we express this test with only public API? ReactCoroutine = require('ReactCoroutine'); ReactPortal = require('ReactPortal'); - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; PropTypes = require('prop-types'); }); diff --git a/src/renderers/shared/fiber/__tests__/ReactIncrementalReflection-test.js b/src/renderers/shared/fiber/__tests__/ReactIncrementalReflection-test.js index 3181061fa8..f505d132de 100644 --- a/src/renderers/shared/fiber/__tests__/ReactIncrementalReflection-test.js +++ b/src/renderers/shared/fiber/__tests__/ReactIncrementalReflection-test.js @@ -13,15 +13,12 @@ var React; var ReactNoop; -var ReactFeatureFlags; describe('ReactIncrementalReflection', () => { beforeEach(() => { jest.resetModules(); React = require('react'); ReactNoop = require('react-noop-renderer'); - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; }); it('handles isMounted even when the initial render is deferred', () => { diff --git a/src/renderers/shared/fiber/__tests__/ReactIncrementalScheduling-test.js b/src/renderers/shared/fiber/__tests__/ReactIncrementalScheduling-test.js index d73ebe4133..3ed31d9456 100644 --- a/src/renderers/shared/fiber/__tests__/ReactIncrementalScheduling-test.js +++ b/src/renderers/shared/fiber/__tests__/ReactIncrementalScheduling-test.js @@ -13,15 +13,12 @@ var React; var ReactNoop; -var ReactFeatureFlags; describe('ReactIncrementalScheduling', () => { beforeEach(() => { jest.resetModules(); React = require('react'); ReactNoop = require('react-noop-renderer'); - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; }); function span(prop) { diff --git a/src/renderers/shared/fiber/__tests__/ReactIncrementalSideEffects-test.js b/src/renderers/shared/fiber/__tests__/ReactIncrementalSideEffects-test.js index c15489376c..fd2266329d 100644 --- a/src/renderers/shared/fiber/__tests__/ReactIncrementalSideEffects-test.js +++ b/src/renderers/shared/fiber/__tests__/ReactIncrementalSideEffects-test.js @@ -13,15 +13,12 @@ var React; var ReactNoop; -var ReactFeatureFlags; describe('ReactIncrementalSideEffects', () => { beforeEach(() => { jest.resetModules(); React = require('react'); ReactNoop = require('react-noop-renderer'); - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; }); function normalizeCodeLocInfo(str) { diff --git a/src/renderers/shared/fiber/__tests__/ReactIncrementalTriangle-test.js b/src/renderers/shared/fiber/__tests__/ReactIncrementalTriangle-test.js index ddc2337ed2..995a32b9f1 100644 --- a/src/renderers/shared/fiber/__tests__/ReactIncrementalTriangle-test.js +++ b/src/renderers/shared/fiber/__tests__/ReactIncrementalTriangle-test.js @@ -13,16 +13,12 @@ var React; var ReactNoop; -var ReactFeatureFlags; describe('ReactIncrementalTriangle', () => { beforeEach(() => { jest.resetModules(); React = require('react'); ReactNoop = require('ReactNoopEntry'); - - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; }); function span(prop) { diff --git a/src/renderers/shared/fiber/__tests__/ReactIncrementalUpdates-test.js b/src/renderers/shared/fiber/__tests__/ReactIncrementalUpdates-test.js index c4f980c517..7879162ad5 100644 --- a/src/renderers/shared/fiber/__tests__/ReactIncrementalUpdates-test.js +++ b/src/renderers/shared/fiber/__tests__/ReactIncrementalUpdates-test.js @@ -13,15 +13,12 @@ var React; var ReactNoop; -var ReactFeatureFlags; describe('ReactIncrementalUpdates', () => { beforeEach(() => { jest.resetModuleRegistry(); React = require('react'); ReactNoop = require('react-noop-renderer'); - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; }); function span(prop) { diff --git a/src/renderers/shared/fiber/__tests__/ReactTopLevelFragment-test.js b/src/renderers/shared/fiber/__tests__/ReactTopLevelFragment-test.js index 7f1fb9f3cc..f09c5fafeb 100644 --- a/src/renderers/shared/fiber/__tests__/ReactTopLevelFragment-test.js +++ b/src/renderers/shared/fiber/__tests__/ReactTopLevelFragment-test.js @@ -13,7 +13,6 @@ var React; var ReactNoop; -var ReactFeatureFlags; // This is a new feature in Fiber so I put it in its own test file. It could // probably move to one of the other test files once it is official. @@ -22,8 +21,6 @@ describe('ReactTopLevelFragment', function() { jest.resetModules(); React = require('react'); ReactNoop = require('react-noop-renderer'); - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; }); it('should render a simple fragment at the top of a component', function() { diff --git a/src/renderers/shared/fiber/__tests__/ReactTopLevelText-test.js b/src/renderers/shared/fiber/__tests__/ReactTopLevelText-test.js index 24ab990946..1e2e8eb5a1 100644 --- a/src/renderers/shared/fiber/__tests__/ReactTopLevelText-test.js +++ b/src/renderers/shared/fiber/__tests__/ReactTopLevelText-test.js @@ -13,7 +13,6 @@ var React; var ReactNoop; -var ReactFeatureFlags; // This is a new feature in Fiber so I put it in its own test file. It could // probably move to one of the other test files once it is official. @@ -22,8 +21,6 @@ describe('ReactTopLevelText', () => { jest.resetModules(); React = require('react'); ReactNoop = require('react-noop-renderer'); - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; }); it('should render a component returning strings directly from render', () => { diff --git a/src/renderers/shared/utils/ReactFeatureFlags.js b/src/renderers/shared/utils/ReactFeatureFlags.js index e0c72dd380..7e19b31dee 100644 --- a/src/renderers/shared/utils/ReactFeatureFlags.js +++ b/src/renderers/shared/utils/ReactFeatureFlags.js @@ -13,7 +13,6 @@ 'use strict'; var ReactFeatureFlags = { - disableNewFiberFeatures: false, enableAsyncSubtreeAPI: true, }; diff --git a/src/renderers/testing/__tests__/ReactTestRenderer-test.js b/src/renderers/testing/__tests__/ReactTestRenderer-test.js index 163bdabd6b..566a0788a5 100644 --- a/src/renderers/testing/__tests__/ReactTestRenderer-test.js +++ b/src/renderers/testing/__tests__/ReactTestRenderer-test.js @@ -14,7 +14,6 @@ var React = require('react'); var ReactTestRenderer = require('react-test-renderer'); var prettyFormat = require('pretty-format'); -var ReactFeatureFlags; // Kind of hacky, but we nullify all the instances to test the tree structure // with jasmine's deep equality function, and test the instances separate. We @@ -40,11 +39,6 @@ function cleanNode(node) { } describe('ReactTestRenderer', () => { - beforeEach(() => { - ReactFeatureFlags = require('ReactFeatureFlags'); - ReactFeatureFlags.disableNewFiberFeatures = false; - }); - function normalizeCodeLocInfo(str) { return str && str.replace(/\(at .+?:\d+\)/g, '(at **)'); }