UNPKG

yahoi

Version:

Yet Another Highly Opinionated Isomorphic Framework

148 lines (118 loc) 5.44 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = undefined; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _server = require('react-dom/server'); var _Renderer = require('./../Renderer'); var _styledComponents = require('styled-components'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var requireAll = require('require-all'); var ClientRenderer = function () { function ClientRenderer(props) { _classCallCheck(this, ClientRenderer); this.projectPath = props.projectPath; this.state = props.state; this.req = props.req; this.targetView = props.targetView; } _createClass(ClientRenderer, [{ key: 'loadTranslations', value: function loadTranslations(language) { var resources = requireAll({ dirname: this.projectPath + '/Translations', filter: /^.*\.(JSON|json)$/, recursive: true, map: function map(name, path) { if (name == 'json') { return require('path').basename(path).split('.')[0]; } else { return name; } } }); return resources; } }, { key: 'render', value: function render() { var _this = this; var req = this.req; var preloadedState = this.preloadedState; return new Promise(function (fulfill, reject) { var compPath = _this.projectPath + '/Client/index.js'; try { var preloadedState = _this.state; // locale Store? var localeStore = preloadedState.Locale; if (typeof localeStore == 'undefined') { localeStore = { preloadedTranslations: _this.loadTranslations('en') }; } else { if (typeof localeStore.language != 'undefined') { localeStore.preloadedTranslations = _this.loadTranslations(localeStore.language); } else { localeStore.preloadedTranslations = _this.loadTranslations('en'); } } var injectedPreloadedState = JSON.stringify(preloadedState); if (process.env.NODE_ENV != 'development') { // Server Side Safe require var Module = require('module'); var originalRequire = Module.prototype.require; Module.prototype.require = function () { if (!/.\.css$/.test(arguments[0])) { return originalRequire.apply(this, arguments); } }; var sourceComponent = originalRequire(compPath).default; } else { var sourceComponent = require(compPath).default; } var Component = _react2.default.createFactory(sourceComponent); var ssr = { location: req.url, context: {}, preloadedState: preloadedState }; if (process.env.NODE_ENV != 'development') { require = originalRequire; } // console.log('root comp', Component); var initatedComponent = _react2.default.createElement(Component, { ssr: ssr }); var sheet = new _styledComponents.ServerStyleSheet(); var htmlStyle = (0, _server.renderToString)(sheet.collectStyles(initatedComponent)); var styleTags = sheet.getStyleTags(); var renderedClient = (0, _server.renderToString)(initatedComponent); } catch (e) { var message = e.message || ''; var stack = e.stack || ''; var renderedClient = 'Error rendering ' + compPath + ':<br/><br/><div style=\'color:#ff0000\'>' + message + '<br/><br/>' + stack + '</div>'; } var CLIENT_INJECTOR = '<script>window.__PRELOADED_STATE__=' + injectedPreloadedState + '</script><div id=\'client-wrapper\'>' + renderedClient + '</div><script src="/public/clientjs/vendor.js"></script><script src="/public/clientjs/main.js"></script>'; var EXTRACTED_POST_CSS_LINK = '<link rel="stylesheet" type="text/css" href="/Public/clientjs/main.css">'; var viewRenderer = new _Renderer.ViewRenderer({ filePath: _this.projectPath + '/Views/' + _this.targetView, data: { CLIENT: CLIENT_INJECTOR, STYLED_COMPONENTS_STYLE_TAG: styleTags, EXTRACTED_POST_CSS_LINK: EXTRACTED_POST_CSS_LINK } }); viewRenderer.render().then(function (renderedHtml) { fulfill(renderedHtml); }).catch(function (e) { console.log(e); reject(e); }); }); } }]); return ClientRenderer; }(); exports.default = ClientRenderer;