From 7ebf7c46f5521e5e03eefc9f5e0899131bc0a7db Mon Sep 17 00:00:00 2001 From: Ben Alpert Date: Sun, 1 Mar 2015 11:49:17 -0800 Subject: [PATCH] ReactFragment counts as a node without warning Fixes #3286. --- src/addons/ReactFragment.js | 3 ++- src/classic/types/ReactPropTypes.js | 2 ++ .../types/__tests__/ReactPropTypes-test.js | 19 ++++++++++++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/addons/ReactFragment.js b/src/addons/ReactFragment.js index a9fb1d156c..19cb40b4bd 100644 --- a/src/addons/ReactFragment.js +++ b/src/addons/ReactFragment.js @@ -141,7 +141,8 @@ var ReactFragment = { warning( didWarnForFragment(fragment), 'Any use of a keyed object should be wrapped in ' + - 'React.addons.createFragment(object) before passed as a child.' + 'React.addons.createFragment(object) before being passed as a ' + + 'child.' ); return fragment; } diff --git a/src/classic/types/ReactPropTypes.js b/src/classic/types/ReactPropTypes.js index 03b2edf394..e8f913f573 100644 --- a/src/classic/types/ReactPropTypes.js +++ b/src/classic/types/ReactPropTypes.js @@ -12,6 +12,7 @@ 'use strict'; var ReactElement = require('ReactElement'); +var ReactFragment = require('ReactFragment'); var ReactPropTypeLocationNames = require('ReactPropTypeLocationNames'); var emptyFunction = require('emptyFunction'); @@ -301,6 +302,7 @@ function isNode(propValue) { if (ReactElement.isValidElement(propValue)) { return true; } + propValue = ReactFragment.extractIfFragment(propValue); for (var k in propValue) { if (!isNode(propValue[k])) { return false; diff --git a/src/classic/types/__tests__/ReactPropTypes-test.js b/src/classic/types/__tests__/ReactPropTypes-test.js index 1db035344c..c3d9a49d8c 100644 --- a/src/classic/types/__tests__/ReactPropTypes-test.js +++ b/src/classic/types/__tests__/ReactPropTypes-test.js @@ -13,6 +13,7 @@ var PropTypes; var React; +var ReactFragment; var ReactPropTypeLocations; var ReactTestUtils; @@ -48,6 +49,7 @@ describe('ReactPropTypes', function() { beforeEach(function() { PropTypes = require('ReactPropTypes'); React = require('React'); + ReactFragment = require('ReactFragment'); ReactPropTypeLocations = require('ReactPropTypeLocations'); ReactTestUtils = require('ReactTestUtils'); }); @@ -356,6 +358,7 @@ describe('ReactPropTypes', function() { }); it('should not warn for valid values', function() { + spyOn(console, 'warn'); typeCheckPass(PropTypes.node,
); typeCheckPass(PropTypes.node, false); typeCheckPass(PropTypes.node, ); @@ -371,7 +374,21 @@ describe('ReactPropTypes', function() { ]); - // Object of rendereable things + // Object of renderable things + var frag = ReactFragment.create; + typeCheckPass(PropTypes.node, frag({ + k0: 123, + k1: 'Some string', + k2:
, + k3: frag({ + k30: , + k31: frag({k310: }), + k32: 'Another string' + }) + })); + expect(console.warn.calls).toEqual([]); + + // This should also pass, though it warns typeCheckPass(PropTypes.node, { k0: 123, k1: 'Some string',