From 7bc5fd5024323588bf280f6cda4327237babea2c Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Tue, 3 Apr 2018 22:14:12 -0400 Subject: [PATCH 01/13] throw error if passed undefined --- packages/react/src/ReactElement.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/react/src/ReactElement.js b/packages/react/src/ReactElement.js index 0594412fa78f9..3d804fc54a587 100644 --- a/packages/react/src/ReactElement.js +++ b/packages/react/src/ReactElement.js @@ -290,6 +290,10 @@ export function cloneAndReplaceKey(oldElement, newKey) { * See https://reactjs.org/docs/react-api.html#cloneelement */ export function cloneElement(element, config, children) { + if (element === undefined) { + throw new Error("Cannot call 'cloneElement' on undefined."); + } + let propName; // Original props are copied From 8ee24521c6c99f273f7914e6c29f8fcaff006406 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Tue, 3 Apr 2018 22:36:07 -0400 Subject: [PATCH 02/13] should be TypeError --- packages/react/src/ReactElement.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react/src/ReactElement.js b/packages/react/src/ReactElement.js index 3d804fc54a587..def77c9480477 100644 --- a/packages/react/src/ReactElement.js +++ b/packages/react/src/ReactElement.js @@ -291,7 +291,7 @@ export function cloneAndReplaceKey(oldElement, newKey) { */ export function cloneElement(element, config, children) { if (element === undefined) { - throw new Error("Cannot call 'cloneElement' on undefined."); + throw new TypeError("Cannot call 'cloneElement' on undefined."); } let propName; From 33d1edf214c21f8e572370a473155996ee558551 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 5 Apr 2018 16:24:57 -0400 Subject: [PATCH 03/13] simplify --- packages/react/src/ReactElement.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/react/src/ReactElement.js b/packages/react/src/ReactElement.js index def77c9480477..e6ae9b99b3558 100644 --- a/packages/react/src/ReactElement.js +++ b/packages/react/src/ReactElement.js @@ -290,8 +290,9 @@ export function cloneAndReplaceKey(oldElement, newKey) { * See https://reactjs.org/docs/react-api.html#cloneelement */ export function cloneElement(element, config, children) { - if (element === undefined) { - throw new TypeError("Cannot call 'cloneElement' on undefined."); + + if (!element) { + throw new TypeError('Cannot clone null or undefined.'); } let propName; From 48c7b533a181e4c82c26ec1473e120a15e19a1f7 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 5 Apr 2018 19:51:05 -0400 Subject: [PATCH 04/13] use invariant --- packages/react/src/ReactElement.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/react/src/ReactElement.js b/packages/react/src/ReactElement.js index e6ae9b99b3558..b6815c6eb4cac 100644 --- a/packages/react/src/ReactElement.js +++ b/packages/react/src/ReactElement.js @@ -12,6 +12,8 @@ import ReactCurrentOwner from './ReactCurrentOwner'; const hasOwnProperty = Object.prototype.hasOwnProperty; +const invariant = require('fbjs/lib/invariant'); + const RESERVED_PROPS = { key: true, ref: true, @@ -290,10 +292,10 @@ export function cloneAndReplaceKey(oldElement, newKey) { * See https://reactjs.org/docs/react-api.html#cloneelement */ export function cloneElement(element, config, children) { - - if (!element) { - throw new TypeError('Cannot clone null or undefined.'); - } + invariant( + !(element === null || element === undefined), + 'Cannot clone a null or undefined element.' + ); let propName; From 34816fc0465781ec3e9f73f32d121021d2113bd1 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 5 Apr 2018 19:52:18 -0400 Subject: [PATCH 05/13] editor messed up spacing --- packages/react/src/ReactElement.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react/src/ReactElement.js b/packages/react/src/ReactElement.js index b6815c6eb4cac..8860145c46963 100644 --- a/packages/react/src/ReactElement.js +++ b/packages/react/src/ReactElement.js @@ -293,8 +293,8 @@ export function cloneAndReplaceKey(oldElement, newKey) { */ export function cloneElement(element, config, children) { invariant( - !(element === null || element === undefined), - 'Cannot clone a null or undefined element.' + !(element === null || element === undefined), + 'Cannot clone a null or undefined element.' ); let propName; From 273370758eafa54d329577b3dc942c70587eccd3 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 5 Apr 2018 20:09:55 -0400 Subject: [PATCH 06/13] better check --- packages/react/src/ReactElement.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react/src/ReactElement.js b/packages/react/src/ReactElement.js index 8860145c46963..83cd432a853ca 100644 --- a/packages/react/src/ReactElement.js +++ b/packages/react/src/ReactElement.js @@ -293,7 +293,7 @@ export function cloneAndReplaceKey(oldElement, newKey) { */ export function cloneElement(element, config, children) { invariant( - !(element === null || element === undefined), + element != null, 'Cannot clone a null or undefined element.' ); From 44df599071aedc1cf25b28f20c79dba23f938fea Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 5 Apr 2018 21:07:23 -0400 Subject: [PATCH 07/13] Revert "better check" This reverts commit 273370758eafa54d329577b3dc942c70587eccd3. --- packages/react/src/ReactElement.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react/src/ReactElement.js b/packages/react/src/ReactElement.js index 83cd432a853ca..8860145c46963 100644 --- a/packages/react/src/ReactElement.js +++ b/packages/react/src/ReactElement.js @@ -293,7 +293,7 @@ export function cloneAndReplaceKey(oldElement, newKey) { */ export function cloneElement(element, config, children) { invariant( - element != null, + !(element === null || element === undefined), 'Cannot clone a null or undefined element.' ); From baa4d840a6093a648a939601bcbe7b04f3052add Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 5 Apr 2018 21:50:15 -0400 Subject: [PATCH 08/13] yarn prettier test was failing --- packages/react/src/ReactElement.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react/src/ReactElement.js b/packages/react/src/ReactElement.js index 8860145c46963..e8a9f30256c1d 100644 --- a/packages/react/src/ReactElement.js +++ b/packages/react/src/ReactElement.js @@ -294,7 +294,7 @@ export function cloneAndReplaceKey(oldElement, newKey) { export function cloneElement(element, config, children) { invariant( !(element === null || element === undefined), - 'Cannot clone a null or undefined element.' + 'Cannot clone a null or undefined element.', ); let propName; From 80de944b19dbef5db29f32cd3c150683fb1f1421 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Thu, 5 Apr 2018 21:56:12 -0400 Subject: [PATCH 09/13] more explicit copy --- packages/react/src/ReactElement.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/react/src/ReactElement.js b/packages/react/src/ReactElement.js index e8a9f30256c1d..4789e4a668ec6 100644 --- a/packages/react/src/ReactElement.js +++ b/packages/react/src/ReactElement.js @@ -294,7 +294,8 @@ export function cloneAndReplaceKey(oldElement, newKey) { export function cloneElement(element, config, children) { invariant( !(element === null || element === undefined), - 'Cannot clone a null or undefined element.', + 'React.cloneElement(...): The argument must be a React element, but you passed %s.', + element, ); let propName; From e3416ee02e9a96bb41688ff12273b9c545e9c055 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Fri, 6 Apr 2018 16:58:37 -0400 Subject: [PATCH 10/13] es6 import --- packages/react/src/ReactElement.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react/src/ReactElement.js b/packages/react/src/ReactElement.js index 4789e4a668ec6..f2c07b1a5ef73 100644 --- a/packages/react/src/ReactElement.js +++ b/packages/react/src/ReactElement.js @@ -10,9 +10,9 @@ import {REACT_ELEMENT_TYPE} from 'shared/ReactSymbols'; import ReactCurrentOwner from './ReactCurrentOwner'; -const hasOwnProperty = Object.prototype.hasOwnProperty; +import invariant from 'fbjs/lib/invariant'; -const invariant = require('fbjs/lib/invariant'); +const hasOwnProperty = Object.prototype.hasOwnProperty; const RESERVED_PROPS = { key: true, From 905abfc99d07f4021ecc358f8344cf2cb4e28460 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Mon, 9 Apr 2018 20:36:03 -0400 Subject: [PATCH 11/13] tests --- .../react/src/__tests__/ReactElementClone-test.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/react/src/__tests__/ReactElementClone-test.js b/packages/react/src/__tests__/ReactElementClone-test.js index d5b08496ba747..ead7397601702 100644 --- a/packages/react/src/__tests__/ReactElementClone-test.js +++ b/packages/react/src/__tests__/ReactElementClone-test.js @@ -359,4 +359,18 @@ describe('ReactElementClone', () => { } expect(clone.props).toEqual({foo: 'ef'}); }); + + it('throws an error if passed null', () => { + const element = null; + expect(() => React.cloneElement(element)).toThrow( + 'React.cloneElement(...): The argument must be a React element, but you passed null.' + ); + }); + + it('throws an error if passed undefined', () => { + let element; + expect(() => React.cloneElement(element)).toThrow( + 'React.cloneElement(...): The argument must be a React element, but you passed undefined.' + ); + }); }); From d20de72fea12fdcb6b8dd2a589d501b654328182 Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Mon, 9 Apr 2018 20:59:46 -0400 Subject: [PATCH 12/13] formatting --- packages/react/src/__tests__/ReactElementClone-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react/src/__tests__/ReactElementClone-test.js b/packages/react/src/__tests__/ReactElementClone-test.js index ead7397601702..475fa623cb223 100644 --- a/packages/react/src/__tests__/ReactElementClone-test.js +++ b/packages/react/src/__tests__/ReactElementClone-test.js @@ -363,14 +363,14 @@ describe('ReactElementClone', () => { it('throws an error if passed null', () => { const element = null; expect(() => React.cloneElement(element)).toThrow( - 'React.cloneElement(...): The argument must be a React element, but you passed null.' + 'React.cloneElement(...): The argument must be a React element, but you passed null.', ); }); it('throws an error if passed undefined', () => { let element; expect(() => React.cloneElement(element)).toThrow( - 'React.cloneElement(...): The argument must be a React element, but you passed undefined.' + 'React.cloneElement(...): The argument must be a React element, but you passed undefined.', ); }); }); From 070ef2091f1d7fa9147a0b526e1775237d4cca1e Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Tue, 10 Apr 2018 02:16:20 +0100 Subject: [PATCH 13/13] Move import --- packages/react/src/ReactElement.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/react/src/ReactElement.js b/packages/react/src/ReactElement.js index f2c07b1a5ef73..9127453b9b55e 100644 --- a/packages/react/src/ReactElement.js +++ b/packages/react/src/ReactElement.js @@ -5,13 +5,12 @@ * LICENSE file in the root directory of this source tree. */ +import invariant from 'fbjs/lib/invariant'; import warning from 'fbjs/lib/warning'; import {REACT_ELEMENT_TYPE} from 'shared/ReactSymbols'; import ReactCurrentOwner from './ReactCurrentOwner'; -import invariant from 'fbjs/lib/invariant'; - const hasOwnProperty = Object.prototype.hasOwnProperty; const RESERVED_PROPS = {