-
Notifications
You must be signed in to change notification settings - Fork 47.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' into remove-event-pooling
# Conflicts: # fixtures/dom/.gitignore # fixtures/dom/package.json # fixtures/dom/src/react-loader.js
- Loading branch information
Showing
22 changed files
with
668 additions
and
39 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
<!doctype html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="utf-8"> | ||
<meta name="viewport" content="width=device-width, initial-scale=1"> | ||
<title>Renderer</title> | ||
<style> | ||
*, | ||
*:before, | ||
*:after { | ||
box-sizing: border-box; | ||
} | ||
|
||
html, | ||
body { | ||
font-family: sans-serif; | ||
margin: 0; | ||
height: 100%; | ||
} | ||
|
||
body { | ||
padding-top: 32px; | ||
} | ||
|
||
#status { | ||
font-size: 12px; | ||
left: 8px; | ||
letter-spacing: 0.05em; | ||
line-height: 16px; | ||
margin: -8px 0 0; | ||
max-width: 50%; | ||
overflow: hidden; | ||
position: absolute; | ||
text-align: left; | ||
text-overflow: ellipsis; | ||
top: 50%; | ||
white-space: nowrap; | ||
width: 100%; | ||
} | ||
|
||
#output { | ||
margin: 16px; | ||
} | ||
|
||
.header { | ||
background: white; | ||
border-bottom: 1px solid #d9d9d9; | ||
padding: 4px; | ||
top: 0; | ||
left: 0; | ||
position: fixed; | ||
width: 100%; | ||
text-align: right; | ||
} | ||
|
||
.controls { | ||
display: inline-block; | ||
margin: 0; | ||
} | ||
|
||
.button { | ||
background: #eee; | ||
border-radius: 2px; | ||
border: 1px solid #aaa; | ||
font-size: 11px; | ||
padding: 4px 6px; | ||
text-transform: uppercase; | ||
} | ||
</style> | ||
</head> | ||
<body> | ||
<header class="header"> | ||
<p id="status">Loading</p> | ||
|
||
<menu class="controls"> | ||
<button class="button" id="hydrate">Hydrate</button> | ||
<button class="button" id="reload">Reload</button> | ||
</menu> | ||
</header> | ||
|
||
<div id="output"></div> | ||
|
||
<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script> | ||
<script src="renderer.js"></script> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
/** | ||
* Supports render.html, a piece of the hydration fixture. See /hydration | ||
*/ | ||
|
||
'use strict'; | ||
|
||
(function() { | ||
var Fixture = null; | ||
var output = document.getElementById('output'); | ||
var status = document.getElementById('status'); | ||
var hydrate = document.getElementById('hydrate'); | ||
var reload = document.getElementById('reload'); | ||
var renders = 0; | ||
var failed = false; | ||
|
||
function getQueryParam(key) { | ||
var pattern = new RegExp(key + '=([^&]+)(&|$)'); | ||
var matches = window.location.search.match(pattern); | ||
|
||
if (matches) { | ||
return decodeURIComponent(matches[1]); | ||
} | ||
|
||
handleError(new Error('No key found for' + key)); | ||
} | ||
|
||
function getBooleanQueryParam(key) { | ||
return getQueryParam(key) === 'true'; | ||
} | ||
|
||
function setStatus(label) { | ||
status.innerHTML = label; | ||
} | ||
|
||
function prerender() { | ||
setStatus('Generating markup'); | ||
|
||
output.innerHTML = ReactDOMServer.renderToString( | ||
React.createElement(Fixture) | ||
); | ||
|
||
setStatus('Markup only (No React)'); | ||
} | ||
|
||
function render() { | ||
setStatus('Hydrating'); | ||
|
||
if (ReactDOM.hydrate) { | ||
ReactDOM.hydrate(React.createElement(Fixture), output); | ||
} else { | ||
ReactDOM.render(React.createElement(Fixture), output); | ||
} | ||
|
||
setStatus(renders > 0 ? 'Re-rendered (' + renders + 'x)' : 'Hydrated'); | ||
renders += 1; | ||
hydrate.innerHTML = 'Re-render'; | ||
} | ||
|
||
function handleError(error) { | ||
console.log(error); | ||
failed = true; | ||
setStatus('Javascript Error'); | ||
output.innerHTML = error; | ||
} | ||
|
||
function loadScript(src) { | ||
return new Promise(function(resolve, reject) { | ||
var script = document.createElement('script'); | ||
script.async = true; | ||
script.src = src; | ||
|
||
script.onload = resolve; | ||
script.onerror = function(error) { | ||
reject(new Error('Unable to load ' + src)); | ||
}; | ||
|
||
document.body.appendChild(script); | ||
}); | ||
} | ||
|
||
function injectFixture(src) { | ||
Fixture = new Function(src + '\nreturn Fixture;')(); | ||
|
||
if (typeof Fixture === 'undefined') { | ||
setStatus('Failed'); | ||
output.innerHTML = 'Please name your root component "Fixture"'; | ||
} else { | ||
prerender(); | ||
|
||
if (getBooleanQueryParam('hydrate')) { | ||
render(); | ||
} | ||
} | ||
} | ||
|
||
function reloadFixture(code) { | ||
renders = 0; | ||
ReactDOM.unmountComponentAtNode(output); | ||
injectFixture(code); | ||
} | ||
|
||
window.onerror = handleError; | ||
|
||
reload.onclick = function() { | ||
window.location.reload(); | ||
}; | ||
|
||
hydrate.onclick = render; | ||
|
||
loadScript(getQueryParam('reactPath')) | ||
.then(function() { | ||
return getBooleanQueryParam('needsReactDOM') | ||
? loadScript(getQueryParam('reactDOMPath')) | ||
: null; | ||
}) | ||
.then(function() { | ||
return loadScript(getQueryParam('reactDOMServerPath')); | ||
}) | ||
.then(function() { | ||
if (failed) { | ||
return; | ||
} | ||
|
||
window.addEventListener('message', function(event) { | ||
var data = JSON.parse(event.data); | ||
|
||
switch (data.type) { | ||
case 'code': | ||
reloadFixture(data.payload); | ||
break; | ||
default: | ||
throw new Error( | ||
'Renderer Error: Unrecognized message "' + data.type + '"' | ||
); | ||
} | ||
}); | ||
|
||
window.parent.postMessage(JSON.stringify({type: 'ready'}), '*'); | ||
}) | ||
.catch(handleError); | ||
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
const React = window.React; | ||
|
||
export class CodeEditor extends React.Component { | ||
shouldComponentUpdate() { | ||
return false; | ||
} | ||
|
||
componentDidMount() { | ||
// Important: CodeMirror incorrectly lays out the editor | ||
// if it executes before CSS has loaded | ||
// https://github.com/graphql/graphiql/issues/33#issuecomment-318188555 | ||
Promise.all([ | ||
import('codemirror'), | ||
import('codemirror/mode/jsx/jsx'), | ||
import('codemirror/lib/codemirror.css'), | ||
import('./codemirror-paraiso-dark.css'), | ||
]).then(([CodeMirror]) => this.install(CodeMirror)); | ||
} | ||
|
||
install(CodeMirror) { | ||
if (!this.textarea) { | ||
return; | ||
} | ||
|
||
const {onChange} = this.props; | ||
|
||
this.editor = CodeMirror.fromTextArea(this.textarea, { | ||
mode: 'jsx', | ||
theme: 'paraiso-dark', | ||
lineNumbers: true, | ||
}); | ||
|
||
this.editor.on('change', function(doc) { | ||
onChange(doc.getValue()); | ||
}); | ||
} | ||
|
||
componentWillUnmount() { | ||
if (this.editor) { | ||
this.editor.toTextArea(); | ||
} | ||
} | ||
|
||
render() { | ||
return ( | ||
<textarea | ||
ref={ref => (this.textarea = ref)} | ||
defaultValue={this.props.code} | ||
autoComplete="off" | ||
hidden={true} | ||
/> | ||
); | ||
} | ||
} | ||
|
||
/** | ||
* Prevent IE9 from raising an error on an unrecognized element: | ||
* See https://github.com/facebook/react/issues/13610 | ||
*/ | ||
const supportsDetails = !( | ||
document.createElement('details') instanceof HTMLUnknownElement | ||
); | ||
|
||
export class CodeError extends React.Component { | ||
render() { | ||
const {error, className} = this.props; | ||
|
||
if (!error) { | ||
return null; | ||
} | ||
|
||
if (supportsDetails) { | ||
const [summary, ...body] = error.message.split(/\n+/g); | ||
|
||
return ( | ||
<details className={className}> | ||
<summary>{summary}</summary> | ||
{body.join('\n')} | ||
</details> | ||
); | ||
} | ||
|
||
return <div className={className}>{error.message}</div>; | ||
} | ||
} |
18 changes: 18 additions & 0 deletions
18
fixtures/dom/src/components/fixtures/hydration/code-transformer.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
/** | ||
* Babel works across all browsers, however it requires many polyfills. | ||
*/ | ||
|
||
import 'core-js/es6/weak-map'; | ||
import 'core-js/es6/weak-set'; | ||
import 'core-js/es6/number'; | ||
import 'core-js/es6/string'; | ||
import 'core-js/es6/array'; | ||
import 'core-js/modules/es6.object.set-prototype-of'; | ||
|
||
import {transform} from '@babel/standalone'; | ||
|
||
const presets = ['es2015', 'stage-3', 'react']; | ||
|
||
export function compile(raw) { | ||
return transform(raw, {presets}).code; | ||
} |
Oops, something went wrong.