@modern-js/prod-server 2.5.1-alpha.3 → 2.6.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 (154) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/libs/context/context.js +13 -0
  3. package/dist/cjs/libs/hook-api/index.js +4 -0
  4. package/dist/cjs/libs/loadConfig.js +5 -0
  5. package/dist/cjs/libs/render/cache/__tests__/cache.fun.test.js +4 -0
  6. package/dist/cjs/libs/render/cache/page-caches/lru.js +4 -0
  7. package/dist/cjs/libs/render/cache/spr.js +5 -0
  8. package/dist/cjs/libs/render/cache/util.js +4 -0
  9. package/dist/cjs/libs/render/index.js +4 -0
  10. package/dist/cjs/libs/render/reader.js +9 -0
  11. package/dist/cjs/libs/render/ssr.js +16 -4
  12. package/dist/cjs/libs/render/static.js +4 -0
  13. package/dist/cjs/libs/route/index.js +4 -0
  14. package/dist/cjs/libs/route/matcher.js +4 -0
  15. package/dist/cjs/libs/serve-file.js +26 -19
  16. package/dist/cjs/server/index.js +32 -4
  17. package/dist/cjs/server/modern-server.js +19 -3
  18. package/dist/esm/libs/context/context.js +15 -6
  19. package/dist/esm/libs/render/cache/spr.js +1 -0
  20. package/dist/esm/libs/render/ssr.js +5 -5
  21. package/dist/esm/libs/route/index.js +4 -0
  22. package/dist/esm/libs/route/matcher.js +4 -0
  23. package/dist/esm/libs/serve-file.js +2 -1
  24. package/dist/esm/server/index.js +30 -7
  25. package/dist/esm/server/modern-server.js +17 -4
  26. package/dist/esm-node/libs/context/context.js +9 -0
  27. package/dist/esm-node/libs/loadConfig.js +1 -0
  28. package/dist/esm-node/libs/render/cache/spr.js +1 -0
  29. package/dist/esm-node/libs/render/reader.js +5 -0
  30. package/dist/esm-node/libs/render/ssr.js +12 -4
  31. package/dist/esm-node/libs/route/index.js +4 -0
  32. package/dist/esm-node/libs/route/matcher.js +4 -0
  33. package/dist/esm-node/libs/serve-file.js +22 -19
  34. package/dist/esm-node/server/index.js +28 -4
  35. package/dist/esm-node/server/modern-server.js +15 -3
  36. package/dist/types/libs/context/context.d.ts +1 -1
  37. package/dist/types/libs/render/ssr.d.ts +1 -0
  38. package/dist/types/type.d.ts +1 -8
  39. package/dist/types/utils.d.ts +1 -1
  40. package/package.json +9 -9
  41. package/dist/js/modern/constants.js +0 -35
  42. package/dist/js/modern/index.js +0 -18
  43. package/dist/js/modern/libs/context/context.js +0 -160
  44. package/dist/js/modern/libs/context/index.js +0 -6
  45. package/dist/js/modern/libs/hook-api/index.js +0 -134
  46. package/dist/js/modern/libs/hook-api/route.js +0 -20
  47. package/dist/js/modern/libs/hook-api/template.js +0 -73
  48. package/dist/js/modern/libs/loadConfig.js +0 -62
  49. package/dist/js/modern/libs/logger.js +0 -111
  50. package/dist/js/modern/libs/metrics.js +0 -11
  51. package/dist/js/modern/libs/proxy.js +0 -92
  52. package/dist/js/modern/libs/render/cache/__tests__/cache.fun.test.js +0 -114
  53. package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +0 -254
  54. package/dist/js/modern/libs/render/cache/__tests__/cacheable.js +0 -47
  55. package/dist/js/modern/libs/render/cache/__tests__/error-configuration.js +0 -37
  56. package/dist/js/modern/libs/render/cache/__tests__/matched-cache.js +0 -91
  57. package/dist/js/modern/libs/render/cache/index.js +0 -115
  58. package/dist/js/modern/libs/render/cache/page-caches/index.js +0 -32
  59. package/dist/js/modern/libs/render/cache/page-caches/lru.js +0 -29
  60. package/dist/js/modern/libs/render/cache/spr.js +0 -248
  61. package/dist/js/modern/libs/render/cache/type.js +0 -0
  62. package/dist/js/modern/libs/render/cache/util.js +0 -102
  63. package/dist/js/modern/libs/render/index.js +0 -86
  64. package/dist/js/modern/libs/render/measure.js +0 -68
  65. package/dist/js/modern/libs/render/reader.js +0 -107
  66. package/dist/js/modern/libs/render/ssr.js +0 -100
  67. package/dist/js/modern/libs/render/static.js +0 -60
  68. package/dist/js/modern/libs/render/type.js +0 -9
  69. package/dist/js/modern/libs/route/index.js +0 -54
  70. package/dist/js/modern/libs/route/matcher.js +0 -87
  71. package/dist/js/modern/libs/route/route.js +0 -16
  72. package/dist/js/modern/libs/serve-file.js +0 -67
  73. package/dist/js/modern/server/index.js +0 -208
  74. package/dist/js/modern/server/modern-server-split.js +0 -74
  75. package/dist/js/modern/server/modern-server.js +0 -554
  76. package/dist/js/modern/type.js +0 -0
  77. package/dist/js/modern/utils.js +0 -136
  78. package/dist/js/modern/worker-server.js +0 -89
  79. package/dist/js/node/constants.js +0 -62
  80. package/dist/js/node/index.js +0 -44
  81. package/dist/js/node/libs/context/context.js +0 -189
  82. package/dist/js/node/libs/context/index.js +0 -30
  83. package/dist/js/node/libs/hook-api/index.js +0 -164
  84. package/dist/js/node/libs/hook-api/route.js +0 -43
  85. package/dist/js/node/libs/hook-api/template.js +0 -97
  86. package/dist/js/node/libs/loadConfig.js +0 -91
  87. package/dist/js/node/libs/logger.js +0 -133
  88. package/dist/js/node/libs/metrics.js +0 -34
  89. package/dist/js/node/libs/proxy.js +0 -114
  90. package/dist/js/node/libs/render/cache/__tests__/cache.fun.test.js +0 -115
  91. package/dist/js/node/libs/render/cache/__tests__/cache.test.js +0 -245
  92. package/dist/js/node/libs/render/cache/__tests__/cacheable.js +0 -70
  93. package/dist/js/node/libs/render/cache/__tests__/error-configuration.js +0 -60
  94. package/dist/js/node/libs/render/cache/__tests__/matched-cache.js +0 -114
  95. package/dist/js/node/libs/render/cache/index.js +0 -134
  96. package/dist/js/node/libs/render/cache/page-caches/index.js +0 -55
  97. package/dist/js/node/libs/render/cache/page-caches/lru.js +0 -58
  98. package/dist/js/node/libs/render/cache/spr.js +0 -270
  99. package/dist/js/node/libs/render/cache/type.js +0 -15
  100. package/dist/js/node/libs/render/cache/util.js +0 -138
  101. package/dist/js/node/libs/render/index.js +0 -115
  102. package/dist/js/node/libs/render/measure.js +0 -90
  103. package/dist/js/node/libs/render/reader.js +0 -140
  104. package/dist/js/node/libs/render/ssr.js +0 -123
  105. package/dist/js/node/libs/render/static.js +0 -89
  106. package/dist/js/node/libs/render/type.js +0 -32
  107. package/dist/js/node/libs/route/index.js +0 -78
  108. package/dist/js/node/libs/route/matcher.js +0 -106
  109. package/dist/js/node/libs/route/route.js +0 -39
  110. package/dist/js/node/libs/serve-file.js +0 -97
  111. package/dist/js/node/server/index.js +0 -219
  112. package/dist/js/node/server/modern-server-split.js +0 -97
  113. package/dist/js/node/server/modern-server.js +0 -559
  114. package/dist/js/node/type.js +0 -15
  115. package/dist/js/node/utils.js +0 -166
  116. package/dist/js/node/worker-server.js +0 -113
  117. package/dist/js/treeshaking/constants.js +0 -29
  118. package/dist/js/treeshaking/index.js +0 -13
  119. package/dist/js/treeshaking/libs/context/context.js +0 -274
  120. package/dist/js/treeshaking/libs/context/index.js +0 -5
  121. package/dist/js/treeshaking/libs/hook-api/index.js +0 -281
  122. package/dist/js/treeshaking/libs/hook-api/route.js +0 -68
  123. package/dist/js/treeshaking/libs/hook-api/template.js +0 -127
  124. package/dist/js/treeshaking/libs/loadConfig.js +0 -82
  125. package/dist/js/treeshaking/libs/logger.js +0 -205
  126. package/dist/js/treeshaking/libs/metrics.js +0 -6
  127. package/dist/js/treeshaking/libs/proxy.js +0 -244
  128. package/dist/js/treeshaking/libs/render/cache/__tests__/cache.fun.test.js +0 -291
  129. package/dist/js/treeshaking/libs/render/cache/__tests__/cache.test.js +0 -781
  130. package/dist/js/treeshaking/libs/render/cache/__tests__/cacheable.js +0 -67
  131. package/dist/js/treeshaking/libs/render/cache/__tests__/error-configuration.js +0 -45
  132. package/dist/js/treeshaking/libs/render/cache/__tests__/matched-cache.js +0 -147
  133. package/dist/js/treeshaking/libs/render/cache/index.js +0 -346
  134. package/dist/js/treeshaking/libs/render/cache/page-caches/index.js +0 -154
  135. package/dist/js/treeshaking/libs/render/cache/page-caches/lru.js +0 -84
  136. package/dist/js/treeshaking/libs/render/cache/spr.js +0 -492
  137. package/dist/js/treeshaking/libs/render/cache/type.js +0 -1
  138. package/dist/js/treeshaking/libs/render/cache/util.js +0 -280
  139. package/dist/js/treeshaking/libs/render/index.js +0 -234
  140. package/dist/js/treeshaking/libs/render/measure.js +0 -146
  141. package/dist/js/treeshaking/libs/render/reader.js +0 -339
  142. package/dist/js/treeshaking/libs/render/ssr.js +0 -223
  143. package/dist/js/treeshaking/libs/render/static.js +0 -216
  144. package/dist/js/treeshaking/libs/render/type.js +0 -7
  145. package/dist/js/treeshaking/libs/route/index.js +0 -130
  146. package/dist/js/treeshaking/libs/route/matcher.js +0 -143
  147. package/dist/js/treeshaking/libs/route/route.js +0 -40
  148. package/dist/js/treeshaking/libs/serve-file.js +0 -184
  149. package/dist/js/treeshaking/server/index.js +0 -505
  150. package/dist/js/treeshaking/server/modern-server-split.js +0 -360
  151. package/dist/js/treeshaking/server/modern-server.js +0 -1089
  152. package/dist/js/treeshaking/type.js +0 -1
  153. package/dist/js/treeshaking/utils.js +0 -147
  154. package/dist/js/treeshaking/worker-server.js +0 -233
@@ -124,16 +124,15 @@ var __generator = this && this.__generator || function(thisArg, body) {
124
124
  };
125
125
  import path from "path";
126
126
  import { fs, LOADABLE_STATS_FILE, mime, ROUTE_MINIFEST_FILE, SERVER_RENDER_FUNCTION_NAME } from "@modern-js/utils";
127
- import cookie from "cookie";
128
127
  import cache from "./cache";
129
128
  import { createLogger, createMetrics } from "./measure";
130
129
  var render = function() {
131
130
  var _ref = _asyncToGenerator(function(ctx, renderOptions, runner) {
132
- var _ctx_res, urlPath, bundle, distDir, template, entryName, staticGenerate, bundleJS, loadableUri, loadableStats, routesManifestUri, routeManifest, context, serverRender, content, _context_redirection, url, _context_redirection_status, status;
131
+ var _ctx_res, urlPath, bundle, distDir, template, entryName, staticGenerate, _renderOptions_enableUnsafeCtx, enableUnsafeCtx, bundleJS, loadableUri, loadableStats, routesManifestUri, routeManifest, context, serverRender, content, _context_redirection, url, _context_redirection_status, status;
133
132
  return __generator(this, function(_state) {
134
133
  switch(_state.label){
135
134
  case 0:
136
- urlPath = renderOptions.urlPath, bundle = renderOptions.bundle, distDir = renderOptions.distDir, template = renderOptions.template, entryName = renderOptions.entryName, staticGenerate = renderOptions.staticGenerate;
135
+ urlPath = renderOptions.urlPath, bundle = renderOptions.bundle, distDir = renderOptions.distDir, template = renderOptions.template, entryName = renderOptions.entryName, staticGenerate = renderOptions.staticGenerate, _renderOptions_enableUnsafeCtx = renderOptions.enableUnsafeCtx, enableUnsafeCtx = _renderOptions_enableUnsafeCtx === void 0 ? false : _renderOptions_enableUnsafeCtx;
137
136
  bundleJS = path.join(distDir, bundle);
138
137
  loadableUri = path.join(distDir, LOADABLE_STATS_FILE);
139
138
  loadableStats = fs.existsSync(loadableUri) ? require(loadableUri) : "";
@@ -147,7 +146,6 @@ var render = function() {
147
146
  host: ctx.host,
148
147
  query: ctx.query,
149
148
  url: ctx.href,
150
- cookieMap: cookie.parse(ctx.headers.cookie || ""),
151
149
  headers: ctx.headers
152
150
  },
153
151
  response: {
@@ -163,12 +161,14 @@ var render = function() {
163
161
  template: template,
164
162
  loadableStats: loadableStats,
165
163
  routeManifest: routeManifest,
164
+ // for streaming ssr
166
165
  entryName: entryName,
167
166
  staticGenerate: staticGenerate,
168
167
  logger: void 0,
169
168
  metrics: void 0,
170
169
  req: ctx.req,
171
- res: ctx.res
170
+ res: ctx.res,
171
+ enableUnsafeCtx: enableUnsafeCtx
172
172
  };
173
173
  context.logger = createLogger(context, ctx.logger);
174
174
  context.metrics = createMetrics(context, ctx.metrics);
@@ -41,6 +41,7 @@ var RouteMatchManager = /*#__PURE__*/ function() {
41
41
  }
42
42
  _createClass(RouteMatchManager, [
43
43
  {
44
+ // get all routes matches pathname
44
45
  key: "filter",
45
46
  value: function filter(pathname) {
46
47
  return this.matchers.reduce(function(matches, matcher) {
@@ -52,6 +53,7 @@ var RouteMatchManager = /*#__PURE__*/ function() {
52
53
  }
53
54
  },
54
55
  {
56
+ // get best match from a set of matches
55
57
  key: "best",
56
58
  value: function best(pathname, matches) {
57
59
  var best;
@@ -87,6 +89,7 @@ var RouteMatchManager = /*#__PURE__*/ function() {
87
89
  }
88
90
  },
89
91
  {
92
+ // reset routes matcher
90
93
  key: "reset",
91
94
  value: function reset(specs) {
92
95
  this.specs = specs;
@@ -98,6 +101,7 @@ var RouteMatchManager = /*#__PURE__*/ function() {
98
101
  }
99
102
  },
100
103
  {
104
+ // get best match from all matcher in manager
101
105
  key: "match",
102
106
  value: function match(pathname) {
103
107
  var matches = this.filter(pathname);
@@ -61,6 +61,7 @@ var RouteMatcher = /*#__PURE__*/ function() {
61
61
  }
62
62
  _createClass(RouteMatcher, [
63
63
  {
64
+ // generate modern route object
64
65
  key: "generate",
65
66
  value: function generate(url) {
66
67
  var route = new ModernRoute(this.spec);
@@ -84,6 +85,7 @@ var RouteMatcher = /*#__PURE__*/ function() {
84
85
  }
85
86
  },
86
87
  {
88
+ // get match url length
87
89
  key: "matchLength",
88
90
  value: function matchLength(pathname) {
89
91
  if (!this.urlReg) {
@@ -96,6 +98,7 @@ var RouteMatcher = /*#__PURE__*/ function() {
96
98
  }
97
99
  },
98
100
  {
101
+ // if match url path
99
102
  key: "matchUrlPath",
100
103
  value: function matchUrlPath(requestUrl) {
101
104
  var urlWithoutSlash = requestUrl.endsWith("/") && requestUrl !== "/" ? requestUrl.slice(0, -1) : requestUrl;
@@ -121,6 +124,7 @@ var RouteMatcher = /*#__PURE__*/ function() {
121
124
  }
122
125
  },
123
126
  {
127
+ // compiler urlPath to regexp if necessary
124
128
  key: "setupUrlPath",
125
129
  value: function setupUrlPath() {
126
130
  var urlPath = this.spec.urlPath;
@@ -146,7 +146,8 @@ var faviconFallbackHandler = function(context, next) {
146
146
  var createStaticFileHandler = function(rules) {
147
147
  var output = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
148
148
  return function() {
149
- var _ref = _asyncToGenerator(function(context, next) {
149
+ var _ref = // eslint-disable-next-line consistent-return
150
+ _asyncToGenerator(function(context, next) {
150
151
  var requestUrl, req, res, _output_assetPrefix, assetPrefix, hitRule, resume;
151
152
  return __generator(this, function(_state) {
152
153
  requestUrl = context.url, req = context.req, res = context.res;
@@ -246,7 +246,20 @@ var Server = /*#__PURE__*/ function() {
246
246
  _createClass(Server, [
247
247
  {
248
248
  key: "init",
249
- value: function init() {
249
+ value: /**
250
+ * 初始化顺序
251
+ * - 读取 .env.{process.env.MODERN_ENV} 文件,加载环境变量
252
+ * - 获取 server runtime config
253
+ * - 设置 context
254
+ * - 创建 hooksRunner
255
+ * - 合并插件,内置插件和 serverConfig 中配置的插件
256
+ * - 执行 config hook
257
+ * - 获取最终的配置
258
+ * - 设置配置到 context
259
+ * - 初始化 server
260
+ * - 执行 prepare hook
261
+ * - 执行 server init
262
+ */ function init() {
250
263
  var _this = this;
251
264
  return _asyncToGenerator(function() {
252
265
  var options;
@@ -309,7 +322,11 @@ var Server = /*#__PURE__*/ function() {
309
322
  }
310
323
  },
311
324
  {
312
- key: "runConfigHook",
325
+ /**
326
+ * Execute config hooks
327
+ * @param runner
328
+ * @param options
329
+ */ key: "runConfigHook",
313
330
  value: function runConfigHook(runner, serverConfig) {
314
331
  var newServerConfig = runner.config(serverConfig || {});
315
332
  return newServerConfig;
@@ -340,7 +357,10 @@ var Server = /*#__PURE__*/ function() {
340
357
  },
341
358
  {
342
359
  key: "initConfig",
343
- value: function initConfig(runner, options) {
360
+ value: /**
361
+ *
362
+ * merge cliConfig and serverConfig
363
+ */ function initConfig(runner, options) {
344
364
  var _this = this;
345
365
  return _asyncToGenerator(function() {
346
366
  var pwd, config, serverConfig, finalServerConfig, resolvedConfigPath;
@@ -382,6 +402,11 @@ var Server = /*#__PURE__*/ function() {
382
402
  listener === null || listener === void 0 ? void 0 : listener();
383
403
  };
384
404
  if (typeof options === "object") {
405
+ if (process.env.PORT) {
406
+ Object.assign(options, {
407
+ port: process.env.PORT
408
+ });
409
+ }
385
410
  this.app.listen(options, callback);
386
411
  } else {
387
412
  this.app.listen(process.env.PORT || options || 8080, callback);
@@ -471,7 +496,7 @@ var Server = /*#__PURE__*/ function() {
471
496
  key: "initAppContext",
472
497
  value: function initAppContext() {
473
498
  var options = this.options;
474
- var appDirectory = options.pwd, _options_plugins = options.plugins, plugins = _options_plugins === void 0 ? [] : _options_plugins, config = options.config, appContext = options.appContext;
499
+ var appDirectory = options.pwd, _options_plugins = options.plugins, plugins = _options_plugins === void 0 ? [] : _options_plugins, config = options.config;
475
500
  var serverPlugins = plugins.map(function(p) {
476
501
  return {
477
502
  server: p
@@ -479,10 +504,8 @@ var Server = /*#__PURE__*/ function() {
479
504
  });
480
505
  return {
481
506
  appDirectory: appDirectory,
482
- apiDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.apiDirectory,
483
- lambdaDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.lambdaDirectory,
484
- sharedDirectory: (appContext === null || appContext === void 0 ? void 0 : appContext.sharedDirectory) || path.resolve(appDirectory, SHARED_DIR),
485
507
  distDirectory: path.join(appDirectory, config.output.path || "dist"),
508
+ sharedDirectory: path.resolve(appDirectory, SHARED_DIR),
486
509
  plugins: serverPlugins
487
510
  };
488
511
  }
@@ -216,8 +216,11 @@ var ModernServer = /*#__PURE__*/ function() {
216
216
  function ModernServer(param) {
217
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
218
  _classCallCheck(this, ModernServer);
219
+ // appDirectory
219
220
  _defineProperty(this, "pwd", void 0);
221
+ // product dist dir
220
222
  _defineProperty(this, "distDir", void 0);
223
+ // work on src or dist
221
224
  _defineProperty(this, "workDir", void 0);
222
225
  _defineProperty(this, "router", void 0);
223
226
  _defineProperty(this, "conf", void 0);
@@ -254,7 +257,8 @@ var ModernServer = /*#__PURE__*/ function() {
254
257
  _createClass(ModernServer, [
255
258
  {
256
259
  key: "onInit",
257
- value: function onInit(runner, app) {
260
+ value: // server prepare
261
+ function onInit(runner, app) {
258
262
  var _this = this;
259
263
  return _asyncToGenerator(function() {
260
264
  var _conf_bff, _this_conf_server, distDir, staticGenerate, conf, usageRoutes, staticPathRegExp, ssrConfig, forceCSR;
@@ -323,6 +327,7 @@ var ModernServer = /*#__PURE__*/ function() {
323
327
  }
324
328
  },
325
329
  {
330
+ // server ready
326
331
  key: "onRepack",
327
332
  value: function onRepack(_) {}
328
333
  },
@@ -382,6 +387,7 @@ var ModernServer = /*#__PURE__*/ function() {
382
387
  }
383
388
  },
384
389
  {
390
+ // exposed requestHandler
385
391
  key: "getRequestHandler",
386
392
  value: function getRequestHandler() {
387
393
  return this.requestHandler.bind(this);
@@ -442,6 +448,7 @@ var ModernServer = /*#__PURE__*/ function() {
442
448
  }
443
449
  },
444
450
  {
451
+ /* —————————————————————— function will be overwrite —————————————————————— */ // get routes info
445
452
  key: "getRoutes",
446
453
  value: function getRoutes() {
447
454
  if (this.presetRoutes) {
@@ -456,12 +463,15 @@ var ModernServer = /*#__PURE__*/ function() {
456
463
  }
457
464
  },
458
465
  {
466
+ // add promisify request handler to server
467
+ // handler should do not do more things after invoke next
459
468
  key: "addHandler",
460
469
  value: function addHandler(handler) {
461
470
  this.handlers.push(handler);
462
471
  }
463
472
  },
464
473
  {
474
+ // return 404 page
465
475
  key: "render404",
466
476
  value: function render404(context) {
467
477
  context.error(ERROR_DIGEST.ENOTF, "404 Not Found");
@@ -502,7 +512,8 @@ var ModernServer = /*#__PURE__*/ function() {
502
512
  },
503
513
  {
504
514
  key: "prepareFrameHandler",
505
- value: function prepareFrameHandler(options) {
515
+ value: // gather frame extension and get framework handler
516
+ function prepareFrameHandler(options) {
506
517
  var _this = this;
507
518
  return _asyncToGenerator(function() {
508
519
  var workDir, runner, _ref, onlyApi, onlyWeb, _createMiddlewareCollecter, getMiddlewares, collector, _getMiddlewares, pluginAPIExt, pluginWebExt, apiDir, serverDir, webExtension, apiExtension;
@@ -610,7 +621,6 @@ var ModernServer = /*#__PURE__*/ function() {
610
621
  pwd: workDir,
611
622
  config: extension,
612
623
  prefix: Array.isArray(prefix) ? prefix[0] : prefix,
613
- httpMethodDecider: bff === null || bff === void 0 ? void 0 : bff.httpMethodDecider,
614
624
  render: _this.render.bind(_this)
615
625
  }, {
616
626
  onLast: function() {
@@ -714,6 +724,7 @@ var ModernServer = /*#__PURE__*/ function() {
714
724
  }
715
725
  },
716
726
  {
727
+ // warmup ssr function
717
728
  key: "warmupSSRBundle",
718
729
  value: function warmupSSRBundle() {
719
730
  var distDir = this.distDir;
@@ -735,7 +746,8 @@ var ModernServer = /*#__PURE__*/ function() {
735
746
  },
736
747
  {
737
748
  key: "routeHandler",
738
- value: function routeHandler(context) {
749
+ value: /* —————————————————————— private function —————————————————————— */ // handler route.json, include api / csr / ssr
750
+ function routeHandler(context) {
739
751
  var _this = this;
740
752
  return _asyncToGenerator(function() {
741
753
  var res, matched, route, afterMatchContext, _afterMatchContext_router, current, url, status, matched2, middlewareContext, renderResult, contentStream, response, afterRenderContext;
@@ -920,6 +932,7 @@ var ModernServer = /*#__PURE__*/ function() {
920
932
  }
921
933
  },
922
934
  {
935
+ // compose handlers and create the final handler
923
936
  key: "compose",
924
937
  value: function compose() {
925
938
  var _this = this;
@@ -6,6 +6,9 @@ import fresh from "fresh";
6
6
  import { headersWithoutCookie } from "../../utils";
7
7
  class ModernServerContext {
8
8
  constructor(req, res, options) {
9
+ /**
10
+ * url params
11
+ */
9
12
  this.params = {};
10
13
  this.options = {};
11
14
  this.req = req;
@@ -28,6 +31,7 @@ class ModernServerContext {
28
31
  this.send(body);
29
32
  };
30
33
  }
34
+ // compat express res.send, only support etag now
31
35
  send(body) {
32
36
  try {
33
37
  const generateETag = !this.res.getHeader("ETag") && this.options.etag;
@@ -77,6 +81,7 @@ class ModernServerContext {
77
81
  }
78
82
  return false;
79
83
  }
84
+ /* request property */
80
85
  get headers() {
81
86
  return this.req.headers;
82
87
  }
@@ -137,12 +142,16 @@ class ModernServerContext {
137
142
  const str = this.querystring;
138
143
  return qs.parse(str);
139
144
  }
145
+ /* response property */
140
146
  get status() {
141
147
  return this.res.statusCode;
142
148
  }
143
149
  set status(statusCode) {
144
150
  this.res.statusCode = statusCode;
145
151
  }
152
+ /**
153
+ * 判断链接是否已经关闭
154
+ */
146
155
  resHasHandled() {
147
156
  return this.res.writableEnded;
148
157
  }
@@ -23,6 +23,7 @@ const loadConfig = ({
23
23
  {
24
24
  ...resolvedConfig,
25
25
  plugins: []
26
+ // filter cli plugins
26
27
  },
27
28
  serverConfig,
28
29
  cliConfig
@@ -54,6 +54,7 @@ class CacheManager {
54
54
  this.cacheOptions = cacheOptions;
55
55
  this.cache = new LRUCache({
56
56
  max: Math.min(MAX_SIZE_EACH_CLUSTER, 600) * 1024 * 1024,
57
+ // 默认存 100M,最大 600M
57
58
  length(n) {
58
59
  const len = n.caches.keys().reduce((total, cur) => {
59
60
  var _a;
@@ -12,11 +12,13 @@ const createCacheItem = async (filepath, mtime) => {
12
12
  };
13
13
  };
14
14
  class LruReader {
15
+ // private timer?: NodeJS.Timeout;
15
16
  constructor() {
16
17
  this.cache = new LRU({
17
18
  max: 256 * MB,
18
19
  length: getContentLength,
19
20
  maxAge: 5 * 60 * 5e3
21
+ // 60s
20
22
  });
21
23
  }
22
24
  init() {
@@ -61,6 +63,9 @@ class LruReader {
61
63
  }
62
64
  }
63
65
  }
66
+ // private timeTask() {
67
+ // this.timer = setInterval(() => this.update, 5 * 60 * 1000).unref();
68
+ // }
64
69
  }
65
70
  const reader = new LruReader();
66
71
  const readFile = async (filepath) => {
@@ -6,12 +6,19 @@ import {
6
6
  ROUTE_MINIFEST_FILE,
7
7
  SERVER_RENDER_FUNCTION_NAME
8
8
  } from "@modern-js/utils";
9
- import cookie from "cookie";
10
9
  import cache from "./cache";
11
10
  import { createLogger, createMetrics } from "./measure";
12
11
  const render = async (ctx, renderOptions, runner) => {
13
12
  var _a;
14
- const { urlPath, bundle, distDir, template, entryName, staticGenerate } = renderOptions;
13
+ const {
14
+ urlPath,
15
+ bundle,
16
+ distDir,
17
+ template,
18
+ entryName,
19
+ staticGenerate,
20
+ enableUnsafeCtx = false
21
+ } = renderOptions;
15
22
  const bundleJS = path.join(distDir, bundle);
16
23
  const loadableUri = path.join(distDir, LOADABLE_STATS_FILE);
17
24
  const loadableStats = fs.existsSync(loadableUri) ? require(loadableUri) : "";
@@ -25,7 +32,6 @@ const render = async (ctx, renderOptions, runner) => {
25
32
  host: ctx.host,
26
33
  query: ctx.query,
27
34
  url: ctx.href,
28
- cookieMap: cookie.parse(ctx.headers.cookie || ""),
29
35
  headers: ctx.headers
30
36
  },
31
37
  response: {
@@ -41,12 +47,14 @@ const render = async (ctx, renderOptions, runner) => {
41
47
  template,
42
48
  loadableStats,
43
49
  routeManifest,
50
+ // for streaming ssr
44
51
  entryName,
45
52
  staticGenerate,
46
53
  logger: void 0,
47
54
  metrics: void 0,
48
55
  req: ctx.req,
49
- res: ctx.res
56
+ res: ctx.res,
57
+ enableUnsafeCtx
50
58
  };
51
59
  context.logger = createLogger(context, ctx.logger);
52
60
  context.metrics = createMetrics(context, ctx.metrics);
@@ -4,6 +4,7 @@ class RouteMatchManager {
4
4
  this.specs = [];
5
5
  this.matchers = [];
6
6
  }
7
+ // get all routes matches pathname
7
8
  filter(pathname) {
8
9
  return this.matchers.reduce((matches, matcher) => {
9
10
  if (matcher.matchUrlPath(pathname)) {
@@ -12,6 +13,7 @@ class RouteMatchManager {
12
13
  return matches;
13
14
  }, []);
14
15
  }
16
+ // get best match from a set of matches
15
17
  best(pathname, matches) {
16
18
  let best;
17
19
  let matchedLen = 0;
@@ -27,6 +29,7 @@ class RouteMatchManager {
27
29
  }
28
30
  return best;
29
31
  }
32
+ // reset routes matcher
30
33
  reset(specs) {
31
34
  this.specs = specs;
32
35
  const matchers = specs.reduce((ms, spec) => {
@@ -35,6 +38,7 @@ class RouteMatchManager {
35
38
  }, []);
36
39
  this.matchers = matchers;
37
40
  }
41
+ // get best match from all matcher in manager
38
42
  match(pathname) {
39
43
  const matches = this.filter(pathname);
40
44
  const best = this.best(pathname, matches);
@@ -22,6 +22,7 @@ class RouteMatcher {
22
22
  this.spec = spec;
23
23
  this.setupUrlPath();
24
24
  }
25
+ // generate modern route object
25
26
  generate(url) {
26
27
  const route = new ModernRoute(this.spec);
27
28
  if (this.urlPath) {
@@ -39,6 +40,7 @@ class RouteMatcher {
39
40
  return matchResult.params;
40
41
  }
41
42
  }
43
+ // get match url length
42
44
  matchLength(pathname) {
43
45
  var _a;
44
46
  if (!this.urlReg) {
@@ -48,6 +50,7 @@ class RouteMatcher {
48
50
  return ((_a = result == null ? void 0 : result[0]) == null ? void 0 : _a.length) || null;
49
51
  }
50
52
  }
53
+ // if match url path
51
54
  matchUrlPath(requestUrl) {
52
55
  let urlWithoutSlash = requestUrl.endsWith("/") && requestUrl !== "/" ? requestUrl.slice(0, -1) : requestUrl;
53
56
  urlWithoutSlash = removeHtmlSuffix(urlWithoutSlash);
@@ -67,6 +70,7 @@ class RouteMatcher {
67
70
  matchEntry(entryName) {
68
71
  return this.spec.entryName === entryName;
69
72
  }
73
+ // compiler urlPath to regexp if necessary
70
74
  setupUrlPath() {
71
75
  const { urlPath } = this.spec;
72
76
  this.urlPath = urlPath === "/" ? urlPath : removeTailSlash(urlPath);
@@ -20,27 +20,30 @@ const faviconFallbackHandler = (context, next) => {
20
20
  next();
21
21
  }
22
22
  };
23
- const createStaticFileHandler = (rules, output = {}) => async (context, next) => {
24
- const { url: requestUrl, req, res } = context;
25
- const { assetPrefix = "/" } = output;
26
- const hitRule = rules.find((item) => {
27
- if (isString(item.path) && requestUrl.startsWith(item.path)) {
28
- return true;
29
- } else if (isRegExp(item.path) && item.path.test(requestUrl)) {
30
- return true;
31
- }
32
- return false;
33
- });
34
- if (hitRule) {
35
- const resume = removedPrefix(req, assetPrefix);
36
- serve(hitRule.target)(req, res, () => {
37
- resume();
38
- next();
23
+ const createStaticFileHandler = (rules, output = {}) => (
24
+ // eslint-disable-next-line consistent-return
25
+ async (context, next) => {
26
+ const { url: requestUrl, req, res } = context;
27
+ const { assetPrefix = "/" } = output;
28
+ const hitRule = rules.find((item) => {
29
+ if (isString(item.path) && requestUrl.startsWith(item.path)) {
30
+ return true;
31
+ } else if (isRegExp(item.path) && item.path.test(requestUrl)) {
32
+ return true;
33
+ }
34
+ return false;
39
35
  });
40
- } else {
41
- return next();
36
+ if (hitRule) {
37
+ const resume = removedPrefix(req, assetPrefix);
38
+ serve(hitRule.target)(req, res, () => {
39
+ resume();
40
+ next();
41
+ });
42
+ } else {
43
+ return next();
44
+ }
42
45
  }
43
- };
46
+ );
44
47
  export {
45
48
  createStaticFileHandler,
46
49
  faviconFallbackHandler
@@ -32,6 +32,20 @@ class Server {
32
32
  this.options = options;
33
33
  this.serverConfig = {};
34
34
  }
35
+ /**
36
+ * 初始化顺序
37
+ * - 读取 .env.{process.env.MODERN_ENV} 文件,加载环境变量
38
+ * - 获取 server runtime config
39
+ * - 设置 context
40
+ * - 创建 hooksRunner
41
+ * - 合并插件,内置插件和 serverConfig 中配置的插件
42
+ * - 执行 config hook
43
+ * - 获取最终的配置
44
+ * - 设置配置到 context
45
+ * - 初始化 server
46
+ * - 执行 prepare hook
47
+ * - 执行 server init
48
+ */
35
49
  async init() {
36
50
  const { options } = this;
37
51
  this.loadServerEnv(options);
@@ -46,6 +60,11 @@ class Server {
46
60
  await this.server.onInit(this.runner, this.app);
47
61
  return this;
48
62
  }
63
+ /**
64
+ * Execute config hooks
65
+ * @param runner
66
+ * @param options
67
+ */
49
68
  runConfigHook(runner, serverConfig) {
50
69
  const newServerConfig = runner.config(serverConfig || {});
51
70
  return newServerConfig;
@@ -63,6 +82,10 @@ class Server {
63
82
  const serverConfig = requireConfig(serverConfigPath);
64
83
  this.serverConfig = serverConfig;
65
84
  }
85
+ /**
86
+ *
87
+ * merge cliConfig and serverConfig
88
+ */
66
89
  async initConfig(runner, options) {
67
90
  const { pwd, config } = options;
68
91
  const { serverConfig } = this;
@@ -86,6 +109,9 @@ class Server {
86
109
  listener == null ? void 0 : listener();
87
110
  };
88
111
  if (typeof options === "object") {
112
+ if (process.env.PORT) {
113
+ Object.assign(options, { port: process.env.PORT });
114
+ }
89
115
  this.app.listen(options, callback);
90
116
  } else {
91
117
  this.app.listen(process.env.PORT || options || 8080, callback);
@@ -130,16 +156,14 @@ class Server {
130
156
  }
131
157
  initAppContext() {
132
158
  const { options } = this;
133
- const { pwd: appDirectory, plugins = [], config, appContext } = options;
159
+ const { pwd: appDirectory, plugins = [], config } = options;
134
160
  const serverPlugins = plugins.map((p) => ({
135
161
  server: p
136
162
  }));
137
163
  return {
138
164
  appDirectory,
139
- apiDirectory: appContext == null ? void 0 : appContext.apiDirectory,
140
- lambdaDirectory: appContext == null ? void 0 : appContext.lambdaDirectory,
141
- sharedDirectory: (appContext == null ? void 0 : appContext.sharedDirectory) || path.resolve(appDirectory, SHARED_DIR),
142
165
  distDirectory: path.join(appDirectory, config.output.path || "dist"),
166
+ sharedDirectory: path.resolve(appDirectory, SHARED_DIR),
143
167
  plugins: serverPlugins
144
168
  };
145
169
  }