From 1193a9483ce3381722979f6d435efb14fb32fd70 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 19 Apr 2018 22:53:12 -0400 Subject: [PATCH 01/17] checkPropTypes in updateContextProvider --- packages/react-reconciler/src/ReactFiberBeginWork.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index 6de5e54877ec3..963057f0be0e1 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -16,6 +16,7 @@ import type {NewContext} from './ReactFiberNewContext'; import type {HydrationContext} from './ReactFiberHydrationContext'; import type {FiberRoot} from './ReactFiberRoot'; import type {ExpirationTime} from './ReactFiberExpirationTime'; +import checkPropTypes from 'prop-types/checkPropTypes'; import { IndeterminateComponent, @@ -885,6 +886,15 @@ export default function( const newValue = newProps.value; workInProgress.memoizedProps = newProps; + if (__DEV__ && workInProgress.types) { + checkPropTypes( + workInProgress.types.propTypes, + newProps, + 'context', + 'ReactContext', + ); + } + let changedBits: number; if (oldProps === null) { // Initial render From 1184974691354836ac08c2ce6b14b2fe3765abf7 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 19 Apr 2018 22:57:02 -0400 Subject: [PATCH 02/17] =?UTF-8?q?invalid=20=E2=80=9Cprop=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/react-reconciler/src/ReactFiberBeginWork.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index 963057f0be0e1..ce012af7ef6d8 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -890,7 +890,7 @@ export default function( checkPropTypes( workInProgress.types.propTypes, newProps, - 'context', + 'prop', 'ReactContext', ); } From 2547b222a8c384e2ebadfbf51ce12b352049264b Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 19 Apr 2018 23:20:26 -0400 Subject: [PATCH 03/17] `type not `types` .. :l --- packages/react-reconciler/src/ReactFiberBeginWork.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index ce012af7ef6d8..98e4f44d2d90e 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -886,9 +886,9 @@ export default function( const newValue = newProps.value; workInProgress.memoizedProps = newProps; - if (__DEV__ && workInProgress.types) { + if (__DEV__ && workInProgress.type) { checkPropTypes( - workInProgress.types.propTypes, + workInProgress.type.propTypes, newProps, 'prop', 'ReactContext', From b596129d4becd97e3fb91b4ae04338954ee17b5f Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 19 Apr 2018 23:23:38 -0400 Subject: [PATCH 04/17] test --- .../__tests__/ReactContextValidator-test.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/react/src/__tests__/ReactContextValidator-test.js b/packages/react/src/__tests__/ReactContextValidator-test.js index d3b9e5b240b24..368a1bd527a91 100644 --- a/packages/react/src/__tests__/ReactContextValidator-test.js +++ b/packages/react/src/__tests__/ReactContextValidator-test.js @@ -225,6 +225,24 @@ describe('ReactContextValidator', () => { ReactTestUtils.renderIntoDocument(); }); + it('warns of incorrect prop types on context provider', () => { + class TestContext extends React.Component { + render() { + return ; + } + } + const MyContext = React.createContext(); + + MyContext.Provider.propTypes = { + value: PropTypes.string.isRequired, + }; + + expect(() => ReactTestUtils.renderIntoDocument()).toWarnDev( + 'Warning: Failed prop type: The prop `value` is marked as required in ' + + '`ReactContext`, but its value is `undefined`.', + ); + }); + // TODO (bvaughn) Remove this test and the associated behavior in the future. // It has only been added in Fiber to match the (unintentional) behavior in Stack. it('should warn (but not error) if getChildContext method is missing', () => { From b26897eef8402d8e6185fa07c77736508ba6715e Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 19 Apr 2018 23:25:47 -0400 Subject: [PATCH 05/17] =?UTF-8?q?don=E2=80=99t=20need=20extra=20check=20wi?= =?UTF-8?q?th=20no=20spelling=20mistake=20(:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/react-reconciler/src/ReactFiberBeginWork.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index 98e4f44d2d90e..3b1a82cf84a70 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -886,7 +886,7 @@ export default function( const newValue = newProps.value; workInProgress.memoizedProps = newProps; - if (__DEV__ && workInProgress.type) { + if (__DEV__) { checkPropTypes( workInProgress.type.propTypes, newProps, From ed42cac6ddfd7d4c47b93653de963a3b648b0412 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 19 Apr 2018 23:31:12 -0400 Subject: [PATCH 06/17] change error message to specifically address provider --- packages/react-reconciler/src/ReactFiberBeginWork.js | 2 +- packages/react/src/__tests__/ReactContextValidator-test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index 3b1a82cf84a70..164355db03d68 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -891,7 +891,7 @@ export default function( workInProgress.type.propTypes, newProps, 'prop', - 'ReactContext', + 'ReactProvider', ); } diff --git a/packages/react/src/__tests__/ReactContextValidator-test.js b/packages/react/src/__tests__/ReactContextValidator-test.js index 368a1bd527a91..e2c0b059dd5c0 100644 --- a/packages/react/src/__tests__/ReactContextValidator-test.js +++ b/packages/react/src/__tests__/ReactContextValidator-test.js @@ -239,7 +239,7 @@ describe('ReactContextValidator', () => { expect(() => ReactTestUtils.renderIntoDocument()).toWarnDev( 'Warning: Failed prop type: The prop `value` is marked as required in ' + - '`ReactContext`, but its value is `undefined`.', + '`ReactProvider`, but its value is `undefined`.', ); }); From 63ef7319e40b8c2f8506ffde49b1ecbf3abca1e7 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 19 Apr 2018 23:34:48 -0400 Subject: [PATCH 07/17] =?UTF-8?q?don=E2=80=99t=20need=20class,=20add=20ext?= =?UTF-8?q?ra=20render=20to=20make=20sure=20good=20props=20go=20through?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/__tests__/ReactContextValidator-test.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/react/src/__tests__/ReactContextValidator-test.js b/packages/react/src/__tests__/ReactContextValidator-test.js index e2c0b059dd5c0..5036f1693f5c9 100644 --- a/packages/react/src/__tests__/ReactContextValidator-test.js +++ b/packages/react/src/__tests__/ReactContextValidator-test.js @@ -226,18 +226,15 @@ describe('ReactContextValidator', () => { }); it('warns of incorrect prop types on context provider', () => { - class TestContext extends React.Component { - render() { - return ; - } - } const MyContext = React.createContext(); MyContext.Provider.propTypes = { value: PropTypes.string.isRequired, }; - expect(() => ReactTestUtils.renderIntoDocument()).toWarnDev( + ReactTestUtils.renderIntoDocument(); + + expect(() => ReactTestUtils.renderIntoDocument()).toWarnDev( 'Warning: Failed prop type: The prop `value` is marked as required in ' + '`ReactProvider`, but its value is `undefined`.', ); From ea50645b0d210bcff1a9921972b166274e081b10 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 19 Apr 2018 23:38:00 -0400 Subject: [PATCH 08/17] nitpicky rename --- .../react/src/__tests__/ReactContextValidator-test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/react/src/__tests__/ReactContextValidator-test.js b/packages/react/src/__tests__/ReactContextValidator-test.js index 5036f1693f5c9..6a5198620a880 100644 --- a/packages/react/src/__tests__/ReactContextValidator-test.js +++ b/packages/react/src/__tests__/ReactContextValidator-test.js @@ -226,15 +226,15 @@ describe('ReactContextValidator', () => { }); it('warns of incorrect prop types on context provider', () => { - const MyContext = React.createContext(); + const TestContext = React.createContext(); - MyContext.Provider.propTypes = { + TestContext.Provider.propTypes = { value: PropTypes.string.isRequired, }; - ReactTestUtils.renderIntoDocument(); + ReactTestUtils.renderIntoDocument(); - expect(() => ReactTestUtils.renderIntoDocument()).toWarnDev( + expect(() => ReactTestUtils.renderIntoDocument()).toWarnDev( 'Warning: Failed prop type: The prop `value` is marked as required in ' + '`ReactProvider`, but its value is `undefined`.', ); From 683fdfebf8445e84d5b57aaa1805d6d2ba67cbb7 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 19 Apr 2018 23:47:28 -0400 Subject: [PATCH 09/17] prettier --- packages/react/src/__tests__/ReactContextValidator-test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/react/src/__tests__/ReactContextValidator-test.js b/packages/react/src/__tests__/ReactContextValidator-test.js index 6a5198620a880..58a07fd2395d0 100644 --- a/packages/react/src/__tests__/ReactContextValidator-test.js +++ b/packages/react/src/__tests__/ReactContextValidator-test.js @@ -234,7 +234,9 @@ describe('ReactContextValidator', () => { ReactTestUtils.renderIntoDocument(); - expect(() => ReactTestUtils.renderIntoDocument()).toWarnDev( + expect(() => + ReactTestUtils.renderIntoDocument(), + ).toWarnDev( 'Warning: Failed prop type: The prop `value` is marked as required in ' + '`ReactProvider`, but its value is `undefined`.', ); From 5a38c062b2f8764b201b043960f974bbfff8fecd Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Fri, 20 Apr 2018 08:45:03 -0400 Subject: [PATCH 10/17] switch to `Context.Provider` --- packages/react-reconciler/src/ReactFiberBeginWork.js | 2 +- packages/react/src/__tests__/ReactContextValidator-test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index 164355db03d68..8b7491d942a93 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -891,7 +891,7 @@ export default function( workInProgress.type.propTypes, newProps, 'prop', - 'ReactProvider', + 'Context.Provider', ); } diff --git a/packages/react/src/__tests__/ReactContextValidator-test.js b/packages/react/src/__tests__/ReactContextValidator-test.js index 58a07fd2395d0..8cc5eb43c02da 100644 --- a/packages/react/src/__tests__/ReactContextValidator-test.js +++ b/packages/react/src/__tests__/ReactContextValidator-test.js @@ -238,7 +238,7 @@ describe('ReactContextValidator', () => { ReactTestUtils.renderIntoDocument(), ).toWarnDev( 'Warning: Failed prop type: The prop `value` is marked as required in ' + - '`ReactProvider`, but its value is `undefined`.', + '`Context.Provider`, but its value is `undefined`.', ); }); From bdfab1f6d0dcb4d779cc3776aff4960f6e5b3e0d Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Fri, 20 Apr 2018 18:10:25 -0400 Subject: [PATCH 11/17] add stack to warning, add extra undefined check --- packages/react-reconciler/src/ReactFiberBeginWork.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index 8b7491d942a93..2505bf10d37b0 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -16,6 +16,7 @@ import type {NewContext} from './ReactFiberNewContext'; import type {HydrationContext} from './ReactFiberHydrationContext'; import type {FiberRoot} from './ReactFiberRoot'; import type {ExpirationTime} from './ReactFiberExpirationTime'; +import emptyFunction from 'fbjs/lib/emptyFunction'; import checkPropTypes from 'prop-types/checkPropTypes'; import { @@ -64,14 +65,18 @@ import {NoWork, Never} from './ReactFiberExpirationTime'; import {AsyncMode, StrictMode} from './ReactTypeOfMode'; import MAX_SIGNED_31_BIT_INT from './maxSigned31BitInt'; +const {getCurrentFiberStackAddendum} = ReactDebugCurrentFiber; + let didWarnAboutBadClass; let didWarnAboutGetDerivedStateOnFunctionalComponent; let didWarnAboutStatelessRefs; +let getStack = emptyFunction.thatReturns(''); if (__DEV__) { didWarnAboutBadClass = {}; didWarnAboutGetDerivedStateOnFunctionalComponent = {}; didWarnAboutStatelessRefs = {}; + getStack = getCurrentFiberStackAddendum; } export default function( @@ -886,12 +891,15 @@ export default function( const newValue = newProps.value; workInProgress.memoizedProps = newProps; - if (__DEV__) { + const providerPropTypes = workInProgress.type.propTypes; + + if (__DEV__ && providerPropTypes) { checkPropTypes( - workInProgress.type.propTypes, + providerPropTypes, newProps, 'prop', 'Context.Provider', + getStack, ); } From ab53c91164ec87caf86902610dd5959e9d9e59d3 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Fri, 20 Apr 2018 21:54:52 -0400 Subject: [PATCH 12/17] separate dev check --- .../src/ReactFiberBeginWork.js | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index 2505bf10d37b0..318c28b724bb2 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -891,16 +891,17 @@ export default function( const newValue = newProps.value; workInProgress.memoizedProps = newProps; - const providerPropTypes = workInProgress.type.propTypes; - - if (__DEV__ && providerPropTypes) { - checkPropTypes( - providerPropTypes, - newProps, - 'prop', - 'Context.Provider', - getStack, - ); + if (__DEV__) { + const providerPropTypes = workInProgress.type.propTypes; + if (providerPropTypes) { + checkPropTypes( + providerPropTypes, + newProps, + 'prop', + 'Context.Provider', + getStack, + ); + } } let changedBits: number; From c500f24cc77aec4c826c7130984808610e2ea2d2 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Sat, 21 Apr 2018 21:01:42 -0400 Subject: [PATCH 13/17] add stack to test --- .../src/__tests__/ReactContextValidator-test.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/react/src/__tests__/ReactContextValidator-test.js b/packages/react/src/__tests__/ReactContextValidator-test.js index 8cc5eb43c02da..a1fcd54308073 100644 --- a/packages/react/src/__tests__/ReactContextValidator-test.js +++ b/packages/react/src/__tests__/ReactContextValidator-test.js @@ -234,11 +234,20 @@ describe('ReactContextValidator', () => { ReactTestUtils.renderIntoDocument(); + class Component extends React.Component { + render () { + return ( + + ); + } + } + expect(() => - ReactTestUtils.renderIntoDocument(), + ReactTestUtils.renderIntoDocument(), ).toWarnDev( 'Warning: Failed prop type: The prop `value` is marked as required in ' + - '`Context.Provider`, but its value is `undefined`.', + '`Context.Provider`, but its value is `undefined`.\n' + + ' in Component (at **)', ); }); From af05d8e5e65049bacd7c4b4ce44fc3b1d7796811 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Sat, 21 Apr 2018 21:01:53 -0400 Subject: [PATCH 14/17] more efficient --- packages/react-reconciler/src/ReactFiberBeginWork.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index 318c28b724bb2..7d93db2426f7a 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -65,18 +65,14 @@ import {NoWork, Never} from './ReactFiberExpirationTime'; import {AsyncMode, StrictMode} from './ReactTypeOfMode'; import MAX_SIGNED_31_BIT_INT from './maxSigned31BitInt'; -const {getCurrentFiberStackAddendum} = ReactDebugCurrentFiber; - let didWarnAboutBadClass; let didWarnAboutGetDerivedStateOnFunctionalComponent; let didWarnAboutStatelessRefs; -let getStack = emptyFunction.thatReturns(''); if (__DEV__) { didWarnAboutBadClass = {}; didWarnAboutGetDerivedStateOnFunctionalComponent = {}; didWarnAboutStatelessRefs = {}; - getStack = getCurrentFiberStackAddendum; } export default function( @@ -893,13 +889,14 @@ export default function( if (__DEV__) { const providerPropTypes = workInProgress.type.propTypes; + const {getCurrentFiberStackAddendum} = ReactDebugCurrentFiber; if (providerPropTypes) { checkPropTypes( providerPropTypes, newProps, 'prop', 'Context.Provider', - getStack, + getCurrentFiberStackAddendum, ); } } From dd0ea94a217f93e0dff9f391e6f1d49a54be5329 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Sat, 21 Apr 2018 21:02:48 -0400 Subject: [PATCH 15/17] remove unused function --- packages/react-reconciler/src/ReactFiberBeginWork.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index 7d93db2426f7a..bf4c29569cde0 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -16,7 +16,6 @@ import type {NewContext} from './ReactFiberNewContext'; import type {HydrationContext} from './ReactFiberHydrationContext'; import type {FiberRoot} from './ReactFiberRoot'; import type {ExpirationTime} from './ReactFiberExpirationTime'; -import emptyFunction from 'fbjs/lib/emptyFunction'; import checkPropTypes from 'prop-types/checkPropTypes'; import { From c419075eb300f9a4a5a5441ccb0f36d1d424c00c Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Sat, 21 Apr 2018 21:04:04 -0400 Subject: [PATCH 16/17] prettier --- .../react/src/__tests__/ReactContextValidator-test.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/react/src/__tests__/ReactContextValidator-test.js b/packages/react/src/__tests__/ReactContextValidator-test.js index a1fcd54308073..b4f500d9302c4 100644 --- a/packages/react/src/__tests__/ReactContextValidator-test.js +++ b/packages/react/src/__tests__/ReactContextValidator-test.js @@ -235,16 +235,12 @@ describe('ReactContextValidator', () => { ReactTestUtils.renderIntoDocument(); class Component extends React.Component { - render () { - return ( - - ); + render() { + return ; } } - expect(() => - ReactTestUtils.renderIntoDocument(), - ).toWarnDev( + expect(() => ReactTestUtils.renderIntoDocument()).toWarnDev( 'Warning: Failed prop type: The prop `value` is marked as required in ' + '`Context.Provider`, but its value is `undefined`.\n' + ' in Component (at **)', From 79ea1b53c7c1b5231da3867fea98f2cd6c0043c1 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Sat, 21 Apr 2018 22:45:13 -0400 Subject: [PATCH 17/17] const to top --- packages/react-reconciler/src/ReactFiberBeginWork.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index bf4c29569cde0..f2d93b09625bb 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -64,6 +64,8 @@ import {NoWork, Never} from './ReactFiberExpirationTime'; import {AsyncMode, StrictMode} from './ReactTypeOfMode'; import MAX_SIGNED_31_BIT_INT from './maxSigned31BitInt'; +const {getCurrentFiberStackAddendum} = ReactDebugCurrentFiber; + let didWarnAboutBadClass; let didWarnAboutGetDerivedStateOnFunctionalComponent; let didWarnAboutStatelessRefs; @@ -888,7 +890,7 @@ export default function( if (__DEV__) { const providerPropTypes = workInProgress.type.propTypes; - const {getCurrentFiberStackAddendum} = ReactDebugCurrentFiber; + if (providerPropTypes) { checkPropTypes( providerPropTypes,