1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 |
|
7 | var _extends2 = require('babel-runtime/helpers/extends');
|
8 |
|
9 | var _extends3 = _interopRequireDefault(_extends2);
|
10 |
|
11 | var _assign = require('babel-runtime/core-js/object/assign');
|
12 |
|
13 | var _assign2 = _interopRequireDefault(_assign);
|
14 |
|
15 | var _trim = require('babel-runtime/core-js/string/trim');
|
16 |
|
17 | var _trim2 = _interopRequireDefault(_trim);
|
18 |
|
19 | exports.default = server;
|
20 |
|
21 | var _react = require('react');
|
22 |
|
23 | var _react2 = _interopRequireDefault(_react);
|
24 |
|
25 | var _server = require('react-dom/server');
|
26 |
|
27 | var _server2 = _interopRequireDefault(_server);
|
28 |
|
29 | var _reactRouter = require('react-router');
|
30 |
|
31 | var _reduxConnect = require('redux-connect');
|
32 |
|
33 | var _createMemoryHistory = require('react-router/lib/createMemoryHistory');
|
34 |
|
35 | var _createMemoryHistory2 = _interopRequireDefault(_createMemoryHistory);
|
36 |
|
37 | var _reactRedux = require('react-redux');
|
38 |
|
39 | var _recursiveReaddirSync = require('recursive-readdir-sync');
|
40 |
|
41 | var _recursiveReaddirSync2 = _interopRequireDefault(_recursiveReaddirSync);
|
42 |
|
43 | var _propertiesReader = require('properties-reader');
|
44 |
|
45 | var _propertiesReader2 = _interopRequireDefault(_propertiesReader);
|
46 |
|
47 | var _cookieDough = require('cookie-dough');
|
48 |
|
49 | var _cookieDough2 = _interopRequireDefault(_cookieDough);
|
50 |
|
51 | var _express = require('express');
|
52 |
|
53 | var _express2 = _interopRequireDefault(_express);
|
54 |
|
55 | var _fsExtra = require('fs-extra');
|
56 |
|
57 | var _fsExtra2 = _interopRequireDefault(_fsExtra);
|
58 |
|
59 | var _create = require('./create');
|
60 |
|
61 | var _create2 = _interopRequireDefault(_create);
|
62 |
|
63 | var _i18n = require('./i18n');
|
64 |
|
65 | var _apiclient = require('./apiclient');
|
66 |
|
67 | var _apiclient2 = _interopRequireDefault(_apiclient);
|
68 |
|
69 | var _fetcher = require('./fetcher');
|
70 |
|
71 | var _fetcher2 = _interopRequireDefault(_fetcher);
|
72 |
|
73 | var _stringify = require('./stringify');
|
74 |
|
75 | var _stringify2 = _interopRequireDefault(_stringify);
|
76 |
|
77 | var _createRouterOpts = require('./createRouterOpts');
|
78 |
|
79 | var _createRouterOpts2 = _interopRequireDefault(_createRouterOpts);
|
80 |
|
81 | var _Html = require('./Html');
|
82 |
|
83 | var _Html2 = _interopRequireDefault(_Html);
|
84 |
|
85 | var _App = require('./App');
|
86 |
|
87 | var _App2 = _interopRequireDefault(_App);
|
88 |
|
89 | var _Offline = require('./Offline');
|
90 |
|
91 | var _Offline2 = _interopRequireDefault(_Offline);
|
92 |
|
93 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
94 |
|
95 | var 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 |
|
108 | function 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 |
|
191 |
|
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 | }
|
268 | module.exports = exports['default']; |
\ | No newline at end of file |