@modern-js/prod-server 2.48.6 → 2.49.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 (174) hide show
  1. package/README.md +20 -16
  2. package/dist/cjs/{libs/route/route.js → error.js} +16 -17
  3. package/dist/cjs/index.js +18 -24
  4. package/dist/cjs/init.js +71 -0
  5. package/dist/cjs/{type.js → types.js} +2 -2
  6. package/dist/esm/error.js +15 -0
  7. package/dist/esm/index.js +53 -19
  8. package/dist/esm/init.js +73 -0
  9. package/dist/esm-node/error.js +14 -0
  10. package/dist/esm-node/index.js +16 -17
  11. package/dist/esm-node/init.js +47 -0
  12. package/dist/types/error.d.ts +6 -0
  13. package/dist/types/index.d.ts +8 -11
  14. package/dist/types/init.d.ts +4 -0
  15. package/dist/types/types.d.ts +14 -0
  16. package/package.json +23 -64
  17. package/dist/cjs/constants.js +0 -72
  18. package/dist/cjs/libs/context/context.js +0 -236
  19. package/dist/cjs/libs/context/index.js +0 -31
  20. package/dist/cjs/libs/hook-api/afterRenderForStream.js +0 -34
  21. package/dist/cjs/libs/hook-api/base.js +0 -96
  22. package/dist/cjs/libs/hook-api/index.js +0 -85
  23. package/dist/cjs/libs/hook-api/index.worker.js +0 -116
  24. package/dist/cjs/libs/hook-api/route.js +0 -44
  25. package/dist/cjs/libs/hook-api/template.js +0 -72
  26. package/dist/cjs/libs/hook-api/templateForStream.js +0 -52
  27. package/dist/cjs/libs/loadConfig.js +0 -70
  28. package/dist/cjs/libs/metrics.js +0 -33
  29. package/dist/cjs/libs/preload/flushServerHeader.js +0 -49
  30. package/dist/cjs/libs/preload/index.js +0 -24
  31. package/dist/cjs/libs/preload/parseLinks.js +0 -124
  32. package/dist/cjs/libs/preload/shouldFlushServerHeader.js +0 -52
  33. package/dist/cjs/libs/preload/transformLinks2String.js +0 -150
  34. package/dist/cjs/libs/proxy.js +0 -99
  35. package/dist/cjs/libs/render/index.js +0 -109
  36. package/dist/cjs/libs/render/measure.js +0 -74
  37. package/dist/cjs/libs/render/ssr.js +0 -130
  38. package/dist/cjs/libs/render/ssrCache/cacheMod.js +0 -51
  39. package/dist/cjs/libs/render/ssrCache/index.js +0 -90
  40. package/dist/cjs/libs/render/ssrCache/manager.js +0 -120
  41. package/dist/cjs/libs/render/static.js +0 -72
  42. package/dist/cjs/libs/render/type.js +0 -33
  43. package/dist/cjs/libs/render/utils.js +0 -41
  44. package/dist/cjs/libs/reporter.js +0 -39
  45. package/dist/cjs/libs/route/index.js +0 -83
  46. package/dist/cjs/libs/route/matcher.js +0 -113
  47. package/dist/cjs/libs/serveFile.js +0 -84
  48. package/dist/cjs/libs/serverTiming.js +0 -41
  49. package/dist/cjs/renderHtml.js +0 -65
  50. package/dist/cjs/server/index.js +0 -223
  51. package/dist/cjs/server/modernServer.js +0 -522
  52. package/dist/cjs/server/modernServerSplit.js +0 -67
  53. package/dist/cjs/utils.js +0 -164
  54. package/dist/cjs/workerServer.js +0 -260
  55. package/dist/esm/constants.js +0 -43
  56. package/dist/esm/libs/context/context.js +0 -260
  57. package/dist/esm/libs/context/index.js +0 -8
  58. package/dist/esm/libs/hook-api/afterRenderForStream.js +0 -33
  59. package/dist/esm/libs/hook-api/base.js +0 -73
  60. package/dist/esm/libs/hook-api/index.js +0 -55
  61. package/dist/esm/libs/hook-api/index.worker.js +0 -99
  62. package/dist/esm/libs/hook-api/route.js +0 -26
  63. package/dist/esm/libs/hook-api/template.js +0 -56
  64. package/dist/esm/libs/hook-api/templateForStream.js +0 -35
  65. package/dist/esm/libs/loadConfig.js +0 -36
  66. package/dist/esm/libs/metrics.js +0 -9
  67. package/dist/esm/libs/preload/flushServerHeader.js +0 -50
  68. package/dist/esm/libs/preload/index.js +0 -2
  69. package/dist/esm/libs/preload/parseLinks.js +0 -172
  70. package/dist/esm/libs/preload/shouldFlushServerHeader.js +0 -27
  71. package/dist/esm/libs/preload/transformLinks2String.js +0 -140
  72. package/dist/esm/libs/proxy.js +0 -160
  73. package/dist/esm/libs/render/index.js +0 -175
  74. package/dist/esm/libs/render/measure.js +0 -69
  75. package/dist/esm/libs/render/ssr.js +0 -133
  76. package/dist/esm/libs/render/ssrCache/cacheMod.js +0 -25
  77. package/dist/esm/libs/render/ssrCache/index.js +0 -170
  78. package/dist/esm/libs/render/ssrCache/manager.js +0 -178
  79. package/dist/esm/libs/render/static.js +0 -100
  80. package/dist/esm/libs/render/type.js +0 -9
  81. package/dist/esm/libs/render/utils.js +0 -16
  82. package/dist/esm/libs/reporter.js +0 -15
  83. package/dist/esm/libs/route/index.js +0 -82
  84. package/dist/esm/libs/route/matcher.js +0 -92
  85. package/dist/esm/libs/route/route.js +0 -17
  86. package/dist/esm/libs/serveFile.js +0 -68
  87. package/dist/esm/libs/serverTiming.js +0 -22
  88. package/dist/esm/renderHtml.js +0 -133
  89. package/dist/esm/server/index.js +0 -350
  90. package/dist/esm/server/modernServer.js +0 -884
  91. package/dist/esm/server/modernServerSplit.js +0 -113
  92. package/dist/esm/utils.js +0 -103
  93. package/dist/esm/workerServer.js +0 -352
  94. package/dist/esm-node/constants.js +0 -43
  95. package/dist/esm-node/libs/context/context.js +0 -202
  96. package/dist/esm-node/libs/context/index.js +0 -6
  97. package/dist/esm-node/libs/hook-api/afterRenderForStream.js +0 -10
  98. package/dist/esm-node/libs/hook-api/base.js +0 -61
  99. package/dist/esm-node/libs/hook-api/index.js +0 -57
  100. package/dist/esm-node/libs/hook-api/index.worker.js +0 -89
  101. package/dist/esm-node/libs/hook-api/route.js +0 -20
  102. package/dist/esm-node/libs/hook-api/template.js +0 -47
  103. package/dist/esm-node/libs/hook-api/templateForStream.js +0 -28
  104. package/dist/esm-node/libs/loadConfig.js +0 -34
  105. package/dist/esm-node/libs/metrics.js +0 -9
  106. package/dist/esm-node/libs/preload/flushServerHeader.js +0 -25
  107. package/dist/esm-node/libs/preload/index.js +0 -2
  108. package/dist/esm-node/libs/preload/parseLinks.js +0 -90
  109. package/dist/esm-node/libs/preload/shouldFlushServerHeader.js +0 -27
  110. package/dist/esm-node/libs/preload/transformLinks2String.js +0 -126
  111. package/dist/esm-node/libs/proxy.js +0 -74
  112. package/dist/esm-node/libs/render/index.js +0 -75
  113. package/dist/esm-node/libs/render/measure.js +0 -49
  114. package/dist/esm-node/libs/render/ssr.js +0 -96
  115. package/dist/esm-node/libs/render/ssrCache/cacheMod.js +0 -17
  116. package/dist/esm-node/libs/render/ssrCache/index.js +0 -66
  117. package/dist/esm-node/libs/render/ssrCache/manager.js +0 -96
  118. package/dist/esm-node/libs/render/static.js +0 -38
  119. package/dist/esm-node/libs/render/type.js +0 -9
  120. package/dist/esm-node/libs/render/utils.js +0 -16
  121. package/dist/esm-node/libs/reporter.js +0 -15
  122. package/dist/esm-node/libs/route/index.js +0 -58
  123. package/dist/esm-node/libs/route/matcher.js +0 -89
  124. package/dist/esm-node/libs/route/route.js +0 -16
  125. package/dist/esm-node/libs/serveFile.js +0 -49
  126. package/dist/esm-node/libs/serverTiming.js +0 -17
  127. package/dist/esm-node/renderHtml.js +0 -73
  128. package/dist/esm-node/server/index.js +0 -189
  129. package/dist/esm-node/server/modernServer.js +0 -488
  130. package/dist/esm-node/server/modernServerSplit.js +0 -43
  131. package/dist/esm-node/utils.js +0 -132
  132. package/dist/esm-node/workerServer.js +0 -235
  133. package/dist/types/constants.d.ts +0 -30
  134. package/dist/types/libs/context/context.d.ts +0 -62
  135. package/dist/types/libs/context/index.d.ts +0 -7
  136. package/dist/types/libs/hook-api/afterRenderForStream.d.ts +0 -4
  137. package/dist/types/libs/hook-api/base.d.ts +0 -53
  138. package/dist/types/libs/hook-api/index.d.ts +0 -6
  139. package/dist/types/libs/hook-api/index.worker.d.ts +0 -19
  140. package/dist/types/libs/hook-api/route.d.ts +0 -9
  141. package/dist/types/libs/hook-api/template.d.ts +0 -22
  142. package/dist/types/libs/hook-api/templateForStream.d.ts +0 -8
  143. package/dist/types/libs/loadConfig.d.ts +0 -13
  144. package/dist/types/libs/metrics.d.ts +0 -3
  145. package/dist/types/libs/preload/flushServerHeader.d.ts +0 -14
  146. package/dist/types/libs/preload/index.d.ts +0 -2
  147. package/dist/types/libs/preload/parseLinks.d.ts +0 -13
  148. package/dist/types/libs/preload/shouldFlushServerHeader.d.ts +0 -3
  149. package/dist/types/libs/preload/transformLinks2String.d.ts +0 -3
  150. package/dist/types/libs/proxy.d.ts +0 -13
  151. package/dist/types/libs/render/index.d.ts +0 -21
  152. package/dist/types/libs/render/measure.d.ts +0 -10
  153. package/dist/types/libs/render/ssr.d.ts +0 -12
  154. package/dist/types/libs/render/ssrCache/cacheMod.d.ts +0 -8
  155. package/dist/types/libs/render/ssrCache/index.d.ts +0 -6
  156. package/dist/types/libs/render/ssrCache/manager.d.ts +0 -20
  157. package/dist/types/libs/render/static.d.ts +0 -3
  158. package/dist/types/libs/render/type.d.ts +0 -36
  159. package/dist/types/libs/render/utils.d.ts +0 -5
  160. package/dist/types/libs/reporter.d.ts +0 -2
  161. package/dist/types/libs/route/index.d.ts +0 -15
  162. package/dist/types/libs/route/matcher.d.ts +0 -15
  163. package/dist/types/libs/route/route.d.ts +0 -14
  164. package/dist/types/libs/serveFile.d.ts +0 -9
  165. package/dist/types/libs/serverTiming.d.ts +0 -13
  166. package/dist/types/renderHtml.d.ts +0 -23
  167. package/dist/types/server/index.d.ts +0 -55
  168. package/dist/types/server/modernServer.d.ts +0 -71
  169. package/dist/types/server/modernServerSplit.d.ts +0 -2
  170. package/dist/types/type.d.ts +0 -78
  171. package/dist/types/utils.d.ts +0 -24
  172. package/dist/types/workerServer.d.ts +0 -59
  173. /package/dist/esm/{type.js → types.js} +0 -0
  174. /package/dist/esm-node/{type.js → types.js} +0 -0
@@ -1,15 +0,0 @@
1
- const defaultReporter = {
2
- init() {
3
- },
4
- reportError() {
5
- },
6
- reportTiming() {
7
- },
8
- reportInfo() {
9
- },
10
- reportWarn() {
11
- }
12
- };
13
- export {
14
- defaultReporter
15
- };
@@ -1,58 +0,0 @@
1
- import { RouteMatcher } from "./matcher";
2
- class RouteMatchManager {
3
- // get all routes matches pathname
4
- filter(pathname) {
5
- return this.matchers.reduce((matches, matcher) => {
6
- if (matcher.matchUrlPath(pathname)) {
7
- matches.push(matcher);
8
- }
9
- return matches;
10
- }, []);
11
- }
12
- // get best match from a set of matches
13
- best(pathname, matches) {
14
- let best;
15
- let matchedLen = 0;
16
- for (const match of matches) {
17
- const len = match.matchLength(pathname);
18
- if (len === null) {
19
- continue;
20
- }
21
- if (len > matchedLen) {
22
- best = match;
23
- matchedLen = len;
24
- }
25
- }
26
- return best;
27
- }
28
- // reset routes matcher
29
- reset(specs) {
30
- this.specs = specs;
31
- const matchers = specs.reduce((ms, spec) => {
32
- ms.push(new RouteMatcher(spec));
33
- return ms;
34
- }, []);
35
- this.matchers = matchers;
36
- }
37
- // get best match from all matcher in manager
38
- match(pathname) {
39
- const matches = this.filter(pathname);
40
- const best = this.best(pathname, matches);
41
- return best;
42
- }
43
- matchEntry(entryname) {
44
- return this.matchers.find((matcher) => matcher.matchEntry(entryname));
45
- }
46
- getBundles() {
47
- const bundles = this.specs.filter((route) => route.isSSR).map((route) => route.bundle);
48
- return bundles;
49
- }
50
- constructor() {
51
- this.specs = [];
52
- this.matchers = [];
53
- }
54
- }
55
- export {
56
- RouteMatchManager,
57
- RouteMatcher
58
- };
@@ -1,89 +0,0 @@
1
- import { match, pathToRegexp, compile } from "path-to-regexp";
2
- import { ModernRoute } from "./route";
3
- const removeTailSlash = (s) => s.replace(/\/+$/, "");
4
- const removeHtmlSuffix = (url) => {
5
- if (url.endsWith(".html")) {
6
- return url.slice(0, -5);
7
- }
8
- return url;
9
- };
10
- const toPath = (reg, params) => {
11
- const fn = compile(reg, {
12
- encode: encodeURIComponent
13
- });
14
- return fn(params);
15
- };
16
- const regCharsDetector = /[^a-zA-Z\-_0-9\/\.]/;
17
- class RouteMatcher {
18
- // generate modern route object
19
- generate(url) {
20
- const route = new ModernRoute(this.spec);
21
- if (this.urlPath) {
22
- const params = this.parseURLParams(url);
23
- route.urlPath = toPath(route.urlPath, params);
24
- route.params = params;
25
- }
26
- return route;
27
- }
28
- parseURLParams(pathname) {
29
- if (!this.urlMatcher) {
30
- return {};
31
- } else {
32
- const matchResult = this.urlMatcher(pathname);
33
- return matchResult.params;
34
- }
35
- }
36
- // get match url length
37
- matchLength(pathname) {
38
- if (!this.urlReg) {
39
- return this.urlPath.length;
40
- } else {
41
- var _result_;
42
- const result = this.urlReg.exec(pathname);
43
- return (result === null || result === void 0 ? void 0 : (_result_ = result[0]) === null || _result_ === void 0 ? void 0 : _result_.length) || null;
44
- }
45
- }
46
- // if match url path
47
- matchUrlPath(requestUrl) {
48
- let urlWithoutSlash = requestUrl.endsWith("/") && requestUrl !== "/" ? requestUrl.slice(0, -1) : requestUrl;
49
- urlWithoutSlash = removeHtmlSuffix(urlWithoutSlash);
50
- if (this.urlMatcher) {
51
- return Boolean(this.urlMatcher(urlWithoutSlash));
52
- } else {
53
- const urlPath = removeHtmlSuffix(this.urlPath);
54
- if (urlWithoutSlash.startsWith(urlPath)) {
55
- if (urlPath !== "/" && urlWithoutSlash.length > urlPath.length && !urlWithoutSlash.startsWith(`${urlPath}/`)) {
56
- return false;
57
- }
58
- return true;
59
- }
60
- return false;
61
- }
62
- }
63
- matchEntry(entryName) {
64
- return this.spec.entryName === entryName;
65
- }
66
- // compiler urlPath to regexp if necessary
67
- setupUrlPath() {
68
- const { urlPath } = this.spec;
69
- this.urlPath = urlPath === "/" ? urlPath : removeTailSlash(urlPath);
70
- const useReg = regCharsDetector.test(urlPath);
71
- if (useReg) {
72
- this.urlMatcher = match(urlPath, {
73
- end: false,
74
- decode: decodeURIComponent
75
- });
76
- this.urlReg = pathToRegexp(urlPath, [], {
77
- end: false
78
- });
79
- }
80
- }
81
- constructor(spec) {
82
- this.urlPath = "";
83
- this.spec = spec;
84
- this.setupUrlPath();
85
- }
86
- }
87
- export {
88
- RouteMatcher
89
- };
@@ -1,16 +0,0 @@
1
- class ModernRoute {
2
- constructor(routeSpec) {
3
- this.params = {};
4
- this.entryName = routeSpec.entryName || "";
5
- this.urlPath = routeSpec.urlPath;
6
- this.entryPath = routeSpec.entryPath || "";
7
- this.isSSR = routeSpec.isSSR || false;
8
- this.isSPA = routeSpec.isSPA || false;
9
- this.isApi = routeSpec.isApi || false;
10
- this.bundle = routeSpec.bundle || "";
11
- this.responseHeaders = routeSpec.responseHeaders;
12
- }
13
- }
14
- export {
15
- ModernRoute
16
- };
@@ -1,49 +0,0 @@
1
- import serve from "serve-static";
2
- import { isString, isRegExp } from "@modern-js/utils";
3
- const removedPrefix = (req, prefix) => {
4
- const useLocalPrefix = !prefix.includes(".");
5
- if (useLocalPrefix) {
6
- req.url = req.url.slice(prefix.length);
7
- return () => {
8
- req.url = prefix + req.url;
9
- };
10
- } else {
11
- return () => {
12
- };
13
- }
14
- };
15
- const faviconFallbackHandler = (context, next) => {
16
- if (context.url === "/favicon.ico") {
17
- context.res.statusCode = 204;
18
- context.res.end();
19
- } else {
20
- next();
21
- }
22
- };
23
- const createStaticFileHandler = (rules, assetPrefix = "/") => (
24
- // eslint-disable-next-line consistent-return
25
- async (context, next) => {
26
- const { url: requestUrl, req, res } = context;
27
- const hitRule = rules.find((item) => {
28
- if (isString(item.path) && requestUrl.startsWith(item.path)) {
29
- return true;
30
- } else if (isRegExp(item.path) && item.path.test(requestUrl)) {
31
- return true;
32
- }
33
- return false;
34
- });
35
- if (hitRule) {
36
- const resume = removedPrefix(req, assetPrefix);
37
- serve(hitRule.target)(req, res, () => {
38
- resume();
39
- next();
40
- });
41
- } else {
42
- return next();
43
- }
44
- }
45
- );
46
- export {
47
- createStaticFileHandler,
48
- faviconFallbackHandler
49
- };
@@ -1,17 +0,0 @@
1
- const SERVER_TIMING = "Server-Timing";
2
- class ServerTiming {
3
- addServeTiming(name, dur, desc) {
4
- const _name = `bd-${this.meta}-${name}`;
5
- const serverTiming = this.res.getHeader(SERVER_TIMING) || this.res.getHeader(SERVER_TIMING.toLocaleLowerCase());
6
- const value = `${_name};${desc ? `decs="${desc}";` : ""} dur=${dur}`;
7
- this.res.set(SERVER_TIMING, serverTiming ? `${serverTiming}, ${value}` : value);
8
- return this;
9
- }
10
- constructor(res, meta) {
11
- this.meta = meta;
12
- this.res = res;
13
- }
14
- }
15
- export {
16
- ServerTiming
17
- };
@@ -1,73 +0,0 @@
1
- var __getOwnPropNames = Object.getOwnPropertyNames;
2
- var __commonJS = (cb, mod) => function __require() {
3
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
4
- };
5
- import { OutgoingMessage } from "http";
6
- import { Readable } from "stream";
7
- import { Socket } from "net";
8
- import { Server } from "./server";
9
- import { isRedirect } from "./utils";
10
- var require_renderHtml = __commonJS({
11
- "src/renderHtml.ts"(exports, module) {
12
- class IncomingMessageLike extends Readable {
13
- constructor({ method, url, headers }) {
14
- super();
15
- this.socket = new Socket();
16
- this.headers = headers || {};
17
- this.headers.host = "localhost:8080";
18
- this.method = method || "get";
19
- this.url = url;
20
- }
21
- }
22
- class ServerResponseLike extends OutgoingMessage {
23
- end(chunk, _encoding, cb) {
24
- this.data.push(chunk.toString());
25
- cb && cb();
26
- this.emit("finish");
27
- return this;
28
- }
29
- constructor() {
30
- super();
31
- this.statusCode = 200;
32
- this.data = [];
33
- }
34
- }
35
- class CustomServer extends Server {
36
- async render(req, res, _url) {
37
- const handler = this.getRequestHandler();
38
- handler(req, res);
39
- return null;
40
- }
41
- }
42
- async function renderHtml({ url, method, headers, body, serverOptions }) {
43
- const req = new IncomingMessageLike({
44
- method,
45
- url,
46
- headers
47
- });
48
- if (body) {
49
- req.push(body);
50
- req.push(null);
51
- }
52
- const res = new ServerResponseLike();
53
- const customServer = new CustomServer(serverOptions);
54
- await customServer.init({
55
- disableHttpServer: true
56
- });
57
- customServer.render(req, res);
58
- return new Promise((resolve) => {
59
- res.addListener("finish", () => {
60
- resolve({
61
- headers: res.getHeaders(),
62
- redirected: isRedirect(res.statusCode),
63
- status: res.statusCode,
64
- url,
65
- body: res.data.join()
66
- });
67
- });
68
- });
69
- }
70
- module.exports = renderHtml;
71
- }
72
- });
73
- export default require_renderHtml();
@@ -1,189 +0,0 @@
1
- import path from "path";
2
- import { fs, createLogger, SHARED_DIR, OUTPUT_CONFIG_FILE, dotenv, dotenvExpand, INTERNAL_SERVER_PLUGINS, ensureAbsolutePath } from "@modern-js/utils";
3
- import { serverManager, AppContext, ConfigContext, loadPlugins } from "@modern-js/server-core";
4
- import { metrics as defaultMetrics } from "../libs/metrics";
5
- import { loadConfig, getServerConfigPath, requireConfig } from "../libs/loadConfig";
6
- import { debug } from "../utils";
7
- import { createProdServer } from "./modernServerSplit";
8
- class Server {
9
- /**
10
- * 初始化顺序
11
- * - 读取 .env.{process.env.MODERN_ENV} 文件,加载环境变量
12
- * - 获取 server runtime config
13
- * - 设置 context
14
- * - 创建 hooksRunner
15
- * - 合并插件,内置插件和 serverConfig 中配置的插件
16
- * - 执行 config hook
17
- * - 获取最终的配置
18
- * - 设置配置到 context
19
- * - 初始化 server
20
- * - 执行 prepare hook
21
- * - 执行 server init
22
- */
23
- async init({ disableHttpServer = false } = {
24
- disableHttpServer: false
25
- }) {
26
- const { options } = this;
27
- await this.loadServerEnv(options);
28
- this.initServerConfig(options);
29
- await this.injectContext(this.runner, options);
30
- this.runner = await this.createHookRunner();
31
- await this.initConfig(this.runner, options);
32
- await this.injectContext(this.runner, options);
33
- this.server = this.serverImpl(options);
34
- await this.runPrepareHook(this.runner);
35
- if (!disableHttpServer) {
36
- this.app = await this.server.createHTTPServer(this.getRequestHandler());
37
- }
38
- {
39
- const result = await this.runner.beforeServerInit({
40
- app: this.app,
41
- server: this.server
42
- });
43
- ({ app: this.app = this.app, server: this.server } = result);
44
- }
45
- await this.server.onInit(this.runner, this.app);
46
- {
47
- const result = await this.runner.afterServerInit({
48
- app: this.app,
49
- server: this.server
50
- });
51
- ({ app: this.app = this.app, server: this.server } = result);
52
- }
53
- return this;
54
- }
55
- /**
56
- * Execute config hooks
57
- * @param runner
58
- * @param options
59
- */
60
- runConfigHook(runner, serverConfig) {
61
- const newServerConfig = runner.config(serverConfig || {});
62
- return newServerConfig;
63
- }
64
- async runPrepareHook(runner) {
65
- runner.prepare();
66
- }
67
- initServerConfig(options) {
68
- const { pwd, serverConfigFile } = options;
69
- const distDirectory = path.join(pwd, options.config.output.path || "dist");
70
- const serverConfigPath = getServerConfigPath(distDirectory, serverConfigFile);
71
- const serverConfig = requireConfig(serverConfigPath);
72
- this.serverConfig = serverConfig;
73
- }
74
- /**
75
- *
76
- * merge cliConfig and serverConfig
77
- */
78
- async initConfig(runner, options) {
79
- const { pwd, config } = options;
80
- const { serverConfig } = this;
81
- const finalServerConfig = this.runConfigHook(runner, serverConfig);
82
- const resolvedConfigPath = ensureAbsolutePath(pwd, path.join(config.output.path || "dist", OUTPUT_CONFIG_FILE));
83
- options.config = loadConfig({
84
- cliConfig: config,
85
- serverConfig: finalServerConfig,
86
- resolvedConfigPath
87
- });
88
- }
89
- async close() {
90
- var _this_server_close, _this_server;
91
- await ((_this_server_close = (_this_server = this.server).close) === null || _this_server_close === void 0 ? void 0 : _this_server_close.call(_this_server));
92
- this.app.close();
93
- }
94
- listen(options, listener) {
95
- const callback = () => {
96
- listener === null || listener === void 0 ? void 0 : listener();
97
- };
98
- if (typeof options === "object") {
99
- if (process.env.PORT) {
100
- Object.assign(options, {
101
- port: process.env.PORT
102
- });
103
- }
104
- this.app.listen(options, callback);
105
- } else {
106
- this.app.listen(process.env.PORT || options || 8080, callback);
107
- }
108
- }
109
- getRequestHandler() {
110
- return (req, res, next) => {
111
- const requestHandler = this.server.getRequestHandler();
112
- return requestHandler(req, res, next);
113
- };
114
- }
115
- async render(req, res, url) {
116
- return this.server.render(req, res, url);
117
- }
118
- async createHookRunner() {
119
- serverManager.clear();
120
- const { options } = this;
121
- const { internalPlugins = INTERNAL_SERVER_PLUGINS, pwd, plugins = [] } = options;
122
- const serverPlugins = this.serverConfig.plugins || [];
123
- const loadedPlugins = loadPlugins(pwd, [
124
- ...serverPlugins,
125
- ...plugins
126
- ], {
127
- internalPlugins
128
- });
129
- debug("plugins", loadedPlugins);
130
- loadedPlugins.forEach((p) => {
131
- serverManager.usePlugin(p);
132
- });
133
- const hooksRunner = await serverManager.init();
134
- return hooksRunner;
135
- }
136
- async injectContext(runner, options) {
137
- const appContext = this.initAppContext();
138
- const { config, pwd } = options;
139
- ConfigContext.set(config);
140
- AppContext.set({
141
- ...appContext,
142
- distDirectory: path.join(pwd, config.output.path || "dist")
143
- });
144
- }
145
- initAppContext() {
146
- const { options } = this;
147
- const { pwd: appDirectory, plugins = [], config, appContext } = options;
148
- const serverPlugins = plugins.map((p) => ({
149
- server: p
150
- }));
151
- return {
152
- appDirectory,
153
- apiDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.apiDirectory,
154
- lambdaDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.lambdaDirectory,
155
- sharedDirectory: (appContext === null || appContext === void 0 ? void 0 : appContext.sharedDirectory) || path.resolve(appDirectory, SHARED_DIR),
156
- distDirectory: path.join(appDirectory, config.output.path || "dist"),
157
- plugins: serverPlugins
158
- };
159
- }
160
- async loadServerEnv(options) {
161
- const { pwd: appDirectory } = options;
162
- const serverEnv = process.env.MODERN_ENV;
163
- const defaultEnvPath = path.resolve(appDirectory, `.env`);
164
- const serverEnvPath = path.resolve(appDirectory, `.env.${serverEnv}`);
165
- for (const envPath of [
166
- serverEnvPath,
167
- defaultEnvPath
168
- ]) {
169
- if (await fs.pathExists(envPath) && !(await fs.stat(envPath)).isDirectory()) {
170
- const envConfig = dotenv.config({
171
- path: envPath
172
- });
173
- dotenvExpand(envConfig);
174
- }
175
- }
176
- }
177
- constructor(options) {
178
- this.serverImpl = createProdServer;
179
- options.logger = options.logger || createLogger({
180
- level: "warn"
181
- });
182
- options.metrics = options.metrics || defaultMetrics;
183
- this.options = options;
184
- this.serverConfig = {};
185
- }
186
- }
187
- export {
188
- Server
189
- };