@modern-js/prod-server 2.0.0-beta.3 → 2.0.0-beta.6

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