forked from rinocloud/react-view-engine
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
75 lines (66 loc) · 2.03 KB
/
index.js
File metadata and controls
75 lines (66 loc) · 2.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
var React = require('react')
var ReactDOMServer = require('react-dom/server')
var path = require('path')
function getComponent(file) {
var r = require(file);
if (r.__esModule && r.default) {
return r.default
} else {
return r
}
}
function cleanOptions(options) {
var opts = options
delete opts['settings']
delete opts['_locals']
delete opts['_csrf']
delete opts['enrouten']
delete opts['cache']
return opts
}
function handler(html, name, options, layout) {
var script = [
'<script type="application/json" id="props_' + name + '">',
JSON.stringify(options),
'</script>',
'<script>',
"window.addEventListener('DOMContentLoaded', function(){",
" if(window.loadProps){",
" var props = JSON.parse(document.getElementById('props_" + name + "').innerHTML);",
" loadProps('" + name + "', props, '" + layout + "');",
" }",
"})",
'</script>'
].join('\n')
return html.replace('</body>', script + '</body>')
}
module.exports = function engine(opts) {
opts = opts || {}
var layout = opts.layout
require('babel-register')({
extensions: opts.extensions || ['.jsx', '.js'],
})
return function (filePath, options, callback) {
try {
if (layout) {
var layoutPath = this.lookup(layout + ".jsx")
var Layout = getComponent(layoutPath)
}
var client = getComponent(filePath)
if (options.noHashes) {
var render = ReactDOMServer.renderToStaticMarkup
} else {
var render = ReactDOMServer.renderToString
}
var name = this.name
var data = cleanOptions(options)
var clientApp = React.createFactory(client)(data)
var Template = Layout ? React.createFactory(Layout)(data, clientApp) : clientApp
var markup = render(Template)
markup = (opts.doctype || '<!DOCTYPE html>') + handler(markup, name, options, layout)
return callback(null, markup)
}catch(error){
return callback(error)
}
}
}