UNPKG

2.17 kBJavaScriptView Raw
1const fse = require('fs-extra');
2const path = require('path');
3
4const getRenderedTemplate = (template, opts)=>{
5 const paths = opts.paths;
6 const head = `<link rel='stylesheet' type='text/css' href='/${opts.entry.name}/${paths.style}' />\n \${headtags}`;
7 const body = `<main id='vitreum-root'>\${component}</main>`;
8 const tail = `<script>vitreum_props=\${propsString};</script>
9 <script src='/${paths.libs}'></script>
10 <script src='/${opts.entry.name}/${paths.code}'></script>
11 <script>
12 (function(){
13 require('react-dom').hydrate(
14 require('react').createElement(${opts.entry.name}, vitreum_props),
15 document.getElementById('vitreum-root')
16 );
17 })();
18 </script>`;
19 return template(head, body, tail);
20};
21module.exports = async (opts={})=>{
22 const paths = opts.paths;
23 const code = `const ReactDOMServer = require('react-dom/server');
24const React = require('react');
25const Headtags = require('vitreum/headtags.js');
26let cache = {};
27${opts.dev ? `require('source-map-support/register');` : ''}
28
29module.exports = (props, opts={})=>{
30 opts = Object.assign({render:true, cache:false}, opts);
31 let component = '', headtags = '';
32 const propsString = JSON.stringify(props);
33 if(opts.cache && cache[propsString]) return cache[propsString];
34 if(opts.render){
35 ${opts.dev ? `delete require.cache[require.resolve('./${paths.code}')];` : ''}
36 global.vitreum_props = props;
37 const Element = require('./${paths.code}');
38 if(!Object.keys(Element).length && typeof Element !== 'function'){
39 throw new Error('${opts.entry.name} component was improperly built. Check the /build folder.');
40 }
41 component = ReactDOMServer.renderToString(React.createElement(Element, props));
42 headtags = Headtags.generate();
43 }
44 const html = \`${getRenderedTemplate(opts.template, opts)}\`;
45 if(opts.cache) cache[propsString] = html;
46 return html;
47};`;
48 await fse.writeFile(`${paths.build}/${opts.entry.name}/${paths.render}`, code);
49 if(opts.static){
50 //TODO: use the utils require
51 const renderer = require(path.resolve(process.cwd(), `${paths.build}/${opts.entry.name}/${paths.render}`));
52 await fse.writeFile(`${paths.build}/${opts.entry.name}/${paths.static}`, renderer())
53 }
54};