diff --git a/docs/getting-started/ClientRendering.md b/docs/getting-started/ClientRendering.md index 563c9de..7b82dda 100644 --- a/docs/getting-started/ClientRendering.md +++ b/docs/getting-started/ClientRendering.md @@ -20,5 +20,18 @@ import { Resolver } from "react-resolver"; Resolver.render( () => , document.getElementById("app") -); +); ``` + +If you want to take advantage of the `hydrate()` method available on `ReactDOM` [React Dom Docs]('https://reactjs.org/docs/react-dom.html#hydrate'), `Resolver` supports this with the `hydrateRender()` method. + +Use this just like `Resolver.render()`; + +```js +import { Resolver } from "react-resolver"; + +Resolver.hydrateRender( + () => , + document.getElementById("app") +); +``` \ No newline at end of file diff --git a/package.json b/package.json index 86510e5..b9b8263 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,8 @@ "test": "test" }, "peerDependencies": { - "react": "^0.14.6 || ^15.0.0-0 || ^16.0.0", - "react-dom": "^0.14.6 || ^15.0.0-0 || ^16.0.0" + "react": "^16.0.0", + "react-dom": "^16.0.0" }, "devDependencies": { "babel": "5.8.34", @@ -16,6 +16,7 @@ "gitbook-cli": "2.3.0", "gitbook-plugin-prism": "^1.1.0", "gitbook-plugin-todo": "0.1.2", + "jsdom": "^9.12.0", "mocha": "2.3.4", "prop-types": "^15.5.8", "react": "^16.0.0", diff --git a/src/Resolver.js b/src/Resolver.js index 9a22de8..3f8a35f 100644 --- a/src/Resolver.js +++ b/src/Resolver.js @@ -45,13 +45,23 @@ export default class Resolver extends React.Component { delete window[PAYLOAD]; } + static hydrateRender = function(render, node, data = window[PAYLOAD]) { + ReactDOM.hydrate(( + + {render} + + ), node); + + delete window[PAYLOAD]; + } + static resolve = function(render, initialData = {}) { const queue = []; renderToStaticMarkup( { queue.push(promise); - return Promise.resolve(true); + return Promise.resolve(true); })}> {render} diff --git a/test/mocha.opts b/test/mocha.opts index d001861..61b97de 100644 --- a/test/mocha.opts +++ b/test/mocha.opts @@ -1,4 +1,5 @@ --compilers js:babel/register +--require ./test/setup.js --recursive --reporter spec --ui bdd diff --git a/test/resolve.test.js b/test/resolve.test.js index 40b4149..0aeff0f 100644 --- a/test/resolve.test.js +++ b/test/resolve.test.js @@ -68,4 +68,28 @@ describe("@resolve", function() { ); }); }); + + context("browser render and hydrateRender", function() { + + it("browser render", () => { + return Resolver.render(() => (), document.getElementById("resolver")) + }) + + it("browser hydrateRender", () => { + return Resolver.hydrateRender(() => (), document.getElementById("resolver")) + }) + + it("browser render markup", function() { + Resolver.render(() => (), document.getElementById("resolver")); + const markup = document.getElementById("resolver").innerHTML; + assert.equal(markup, "
testRender
"); + }); + + it("browser hydrateRender markup", function() { + Resolver.hydrateRender(() => (), document.getElementById("resolver")) + const markup = document.getElementById("resolver").innerHTML; + assert.equal(markup, "
testHydrateRender
"); + }); + + }); }); diff --git a/test/setup.js b/test/setup.js new file mode 100644 index 0000000..acd7dd5 --- /dev/null +++ b/test/setup.js @@ -0,0 +1,20 @@ +var jsdom = require("jsdom").jsdom; +var document = jsdom("
"); +var window = document.defaultView; + +function copyProps(src, target) { + const props = Object.getOwnPropertyNames(src) + .filter(prop => typeof target[prop] === 'undefined') + .reduce((result, prop) => ({ + ...result, + [prop]: Object.getOwnPropertyDescriptor(src, prop) + }), {}); + Object.defineProperties(target, props); +} + +global.window = window; +global.document = window.document; +global.navigator = { + userAgent: 'node.js' +}; +copyProps(window, global); \ No newline at end of file