From cb8528c180cdd24656f6464fb18ccd6393498152 Mon Sep 17 00:00:00 2001 From: Kevin Grandon Date: Thu, 22 Mar 2018 13:35:18 -0700 Subject: [PATCH 1/3] Support React.Fragment --- src/__tests__/__node__/prepare-render.node.js | 16 ++++++++++++++++ src/prepare.js | 5 ++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/__tests__/__node__/prepare-render.node.js b/src/__tests__/__node__/prepare-render.node.js index b7a1239..851cbb6 100644 --- a/src/__tests__/__node__/prepare-render.node.js +++ b/src/__tests__/__node__/prepare-render.node.js @@ -386,3 +386,19 @@ tape('Preparing an async app with componentWillReceiveProps option', t => { t.end(); }); }); + +tape('Preparing a Fragment', t => { + const app = ( + + 1 + 2 + + ); + const p = prepare(app); + t.ok(p instanceof Promise, 'prepare returns a promise'); + p.then(() => { + const wrapper = shallow(
{app}
); + t.equal(wrapper.find('span').length, 2, 'has two children'); + t.end(); + }); +}); diff --git a/src/prepare.js b/src/prepare.js index 5a756fe..f390831 100644 --- a/src/prepare.js +++ b/src/prepare.js @@ -41,7 +41,10 @@ function prepareElement(element, context) { return Promise.resolve([null, context]); } const {type, props} = element; - if (typeof type === 'string') { + if ( + typeof type === 'string' || + type.toString() === React.Fragment.toString() + ) { return Promise.resolve([props.children, context]); } if (!isReactCompositeComponent(type)) { From 937c456fb614663a5932625c2c6b632db44dff59 Mon Sep 17 00:00:00 2001 From: Kevin Grandon Date: Thu, 22 Mar 2018 14:11:37 -0700 Subject: [PATCH 2/3] Simplify check --- src/prepare.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/prepare.js b/src/prepare.js index f390831..ff89423 100644 --- a/src/prepare.js +++ b/src/prepare.js @@ -41,10 +41,7 @@ function prepareElement(element, context) { return Promise.resolve([null, context]); } const {type, props} = element; - if ( - typeof type === 'string' || - type.toString() === React.Fragment.toString() - ) { + if (typeof type === 'string' || type === React.Fragment) { return Promise.resolve([props.children, context]); } if (!isReactCompositeComponent(type)) { From 980f2842551cbf7ccda7224c928e1602b8d1f0be Mon Sep 17 00:00:00 2001 From: Kevin Grandon Date: Fri, 23 Mar 2018 12:33:04 -0700 Subject: [PATCH 3/3] Add a test case for preparing a fragment with async children --- src/__tests__/__node__/prepare-render.node.js | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/__tests__/__node__/prepare-render.node.js b/src/__tests__/__node__/prepare-render.node.js index 851cbb6..a5aa595 100644 --- a/src/__tests__/__node__/prepare-render.node.js +++ b/src/__tests__/__node__/prepare-render.node.js @@ -402,3 +402,34 @@ tape('Preparing a Fragment', t => { t.end(); }); }); + +tape('Preparing a fragment with async children', t => { + let numChildRenders = 0; + let numPrepares = 0; + function SimplePresentational() { + numChildRenders++; + return
Hello World
; + } + const AsyncChild = prepared(props => { + numPrepares++; + t.equal( + props.data, + 'test', + 'passes props through to prepared component correctly' + ); + return Promise.resolve(); + })(SimplePresentational); + const app = ( + + + + + ); + const p = prepare(app); + t.ok(p instanceof Promise, 'prepare returns a promise'); + p.then(() => { + t.equal(numPrepares, 2, 'runs prepare function twice'); + t.equal(numChildRenders, 2, 'renders SimplePresentational twice'); + t.end(); + }); +});