Skip to content
This repository was archived by the owner on Oct 9, 2023. It is now read-only.

Commit aad6a8a

Browse files
committed
concept approved making further improvements
1 parent 56f071f commit aad6a8a

8 files changed

+206
-221
lines changed

src/client.js

+29-18
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,42 @@ import React from 'react';
22
import ReactDOM from 'react-dom';
33
import hypernova, { load } from 'hypernova';
44

5-
export const renderReact = (name, component) => hypernova({
5+
const renderReactClient = (name, component) => {
6+
const payloads = load(name);
7+
8+
if (payloads) {
9+
payloads.forEach((payload) => {
10+
const { node, data } = payload;
11+
const element = React.createElement(component, data);
12+
13+
if (ReactDOM.hydrate) {
14+
ReactDOM.hydrate(element, node);
15+
} else {
16+
ReactDOM.render(element, node);
17+
}
18+
});
19+
}
20+
21+
return component;
22+
};
23+
24+
const renderReact = (name, component) => hypernova({
625
server() {},
726

827
client() {
9-
const payloads = load(name);
10-
11-
if (payloads) {
12-
payloads.forEach((payload) => {
13-
const { node, data } = payload;
14-
const element = React.createElement(component, data);
15-
16-
if (ReactDOM.hydrate) {
17-
ReactDOM.hydrate(element, node);
18-
} else {
19-
ReactDOM.render(element, node);
20-
}
21-
});
22-
}
23-
24-
return component;
28+
return renderReactClient(name, component);
2529
},
2630
});
2731

28-
export const renderReactStatic = () => hypernova({
32+
/* istanbul ignore next */
33+
const renderReactStatic = () => hypernova({
2934
server() {},
3035

3136
client() {},
3237
});
38+
39+
export {
40+
renderReactClient,
41+
renderReact,
42+
renderReactStatic,
43+
};

src/index.js

+6-25
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,20 @@
1-
import React from 'react';
2-
import ReactDOM from 'react-dom';
3-
import ReactDOMServer from 'react-dom/server';
4-
import hypernova, { serialize, load } from 'hypernova';
1+
import hypernova from 'hypernova';
2+
import { renderReactClient } from './client';
3+
import { renderReactServer, renderReactStaticServer } from './server';
54

65
export const renderReact = (name, component) => hypernova({
76
server() {
8-
return (props) => {
9-
const contents = ReactDOMServer.renderToString(React.createElement(component, props));
10-
return serialize(name, contents, props);
11-
};
7+
return renderReactServer(name, component);
128
},
139

1410
client() {
15-
const payloads = load(name);
16-
17-
if (payloads) {
18-
payloads.forEach((payload) => {
19-
const { node, data } = payload;
20-
const element = React.createElement(component, data);
21-
22-
if (ReactDOM.hydrate) {
23-
ReactDOM.hydrate(element, node);
24-
} else {
25-
ReactDOM.render(element, node);
26-
}
27-
});
28-
}
29-
30-
return component;
11+
return renderReactClient(name, component);
3112
},
3213
});
3314

3415
export const renderReactStatic = (name, component) => hypernova({
3516
server() {
36-
return props => ReactDOMServer.renderToStaticMarkup(React.createElement(component, props));
17+
return renderReactStaticServer(name, component);
3718
},
3819

3920
client() {},

src/server.js

+20-8
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,33 @@ import React from 'react';
22
import ReactDOMServer from 'react-dom/server';
33
import hypernova, { serialize } from 'hypernova';
44

5-
export const renderReact = (name, component) => hypernova({
5+
const renderReactServer = (name, component) => (props) => {
6+
const contents = ReactDOMServer.renderToString(React.createElement(component, props));
7+
return serialize(name, contents, props);
8+
};
9+
10+
const renderReactStaticServer = (name, component) => props =>
11+
ReactDOMServer.renderToStaticMarkup(React.createElement(component, props));
12+
13+
const renderReact = (name, component) => hypernova({
614
server() {
7-
return (props) => {
8-
const contents = ReactDOMServer.renderToString(React.createElement(component, props));
9-
return serialize(name, contents, props);
10-
};
15+
return renderReactServer(name, component);
1116
},
1217

13-
client() { },
18+
client() {},
1419
});
1520

16-
export const renderReactStatic = (name, component) => hypernova({
21+
const renderReactStatic = (name, component) => hypernova({
1722
server() {
18-
return props => ReactDOMServer.renderToStaticMarkup(React.createElement(component, props));
23+
return renderReactStaticServer(name, component);
1924
},
2025

2126
client() {},
2227
});
28+
29+
export {
30+
renderReactServer,
31+
renderReactStaticServer,
32+
renderReact,
33+
renderReactStatic,
34+
};

test/renderReact-test.js

+13-130
Original file line numberDiff line numberDiff line change
@@ -1,151 +1,48 @@
11
import jsdom from 'jsdom';
22
import { assert } from 'chai';
33
import sinon from 'sinon';
4-
import ReactDOM from 'react-dom';
5-
import ifReact from 'enzyme-adapter-react-helper/build/ifReact';
64

75
import ExampleReactComponent from './components/ExampleReactComponent';
86
import { renderReact } from '..';
9-
import { renderReact as renderReactClient } from '../lib/client';
10-
import { renderReact as renderReactServer } from '../lib/server';
7+
import * as renderReactClientModule from '../lib/client';
8+
import * as renderReactServerModule from '../lib/server';
119

1210
describe('renderReact', () => {
13-
let result;
14-
beforeEach(() => {
15-
result = renderReact('ExampleReactComponent', ExampleReactComponent)({ name: 'Desmond' });
16-
});
17-
1811
it('exists', () => {
1912
assert.isFunction(renderReact);
2013
assert.equal(renderReact.length, 2);
2114
});
2215

23-
it('has correct markup on server', () => {
24-
assert.isString(result);
25-
assert.match(result, /Hello Desmond/);
26-
});
27-
28-
ifReact('>= 16', it, it.skip)('calls hypernova.client (hydrate method)', (done) => {
29-
jsdom.env(result, (err, window) => {
30-
if (err) {
31-
done(err);
32-
return;
33-
}
34-
35-
global.window = window;
36-
global.document = window.document;
37-
38-
const hydrateMethod = sinon.spy(ReactDOM, 'hydrate');
39-
40-
// Calling it again for the client.
41-
renderReact('ExampleReactComponent', ExampleReactComponent);
42-
43-
assert(hydrateMethod.calledOnce);
44-
45-
hydrateMethod.restore();
46-
47-
delete global.window;
48-
delete global.document;
49-
50-
done();
51-
});
52-
});
53-
54-
it('calls hypernova.client (render method)', (done) => {
55-
jsdom.env(result, (err, window) => {
56-
if (err) {
57-
done(err);
58-
return;
59-
}
60-
61-
const sandbox = sinon.createSandbox();
62-
if (ReactDOM.hydrate) {
63-
sandbox.stub(ReactDOM, 'hydrate').value(undefined);
64-
}
65-
66-
const renderMethod = sinon.spy(ReactDOM, 'render');
67-
68-
global.window = window;
69-
global.document = window.document;
70-
71-
// Calling it again for the client.
72-
renderReact('ExampleReactComponent', ExampleReactComponent);
73-
74-
assert(renderMethod.calledOnce);
16+
it('calls renderReactServer', () => {
17+
const renderReactServerSpy = sinon.spy(renderReactServerModule, 'renderReactServer');
7518

76-
sandbox.restore();
77-
renderMethod.restore();
19+
renderReact('ExampleReactComponent', ExampleReactComponent)({ name: 'Desmond' });
7820

79-
delete global.window;
80-
delete global.document;
21+
assert(renderReactServerSpy.calledOnce, `renderReactServer was not called once but ${renderReactServerSpy.callCount} times`);
8122

82-
done();
83-
});
23+
renderReactServerSpy.restore();
8424
});
85-
});
8625

87-
describe('renderReact client side endpoint', () => {
88-
let result;
89-
beforeEach(() => {
90-
result = renderReact('ExampleReactComponent', ExampleReactComponent)({ name: 'Desmond' });
91-
});
26+
it('calls renderReactClient', (done) => {
27+
const result = renderReact('ExampleReactComponent', ExampleReactComponent)({ name: 'Desmond' });
9228

93-
it('exists', () => {
94-
assert.isFunction(renderReactClient);
95-
assert.equal(renderReactClient.length, 2);
96-
});
97-
98-
ifReact('>= 16', it, it.skip)('calls hypernova.client (hydrate method)', (done) => {
9929
jsdom.env(result, (err, window) => {
10030
if (err) {
10131
done(err);
10232
return;
10333
}
10434

105-
global.window = window;
106-
global.document = window.document;
107-
108-
const hydrateMethod = sinon.spy(ReactDOM, 'hydrate');
109-
110-
// Calling it again for the client.
111-
renderReactClient('ExampleReactComponent', ExampleReactComponent);
112-
113-
assert(hydrateMethod.calledOnce);
114-
115-
hydrateMethod.restore();
116-
117-
delete global.window;
118-
delete global.document;
119-
120-
done();
121-
});
122-
});
123-
124-
it('calls hypernova.client (render method)', (done) => {
125-
jsdom.env(result, (err, window) => {
126-
if (err) {
127-
done(err);
128-
return;
129-
}
130-
131-
const sandbox = sinon.createSandbox();
132-
if (ReactDOM.hydrate) {
133-
sandbox.stub(ReactDOM, 'hydrate').value(undefined);
134-
}
135-
136-
const renderMethod = sinon.spy(ReactDOM, 'render');
35+
const renderReactClientSpy = sinon.spy(renderReactClientModule, 'renderReactClient');
13736

13837
global.window = window;
13938
global.document = window.document;
14039

14140
// Calling it again for the client.
142-
renderReactClient('ExampleReactComponent', ExampleReactComponent);
143-
144-
assert(renderMethod.calledOnce);
41+
renderReact('ExampleReactComponent', ExampleReactComponent);
14542

146-
sandbox.restore();
43+
assert(renderReactClientSpy.calledOnce, `renderReactClient was not called once but ${renderReactClientSpy.callCount} times`);
14744

148-
renderMethod.restore();
45+
renderReactClientSpy.restore();
14946

15047
delete global.window;
15148
delete global.document;
@@ -154,17 +51,3 @@ describe('renderReact client side endpoint', () => {
15451
});
15552
});
15653
});
157-
158-
describe('renderReact server side endpoint', () => {
159-
it('exists', () => {
160-
assert.isFunction(renderReactServer);
161-
assert.equal(renderReactServer.length, 2);
162-
});
163-
164-
it('has correct markup on server', () => {
165-
const result = renderReactServer('ExampleReactComponent', ExampleReactComponent)({ name: 'Desmond' });
166-
167-
assert.isString(result);
168-
assert.match(result, /Hello Desmond/);
169-
});
170-
});

0 commit comments

Comments
 (0)