UNPKG

8.54 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _extends2 = require('babel-runtime/helpers/extends');
8
9var _extends3 = _interopRequireDefault(_extends2);
10
11var _assign = require('babel-runtime/core-js/object/assign');
12
13var _assign2 = _interopRequireDefault(_assign);
14
15var _trim = require('babel-runtime/core-js/string/trim');
16
17var _trim2 = _interopRequireDefault(_trim);
18
19exports.default = server;
20
21var _react = require('react');
22
23var _react2 = _interopRequireDefault(_react);
24
25var _server = require('react-dom/server');
26
27var _server2 = _interopRequireDefault(_server);
28
29var _reactRouter = require('react-router');
30
31var _reduxConnect = require('redux-connect');
32
33var _createMemoryHistory = require('react-router/lib/createMemoryHistory');
34
35var _createMemoryHistory2 = _interopRequireDefault(_createMemoryHistory);
36
37var _reactRedux = require('react-redux');
38
39var _recursiveReaddirSync = require('recursive-readdir-sync');
40
41var _recursiveReaddirSync2 = _interopRequireDefault(_recursiveReaddirSync);
42
43var _propertiesReader = require('properties-reader');
44
45var _propertiesReader2 = _interopRequireDefault(_propertiesReader);
46
47var _cookieDough = require('cookie-dough');
48
49var _cookieDough2 = _interopRequireDefault(_cookieDough);
50
51var _express = require('express');
52
53var _express2 = _interopRequireDefault(_express);
54
55var _fsExtra = require('fs-extra');
56
57var _fsExtra2 = _interopRequireDefault(_fsExtra);
58
59var _create = require('./create');
60
61var _create2 = _interopRequireDefault(_create);
62
63var _i18n = require('./i18n');
64
65var _apiclient = require('./apiclient');
66
67var _apiclient2 = _interopRequireDefault(_apiclient);
68
69var _fetcher = require('./fetcher');
70
71var _fetcher2 = _interopRequireDefault(_fetcher);
72
73var _stringify = require('./stringify');
74
75var _stringify2 = _interopRequireDefault(_stringify);
76
77var _createRouterOpts = require('./createRouterOpts');
78
79var _createRouterOpts2 = _interopRequireDefault(_createRouterOpts);
80
81var _Html = require('./Html');
82
83var _Html2 = _interopRequireDefault(_Html);
84
85var _App = require('./App');
86
87var _App2 = _interopRequireDefault(_App);
88
89var _Offline = require('./Offline');
90
91var _Offline2 = _interopRequireDefault(_Offline);
92
93function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
94
95var loadi18n = function loadi18n(dir, i18n) {
96 var path = require('path');
97 var files = (0, _recursiveReaddirSync2.default)(dir);
98 files.map(function (file) {
99 console.log('### loading lang files');
100 console.log(file);
101 var properties = (0, _propertiesReader2.default)(file);
102 var lang = path.basename(file, '.properties');
103 i18n[lang] = properties.getAllProperties();
104 });
105 console.log(i18n);
106};
107
108function server(_ref) {
109 var app = _ref.app,
110 path = _ref.path,
111 urls = _ref.urls,
112 origin = _ref.origin,
113 i18ndir = _ref.i18ndir,
114 reducers = _ref.reducers,
115 routes = _ref.routes,
116 handlers = _ref.handlers,
117 statics = _ref.statics,
118 _ref$isDevelopment = _ref.isDevelopment,
119 isDevelopment = _ref$isDevelopment === undefined ? false : _ref$isDevelopment,
120 _ref$manifest = _ref.manifest,
121 manifest = _ref$manifest === undefined ? {} : _ref$manifest,
122 _ref$colors = _ref.colors,
123 colors = _ref$colors === undefined ? {} : _ref$colors;
124
125 var i18n = {};
126 loadi18n(i18ndir, i18n);
127 if (_Offline2.default) {
128 app.get('/offline', function (req, res) {
129 res.send('<!doctype html>\n' + _server2.default.renderToString(_react2.default.createElement(_Html2.default, {
130 assets: webpackIsomorphicTools.assets(),
131 component: _react2.default.createElement(_Offline2.default, { colors: colors }),
132 store: { getState: function getState() {} },
133 statics: statics,
134 enableScript: false
135 })));
136 });
137 }
138 var koikiSw = _fsExtra2.default.readFileSync(require('path').resolve(__dirname, './static/koiki-sw.js'));
139 var cacheTargets = _fsExtra2.default.readJsonSync(require('path').resolve(process.cwd(), 'cache-targets.json'));
140 app.use('/koiki-sw.js', function (req, res) {
141 return res.send('const CACHE_TARGETS = ' + cacheTargets + ';' + koikiSw);
142 });
143 app.use('/', _express2.default.static(__dirname + '/static'));
144 app.get('/manifest.json', function (req, res) {
145 var lang = (0, _trim2.default)((req.headers['accept-language'] || '').split(',')[0].split('-')[0].split('_')[0]) || 'en';
146
147 res.json((0, _assign2.default)({
148 dir: 'ltr',
149 lang: lang,
150 name: origin,
151 display: 'fullscreen',
152 start_url: origin + '/' + lang,
153 short_name: origin,
154 theme_color: 'transparent',
155 description: '',
156 orientation: 'any',
157 background_color: colors.background || 'transparent',
158 related_applications: [],
159 prefer_related_applications: false,
160 icons: ['48', '72', '96', '144', '168', '192', '256', '384', '512'].map(function (size) {
161 return {
162 src: '/images/favicon.png',
163 type: 'image/png',
164 sizes: size + 'x' + size
165 };
166 })
167 }, manifest));
168 });
169
170 app.get('*', function (req, res, next) {
171 if (!isDevelopment && req.headers['x-forwarded-proto'] !== 'https') {
172 res.redirect(origin + req.url);
173 } else {
174 next();
175 }
176 });
177
178 app.get('/', function (req, res) {
179 var lang = (0, _trim2.default)((req.headers['accept-language'] || '').split(',')[0].split('-')[0].split('_')[0]) || 'en';
180 console.log(lang, req.headers['accept-language']);
181 res.redirect((0, _stringify2.default)(path, { lang: lang }));
182 });
183
184 app.use(path, function (req, res, next) {
185 if (!i18n[req.params.lang]) {
186 next();
187 return;
188 }
189 if (isDevelopment) {
190 // Do not cache webpack stats: the script file would change since
191 // hot module replacement is enabled in the development env
192 webpackIsomorphicTools.refresh();
193 }
194 var client = new _apiclient2.default({
195 cookie: req.get('cookie'),
196 origin: origin,
197 referer: origin
198 });
199 var cookie = new _cookieDough2.default(req);
200 var history = (0, _createMemoryHistory2.default)((0, _createRouterOpts2.default)());
201
202 var store = (0, _create2.default)({ reducers: reducers, history: history, isDevelopment: isDevelopment });
203 store.dispatch((0, _i18n.set)(i18n[req.params.lang]));
204
205 var fetcher = new _fetcher2.default({
206 client: client,
207 dispatch: store.dispatch,
208 urls: urls,
209 type: 'server'
210 });
211
212 function hydrateOnClient() {
213 res.send('<!doctype html>\n' + _server2.default.renderToString(_react2.default.createElement(_Html2.default, {
214 assets: webpackIsomorphicTools.assets(),
215 store: store,
216 statics: statics
217 })));
218 }
219
220 (0, _reactRouter.match)({
221 history: history,
222 routes: _react2.default.createElement(
223 _reactRouter.Route,
224 {
225 urls: urls,
226 origin: origin,
227 component: _App2.default,
228 cookie: cookie,
229 fetcher: fetcher
230 },
231 routes(store, cookie)
232 ),
233 location: req.originalUrl
234 }, function (error, redirectLocation, renderProps) {
235 if (redirectLocation) {
236 res.redirect(redirectLocation.pathname + redirectLocation.search);
237 } else if (error) {
238 handlers.error(error);
239 res.set('Content-Type', 'text/html');
240 res.status(500);
241 hydrateOnClient();
242 } else if (renderProps) {
243 (0, _reduxConnect.loadOnServer)((0, _extends3.default)({}, renderProps, { store: store, cookie: cookie, helpers: { fetcher: fetcher } })).then(function () {
244 var component = _react2.default.createElement(
245 _reactRedux.Provider,
246 { store: store, key: 'provider' },
247 _react2.default.createElement(_reduxConnect.ReduxAsyncConnect, (0, _extends3.default)({}, renderProps, { store: store }))
248 );
249 res.set('Content-Type', 'text/html');
250 res.status(200);
251
252 global.navigator = { userAgent: req.headers['user-agent'] };
253 res.send('<!doctype html>\n' + _server2.default.renderToString(_react2.default.createElement(_Html2.default, {
254 assets: webpackIsomorphicTools.assets(),
255 component: component,
256 store: store,
257 fetcher: fetcher.get(urls),
258 statics: statics
259 })));
260 });
261 } else {
262 res.set('Content-Type', 'text/html');
263 res.status(404).send('Not found');
264 }
265 });
266 });
267}
268module.exports = exports['default'];
\No newline at end of file