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

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 +69 -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 +42 -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 +144 -145
  34. package/dist/js/modern/server/modern-server-split.js +46 -12
  35. package/dist/js/modern/server/modern-server.js +377 -417
  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 +45 -30
  40. package/dist/js/node/index.js +31 -57
  41. package/dist/js/node/libs/context/context.js +79 -94
  42. package/dist/js/node/libs/context/index.js +23 -13
  43. package/dist/js/node/libs/hook-api/index.js +69 -48
  44. package/dist/js/node/libs/hook-api/route.js +22 -11
  45. package/dist/js/node/libs/hook-api/template.js +36 -39
  46. package/dist/js/node/libs/loadConfig.js +69 -35
  47. package/dist/js/node/libs/metrics.js +21 -9
  48. package/dist/js/node/libs/proxy.js +86 -44
  49. package/dist/js/node/libs/render/cache/__tests__/cache.fun.test.js +132 -70
  50. package/dist/js/node/libs/render/cache/__tests__/cache.test.js +268 -218
  51. package/dist/js/node/libs/render/cache/__tests__/cacheable.js +61 -55
  52. package/dist/js/node/libs/render/cache/__tests__/error-configuration.js +54 -40
  53. package/dist/js/node/libs/render/cache/__tests__/matched-cache.js +101 -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 +50 -14
  56. package/dist/js/node/libs/render/cache/page-caches/lru.js +29 -12
  57. package/dist/js/node/libs/render/cache/spr.js +156 -129
  58. package/dist/js/node/libs/render/cache/type.js +0 -5
  59. package/dist/js/node/libs/render/cache/util.js +88 -45
  60. package/dist/js/node/libs/render/index.js +102 -67
  61. package/dist/js/node/libs/render/measure.js +55 -31
  62. package/dist/js/node/libs/render/reader.js +87 -70
  63. package/dist/js/node/libs/render/ssr.js +76 -47
  64. package/dist/js/node/libs/render/static.js +75 -40
  65. package/dist/js/node/libs/render/type.js +27 -12
  66. package/dist/js/node/libs/route/index.js +26 -26
  67. package/dist/js/node/libs/route/matcher.js +36 -41
  68. package/dist/js/node/libs/route/route.js +25 -22
  69. package/dist/js/node/libs/serve-file.js +61 -32
  70. package/dist/js/node/server/index.js +160 -160
  71. package/dist/js/node/server/modern-server-split.js +68 -22
  72. package/dist/js/node/server/modern-server.js +395 -441
  73. package/dist/js/node/type.js +0 -3
  74. package/dist/js/node/utils.js +74 -52
  75. package/dist/js/node/worker-server.js +53 -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 +265 -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 +468 -327
  108. package/dist/js/treeshaking/server/modern-server-split.js +352 -144
  109. package/dist/js/treeshaking/server/modern-server.js +1046 -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,1081 @@
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 util from "util";
201
+ import path from "path";
202
+ import { fs, mime, ROUTE_SPEC_FILE } from "@modern-js/utils";
15
203
  import { RouteMatchManager } from "../libs/route";
16
204
  import { createRenderHandler } from "../libs/render";
17
205
  import { createStaticFileHandler, faviconFallbackHandler } from "../libs/serve-file";
18
206
  import { createErrorDocument, createMiddlewareCollecter, getStaticReg, mergeExtension, noop, debug, isRedirect } from "../utils";
19
207
  import * as reader from "../libs/render/reader";
20
208
  import { createProxyHandler } from "../libs/proxy";
21
- import { createContext as _createContext } from "../libs/context";
209
+ import { createContext } from "../libs/context";
22
210
  import { templateInjectableStream } from "../libs/hook-api/template";
23
211
  import { AGGRED_DIR, ERROR_DIGEST, ERROR_PAGE_TEXT, RUN_MODE } from "../constants";
24
212
  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
132
- });
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
- }
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
- }
190
- }
191
- }, _callee2);
192
- }));
193
- return function (_x3, _x4) {
194
- return _ref2.apply(this, arguments);
195
- };
196
- }());
213
+ var API_DIR = "./api";
214
+ var SERVER_DIR = "./server";
215
+ var ModernServer = /*#__PURE__*/ function() {
216
+ "use strict";
217
+ function ModernServer(param) {
218
+ 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;
219
+ _classCallCheck(this, ModernServer);
220
+ _defineProperty(this, "pwd", void 0);
221
+ _defineProperty(this, "distDir", void 0);
222
+ _defineProperty(this, "workDir", void 0);
223
+ _defineProperty(this, "router", void 0);
224
+ _defineProperty(this, "conf", void 0);
225
+ _defineProperty(this, "handlers", []);
226
+ _defineProperty(this, "presetRoutes", void 0);
227
+ _defineProperty(this, "runner", void 0);
228
+ _defineProperty(this, "logger", void 0);
229
+ _defineProperty(this, "metrics", void 0);
230
+ _defineProperty(this, "runMode", void 0);
231
+ _defineProperty(this, "reader", reader);
232
+ _defineProperty(this, "proxyTarget", void 0);
233
+ _defineProperty(this, "staticFileHandler", void 0);
234
+ _defineProperty(this, "routeRenderHandler", void 0);
235
+ _defineProperty(this, "beforeRouteHandler", null);
236
+ _defineProperty(this, "frameWebHandler", null);
237
+ _defineProperty(this, "frameAPIHandler", null);
238
+ _defineProperty(this, "proxyHandler", null);
239
+ _defineProperty(this, "_handler", void 0);
240
+ _defineProperty(this, "staticGenerate", void 0);
241
+ require("ignore-styles");
242
+ this.pwd = pwd;
243
+ this.distDir = path.join(pwd, config.output.path || "dist");
244
+ this.workDir = this.distDir;
245
+ this.conf = config;
246
+ debug("server conf", this.conf);
247
+ this.logger = logger;
248
+ this.metrics = metrics;
249
+ this.router = new RouteMatchManager();
250
+ this.presetRoutes = routes;
251
+ this.proxyTarget = proxyTarget;
252
+ this.staticGenerate = staticGenerate || false;
253
+ this.runMode = runMode || RUN_MODE.FULL;
197
254
  }
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;
237
- }
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;
248
- }
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();
255
+ _createClass(ModernServer, [
256
+ {
257
+ key: "onInit",
258
+ value: function onInit(runner, app) {
259
+ var _this = this;
260
+ return _asyncToGenerator(function() {
261
+ var ref, distDir, staticGenerate, conf, usageRoutes, staticPathRegExp;
262
+ return __generator(this, function(_state) {
263
+ switch(_state.label){
264
+ case 0:
265
+ _this.runner = runner;
266
+ distDir = _this.distDir, staticGenerate = _this.staticGenerate, conf = _this.conf;
267
+ debug("final server conf", _this.conf);
268
+ _this.proxyHandler = createProxyHandler((ref = conf.bff) === null || ref === void 0 ? void 0 : ref.proxy);
269
+ if (_this.proxyHandler) {
270
+ _this.proxyHandler.forEach(function(handler) {
271
+ _this.addHandler(handler);
272
+ });
273
+ }
274
+ _this.reader.init();
275
+ app.on("close", function() {
276
+ _this.reader.close();
277
+ });
278
+ usageRoutes = _this.filterRoutes(_this.getRoutes());
279
+ _this.router.reset(usageRoutes);
280
+ _this.warmupSSRBundle();
281
+ return [
282
+ 4,
283
+ _this.prepareFrameHandler()
284
+ ];
285
+ case 1:
286
+ _state.sent();
287
+ return [
288
+ 4,
289
+ _this.prepareBeforeRouteHandler(usageRoutes, distDir)
290
+ ];
291
+ case 2:
292
+ _state.sent();
293
+ staticPathRegExp = getStaticReg(_this.conf.output || {}, _this.conf.html);
294
+ _this.staticFileHandler = createStaticFileHandler([
295
+ {
296
+ path: staticPathRegExp,
297
+ target: distDir
298
+ }
299
+ ], _this.conf.output);
300
+ _this.routeRenderHandler = createRenderHandler({
301
+ distDir: distDir,
302
+ staticGenerate: staticGenerate
303
+ });
304
+ return [
305
+ 4,
306
+ _this.setupBeforeProdMiddleware()
307
+ ];
308
+ case 3:
309
+ _state.sent();
310
+ _this.addHandler(_this.staticFileHandler);
311
+ _this.addHandler(faviconFallbackHandler);
312
+ _this.addBeforeRouteHandler();
313
+ _this.addHandler(_this.routeHandler.bind(_this));
314
+ _this.compose();
315
+ return [
316
+ 2
317
+ ];
318
+ }
319
+ });
320
+ })();
255
321
  }
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();
322
+ },
323
+ {
324
+ key: "onRepack",
325
+ value: function onRepack(_) {}
326
+ },
327
+ {
328
+ key: "addBeforeRouteHandler",
329
+ value: function addBeforeRouteHandler() {
330
+ var _this = this;
331
+ this.addHandler(function() {
332
+ var _ref = _asyncToGenerator(function(context, next) {
333
+ return __generator(this, function(_state) {
334
+ switch(_state.label){
335
+ case 0:
336
+ if (!_this.beforeRouteHandler) return [
337
+ 3,
338
+ 2
339
+ ];
340
+ return [
341
+ 4,
342
+ _this.beforeRouteHandler(context)
343
+ ];
344
+ case 1:
345
+ _state.sent();
346
+ if (_this.isSend(context.res)) {
347
+ return [
348
+ 2
349
+ ];
350
+ }
351
+ _state.label = 2;
352
+ case 2:
353
+ return [
354
+ 2,
355
+ next()
356
+ ];
357
+ }
358
+ });
359
+ });
360
+ return function(context, next) {
361
+ return _ref.apply(this, arguments);
362
+ };
363
+ }());
276
364
  }
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
- }
365
+ },
366
+ {
367
+ key: "onServerChange",
368
+ value: function onServerChange(param) {
369
+ var filepath = param.filepath;
370
+ var pwd = this.pwd;
371
+ var api = AGGRED_DIR.api, server = AGGRED_DIR.server;
372
+ var apiPath = path.normalize(path.join(pwd, api));
373
+ var serverPath = path.normalize(path.join(pwd, server));
374
+ var onlyApi = filepath.startsWith(apiPath);
375
+ var onlyWeb = filepath.startsWith(serverPath);
376
+ this.prepareFrameHandler({
377
+ onlyWeb: onlyWeb,
378
+ onlyApi: onlyApi
341
379
  });
342
- case 3:
343
- handler = _context5.sent;
344
- this.beforeRouteHandler = handler;
345
- case 5:
346
- case "end":
347
- return _context5.stop();
348
380
  }
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;
381
+ },
382
+ {
383
+ key: "getRequestHandler",
384
+ value: function getRequestHandler() {
385
+ return this.requestHandler.bind(this);
386
+ }
387
+ },
388
+ {
389
+ key: "render",
390
+ value: function render(req, res, url) {
391
+ var _this = this;
392
+ return _asyncToGenerator(function() {
393
+ var context, matched, route, result;
394
+ return __generator(this, function(_state) {
395
+ switch(_state.label){
396
+ case 0:
397
+ req.logger = _this.logger;
398
+ req.metrics = _this.metrics;
399
+ context = createContext(req, res);
400
+ matched = _this.router.match(url || context.path);
401
+ if (!matched) {
402
+ return [
403
+ 2,
404
+ null
405
+ ];
406
+ }
407
+ route = matched.generate(context.url);
408
+ return [
409
+ 4,
410
+ _this.handleWeb(context, route)
411
+ ];
412
+ case 1:
413
+ result = _state.sent();
414
+ if (!result) {
415
+ return [
416
+ 2,
417
+ null
418
+ ];
419
+ }
420
+ return [
421
+ 2,
422
+ result.content.toString()
423
+ ];
424
+ }
425
+ });
426
+ })();
427
+ }
428
+ },
429
+ {
430
+ key: "createHTTPServer",
431
+ value: function createHTTPServer(handler) {
432
+ return _asyncToGenerator(function() {
433
+ return __generator(this, function(_state) {
434
+ return [
435
+ 2,
436
+ createServer(handler)
437
+ ];
438
+ });
439
+ })();
440
+ }
441
+ },
442
+ {
443
+ key: "getRoutes",
444
+ value: function getRoutes() {
445
+ if (this.presetRoutes) {
446
+ return this.presetRoutes;
382
447
  }
383
- _context6.t0 = !onlyApi;
384
- case 13:
385
- if (!_context6.t0) {
386
- _context6.next = 18;
387
- break;
448
+ var file = path.join(this.distDir, ROUTE_SPEC_FILE);
449
+ if (fs.existsSync(file)) {
450
+ var content = fs.readJSONSync(file);
451
+ return content.routes;
388
452
  }
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;
453
+ return [];
454
+ }
455
+ },
456
+ {
457
+ key: "addHandler",
458
+ value: function addHandler(handler) {
459
+ if (handler[Symbol.toStringTag] === "AsyncFunction") {
460
+ this.handlers.push(handler);
461
+ } else {
462
+ this.handlers.push(util.promisify(handler));
398
463
  }
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();
407
464
  }
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();
465
+ },
466
+ {
467
+ key: "render404",
468
+ value: function render404(context) {
469
+ context.error(ERROR_DIGEST.ENOTF, "404 Not Found");
470
+ this.renderErrorPage(context, 404);
441
471
  }
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();
472
+ },
473
+ {
474
+ key: "prepareBeforeRouteHandler",
475
+ value: function prepareBeforeRouteHandler(specs, distDir) {
476
+ var _this = this;
477
+ return _asyncToGenerator(function() {
478
+ var runner, handler;
479
+ return __generator(this, function(_state) {
480
+ switch(_state.label){
481
+ case 0:
482
+ runner = _this.runner;
483
+ return [
484
+ 4,
485
+ runner.preparebeforeRouteHandler({
486
+ serverRoutes: specs,
487
+ distDir: distDir
488
+ }, {
489
+ onLast: function() {
490
+ return null;
491
+ }
492
+ })
493
+ ];
494
+ case 1:
495
+ handler = _state.sent();
496
+ _this.beforeRouteHandler = handler;
497
+ return [
498
+ 2
499
+ ];
500
+ }
501
+ });
502
+ })();
474
503
  }
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();
504
+ },
505
+ {
506
+ key: "prepareFrameHandler",
507
+ value: function prepareFrameHandler(options) {
508
+ var _this = this;
509
+ return _asyncToGenerator(function() {
510
+ var workDir, runner, ref, onlyApi, onlyWeb, _ref, getMiddlewares, collector, ref1, pluginAPIExt, pluginWebExt, apiDir, serverDir, webExtension, apiExtension;
511
+ return __generator(this, function(_state) {
512
+ switch(_state.label){
513
+ case 0:
514
+ workDir = _this.workDir, runner = _this.runner;
515
+ ref = options || {}, onlyApi = ref.onlyApi, onlyWeb = ref.onlyWeb;
516
+ _ref = createMiddlewareCollecter(), getMiddlewares = _ref.getMiddlewares, collector = _objectWithoutProperties(_ref, [
517
+ "getMiddlewares"
518
+ ]);
519
+ return [
520
+ 4,
521
+ runner.gather(collector)
522
+ ];
523
+ case 1:
524
+ _state.sent();
525
+ ref1 = getMiddlewares(), pluginAPIExt = ref1.api, pluginWebExt = ref1.web;
526
+ apiDir = path.join(workDir, API_DIR);
527
+ serverDir = path.join(workDir, SERVER_DIR);
528
+ return [
529
+ 4,
530
+ fs.pathExists(path.join(serverDir))
531
+ ];
532
+ case 2:
533
+ if (!(_state.sent() && !onlyApi)) return [
534
+ 3,
535
+ 4
536
+ ];
537
+ webExtension = mergeExtension(pluginWebExt);
538
+ return [
539
+ 4,
540
+ _this.prepareWebHandler(webExtension)
541
+ ];
542
+ case 3:
543
+ _this.frameWebHandler = _state.sent();
544
+ _state.label = 4;
545
+ case 4:
546
+ if (!(fs.existsSync(apiDir) && !onlyWeb)) return [
547
+ 3,
548
+ 6
549
+ ];
550
+ apiExtension = mergeExtension(pluginAPIExt);
551
+ return [
552
+ 4,
553
+ _this.prepareAPIHandler(apiExtension)
554
+ ];
555
+ case 5:
556
+ _this.frameAPIHandler = _state.sent();
557
+ _state.label = 6;
558
+ case 6:
559
+ return [
560
+ 2
561
+ ];
562
+ }
563
+ });
564
+ })();
509
565
  }
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();
566
+ },
567
+ {
568
+ key: "prepareWebHandler",
569
+ value: function prepareWebHandler(extension) {
570
+ var _this = this;
571
+ return _asyncToGenerator(function() {
572
+ var workDir, runner, handler;
573
+ return __generator(this, function(_state) {
574
+ switch(_state.label){
575
+ case 0:
576
+ workDir = _this.workDir, runner = _this.runner;
577
+ return [
578
+ 4,
579
+ runner.prepareWebServer({
580
+ pwd: workDir,
581
+ config: extension
582
+ }, {
583
+ onLast: function() {
584
+ return null;
585
+ }
586
+ })
587
+ ];
588
+ case 1:
589
+ handler = _state.sent();
590
+ return [
591
+ 2,
592
+ handler
593
+ ];
594
+ }
595
+ });
596
+ })();
539
597
  }
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();
598
+ },
599
+ {
600
+ key: "prepareAPIHandler",
601
+ value: function prepareAPIHandler(extension) {
602
+ var _this = this;
603
+ return _asyncToGenerator(function() {
604
+ var workDir, runner, conf, bff, prefix;
605
+ return __generator(this, function(_state) {
606
+ workDir = _this.workDir, runner = _this.runner, conf = _this.conf;
607
+ bff = conf.bff;
608
+ prefix = (bff === null || bff === void 0 ? void 0 : bff.prefix) || "/api";
609
+ return [
610
+ 2,
611
+ runner.prepareApiServer({
612
+ pwd: workDir,
613
+ config: extension,
614
+ prefix: Array.isArray(prefix) ? prefix[0] : prefix
615
+ }, {
616
+ onLast: function() {
617
+ return null;
618
+ }
619
+ })
620
+ ];
621
+ });
622
+ })();
564
623
  }
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();
624
+ },
625
+ {
626
+ key: "filterRoutes",
627
+ value: function filterRoutes(routes) {
628
+ return routes;
585
629
  }
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
630
+ },
631
+ {
632
+ key: "setupBeforeProdMiddleware",
633
+ value: function setupBeforeProdMiddleware() {
634
+ var _this = this;
635
+ return _asyncToGenerator(function() {
636
+ var conf, runner, preMiddleware;
637
+ return __generator(this, function(_state) {
638
+ switch(_state.label){
639
+ case 0:
640
+ conf = _this.conf, runner = _this.runner;
641
+ return [
642
+ 4,
643
+ runner.beforeProdServer(conf)
644
+ ];
645
+ case 1:
646
+ preMiddleware = _state.sent();
647
+ preMiddleware.flat().forEach(function(mid) {
648
+ _this.addHandler(mid);
649
+ });
650
+ return [
651
+ 2
652
+ ];
653
+ }
654
+ });
655
+ })();
656
+ }
657
+ },
658
+ {
659
+ key: "handleAPI",
660
+ value: function handleAPI(context) {
661
+ var _this = this;
662
+ return _asyncToGenerator(function() {
663
+ var req, res;
664
+ return __generator(this, function(_state) {
665
+ switch(_state.label){
666
+ case 0:
667
+ req = context.req, res = context.res;
668
+ if (!_this.frameAPIHandler) {
669
+ throw new Error("can not found api handler");
670
+ }
671
+ return [
672
+ 4,
673
+ _this.frameAPIHandler(req, res)
674
+ ];
675
+ case 1:
676
+ _state.sent();
677
+ return [
678
+ 2
679
+ ];
680
+ }
681
+ });
682
+ })();
683
+ }
684
+ },
685
+ {
686
+ key: "handleWeb",
687
+ value: function handleWeb(context, route) {
688
+ var _this = this;
689
+ return _asyncToGenerator(function() {
690
+ return __generator(this, function(_state) {
691
+ return [
692
+ 2,
693
+ _this.routeRenderHandler({
694
+ ctx: context,
695
+ route: route,
696
+ runner: _this.runner
697
+ })
698
+ ];
699
+ });
700
+ })();
701
+ }
702
+ },
703
+ {
704
+ key: "proxy",
705
+ value: function proxy() {
706
+ return _asyncToGenerator(function() {
707
+ return __generator(this, function(_state) {
708
+ return [
709
+ 2,
710
+ null
711
+ ];
712
+ });
713
+ })();
714
+ }
715
+ },
716
+ {
717
+ key: "warmupSSRBundle",
718
+ value: function warmupSSRBundle() {
719
+ var distDir = this.distDir;
720
+ var bundles = this.router.getBundles();
721
+ bundles.forEach(function(bundle) {
722
+ var filepath = path.join(distDir, bundle);
723
+ require(filepath);
651
724
  });
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;
725
+ }
726
+ },
727
+ {
728
+ key: "createContext",
729
+ value: function createContext1(req, res) {
730
+ var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
731
+ return createContext(req, res, options);
732
+ }
733
+ },
734
+ {
735
+ key: "routeHandler",
736
+ value: function routeHandler(context) {
737
+ var _this = this;
738
+ return _asyncToGenerator(function() {
739
+ var res, matched, route, afterMatchContext, _router, current, url, status, matched2, middlewareContext, renderResult, contentStream, response, afterRenderContext;
740
+ return __generator(this, function(_state) {
741
+ switch(_state.label){
742
+ case 0:
743
+ res = context.res;
744
+ matched = _this.router.match(context.path);
745
+ if (!matched) {
746
+ _this.render404(context);
747
+ return [
748
+ 2
749
+ ];
750
+ }
751
+ route = matched.generate(context.url);
752
+ if (!route.isApi) return [
753
+ 3,
754
+ 2
755
+ ];
756
+ return [
757
+ 4,
758
+ _this.handleAPI(context)
759
+ ];
760
+ case 1:
761
+ _state.sent();
762
+ return [
763
+ 2
764
+ ];
765
+ case 2:
766
+ afterMatchContext = createAfterMatchContext(context, route.entryName);
767
+ if (!(_this.runMode === RUN_MODE.FULL)) return [
768
+ 3,
769
+ 4
770
+ ];
771
+ return [
772
+ 4,
773
+ _this.runner.afterMatch(afterMatchContext, {
774
+ onLast: noop
775
+ })
776
+ ];
777
+ case 3:
778
+ _state.sent();
779
+ _state.label = 4;
780
+ case 4:
781
+ if (_this.isSend(res)) {
782
+ return [
783
+ 2
784
+ ];
785
+ }
786
+ _router = afterMatchContext.router, current = _router.current, url = _router.url, status = _router.status;
787
+ if (url) {
788
+ _this.redirect(res, url, status);
789
+ return [
790
+ 2
791
+ ];
792
+ }
793
+ if (route.entryName !== current) {
794
+ matched2 = _this.router.matchEntry(current);
795
+ if (!matched2) {
796
+ _this.render404(context);
797
+ return [
798
+ 2
799
+ ];
800
+ }
801
+ route = matched2.generate(context.url);
802
+ }
803
+ context.setParams(route.params);
804
+ context.setServerData("router", {
805
+ baseUrl: route.urlPath,
806
+ params: route.params
807
+ });
808
+ if (!_this.frameWebHandler) return [
809
+ 3,
810
+ 6
811
+ ];
812
+ res.locals = res.locals || {};
813
+ middlewareContext = createMiddlewareContext(context);
814
+ return [
815
+ 4,
816
+ _this.frameWebHandler(middlewareContext)
817
+ ];
818
+ case 5:
819
+ _state.sent();
820
+ res.locals = _objectSpread({}, res.locals, middlewareContext.response.locals);
821
+ _state.label = 6;
822
+ case 6:
823
+ if (_this.isSend(res)) {
824
+ return [
825
+ 2
826
+ ];
827
+ }
828
+ if (route.responseHeaders) {
829
+ Object.keys(route.responseHeaders).forEach(function(key) {
830
+ var value = route.responseHeaders[key];
831
+ if (value) {
832
+ context.res.setHeader(key, value);
833
+ }
834
+ });
835
+ }
836
+ return [
837
+ 4,
838
+ _this.handleWeb(context, route)
839
+ ];
840
+ case 7:
841
+ renderResult = _state.sent();
842
+ if (!renderResult) {
843
+ _this.render404(context);
844
+ return [
845
+ 2
846
+ ];
847
+ }
848
+ if (renderResult.redirect) {
849
+ _this.redirect(res, renderResult.content, renderResult.statusCode);
850
+ return [
851
+ 2
852
+ ];
853
+ }
854
+ if (_this.isSend(res)) {
855
+ return [
856
+ 2
857
+ ];
858
+ }
859
+ res.setHeader("content-type", renderResult.contentType);
860
+ contentStream = renderResult.contentStream;
861
+ if (contentStream) {
862
+ contentStream.pipe(templateInjectableStream({
863
+ prependHead: route.entryName ? "<script>window._SERVER_DATA=".concat(JSON.stringify(context.serverData), "</script>") : void 0
864
+ })).pipe(res);
865
+ return [
866
+ 2
867
+ ];
868
+ }
869
+ response = renderResult.content;
870
+ if (!route.entryName) return [
871
+ 3,
872
+ 10
873
+ ];
874
+ afterRenderContext = createAfterRenderContext(context, response.toString());
875
+ if (!(_this.runMode === RUN_MODE.FULL)) return [
876
+ 3,
877
+ 9
878
+ ];
879
+ return [
880
+ 4,
881
+ _this.runner.afterRender(afterRenderContext, {
882
+ onLast: noop
883
+ })
884
+ ];
885
+ case 8:
886
+ _state.sent();
887
+ _state.label = 9;
888
+ case 9:
889
+ if (_this.isSend(res)) {
890
+ return [
891
+ 2
892
+ ];
893
+ }
894
+ afterRenderContext.template.prependHead("<script>window._SERVER_DATA=".concat(JSON.stringify(context.serverData), "</script>"));
895
+ response = afterRenderContext.template.get();
896
+ _state.label = 10;
897
+ case 10:
898
+ res.end(response);
899
+ return [
900
+ 2
901
+ ];
902
+ }
903
+ });
904
+ })();
905
+ }
906
+ },
907
+ {
908
+ key: "isSend",
909
+ value: function isSend(res) {
910
+ if (res.headersSent) {
911
+ return true;
675
912
  }
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;
913
+ if (res.getHeader("Location") && isRedirect(res.statusCode)) {
914
+ res.end();
915
+ return true;
689
916
  }
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;
917
+ return false;
918
+ }
919
+ },
920
+ {
921
+ key: "compose",
922
+ value: function compose() {
923
+ var _this = this;
924
+ var handlers = this.handlers;
925
+ if (!Array.isArray(handlers)) {
926
+ throw new TypeError("Middleware stack must be an array!");
700
927
  }
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);
928
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
929
+ try {
930
+ for(var _iterator = handlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
931
+ var fn = _step.value;
932
+ if (typeof fn !== "function") {
933
+ throw new TypeError("Middleware must be composed of functions!");
934
+ }
935
+ }
936
+ } catch (err) {
937
+ _didIteratorError = true;
938
+ _iteratorError = err;
939
+ } finally{
940
+ try {
941
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
942
+ _iterator.return();
943
+ }
944
+ } finally{
945
+ if (_didIteratorError) {
946
+ throw _iteratorError;
947
+ }
708
948
  }
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
949
  }
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();
950
+ this._handler = function(context, next) {
951
+ var i = 0;
952
+ var dispatch = function(error) {
953
+ if (error) {
954
+ return _this.onError(context, error);
955
+ }
956
+ var handler = handlers[i++];
957
+ if (!handler) {
958
+ return next();
959
+ }
960
+ return handler(context, dispatch).catch(onError);
961
+ };
962
+ var onError = function(err) {
963
+ _this.onError(context, err);
964
+ };
965
+ return dispatch();
966
+ };
779
967
  }
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;
968
+ },
969
+ {
970
+ key: "requestHandler",
971
+ value: function requestHandler(req, res) {
972
+ var next = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : function() {};
973
+ res.statusCode = 200;
974
+ req.logger = this.logger;
975
+ req.metrics = this.metrics;
976
+ var context;
977
+ try {
978
+ context = this.createContext(req, res);
979
+ } catch (e) {
980
+ this.logger.error(e);
981
+ res.statusCode = 500;
982
+ res.setHeader("content-type", mime.contentType("html"));
983
+ return res.end(createErrorDocument(500, ERROR_PAGE_TEXT[500]));
898
984
  }
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;
985
+ try {
986
+ return this._handler(context, next);
987
+ } catch (err) {
988
+ return this.onError(context, err);
904
989
  }
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
990
  }
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;
991
+ },
992
+ {
993
+ key: "redirect",
994
+ value: function redirect(res, url) {
995
+ var status = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 302;
996
+ res.setHeader("Location", url);
997
+ res.statusCode = status;
998
+ res.end();
999
+ }
1000
+ },
1001
+ {
1002
+ key: "onError",
1003
+ value: function onError(context, err) {
1004
+ context.error(ERROR_DIGEST.EINTER, err);
1005
+ this.renderErrorPage(context, 500);
1006
+ }
1007
+ },
1008
+ {
1009
+ key: "renderErrorPage",
1010
+ value: function renderErrorPage(context, status) {
1011
+ var _this = this;
1012
+ return _asyncToGenerator(function() {
1013
+ var res, statusPage, customErrorPage, matched, route, entryName, file, e, text;
1014
+ return __generator(this, function(_state) {
1015
+ switch(_state.label){
1016
+ case 0:
1017
+ res = context.res;
1018
+ context.status = status;
1019
+ res.setHeader("content-type", mime.contentType("html"));
1020
+ statusPage = "/".concat(status);
1021
+ customErrorPage = "/_error";
1022
+ matched = _this.router.match(statusPage) || _this.router.match(customErrorPage);
1023
+ if (!matched) return [
1024
+ 3,
1025
+ 4
1026
+ ];
1027
+ route = matched.generate(context.url);
1028
+ entryName = route.entryName;
1029
+ if (!(entryName === status.toString() || entryName === "_error")) return [
1030
+ 3,
1031
+ 4
1032
+ ];
1033
+ _state.label = 1;
1034
+ case 1:
1035
+ _state.trys.push([
1036
+ 1,
1037
+ 3,
1038
+ ,
1039
+ 4
1040
+ ]);
1041
+ return [
1042
+ 4,
1043
+ _this.routeRenderHandler({
1044
+ route: route,
1045
+ ctx: context,
1046
+ runner: _this.runner
1047
+ })
1048
+ ];
1049
+ case 2:
1050
+ file = _state.sent();
1051
+ if (file) {
1052
+ context.res.end(file.content);
1053
+ return [
1054
+ 2
1055
+ ];
1056
+ }
1057
+ return [
1058
+ 3,
1059
+ 4
1060
+ ];
1061
+ case 3:
1062
+ e = _state.sent();
1063
+ return [
1064
+ 3,
1065
+ 4
1066
+ ];
1067
+ case 4:
1068
+ text = ERROR_PAGE_TEXT[status] || ERROR_PAGE_TEXT[500];
1069
+ context.res.end(createErrorDocument(status, text));
1070
+ return [
1071
+ 2
1072
+ ];
1073
+ }
1074
+ });
1075
+ })();
1076
+ }
1077
+ }
1078
+ ]);
1079
+ return ModernServer;
943
1080
  }();
944
- /* eslint-enable max-lines */
1081
+ export { ModernServer };