@modern-js/prod-server 2.0.0-beta.0 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/dist/js/modern/constants.js +0 -2
- package/dist/js/modern/index.js +0 -1
- package/dist/js/modern/libs/context/context.js +10 -56
- package/dist/js/modern/libs/hook-api/index.js +0 -31
- package/dist/js/modern/libs/hook-api/route.js +0 -8
- package/dist/js/modern/libs/hook-api/template.js +0 -16
- package/dist/js/modern/libs/loadConfig.js +3 -10
- package/dist/js/modern/libs/metrics.js +6 -6
- package/dist/js/modern/libs/proxy.js +7 -12
- package/dist/js/modern/libs/render/cache/__tests__/cache.fun.test.js +0 -1
- package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +0 -9
- package/dist/js/modern/libs/render/cache/index.js +8 -16
- package/dist/js/modern/libs/render/cache/page-caches/lru.js +0 -10
- package/dist/js/modern/libs/render/cache/spr.js +12 -62
- package/dist/js/modern/libs/render/cache/util.js +0 -6
- package/dist/js/modern/libs/render/index.js +6 -11
- package/dist/js/modern/libs/render/measure.js +1 -11
- package/dist/js/modern/libs/render/modern/index.js +2 -13
- package/dist/js/modern/libs/render/reader.js +13 -24
- package/dist/js/modern/libs/render/ssr.js +5 -6
- package/dist/js/modern/libs/render/static.js +6 -9
- package/dist/js/modern/libs/render/type.js +0 -1
- package/dist/js/modern/libs/route/index.js +8 -19
- package/dist/js/modern/libs/route/matcher.js +21 -29
- package/dist/js/modern/libs/route/route.js +0 -13
- package/dist/js/modern/libs/serve-file.js +5 -6
- package/dist/js/modern/server/index.js +19 -41
- package/dist/js/modern/server/modern-server-split.js +0 -11
- package/dist/js/modern/server/modern-server.js +83 -164
- package/dist/js/modern/utils.js +2 -21
- package/dist/js/modern/worker-server.js +34 -0
- package/dist/js/node/constants.js +0 -2
- package/dist/js/node/index.js +0 -10
- package/dist/js/node/libs/context/context.js +10 -65
- package/dist/js/node/libs/context/index.js +0 -3
- package/dist/js/node/libs/hook-api/index.js +0 -42
- package/dist/js/node/libs/hook-api/route.js +0 -10
- package/dist/js/node/libs/hook-api/template.js +0 -22
- package/dist/js/node/libs/loadConfig.js +3 -22
- package/dist/js/node/libs/metrics.js +6 -6
- package/dist/js/node/libs/proxy.js +7 -17
- package/dist/js/node/libs/render/cache/__tests__/cache.fun.test.js +0 -5
- package/dist/js/node/libs/render/cache/__tests__/cache.test.js +0 -12
- package/dist/js/node/libs/render/cache/index.js +8 -22
- package/dist/js/node/libs/render/cache/page-caches/index.js +0 -2
- package/dist/js/node/libs/render/cache/page-caches/lru.js +0 -14
- package/dist/js/node/libs/render/cache/spr.js +12 -71
- package/dist/js/node/libs/render/cache/util.js +0 -18
- package/dist/js/node/libs/render/index.js +6 -26
- package/dist/js/node/libs/render/measure.js +0 -17
- package/dist/js/node/libs/render/modern/index.js +2 -20
- package/dist/js/node/libs/render/reader.js +12 -39
- package/dist/js/node/libs/render/ssr.js +4 -16
- package/dist/js/node/libs/render/static.js +6 -18
- package/dist/js/node/libs/render/type.js +0 -1
- package/dist/js/node/libs/route/index.js +8 -22
- package/dist/js/node/libs/route/matcher.js +18 -34
- package/dist/js/node/libs/route/route.js +0 -15
- package/dist/js/node/libs/serve-file.js +5 -13
- package/dist/js/node/server/index.js +19 -61
- package/dist/js/node/server/modern-server-split.js +0 -13
- package/dist/js/node/server/modern-server.js +83 -193
- package/dist/js/node/utils.js +3 -46
- package/dist/js/node/worker-server.js +41 -0
- package/dist/js/treeshaking/constants.js +28 -0
- package/dist/js/treeshaking/index.js +13 -0
- package/dist/js/treeshaking/libs/context/context.js +243 -0
- package/dist/js/treeshaking/libs/context/index.js +5 -0
- package/dist/js/treeshaking/libs/hook-api/index.js +157 -0
- package/dist/js/treeshaking/libs/hook-api/route.js +33 -0
- package/dist/js/treeshaking/libs/hook-api/template.js +91 -0
- package/dist/js/treeshaking/libs/loadConfig.js +39 -0
- package/dist/js/treeshaking/libs/metrics.js +12 -0
- package/dist/js/treeshaking/libs/proxy.js +80 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/cache.fun.test.js +124 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/cache.test.js +464 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/cacheable.js +53 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/error-configuration.js +35 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/matched-cache.js +121 -0
- package/dist/js/treeshaking/libs/render/cache/index.js +184 -0
- package/dist/js/treeshaking/libs/render/cache/page-caches/index.js +30 -0
- package/dist/js/treeshaking/libs/render/cache/page-caches/lru.js +46 -0
- package/dist/js/treeshaking/libs/render/cache/spr.js +362 -0
- package/dist/js/treeshaking/libs/render/cache/type.js +1 -0
- package/dist/js/treeshaking/libs/render/cache/util.js +101 -0
- package/dist/js/treeshaking/libs/render/index.js +100 -0
- package/dist/js/treeshaking/libs/render/measure.js +61 -0
- package/dist/js/treeshaking/libs/render/modern/browser-list.js +7 -0
- package/dist/js/treeshaking/libs/render/modern/index.js +39 -0
- package/dist/js/treeshaking/libs/render/reader.js +191 -0
- package/dist/js/treeshaking/libs/render/ssr.js +98 -0
- package/dist/js/treeshaking/libs/render/static.js +84 -0
- package/dist/js/treeshaking/libs/render/type.js +6 -0
- package/dist/js/treeshaking/libs/route/index.js +94 -0
- package/dist/js/treeshaking/libs/route/matcher.js +113 -0
- package/dist/js/treeshaking/libs/route/route.js +26 -0
- package/dist/js/treeshaking/libs/serve-file.js +75 -0
- package/dist/js/treeshaking/server/index.js +343 -0
- package/dist/js/treeshaking/server/modern-server-split.js +152 -0
- package/dist/js/treeshaking/server/modern-server.js +945 -0
- package/dist/js/treeshaking/type.js +1 -0
- package/dist/js/treeshaking/utils.js +87 -0
- package/dist/js/treeshaking/worker-server.js +56 -0
- package/dist/types/index.d.ts +0 -2
- package/dist/types/libs/context/context.d.ts +0 -3
- package/dist/types/libs/loadConfig.d.ts +0 -1
- package/dist/types/libs/render/cache/index.d.ts +0 -2
- package/dist/types/libs/render/cache/spr.d.ts +0 -2
- package/dist/types/server/index.d.ts +0 -3
- package/dist/types/utils.d.ts +0 -1
- package/dist/types/worker-server.d.ts +16 -0
- package/package.json +28 -12
|
@@ -0,0 +1,945 @@
|
|
|
1
|
+
import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
|
|
2
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
3
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
|
|
4
|
+
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
|
5
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
6
|
+
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
7
|
+
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
8
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
9
|
+
var _excluded = ["getMiddlewares"];
|
|
10
|
+
/* eslint-disable max-lines */
|
|
11
|
+
import { createServer } from 'http';
|
|
12
|
+
import util from 'util';
|
|
13
|
+
import path from 'path';
|
|
14
|
+
import { fs, mime, ROUTE_SPEC_FILE } from '@modern-js/utils';
|
|
15
|
+
import { RouteMatchManager } from "../libs/route";
|
|
16
|
+
import { createRenderHandler } from "../libs/render";
|
|
17
|
+
import { createStaticFileHandler, faviconFallbackHandler } from "../libs/serve-file";
|
|
18
|
+
import { createErrorDocument, createMiddlewareCollecter, getStaticReg, mergeExtension, noop, debug, isRedirect } from "../utils";
|
|
19
|
+
import * as reader from "../libs/render/reader";
|
|
20
|
+
import { createProxyHandler } from "../libs/proxy";
|
|
21
|
+
import { createContext as _createContext } from "../libs/context";
|
|
22
|
+
import { templateInjectableStream } from "../libs/hook-api/template";
|
|
23
|
+
import { AGGRED_DIR, ERROR_DIGEST, ERROR_PAGE_TEXT, RUN_MODE } from "../constants";
|
|
24
|
+
import { createAfterMatchContext, createAfterRenderContext, createMiddlewareContext } from "../libs/hook-api";
|
|
25
|
+
var API_DIR = './api';
|
|
26
|
+
var SERVER_DIR = './server';
|
|
27
|
+
export var ModernServer = /*#__PURE__*/function () {
|
|
28
|
+
// appDirectory
|
|
29
|
+
|
|
30
|
+
// product dist dir
|
|
31
|
+
|
|
32
|
+
// work on src or dist
|
|
33
|
+
|
|
34
|
+
function ModernServer(_ref) {
|
|
35
|
+
var _config$output;
|
|
36
|
+
var pwd = _ref.pwd,
|
|
37
|
+
config = _ref.config,
|
|
38
|
+
routes = _ref.routes,
|
|
39
|
+
staticGenerate = _ref.staticGenerate,
|
|
40
|
+
logger = _ref.logger,
|
|
41
|
+
metrics = _ref.metrics,
|
|
42
|
+
runMode = _ref.runMode,
|
|
43
|
+
proxyTarget = _ref.proxyTarget;
|
|
44
|
+
_classCallCheck(this, ModernServer);
|
|
45
|
+
_defineProperty(this, "pwd", void 0);
|
|
46
|
+
_defineProperty(this, "distDir", void 0);
|
|
47
|
+
_defineProperty(this, "workDir", void 0);
|
|
48
|
+
_defineProperty(this, "router", void 0);
|
|
49
|
+
_defineProperty(this, "conf", void 0);
|
|
50
|
+
_defineProperty(this, "handlers", []);
|
|
51
|
+
_defineProperty(this, "presetRoutes", void 0);
|
|
52
|
+
_defineProperty(this, "runner", void 0);
|
|
53
|
+
_defineProperty(this, "logger", void 0);
|
|
54
|
+
_defineProperty(this, "metrics", void 0);
|
|
55
|
+
_defineProperty(this, "runMode", void 0);
|
|
56
|
+
_defineProperty(this, "reader", reader);
|
|
57
|
+
_defineProperty(this, "proxyTarget", void 0);
|
|
58
|
+
_defineProperty(this, "staticFileHandler", void 0);
|
|
59
|
+
_defineProperty(this, "routeRenderHandler", void 0);
|
|
60
|
+
_defineProperty(this, "beforeRouteHandler", null);
|
|
61
|
+
_defineProperty(this, "frameWebHandler", null);
|
|
62
|
+
_defineProperty(this, "frameAPIHandler", null);
|
|
63
|
+
_defineProperty(this, "proxyHandler", null);
|
|
64
|
+
_defineProperty(this, "_handler", void 0);
|
|
65
|
+
_defineProperty(this, "staticGenerate", void 0);
|
|
66
|
+
require('ignore-styles');
|
|
67
|
+
this.pwd = pwd;
|
|
68
|
+
this.distDir = path.join(pwd, ((_config$output = config.output) === null || _config$output === void 0 ? void 0 : _config$output.path) || 'dist');
|
|
69
|
+
this.workDir = this.distDir;
|
|
70
|
+
this.conf = config;
|
|
71
|
+
debug('server conf', this.conf);
|
|
72
|
+
this.logger = logger;
|
|
73
|
+
this.metrics = metrics;
|
|
74
|
+
this.router = new RouteMatchManager();
|
|
75
|
+
this.presetRoutes = routes;
|
|
76
|
+
this.proxyTarget = proxyTarget;
|
|
77
|
+
this.staticGenerate = staticGenerate || false;
|
|
78
|
+
this.runMode = runMode || RUN_MODE.FULL;
|
|
79
|
+
// process.env.BUILD_TYPE = `${this.staticGenerate ? 'ssg' : 'ssr'}`;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// server prepare
|
|
83
|
+
_createClass(ModernServer, [{
|
|
84
|
+
key: "onInit",
|
|
85
|
+
value: function () {
|
|
86
|
+
var _onInit = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(runner, app) {
|
|
87
|
+
var _conf$bff,
|
|
88
|
+
_this = this;
|
|
89
|
+
var distDir, staticGenerate, conf, usageRoutes, staticPathRegExp;
|
|
90
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
91
|
+
while (1) {
|
|
92
|
+
switch (_context.prev = _context.next) {
|
|
93
|
+
case 0:
|
|
94
|
+
this.runner = runner;
|
|
95
|
+
distDir = this.distDir, staticGenerate = this.staticGenerate, conf = this.conf;
|
|
96
|
+
debug('final server conf', this.conf);
|
|
97
|
+
// proxy handler, each proxy has own handler
|
|
98
|
+
this.proxyHandler = createProxyHandler((_conf$bff = conf.bff) === null || _conf$bff === void 0 ? void 0 : _conf$bff.proxy);
|
|
99
|
+
if (this.proxyHandler) {
|
|
100
|
+
this.proxyHandler.forEach(function (handler) {
|
|
101
|
+
_this.addHandler(handler);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// start file reader
|
|
106
|
+
this.reader.init();
|
|
107
|
+
app.on('close', function () {
|
|
108
|
+
_this.reader.close();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// use preset routes priority
|
|
112
|
+
usageRoutes = this.filterRoutes(this.getRoutes());
|
|
113
|
+
this.router.reset(usageRoutes);
|
|
114
|
+
|
|
115
|
+
// warmup ssr bundle in production env
|
|
116
|
+
this.warmupSSRBundle();
|
|
117
|
+
_context.next = 12;
|
|
118
|
+
return this.prepareFrameHandler();
|
|
119
|
+
case 12:
|
|
120
|
+
_context.next = 14;
|
|
121
|
+
return this.prepareBeforeRouteHandler(usageRoutes, distDir);
|
|
122
|
+
case 14:
|
|
123
|
+
// Only work when without setting `assetPrefix`.
|
|
124
|
+
// Setting `assetPrefix` means these resources should be uploaded to CDN.
|
|
125
|
+
staticPathRegExp = getStaticReg(this.conf.output || {});
|
|
126
|
+
this.staticFileHandler = createStaticFileHandler([{
|
|
127
|
+
path: staticPathRegExp,
|
|
128
|
+
target: distDir
|
|
129
|
+
}], this.conf.output);
|
|
130
|
+
this.routeRenderHandler = createRenderHandler({
|
|
131
|
+
distDir: distDir,
|
|
132
|
+
staticGenerate: staticGenerate
|
|
133
|
+
});
|
|
134
|
+
_context.next = 19;
|
|
135
|
+
return this.setupBeforeProdMiddleware();
|
|
136
|
+
case 19:
|
|
137
|
+
this.addHandler(this.staticFileHandler);
|
|
138
|
+
|
|
139
|
+
// execute after staticFileHandler, can rename to staticFallbackHandler if needed.
|
|
140
|
+
this.addHandler(faviconFallbackHandler);
|
|
141
|
+
this.addBeforeRouteHandler();
|
|
142
|
+
this.addHandler(this.routeHandler.bind(this));
|
|
143
|
+
|
|
144
|
+
// compose middlewares to http handler
|
|
145
|
+
this.compose();
|
|
146
|
+
case 24:
|
|
147
|
+
case "end":
|
|
148
|
+
return _context.stop();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}, _callee, this);
|
|
152
|
+
}));
|
|
153
|
+
function onInit(_x, _x2) {
|
|
154
|
+
return _onInit.apply(this, arguments);
|
|
155
|
+
}
|
|
156
|
+
return onInit;
|
|
157
|
+
}() // server ready
|
|
158
|
+
}, {
|
|
159
|
+
key: "onRepack",
|
|
160
|
+
value: function onRepack(_) {
|
|
161
|
+
// empty
|
|
162
|
+
}
|
|
163
|
+
}, {
|
|
164
|
+
key: "addBeforeRouteHandler",
|
|
165
|
+
value: function addBeforeRouteHandler() {
|
|
166
|
+
var _this2 = this;
|
|
167
|
+
this.addHandler( /*#__PURE__*/function () {
|
|
168
|
+
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(context, next) {
|
|
169
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
170
|
+
while (1) {
|
|
171
|
+
switch (_context2.prev = _context2.next) {
|
|
172
|
+
case 0:
|
|
173
|
+
if (!_this2.beforeRouteHandler) {
|
|
174
|
+
_context2.next = 5;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
_context2.next = 3;
|
|
178
|
+
return _this2.beforeRouteHandler(context);
|
|
179
|
+
case 3:
|
|
180
|
+
if (!_this2.isSend(context.res)) {
|
|
181
|
+
_context2.next = 5;
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
return _context2.abrupt("return");
|
|
185
|
+
case 5:
|
|
186
|
+
return _context2.abrupt("return", next());
|
|
187
|
+
case 6:
|
|
188
|
+
case "end":
|
|
189
|
+
return _context2.stop();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}, _callee2);
|
|
193
|
+
}));
|
|
194
|
+
return function (_x3, _x4) {
|
|
195
|
+
return _ref2.apply(this, arguments);
|
|
196
|
+
};
|
|
197
|
+
}());
|
|
198
|
+
}
|
|
199
|
+
}, {
|
|
200
|
+
key: "onServerChange",
|
|
201
|
+
value: function onServerChange(_ref3) {
|
|
202
|
+
var filepath = _ref3.filepath;
|
|
203
|
+
var pwd = this.pwd;
|
|
204
|
+
var api = AGGRED_DIR.api,
|
|
205
|
+
server = AGGRED_DIR.server;
|
|
206
|
+
var apiPath = path.normalize(path.join(pwd, api));
|
|
207
|
+
var serverPath = path.normalize(path.join(pwd, server));
|
|
208
|
+
var onlyApi = filepath.startsWith(apiPath);
|
|
209
|
+
var onlyWeb = filepath.startsWith(serverPath);
|
|
210
|
+
this.prepareFrameHandler({
|
|
211
|
+
onlyWeb: onlyWeb,
|
|
212
|
+
onlyApi: onlyApi
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// exposed requestHandler
|
|
217
|
+
}, {
|
|
218
|
+
key: "getRequestHandler",
|
|
219
|
+
value: function getRequestHandler() {
|
|
220
|
+
return this.requestHandler.bind(this);
|
|
221
|
+
}
|
|
222
|
+
}, {
|
|
223
|
+
key: "render",
|
|
224
|
+
value: function () {
|
|
225
|
+
var _render = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(req, res, url) {
|
|
226
|
+
var context, matched, route, result;
|
|
227
|
+
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
228
|
+
while (1) {
|
|
229
|
+
switch (_context3.prev = _context3.next) {
|
|
230
|
+
case 0:
|
|
231
|
+
req.logger = this.logger;
|
|
232
|
+
req.metrics = this.metrics;
|
|
233
|
+
context = _createContext(req, res);
|
|
234
|
+
matched = this.router.match(url || context.path);
|
|
235
|
+
if (matched) {
|
|
236
|
+
_context3.next = 6;
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
return _context3.abrupt("return", null);
|
|
240
|
+
case 6:
|
|
241
|
+
route = matched.generate(context.url);
|
|
242
|
+
_context3.next = 9;
|
|
243
|
+
return this.handleWeb(context, route);
|
|
244
|
+
case 9:
|
|
245
|
+
result = _context3.sent;
|
|
246
|
+
if (result) {
|
|
247
|
+
_context3.next = 12;
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
return _context3.abrupt("return", null);
|
|
251
|
+
case 12:
|
|
252
|
+
return _context3.abrupt("return", result.content.toString());
|
|
253
|
+
case 13:
|
|
254
|
+
case "end":
|
|
255
|
+
return _context3.stop();
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}, _callee3, this);
|
|
259
|
+
}));
|
|
260
|
+
function render(_x5, _x6, _x7) {
|
|
261
|
+
return _render.apply(this, arguments);
|
|
262
|
+
}
|
|
263
|
+
return render;
|
|
264
|
+
}()
|
|
265
|
+
}, {
|
|
266
|
+
key: "createHTTPServer",
|
|
267
|
+
value: function () {
|
|
268
|
+
var _createHTTPServer = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(handler) {
|
|
269
|
+
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
|
|
270
|
+
while (1) {
|
|
271
|
+
switch (_context4.prev = _context4.next) {
|
|
272
|
+
case 0:
|
|
273
|
+
return _context4.abrupt("return", createServer(handler));
|
|
274
|
+
case 1:
|
|
275
|
+
case "end":
|
|
276
|
+
return _context4.stop();
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}, _callee4);
|
|
280
|
+
}));
|
|
281
|
+
function createHTTPServer(_x8) {
|
|
282
|
+
return _createHTTPServer.apply(this, arguments);
|
|
283
|
+
}
|
|
284
|
+
return createHTTPServer;
|
|
285
|
+
}()
|
|
286
|
+
/* —————————————————————— function will be overwrite —————————————————————— */
|
|
287
|
+
// get routes info
|
|
288
|
+
}, {
|
|
289
|
+
key: "getRoutes",
|
|
290
|
+
value: function getRoutes() {
|
|
291
|
+
// Preferred to use preset routes
|
|
292
|
+
if (this.presetRoutes) {
|
|
293
|
+
return this.presetRoutes;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// read routes from spec file
|
|
297
|
+
var file = path.join(this.distDir, ROUTE_SPEC_FILE);
|
|
298
|
+
if (fs.existsSync(file)) {
|
|
299
|
+
var content = fs.readJSONSync(file);
|
|
300
|
+
return content.routes;
|
|
301
|
+
}
|
|
302
|
+
return [];
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// add promisify request handler to server
|
|
306
|
+
// handler should do not do more things after invoke next
|
|
307
|
+
}, {
|
|
308
|
+
key: "addHandler",
|
|
309
|
+
value: function addHandler(handler) {
|
|
310
|
+
if (handler[Symbol.toStringTag] === 'AsyncFunction') {
|
|
311
|
+
this.handlers.push(handler);
|
|
312
|
+
} else {
|
|
313
|
+
this.handlers.push(util.promisify(handler));
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// return 404 page
|
|
318
|
+
}, {
|
|
319
|
+
key: "render404",
|
|
320
|
+
value: function render404(context) {
|
|
321
|
+
context.error(ERROR_DIGEST.ENOTF, '404 Not Found');
|
|
322
|
+
this.renderErrorPage(context, 404);
|
|
323
|
+
}
|
|
324
|
+
}, {
|
|
325
|
+
key: "prepareBeforeRouteHandler",
|
|
326
|
+
value: function () {
|
|
327
|
+
var _prepareBeforeRouteHandler = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(specs, distDir) {
|
|
328
|
+
var runner, handler;
|
|
329
|
+
return _regeneratorRuntime().wrap(function _callee5$(_context5) {
|
|
330
|
+
while (1) {
|
|
331
|
+
switch (_context5.prev = _context5.next) {
|
|
332
|
+
case 0:
|
|
333
|
+
runner = this.runner;
|
|
334
|
+
_context5.next = 3;
|
|
335
|
+
return runner.preparebeforeRouteHandler({
|
|
336
|
+
serverRoutes: specs,
|
|
337
|
+
distDir: distDir
|
|
338
|
+
}, {
|
|
339
|
+
onLast: function onLast() {
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
case 3:
|
|
344
|
+
handler = _context5.sent;
|
|
345
|
+
this.beforeRouteHandler = handler;
|
|
346
|
+
case 5:
|
|
347
|
+
case "end":
|
|
348
|
+
return _context5.stop();
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}, _callee5, this);
|
|
352
|
+
}));
|
|
353
|
+
function prepareBeforeRouteHandler(_x9, _x10) {
|
|
354
|
+
return _prepareBeforeRouteHandler.apply(this, arguments);
|
|
355
|
+
}
|
|
356
|
+
return prepareBeforeRouteHandler;
|
|
357
|
+
}() // gather frame extension and get framework handler
|
|
358
|
+
}, {
|
|
359
|
+
key: "prepareFrameHandler",
|
|
360
|
+
value: function () {
|
|
361
|
+
var _prepareFrameHandler = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(options) {
|
|
362
|
+
var workDir, runner, _ref4, onlyApi, onlyWeb, _createMiddlewareColl, getMiddlewares, collector, _getMiddlewares, pluginAPIExt, pluginWebExt, apiDir, serverDir, webExtension, apiExtension;
|
|
363
|
+
return _regeneratorRuntime().wrap(function _callee6$(_context6) {
|
|
364
|
+
while (1) {
|
|
365
|
+
switch (_context6.prev = _context6.next) {
|
|
366
|
+
case 0:
|
|
367
|
+
workDir = this.workDir, runner = this.runner;
|
|
368
|
+
_ref4 = options || {}, onlyApi = _ref4.onlyApi, onlyWeb = _ref4.onlyWeb; // server hook, gather plugin inject
|
|
369
|
+
_createMiddlewareColl = createMiddlewareCollecter(), getMiddlewares = _createMiddlewareColl.getMiddlewares, collector = _objectWithoutProperties(_createMiddlewareColl, _excluded);
|
|
370
|
+
_context6.next = 5;
|
|
371
|
+
return runner.gather(collector);
|
|
372
|
+
case 5:
|
|
373
|
+
_getMiddlewares = getMiddlewares(), pluginAPIExt = _getMiddlewares.api, pluginWebExt = _getMiddlewares.web;
|
|
374
|
+
apiDir = path.join(workDir, API_DIR);
|
|
375
|
+
serverDir = path.join(workDir, SERVER_DIR); // get api or web server handler from server-framework plugin
|
|
376
|
+
_context6.next = 10;
|
|
377
|
+
return fs.pathExists(path.join(serverDir));
|
|
378
|
+
case 10:
|
|
379
|
+
_context6.t0 = _context6.sent;
|
|
380
|
+
if (!_context6.t0) {
|
|
381
|
+
_context6.next = 13;
|
|
382
|
+
break;
|
|
383
|
+
}
|
|
384
|
+
_context6.t0 = !onlyApi;
|
|
385
|
+
case 13:
|
|
386
|
+
if (!_context6.t0) {
|
|
387
|
+
_context6.next = 18;
|
|
388
|
+
break;
|
|
389
|
+
}
|
|
390
|
+
webExtension = mergeExtension(pluginWebExt);
|
|
391
|
+
_context6.next = 17;
|
|
392
|
+
return this.prepareWebHandler(webExtension);
|
|
393
|
+
case 17:
|
|
394
|
+
this.frameWebHandler = _context6.sent;
|
|
395
|
+
case 18:
|
|
396
|
+
if (!(fs.existsSync(apiDir) && !onlyWeb)) {
|
|
397
|
+
_context6.next = 23;
|
|
398
|
+
break;
|
|
399
|
+
}
|
|
400
|
+
apiExtension = mergeExtension(pluginAPIExt);
|
|
401
|
+
_context6.next = 22;
|
|
402
|
+
return this.prepareAPIHandler(apiExtension);
|
|
403
|
+
case 22:
|
|
404
|
+
this.frameAPIHandler = _context6.sent;
|
|
405
|
+
case 23:
|
|
406
|
+
case "end":
|
|
407
|
+
return _context6.stop();
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}, _callee6, this);
|
|
411
|
+
}));
|
|
412
|
+
function prepareFrameHandler(_x11) {
|
|
413
|
+
return _prepareFrameHandler.apply(this, arguments);
|
|
414
|
+
}
|
|
415
|
+
return prepareFrameHandler;
|
|
416
|
+
}()
|
|
417
|
+
}, {
|
|
418
|
+
key: "prepareWebHandler",
|
|
419
|
+
value: function () {
|
|
420
|
+
var _prepareWebHandler = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(extension) {
|
|
421
|
+
var workDir, runner, handler;
|
|
422
|
+
return _regeneratorRuntime().wrap(function _callee7$(_context7) {
|
|
423
|
+
while (1) {
|
|
424
|
+
switch (_context7.prev = _context7.next) {
|
|
425
|
+
case 0:
|
|
426
|
+
workDir = this.workDir, runner = this.runner;
|
|
427
|
+
_context7.next = 3;
|
|
428
|
+
return runner.prepareWebServer({
|
|
429
|
+
pwd: workDir,
|
|
430
|
+
config: extension
|
|
431
|
+
}, {
|
|
432
|
+
onLast: function onLast() {
|
|
433
|
+
return null;
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
case 3:
|
|
437
|
+
handler = _context7.sent;
|
|
438
|
+
return _context7.abrupt("return", handler);
|
|
439
|
+
case 5:
|
|
440
|
+
case "end":
|
|
441
|
+
return _context7.stop();
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}, _callee7, this);
|
|
445
|
+
}));
|
|
446
|
+
function prepareWebHandler(_x12) {
|
|
447
|
+
return _prepareWebHandler.apply(this, arguments);
|
|
448
|
+
}
|
|
449
|
+
return prepareWebHandler;
|
|
450
|
+
}()
|
|
451
|
+
}, {
|
|
452
|
+
key: "prepareAPIHandler",
|
|
453
|
+
value: function () {
|
|
454
|
+
var _prepareAPIHandler = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(extension) {
|
|
455
|
+
var workDir, runner, conf, _ref5, bff, prefix;
|
|
456
|
+
return _regeneratorRuntime().wrap(function _callee8$(_context8) {
|
|
457
|
+
while (1) {
|
|
458
|
+
switch (_context8.prev = _context8.next) {
|
|
459
|
+
case 0:
|
|
460
|
+
workDir = this.workDir, runner = this.runner, conf = this.conf;
|
|
461
|
+
_ref5 = conf, bff = _ref5.bff;
|
|
462
|
+
prefix = (bff === null || bff === void 0 ? void 0 : bff.prefix) || '/api';
|
|
463
|
+
return _context8.abrupt("return", runner.prepareApiServer({
|
|
464
|
+
pwd: workDir,
|
|
465
|
+
config: extension,
|
|
466
|
+
prefix: Array.isArray(prefix) ? prefix[0] : prefix
|
|
467
|
+
}, {
|
|
468
|
+
onLast: function onLast() {
|
|
469
|
+
return null;
|
|
470
|
+
}
|
|
471
|
+
}));
|
|
472
|
+
case 4:
|
|
473
|
+
case "end":
|
|
474
|
+
return _context8.stop();
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}, _callee8, this);
|
|
478
|
+
}));
|
|
479
|
+
function prepareAPIHandler(_x13) {
|
|
480
|
+
return _prepareAPIHandler.apply(this, arguments);
|
|
481
|
+
}
|
|
482
|
+
return prepareAPIHandler;
|
|
483
|
+
}()
|
|
484
|
+
}, {
|
|
485
|
+
key: "filterRoutes",
|
|
486
|
+
value: function filterRoutes(routes) {
|
|
487
|
+
return routes;
|
|
488
|
+
}
|
|
489
|
+
}, {
|
|
490
|
+
key: "setupBeforeProdMiddleware",
|
|
491
|
+
value: function () {
|
|
492
|
+
var _setupBeforeProdMiddleware = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
|
|
493
|
+
var _this3 = this;
|
|
494
|
+
var conf, runner, preMiddleware;
|
|
495
|
+
return _regeneratorRuntime().wrap(function _callee9$(_context9) {
|
|
496
|
+
while (1) {
|
|
497
|
+
switch (_context9.prev = _context9.next) {
|
|
498
|
+
case 0:
|
|
499
|
+
conf = this.conf, runner = this.runner;
|
|
500
|
+
_context9.next = 3;
|
|
501
|
+
return runner.beforeProdServer(conf);
|
|
502
|
+
case 3:
|
|
503
|
+
preMiddleware = _context9.sent;
|
|
504
|
+
preMiddleware.flat().forEach(function (mid) {
|
|
505
|
+
_this3.addHandler(mid);
|
|
506
|
+
});
|
|
507
|
+
case 5:
|
|
508
|
+
case "end":
|
|
509
|
+
return _context9.stop();
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}, _callee9, this);
|
|
513
|
+
}));
|
|
514
|
+
function setupBeforeProdMiddleware() {
|
|
515
|
+
return _setupBeforeProdMiddleware.apply(this, arguments);
|
|
516
|
+
}
|
|
517
|
+
return setupBeforeProdMiddleware;
|
|
518
|
+
}()
|
|
519
|
+
}, {
|
|
520
|
+
key: "handleAPI",
|
|
521
|
+
value: function () {
|
|
522
|
+
var _handleAPI = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10(context) {
|
|
523
|
+
var req, res;
|
|
524
|
+
return _regeneratorRuntime().wrap(function _callee10$(_context10) {
|
|
525
|
+
while (1) {
|
|
526
|
+
switch (_context10.prev = _context10.next) {
|
|
527
|
+
case 0:
|
|
528
|
+
req = context.req, res = context.res;
|
|
529
|
+
if (this.frameAPIHandler) {
|
|
530
|
+
_context10.next = 3;
|
|
531
|
+
break;
|
|
532
|
+
}
|
|
533
|
+
throw new Error('can not found api handler');
|
|
534
|
+
case 3:
|
|
535
|
+
_context10.next = 5;
|
|
536
|
+
return this.frameAPIHandler(req, res);
|
|
537
|
+
case 5:
|
|
538
|
+
case "end":
|
|
539
|
+
return _context10.stop();
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}, _callee10, this);
|
|
543
|
+
}));
|
|
544
|
+
function handleAPI(_x14) {
|
|
545
|
+
return _handleAPI.apply(this, arguments);
|
|
546
|
+
}
|
|
547
|
+
return handleAPI;
|
|
548
|
+
}()
|
|
549
|
+
}, {
|
|
550
|
+
key: "handleWeb",
|
|
551
|
+
value: function () {
|
|
552
|
+
var _handleWeb = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11(context, route) {
|
|
553
|
+
return _regeneratorRuntime().wrap(function _callee11$(_context11) {
|
|
554
|
+
while (1) {
|
|
555
|
+
switch (_context11.prev = _context11.next) {
|
|
556
|
+
case 0:
|
|
557
|
+
return _context11.abrupt("return", this.routeRenderHandler({
|
|
558
|
+
ctx: context,
|
|
559
|
+
route: route,
|
|
560
|
+
runner: this.runner
|
|
561
|
+
}));
|
|
562
|
+
case 1:
|
|
563
|
+
case "end":
|
|
564
|
+
return _context11.stop();
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}, _callee11, this);
|
|
568
|
+
}));
|
|
569
|
+
function handleWeb(_x15, _x16) {
|
|
570
|
+
return _handleWeb.apply(this, arguments);
|
|
571
|
+
}
|
|
572
|
+
return handleWeb;
|
|
573
|
+
}()
|
|
574
|
+
}, {
|
|
575
|
+
key: "proxy",
|
|
576
|
+
value: function () {
|
|
577
|
+
var _proxy = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12() {
|
|
578
|
+
return _regeneratorRuntime().wrap(function _callee12$(_context12) {
|
|
579
|
+
while (1) {
|
|
580
|
+
switch (_context12.prev = _context12.next) {
|
|
581
|
+
case 0:
|
|
582
|
+
return _context12.abrupt("return", null);
|
|
583
|
+
case 1:
|
|
584
|
+
case "end":
|
|
585
|
+
return _context12.stop();
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}, _callee12);
|
|
589
|
+
}));
|
|
590
|
+
function proxy() {
|
|
591
|
+
return _proxy.apply(this, arguments);
|
|
592
|
+
}
|
|
593
|
+
return proxy;
|
|
594
|
+
}() // warmup ssr function
|
|
595
|
+
}, {
|
|
596
|
+
key: "warmupSSRBundle",
|
|
597
|
+
value: function warmupSSRBundle() {
|
|
598
|
+
var distDir = this.distDir;
|
|
599
|
+
var bundles = this.router.getBundles();
|
|
600
|
+
bundles.forEach(function (bundle) {
|
|
601
|
+
var filepath = path.join(distDir, bundle);
|
|
602
|
+
// if error, just throw and let process die
|
|
603
|
+
require(filepath);
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
}, {
|
|
607
|
+
key: "createContext",
|
|
608
|
+
value: function createContext(req, res) {
|
|
609
|
+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
610
|
+
return _createContext(req, res, options);
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/* —————————————————————— private function —————————————————————— */
|
|
614
|
+
// handler route.json, include api / csr / ssr
|
|
615
|
+
}, {
|
|
616
|
+
key: "routeHandler",
|
|
617
|
+
value: function () {
|
|
618
|
+
var _routeHandler = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee13(context) {
|
|
619
|
+
var res, matched, route, afterMatchContext, _afterMatchContext$ro, current, url, status, _matched, middlewareContext, renderResult, contentStream, response, afterRenderContext;
|
|
620
|
+
return _regeneratorRuntime().wrap(function _callee13$(_context13) {
|
|
621
|
+
while (1) {
|
|
622
|
+
switch (_context13.prev = _context13.next) {
|
|
623
|
+
case 0:
|
|
624
|
+
res = context.res; // match routes in the route spec
|
|
625
|
+
matched = this.router.match(context.path);
|
|
626
|
+
if (matched) {
|
|
627
|
+
_context13.next = 5;
|
|
628
|
+
break;
|
|
629
|
+
}
|
|
630
|
+
this.render404(context);
|
|
631
|
+
return _context13.abrupt("return");
|
|
632
|
+
case 5:
|
|
633
|
+
// route is api service
|
|
634
|
+
route = matched.generate(context.url);
|
|
635
|
+
if (!route.isApi) {
|
|
636
|
+
_context13.next = 10;
|
|
637
|
+
break;
|
|
638
|
+
}
|
|
639
|
+
_context13.next = 9;
|
|
640
|
+
return this.handleAPI(context);
|
|
641
|
+
case 9:
|
|
642
|
+
return _context13.abrupt("return");
|
|
643
|
+
case 10:
|
|
644
|
+
afterMatchContext = createAfterMatchContext(context, route.entryName); // only full mode run server hook
|
|
645
|
+
if (!(this.runMode === RUN_MODE.FULL)) {
|
|
646
|
+
_context13.next = 14;
|
|
647
|
+
break;
|
|
648
|
+
}
|
|
649
|
+
_context13.next = 14;
|
|
650
|
+
return this.runner.afterMatch(afterMatchContext, {
|
|
651
|
+
onLast: noop
|
|
652
|
+
});
|
|
653
|
+
case 14:
|
|
654
|
+
if (!this.isSend(res)) {
|
|
655
|
+
_context13.next = 16;
|
|
656
|
+
break;
|
|
657
|
+
}
|
|
658
|
+
return _context13.abrupt("return");
|
|
659
|
+
case 16:
|
|
660
|
+
_afterMatchContext$ro = afterMatchContext.router, current = _afterMatchContext$ro.current, url = _afterMatchContext$ro.url, status = _afterMatchContext$ro.status; // redirect to another url
|
|
661
|
+
if (!url) {
|
|
662
|
+
_context13.next = 20;
|
|
663
|
+
break;
|
|
664
|
+
}
|
|
665
|
+
this.redirect(res, url, status);
|
|
666
|
+
return _context13.abrupt("return");
|
|
667
|
+
case 20:
|
|
668
|
+
if (!(route.entryName !== current)) {
|
|
669
|
+
_context13.next = 26;
|
|
670
|
+
break;
|
|
671
|
+
}
|
|
672
|
+
_matched = this.router.matchEntry(current);
|
|
673
|
+
if (_matched) {
|
|
674
|
+
_context13.next = 25;
|
|
675
|
+
break;
|
|
676
|
+
}
|
|
677
|
+
this.render404(context);
|
|
678
|
+
return _context13.abrupt("return");
|
|
679
|
+
case 25:
|
|
680
|
+
route = _matched.generate(context.url);
|
|
681
|
+
case 26:
|
|
682
|
+
context.setParams(route.params);
|
|
683
|
+
context.setServerData('router', {
|
|
684
|
+
baseUrl: route.urlPath,
|
|
685
|
+
params: route.params
|
|
686
|
+
});
|
|
687
|
+
if (!this.frameWebHandler) {
|
|
688
|
+
_context13.next = 34;
|
|
689
|
+
break;
|
|
690
|
+
}
|
|
691
|
+
res.locals = res.locals || {};
|
|
692
|
+
middlewareContext = createMiddlewareContext(context);
|
|
693
|
+
_context13.next = 33;
|
|
694
|
+
return this.frameWebHandler(middlewareContext);
|
|
695
|
+
case 33:
|
|
696
|
+
res.locals = _objectSpread(_objectSpread({}, res.locals), middlewareContext.response.locals);
|
|
697
|
+
case 34:
|
|
698
|
+
if (!this.isSend(res)) {
|
|
699
|
+
_context13.next = 36;
|
|
700
|
+
break;
|
|
701
|
+
}
|
|
702
|
+
return _context13.abrupt("return");
|
|
703
|
+
case 36:
|
|
704
|
+
if (route.responseHeaders) {
|
|
705
|
+
Object.keys(route.responseHeaders).forEach(function (key) {
|
|
706
|
+
var value = route.responseHeaders[key];
|
|
707
|
+
if (value) {
|
|
708
|
+
context.res.setHeader(key, value);
|
|
709
|
+
}
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
_context13.next = 39;
|
|
713
|
+
return this.handleWeb(context, route);
|
|
714
|
+
case 39:
|
|
715
|
+
renderResult = _context13.sent;
|
|
716
|
+
if (renderResult) {
|
|
717
|
+
_context13.next = 43;
|
|
718
|
+
break;
|
|
719
|
+
}
|
|
720
|
+
this.render404(context);
|
|
721
|
+
return _context13.abrupt("return");
|
|
722
|
+
case 43:
|
|
723
|
+
if (!renderResult.redirect) {
|
|
724
|
+
_context13.next = 46;
|
|
725
|
+
break;
|
|
726
|
+
}
|
|
727
|
+
this.redirect(res, renderResult.content, renderResult.statusCode);
|
|
728
|
+
return _context13.abrupt("return");
|
|
729
|
+
case 46:
|
|
730
|
+
if (!this.isSend(res)) {
|
|
731
|
+
_context13.next = 48;
|
|
732
|
+
break;
|
|
733
|
+
}
|
|
734
|
+
return _context13.abrupt("return");
|
|
735
|
+
case 48:
|
|
736
|
+
res.setHeader('content-type', renderResult.contentType);
|
|
737
|
+
contentStream = renderResult.contentStream;
|
|
738
|
+
if (!contentStream) {
|
|
739
|
+
_context13.next = 53;
|
|
740
|
+
break;
|
|
741
|
+
}
|
|
742
|
+
contentStream.pipe(templateInjectableStream({
|
|
743
|
+
prependHead: route.entryName ? "<script>window._SERVER_DATA=".concat(JSON.stringify(context.serverData), "</script>") : undefined
|
|
744
|
+
})).pipe(res);
|
|
745
|
+
return _context13.abrupt("return");
|
|
746
|
+
case 53:
|
|
747
|
+
response = renderResult.content;
|
|
748
|
+
if (!route.entryName) {
|
|
749
|
+
_context13.next = 63;
|
|
750
|
+
break;
|
|
751
|
+
}
|
|
752
|
+
afterRenderContext = createAfterRenderContext(context, response.toString()); // only full mode run server hook
|
|
753
|
+
// FIXME: how to run server hook in streaming
|
|
754
|
+
if (!(this.runMode === RUN_MODE.FULL)) {
|
|
755
|
+
_context13.next = 59;
|
|
756
|
+
break;
|
|
757
|
+
}
|
|
758
|
+
_context13.next = 59;
|
|
759
|
+
return this.runner.afterRender(afterRenderContext, {
|
|
760
|
+
onLast: noop
|
|
761
|
+
});
|
|
762
|
+
case 59:
|
|
763
|
+
if (!this.isSend(res)) {
|
|
764
|
+
_context13.next = 61;
|
|
765
|
+
break;
|
|
766
|
+
}
|
|
767
|
+
return _context13.abrupt("return");
|
|
768
|
+
case 61:
|
|
769
|
+
// It will inject _SERVER_DATA twice, when SSG mode.
|
|
770
|
+
// The first time was in ssg html created, the seoncd time was in prod-server start.
|
|
771
|
+
// but the second wound causes route error.
|
|
772
|
+
// To ensure that the second injection fails, the _SERVER_DATA inject at the front of head,
|
|
773
|
+
afterRenderContext.template.prependHead("<script>window._SERVER_DATA=".concat(JSON.stringify(context.serverData), "</script>"));
|
|
774
|
+
response = afterRenderContext.template.get();
|
|
775
|
+
case 63:
|
|
776
|
+
res.end(response);
|
|
777
|
+
case 64:
|
|
778
|
+
case "end":
|
|
779
|
+
return _context13.stop();
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
}, _callee13, this);
|
|
783
|
+
}));
|
|
784
|
+
function routeHandler(_x17) {
|
|
785
|
+
return _routeHandler.apply(this, arguments);
|
|
786
|
+
}
|
|
787
|
+
return routeHandler;
|
|
788
|
+
}()
|
|
789
|
+
}, {
|
|
790
|
+
key: "isSend",
|
|
791
|
+
value: function isSend(res) {
|
|
792
|
+
if (res.headersSent) {
|
|
793
|
+
return true;
|
|
794
|
+
}
|
|
795
|
+
if (res.getHeader('Location') && isRedirect(res.statusCode)) {
|
|
796
|
+
res.end();
|
|
797
|
+
return true;
|
|
798
|
+
}
|
|
799
|
+
return false;
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// compose handlers and create the final handler
|
|
803
|
+
}, {
|
|
804
|
+
key: "compose",
|
|
805
|
+
value: function compose() {
|
|
806
|
+
var _this4 = this;
|
|
807
|
+
var handlers = this.handlers;
|
|
808
|
+
if (!Array.isArray(handlers)) {
|
|
809
|
+
throw new TypeError('Middleware stack must be an array!');
|
|
810
|
+
}
|
|
811
|
+
var _iterator = _createForOfIteratorHelper(handlers),
|
|
812
|
+
_step;
|
|
813
|
+
try {
|
|
814
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
815
|
+
var fn = _step.value;
|
|
816
|
+
if (typeof fn !== 'function') {
|
|
817
|
+
throw new TypeError('Middleware must be composed of functions!');
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
} catch (err) {
|
|
821
|
+
_iterator.e(err);
|
|
822
|
+
} finally {
|
|
823
|
+
_iterator.f();
|
|
824
|
+
}
|
|
825
|
+
this._handler = function (context, next) {
|
|
826
|
+
var i = 0;
|
|
827
|
+
var dispatch = function dispatch(error) {
|
|
828
|
+
if (error) {
|
|
829
|
+
return _this4.onError(context, error);
|
|
830
|
+
}
|
|
831
|
+
var handler = handlers[i++];
|
|
832
|
+
if (!handler) {
|
|
833
|
+
return next();
|
|
834
|
+
}
|
|
835
|
+
return handler(context, dispatch)["catch"](onError);
|
|
836
|
+
};
|
|
837
|
+
var onError = function onError(err) {
|
|
838
|
+
_this4.onError(context, err);
|
|
839
|
+
};
|
|
840
|
+
return dispatch();
|
|
841
|
+
};
|
|
842
|
+
}
|
|
843
|
+
}, {
|
|
844
|
+
key: "requestHandler",
|
|
845
|
+
value: function requestHandler(req, res) {
|
|
846
|
+
var next = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {
|
|
847
|
+
// empty
|
|
848
|
+
};
|
|
849
|
+
res.statusCode = 200;
|
|
850
|
+
req.logger = this.logger;
|
|
851
|
+
req.metrics = this.metrics;
|
|
852
|
+
var context;
|
|
853
|
+
try {
|
|
854
|
+
context = this.createContext(req, res);
|
|
855
|
+
} catch (e) {
|
|
856
|
+
this.logger.error(e);
|
|
857
|
+
res.statusCode = 500;
|
|
858
|
+
res.setHeader('content-type', mime.contentType('html'));
|
|
859
|
+
return res.end(createErrorDocument(500, ERROR_PAGE_TEXT[500]));
|
|
860
|
+
}
|
|
861
|
+
try {
|
|
862
|
+
return this._handler(context, next);
|
|
863
|
+
} catch (err) {
|
|
864
|
+
return this.onError(context, err);
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
}, {
|
|
868
|
+
key: "redirect",
|
|
869
|
+
value: function redirect(res, url) {
|
|
870
|
+
var status = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 302;
|
|
871
|
+
res.setHeader('Location', url);
|
|
872
|
+
res.statusCode = status;
|
|
873
|
+
res.end();
|
|
874
|
+
}
|
|
875
|
+
}, {
|
|
876
|
+
key: "onError",
|
|
877
|
+
value: function onError(context, err) {
|
|
878
|
+
context.error(ERROR_DIGEST.EINTER, err);
|
|
879
|
+
this.renderErrorPage(context, 500);
|
|
880
|
+
}
|
|
881
|
+
}, {
|
|
882
|
+
key: "renderErrorPage",
|
|
883
|
+
value: function () {
|
|
884
|
+
var _renderErrorPage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee14(context, status) {
|
|
885
|
+
var res, statusPage, customErrorPage, matched, route, entryName, file, text;
|
|
886
|
+
return _regeneratorRuntime().wrap(function _callee14$(_context14) {
|
|
887
|
+
while (1) {
|
|
888
|
+
switch (_context14.prev = _context14.next) {
|
|
889
|
+
case 0:
|
|
890
|
+
res = context.res;
|
|
891
|
+
context.status = status;
|
|
892
|
+
res.setHeader('content-type', mime.contentType('html'));
|
|
893
|
+
statusPage = "/".concat(status);
|
|
894
|
+
customErrorPage = "/_error";
|
|
895
|
+
matched = this.router.match(statusPage) || this.router.match(customErrorPage); // if no custom status page find
|
|
896
|
+
if (!matched) {
|
|
897
|
+
_context14.next = 21;
|
|
898
|
+
break;
|
|
899
|
+
}
|
|
900
|
+
route = matched.generate(context.url);
|
|
901
|
+
entryName = route.entryName; // check entryName, avoid matched '/' route
|
|
902
|
+
if (!(entryName === status.toString() || entryName === '_error')) {
|
|
903
|
+
_context14.next = 21;
|
|
904
|
+
break;
|
|
905
|
+
}
|
|
906
|
+
_context14.prev = 10;
|
|
907
|
+
_context14.next = 13;
|
|
908
|
+
return this.routeRenderHandler({
|
|
909
|
+
route: route,
|
|
910
|
+
ctx: context,
|
|
911
|
+
runner: this.runner
|
|
912
|
+
});
|
|
913
|
+
case 13:
|
|
914
|
+
file = _context14.sent;
|
|
915
|
+
if (!file) {
|
|
916
|
+
_context14.next = 17;
|
|
917
|
+
break;
|
|
918
|
+
}
|
|
919
|
+
context.res.end(file.content);
|
|
920
|
+
return _context14.abrupt("return");
|
|
921
|
+
case 17:
|
|
922
|
+
_context14.next = 21;
|
|
923
|
+
break;
|
|
924
|
+
case 19:
|
|
925
|
+
_context14.prev = 19;
|
|
926
|
+
_context14.t0 = _context14["catch"](10);
|
|
927
|
+
case 21:
|
|
928
|
+
text = ERROR_PAGE_TEXT[status] || ERROR_PAGE_TEXT[500];
|
|
929
|
+
context.res.end(createErrorDocument(status, text));
|
|
930
|
+
case 23:
|
|
931
|
+
case "end":
|
|
932
|
+
return _context14.stop();
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
}, _callee14, this, [[10, 19]]);
|
|
936
|
+
}));
|
|
937
|
+
function renderErrorPage(_x18, _x19) {
|
|
938
|
+
return _renderErrorPage.apply(this, arguments);
|
|
939
|
+
}
|
|
940
|
+
return renderErrorPage;
|
|
941
|
+
}()
|
|
942
|
+
}]);
|
|
943
|
+
return ModernServer;
|
|
944
|
+
}();
|
|
945
|
+
/* eslint-enable max-lines */
|