@modern-js/prod-server 2.6.0 → 2.6.1-alpha.0

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