/
render.js
97 lines (84 loc) · 3.49 KB
/
render.js
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.renderHtmlUtil = exports.layoutUtil = exports.renderUtil = undefined;
var _defaults = require('../defaults');
var _string = require('./string');
var renderer = require('vue-server-renderer').createRenderer();
var appRegex = /{{{app}}}/igm;
var scriptRegex = /{{{script}}}/igm;
var titleRegex = /{{{title}}}/igm;
var types = new _defaults.Types();
function createApp(script) {
return new Vue(script);
if (typeof module !== 'undefined' && module.exports) {
module.exports = createApp;
} else {
this.app = createApp();
}
}
function layoutUtil(components) {
var layout = {};
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = components[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var component = _step.value;
switch (component.type) {
case types.LAYOUT:
layout = component;
break;
case types.COMPONENT:
layout.template = layout.template.replace(appRegex, '<div id="app">' + component.script.template + '</div>');
layout.script = component.script;
break;
case types.SUBCOMPONENT:
if (layout.script.components) {
layout.script.components[component.name] = component.script;
} else {
layout.script.components = {};
layout.script.components[component.name] = component.script;
}
break;
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return layout;
}
function renderUtil(layout, renderedScriptString, defaults) {
var html = '';
global.Vue = require('vue');
renderer.renderToString(createApp(layout.script), function (error, renderedHtml) {
html = layout.template.replace(appRegex, '<div id="app">' + renderedHtml + '</div>');
html = html.replace(scriptRegex, renderedScriptString);
html = html.replace(titleRegex, layout.script.data.title || defaults.options.title);
});
return html;
}
function renderedScript(script) {
var scriptString = (0, _string.scriptToString)(script);
return '<script>\n (function () {\n \'use strict\'\n var createApp = function () {\n return new Vue(\n ' + scriptString + '\n )\n }\n if (typeof module !== \'undefined\' && module.exports) {\n module.exports = createApp\n } else {\n this.app = createApp()\n }\n }).call(this)\n </script>';
}
function renderHtmlUtil(components, defaults) {
var layout = layoutUtil(components);
var renderedScriptString = renderedScript(layout.script);
return renderUtil(layout, renderedScriptString, defaults);
}
exports.renderUtil = renderUtil;
exports.layoutUtil = layoutUtil;
exports.renderHtmlUtil = renderHtmlUtil;