@repage/renderer-react
Version:
106 lines (94 loc) • 3.29 kB
JavaScript
const assert = require('reassert');
const assert_usage = assert;
const assert_internal = assert;
const React = require('react');
const rootContainerId = 'react-root';
module.exports = {
get_initial_props,
loadData,
get_views,
};
function get_initial_props(route, contextObject) {
assert_internal(route);
assert_internal(contextObject.initialProps, contextObject);
const initial_props = Object.assign({route}, contextObject.initialProps);
return initial_props;
}
function get_views({page, initial_props}) {
const {view: view_page_prop, viewWrapper} = page;
if( ! view_page_prop ) {
return [];
}
const views = (
(
view_page_prop.constructor !== Array ? (
[view_page_prop]
) : (
view_page_prop
)
)
.map(view => {
assert_usage(
view
);
if( view.constructor!==Object || ! view.view ) {
return {
react_component: view,
container_id: rootContainerId,
};
}
return {
react_component: view.view,
container_id: view.containerId || rootContainerId,
};
})
.map(view_object => {
assert_internal(view_object.react_component, view_object);
let react_element = React.createElement(view_object.react_component, initial_props);
if( viewWrapper ) {
const extra_args = Object.assign(
{
reactComponent: view_object.react_component,
containerId: view_object.container_id,
},
initial_props
);
assert_internal(extra_args.reactComponent);
assert_internal(extra_args.route.url, extra_args);
assert_internal(extra_args.route.url.pathname, extra_args);
assert_internal(extra_args.route.url.pathname.startsWith('/'), extra_args);
react_element = viewWrapper(react_element, extra_args);
assert_usage(react_element);
}
view_object.react_element = react_element;
return view_object;
})
);
views.forEach((view_object, i) => {
assert_internal(view_object.react_component);
assert_internal(view_object.react_element);
assert_internal(view_object.container_id);
views.slice(0, i).forEach(view_object_2 => {
assert_usage(
view_object.container_id !== view_object_2.container_id,
page,
view_object,
view_object_2,
"The two views printed above of the page printed above have the same container id"
);
});
});
return views;
}
async function loadData(args) {
const {page, renderHtmlContext, renderDomContext} = args;
assert(!renderHtmlContext || !renderDomContext);
const context = renderHtmlContext || renderDomContext;
context.initialProps = (
page.getInitialProps ? (
await page.getInitialProps(args)
) : (
{}
)
);
}