13
var renders = 0;
14
var failed = false;
15
16
+ var needsReactDOM = getBooleanQueryParam('needsReactDOM');
17
+ var needsCreateElement = getBooleanQueryParam('needsCreateElement');
18
+
19
+ function unmountComponent(node) {
20
+ // ReactDOM was moved into a separate package in 0.14
21
+ if (needsReactDOM) {
22
+ ReactDOM.unmountComponentAtNode(node);
23
+ } else if (React.unmountComponentAtNode) {
24
+ React.unmountComponentAtNode(node);
25
+ } else {
26
+ // Unmounting for React 0.4 and lower
27
+ React.unmountAndReleaseReactRootNode(node);
28
+ }
29
+ }
30
+
31
+ function createElement(value) {
32
+ // React.createElement replaced function invocation in 0.12
33
+ if (needsCreateElement) {
34
+ return React.createElement(value);
35
+ } else {
36
+ return value();
37
+ }
38
+ }
39
+
40
function getQueryParam(key) {
41
var pattern = new RegExp(key + '=([^&]+)(&|$)');
42
var matches = window.location.search.match(pattern);
59
function prerender() {
60
setStatus('Generating markup');
61
38
- output.innerHTML = ReactDOMServer.renderToString(
39
- React.createElement(Fixture)
40
- );
62
+ return Promise.resolve()
63
+ .then(function() {
64
+ const element = createElement(Fixture);
65
+
66
+ // Server rendering moved to a separate package along with ReactDOM
67
+ // in 0.14.0
68
+ if (needsReactDOM) {
69
+ return ReactDOMServer.renderToString(element);
70
+ }
71
+
72
+ // React.renderComponentToString was renamed in 0.12
73
+ if (React.renderToString) {
74
+ return React.renderToString(element);
75
+ }
76
42
- setStatus('Markup only (No React)');
77
+ // React.renderComponentToString became synchronous in React 0.9.0
78
+ if (React.renderComponentToString.length === 1) {
79
+ return React.renderComponentToString(element);
80
+ }
81
+
82
+ // Finally, React 0.4 and lower emits markup in a callback
83
+ return new Promise(function(resolve) {
84
+ React.renderComponentToString(element, resolve);
85
+ });
86
+ })
87
+ .then(function(string) {
88
+ output.innerHTML = string;
89
+ setStatus('Markup only (No React)');
90
+ })
91
+ .catch(handleError);
92
}
93
94
function render() {
95
setStatus('Hydrating');
96
48
- if (ReactDOM.hydrate) {
49
- ReactDOM.hydrate(React.createElement(Fixture), output);
97
+ var element = createElement(Fixture);
98
+
99
+ // ReactDOM was split out into another package in 0.14
100
+ if (needsReactDOM) {
101
+ // Hydration changed to a separate method in React 16
102
+ if (ReactDOM.hydrate) {
103
+ ReactDOM.hydrate(element, output);
104
+ } else {
105
+ ReactDOM.render(element, output);
106
+ }
107
+ } else if (React.render) {
108
+ // React.renderComponent was renamed in 0.12
109
+ React.render(element, output);
110
} else {
51
- ReactDOM.render(React.createElement(Fixture), output);
111
+ React.renderComponent(element, output);
112
}
113
114
setStatus(renders > 0 ? 'Re-rendered (' + renders + 'x)' : 'Hydrated');
145
setStatus('Failed');
146
output.innerHTML = 'Please name your root component "Fixture"';
147
} else {
88
- prerender();
89
-
90
- if (getBooleanQueryParam('hydrate')) {
91
- render();
92
- }
148
+ prerender().then(function() {
149
+ if (getBooleanQueryParam('hydrate')) {
150
+ render();
151
+ }
152
+ });
153
}
154
}
155
156
function reloadFixture(code) {
157
renders = 0;
98
- ReactDOM.unmountComponentAtNode(output);
158
+ unmountComponent(output);
159
injectFixture(code);
160
}
161
169
170
loadScript(getQueryParam('reactPath'))
171
.then(function() {
112
- return getBooleanQueryParam('needsReactDOM')
113
- ? loadScript(getQueryParam('reactDOMPath'))
114
- : null;
115
- })
116
- .then(function() {
117
- return loadScript(getQueryParam('reactDOMServerPath'));
172
+ if (needsReactDOM) {
173
+ return Promise.all([
174
+ loadScript(getQueryParam('reactDOMPath')),
175
+ loadScript(getQueryParam('reactDOMServerPath')),
176
+ ]);
177
+ }
178
})
179
.then(function() {
180
if (failed) {