@modern-js/prod-server 2.35.0 → 2.36.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 (151) hide show
  1. package/dist/cjs/constants.js +33 -27
  2. package/dist/cjs/index.js +41 -33
  3. package/dist/cjs/libs/context/context.js +86 -36
  4. package/dist/cjs/libs/context/index.js +27 -17
  5. package/dist/cjs/libs/hook-api/base.js +49 -30
  6. package/dist/cjs/libs/hook-api/index.js +36 -28
  7. package/dist/cjs/libs/hook-api/index.worker.js +39 -31
  8. package/dist/cjs/libs/hook-api/route.js +28 -11
  9. package/dist/cjs/libs/hook-api/template.js +27 -17
  10. package/dist/cjs/libs/hook-api/templateForStream.js +31 -14
  11. package/dist/cjs/libs/loadConfig.js +46 -29
  12. package/dist/cjs/libs/metrics.js +24 -7
  13. package/dist/cjs/libs/preload/flushServerHeader.js +30 -13
  14. package/dist/cjs/libs/preload/index.js +22 -5
  15. package/dist/cjs/libs/preload/parseLinks.js +54 -30
  16. package/dist/cjs/libs/preload/shouldFlushServerHeader.js +25 -15
  17. package/dist/cjs/libs/preload/transformLinks2String.js +27 -11
  18. package/dist/cjs/libs/proxy.js +29 -19
  19. package/dist/cjs/libs/render/cache/__tests__/cache.fun.test.js +40 -22
  20. package/dist/cjs/libs/render/cache/__tests__/cache.test.js +33 -41
  21. package/dist/cjs/libs/render/cache/__tests__/cacheable.js +24 -7
  22. package/dist/cjs/libs/render/cache/__tests__/error-configuration.js +24 -7
  23. package/dist/cjs/libs/render/cache/__tests__/matched-cache.js +24 -7
  24. package/dist/cjs/libs/render/cache/index.js +30 -18
  25. package/dist/cjs/libs/render/cache/page-caches/index.js +26 -9
  26. package/dist/cjs/libs/render/cache/page-caches/lru.js +39 -13
  27. package/dist/cjs/libs/render/cache/spr.js +62 -44
  28. package/dist/cjs/libs/render/cache/type.js +15 -3
  29. package/dist/cjs/libs/render/cache/util.js +49 -36
  30. package/dist/cjs/libs/render/index.js +56 -30
  31. package/dist/cjs/libs/render/measure.js +27 -17
  32. package/dist/cjs/libs/render/reader.js +50 -35
  33. package/dist/cjs/libs/render/ssr.js +52 -26
  34. package/dist/cjs/libs/render/static.js +44 -18
  35. package/dist/cjs/libs/render/type.js +24 -7
  36. package/dist/cjs/libs/render/utils.js +29 -19
  37. package/dist/cjs/libs/reporter.js +24 -7
  38. package/dist/cjs/libs/route/index.js +30 -20
  39. package/dist/cjs/libs/route/matcher.js +37 -20
  40. package/dist/cjs/libs/route/route.js +34 -17
  41. package/dist/cjs/libs/serveFile.js +40 -21
  42. package/dist/cjs/libs/serverTiming.js +27 -10
  43. package/dist/cjs/renderHtml.js +17 -20
  44. package/dist/cjs/server/index.js +74 -50
  45. package/dist/cjs/server/modernServer.js +136 -113
  46. package/dist/cjs/server/modernServerSplit.js +29 -12
  47. package/dist/cjs/type.js +15 -3
  48. package/dist/cjs/utils.js +41 -38
  49. package/dist/cjs/workerServer.js +48 -39
  50. package/dist/esm/constants.js +14 -6
  51. package/dist/esm/index.js +11 -5
  52. package/dist/esm/libs/context/context.js +33 -6
  53. package/dist/esm/libs/context/index.js +5 -2
  54. package/dist/esm/libs/hook-api/base.js +6 -2
  55. package/dist/esm/libs/hook-api/index.js +11 -5
  56. package/dist/esm/libs/hook-api/index.worker.js +16 -10
  57. package/dist/esm/libs/hook-api/route.js +4 -1
  58. package/dist/esm/libs/hook-api/template.js +6 -2
  59. package/dist/esm/libs/hook-api/templateForStream.js +4 -1
  60. package/dist/esm/libs/loadConfig.js +8 -3
  61. package/dist/esm/libs/metrics.js +3 -1
  62. package/dist/esm/libs/preload/flushServerHeader.js +9 -6
  63. package/dist/esm/libs/preload/parseLinks.js +13 -11
  64. package/dist/esm/libs/preload/shouldFlushServerHeader.js +6 -2
  65. package/dist/esm/libs/preload/transformLinks2String.js +5 -3
  66. package/dist/esm/libs/proxy.js +9 -5
  67. package/dist/esm/libs/render/cache/__tests__/cache.test.js +12 -12
  68. package/dist/esm/libs/render/cache/__tests__/cacheable.js +4 -1
  69. package/dist/esm/libs/render/cache/__tests__/error-configuration.js +4 -1
  70. package/dist/esm/libs/render/cache/__tests__/matched-cache.js +4 -1
  71. package/dist/esm/libs/render/cache/index.js +6 -3
  72. package/dist/esm/libs/render/cache/page-caches/index.js +5 -2
  73. package/dist/esm/libs/render/cache/page-caches/lru.js +4 -1
  74. package/dist/esm/libs/render/cache/spr.js +13 -9
  75. package/dist/esm/libs/render/cache/type.js +0 -1
  76. package/dist/esm/libs/render/cache/util.js +18 -8
  77. package/dist/esm/libs/render/index.js +17 -11
  78. package/dist/esm/libs/render/measure.js +15 -11
  79. package/dist/esm/libs/render/reader.js +17 -10
  80. package/dist/esm/libs/render/ssr.js +11 -8
  81. package/dist/esm/libs/render/static.js +5 -2
  82. package/dist/esm/libs/render/type.js +4 -1
  83. package/dist/esm/libs/render/utils.js +6 -2
  84. package/dist/esm/libs/reporter.js +4 -1
  85. package/dist/esm/libs/route/index.js +5 -2
  86. package/dist/esm/libs/route/matcher.js +6 -3
  87. package/dist/esm/libs/route/route.js +4 -1
  88. package/dist/esm/libs/serveFile.js +6 -2
  89. package/dist/esm/libs/serverTiming.js +4 -1
  90. package/dist/esm/renderHtml.js +133 -124
  91. package/dist/esm/server/index.js +14 -13
  92. package/dist/esm/server/modernServer.js +39 -47
  93. package/dist/esm/server/modernServerSplit.js +4 -1
  94. package/dist/esm/type.js +0 -1
  95. package/dist/esm/utils.js +23 -12
  96. package/dist/esm/workerServer.js +25 -22
  97. package/dist/esm-node/constants.js +14 -6
  98. package/dist/esm-node/index.js +11 -5
  99. package/dist/esm-node/libs/context/context.js +33 -6
  100. package/dist/esm-node/libs/context/index.js +5 -2
  101. package/dist/esm-node/libs/hook-api/base.js +6 -2
  102. package/dist/esm-node/libs/hook-api/index.js +10 -4
  103. package/dist/esm-node/libs/hook-api/index.worker.js +10 -4
  104. package/dist/esm-node/libs/hook-api/route.js +4 -1
  105. package/dist/esm-node/libs/hook-api/template.js +6 -2
  106. package/dist/esm-node/libs/hook-api/templateForStream.js +4 -1
  107. package/dist/esm-node/libs/loadConfig.js +8 -3
  108. package/dist/esm-node/libs/metrics.js +3 -1
  109. package/dist/esm-node/libs/preload/flushServerHeader.js +6 -3
  110. package/dist/esm-node/libs/preload/parseLinks.js +11 -9
  111. package/dist/esm-node/libs/preload/shouldFlushServerHeader.js +6 -2
  112. package/dist/esm-node/libs/preload/transformLinks2String.js +5 -3
  113. package/dist/esm-node/libs/proxy.js +6 -2
  114. package/dist/esm-node/libs/render/cache/__tests__/cache.test.js +7 -12
  115. package/dist/esm-node/libs/render/cache/__tests__/cacheable.js +4 -1
  116. package/dist/esm-node/libs/render/cache/__tests__/error-configuration.js +4 -1
  117. package/dist/esm-node/libs/render/cache/__tests__/matched-cache.js +4 -1
  118. package/dist/esm-node/libs/render/cache/index.js +5 -3
  119. package/dist/esm-node/libs/render/cache/page-caches/index.js +4 -1
  120. package/dist/esm-node/libs/render/cache/page-caches/lru.js +4 -1
  121. package/dist/esm-node/libs/render/cache/spr.js +7 -4
  122. package/dist/esm-node/libs/render/cache/type.js +0 -1
  123. package/dist/esm-node/libs/render/cache/util.js +18 -8
  124. package/dist/esm-node/libs/render/index.js +7 -3
  125. package/dist/esm-node/libs/render/measure.js +6 -2
  126. package/dist/esm-node/libs/render/reader.js +13 -7
  127. package/dist/esm-node/libs/render/ssr.js +4 -1
  128. package/dist/esm-node/libs/render/static.js +4 -1
  129. package/dist/esm-node/libs/render/type.js +4 -1
  130. package/dist/esm-node/libs/render/utils.js +6 -2
  131. package/dist/esm-node/libs/reporter.js +4 -1
  132. package/dist/esm-node/libs/route/index.js +5 -2
  133. package/dist/esm-node/libs/route/matcher.js +6 -3
  134. package/dist/esm-node/libs/route/route.js +4 -1
  135. package/dist/esm-node/libs/serveFile.js +6 -2
  136. package/dist/esm-node/libs/serverTiming.js +4 -1
  137. package/dist/esm-node/renderHtml.js +72 -63
  138. package/dist/esm-node/server/index.js +11 -10
  139. package/dist/esm-node/server/modernServer.js +29 -28
  140. package/dist/esm-node/server/modernServerSplit.js +4 -1
  141. package/dist/esm-node/type.js +0 -1
  142. package/dist/esm-node/utils.js +20 -9
  143. package/dist/esm-node/workerServer.js +12 -9
  144. package/dist/types/libs/context/context.d.ts +2 -1
  145. package/dist/types/type.d.ts +1 -0
  146. package/dist/types/utils.d.ts +1 -1
  147. package/package.json +9 -8
  148. package/dist/cjs/libs/logger.js +0 -123
  149. package/dist/esm/libs/logger.js +0 -125
  150. package/dist/esm-node/libs/logger.js +0 -106
  151. package/dist/types/libs/logger.d.ts +0 -61
@@ -6,7 +6,8 @@ import { handleDirectory } from "./static";
6
6
  import { readFile } from "./reader";
7
7
  import * as ssr from "./ssr";
8
8
  import { injectServerData } from "./utils";
9
- export const createRenderHandler = ({ distDir, staticGenerate, conf, forceCSR, nonce, ssrRender, metaName = "modern-js" }) => async function render({ ctx, route, runner }) {
9
+ const calcFallback = (metaName) => `x-${cutNameByHyphen(metaName)}-ssr-fallback`;
10
+ const createRenderHandler = ({ distDir, staticGenerate, conf, forceCSR, nonce, ssrRender, metaName = "modern-js" }) => async function render({ ctx, route, runner }) {
10
11
  if (ctx.resHasHandled()) {
11
12
  return null;
12
13
  }
@@ -21,7 +22,7 @@ export const createRenderHandler = ({ distDir, staticGenerate, conf, forceCSR, n
21
22
  if (!content) {
22
23
  return null;
23
24
  }
24
- const useCSR = forceCSR && (ctx.query.csr || ctx.headers[`x-${cutNameByHyphen(metaName)}-ssr-fallback`]);
25
+ const useCSR = forceCSR && (ctx.query.csr || ctx.headers[calcFallback(metaName)]);
25
26
  if (route.isSSR && !useCSR) {
26
27
  try {
27
28
  const userAgent = ctx.getReqHeader("User-Agent");
@@ -59,7 +60,7 @@ export const createRenderHandler = ({ distDir, staticGenerate, conf, forceCSR, n
59
60
  return result;
60
61
  } catch (err) {
61
62
  ctx.error(ERROR_DIGEST.ERENDER, err.stack || err.message);
62
- ctx.res.set("x-modern-ssr-fallback", "1");
63
+ ctx.res.set(calcFallback(metaName), "1");
63
64
  }
64
65
  }
65
66
  return {
@@ -67,3 +68,6 @@ export const createRenderHandler = ({ distDir, staticGenerate, conf, forceCSR, n
67
68
  contentType: mime.contentType(path.extname(templatePath))
68
69
  };
69
70
  };
71
+ export {
72
+ createRenderHandler
73
+ };
@@ -1,5 +1,5 @@
1
1
  import { headersWithoutCookie } from "../../utils";
2
- export const createMetrics = (context, metrics) => {
2
+ const createMetrics = (context, metrics) => {
3
3
  const { entryName: entry, request } = context;
4
4
  const { pathname = "" } = request || {};
5
5
  const emitTimer = (name, cost, tags = {}) => {
@@ -21,7 +21,7 @@ export const createMetrics = (context, metrics) => {
21
21
  emitCounter
22
22
  };
23
23
  };
24
- export const createLogger = (serverContext, logger) => {
24
+ const createLogger = (serverContext, logger) => {
25
25
  const request = serverContext.request || {};
26
26
  const { headers = {}, pathname = "" } = request;
27
27
  const debug = (message, ...args) => {
@@ -43,3 +43,7 @@ export const createLogger = (serverContext, logger) => {
43
43
  debug
44
44
  };
45
45
  };
46
+ export {
47
+ createLogger,
48
+ createMetrics
49
+ };
@@ -11,7 +11,7 @@ const createCacheItem = async (content, mtime) => {
11
11
  mtime
12
12
  };
13
13
  };
14
- export class LruReader {
14
+ class LruReader {
15
15
  init(fs) {
16
16
  this.fs = fs || extraFS;
17
17
  }
@@ -71,17 +71,23 @@ export class LruReader {
71
71
  }
72
72
  }
73
73
  const reader = new LruReader();
74
- export const readFile = async (filepath) => {
75
- var _file;
74
+ const readFile = async (filepath) => {
76
75
  const file = await reader.read(filepath);
77
- return (_file = file) === null || _file === void 0 ? void 0 : _file.content;
76
+ return file === null || file === void 0 ? void 0 : file.content;
78
77
  };
79
- export const updateFile = () => {
78
+ const updateFile = () => {
80
79
  reader.update();
81
80
  };
82
- export const init = (fs) => {
81
+ const init = (fs) => {
83
82
  reader.init(fs);
84
83
  };
85
- export const close = () => {
84
+ const close = () => {
86
85
  reader.close();
87
86
  };
87
+ export {
88
+ LruReader,
89
+ close,
90
+ init,
91
+ readFile,
92
+ updateFile
93
+ };
@@ -3,7 +3,7 @@ import { fs, mime, LOADABLE_STATS_FILE, ROUTE_MANIFEST_FILE, SERVER_RENDER_FUNCT
3
3
  import cache from "./cache";
4
4
  import { createLogger, createMetrics } from "./measure";
5
5
  import { injectServerDataStream, injectServerData } from "./utils";
6
- export const render = async (ctx, renderOptions, runner) => {
6
+ const render = async (ctx, renderOptions, runner) => {
7
7
  var _ctx_res;
8
8
  const { urlPath, bundle, distDir, template, entryName, staticGenerate, enableUnsafeCtx = false, nonce } = renderOptions;
9
9
  const bundleJS = path.join(distDir, bundle);
@@ -73,3 +73,6 @@ export const render = async (ctx, renderOptions, runner) => {
73
73
  };
74
74
  }
75
75
  };
76
+ export {
77
+ render
78
+ };
@@ -1,7 +1,7 @@
1
1
  import path from "path";
2
2
  import { mime } from "@modern-js/utils";
3
3
  import { readFile } from "./reader";
4
- export async function handleDirectory(ctx, entryPath, urlPath) {
4
+ async function handleDirectory(ctx, entryPath, urlPath) {
5
5
  const { path: pathname } = ctx;
6
6
  const filepath = path.join(entryPath, trimLeft(pathname, urlPath));
7
7
  let content = await readFile(filepath);
@@ -33,3 +33,6 @@ const trimLeft = (str, prefix) => {
33
33
  }
34
34
  return str;
35
35
  };
36
+ export {
37
+ handleDirectory
38
+ };
@@ -1,6 +1,9 @@
1
- export var RenderLevel;
1
+ var RenderLevel;
2
2
  (function(RenderLevel2) {
3
3
  RenderLevel2[RenderLevel2["CLIENT_RENDER"] = 0] = "CLIENT_RENDER";
4
4
  RenderLevel2[RenderLevel2["SERVER_PREFETCH"] = 1] = "SERVER_PREFETCH";
5
5
  RenderLevel2[RenderLevel2["SERVER_RENDER"] = 2] = "SERVER_RENDER";
6
6
  })(RenderLevel || (RenderLevel = {}));
7
+ export {
8
+ RenderLevel
9
+ };
@@ -1,12 +1,16 @@
1
1
  import { TemplateAPI } from "../hook-api/template";
2
2
  import { templateInjectableStream } from "../hook-api/templateForStream";
3
- export const injectServerData = (content, context) => {
3
+ const injectServerData = (content, context) => {
4
4
  const template = new TemplateAPI(content);
5
5
  template.prependHead(`<script type="application/json" id="__MODERN_SERVER_DATA__">${JSON.stringify(context.serverData)}</script>`);
6
6
  return template.get();
7
7
  };
8
- export const injectServerDataStream = (content, context) => {
8
+ const injectServerDataStream = (content, context) => {
9
9
  return content.pipe(templateInjectableStream({
10
10
  prependHead: `<script type="application/json" id="__MODERN_SERVER_DATA__">${JSON.stringify(context.serverData)}</script>`
11
11
  }));
12
12
  };
13
+ export {
14
+ injectServerData,
15
+ injectServerDataStream
16
+ };
@@ -1,4 +1,4 @@
1
- export const defaultReporter = {
1
+ const defaultReporter = {
2
2
  init() {
3
3
  },
4
4
  reportError() {
@@ -10,3 +10,6 @@ export const defaultReporter = {
10
10
  reportWarn() {
11
11
  }
12
12
  };
13
+ export {
14
+ defaultReporter
15
+ };
@@ -1,6 +1,6 @@
1
1
  import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
2
  import { RouteMatcher } from "./matcher";
3
- export class RouteMatchManager {
3
+ class RouteMatchManager {
4
4
  // get all routes matches pathname
5
5
  filter(pathname) {
6
6
  return this.matchers.reduce((matches, matcher) => {
@@ -54,4 +54,7 @@ export class RouteMatchManager {
54
54
  this.matchers = [];
55
55
  }
56
56
  }
57
- export { RouteMatcher };
57
+ export {
58
+ RouteMatchManager,
59
+ RouteMatcher
60
+ };
@@ -15,7 +15,7 @@ const toPath = (reg, params) => {
15
15
  return fn(params);
16
16
  };
17
17
  const regCharsDetector = /[^a-zA-Z\-_0-9\/\.]/;
18
- export class RouteMatcher {
18
+ class RouteMatcher {
19
19
  // generate modern route object
20
20
  generate(url) {
21
21
  const route = new ModernRoute(this.spec);
@@ -39,9 +39,9 @@ export class RouteMatcher {
39
39
  if (!this.urlReg) {
40
40
  return this.urlPath.length;
41
41
  } else {
42
- var _result_, _result;
42
+ var _result_;
43
43
  const result = this.urlReg.exec(pathname);
44
- return ((_result = result) === null || _result === void 0 ? void 0 : (_result_ = _result[0]) === null || _result_ === void 0 ? void 0 : _result_.length) || null;
44
+ return (result === null || result === void 0 ? void 0 : (_result_ = result[0]) === null || _result_ === void 0 ? void 0 : _result_.length) || null;
45
45
  }
46
46
  }
47
47
  // if match url path
@@ -88,3 +88,6 @@ export class RouteMatcher {
88
88
  this.setupUrlPath();
89
89
  }
90
90
  }
91
+ export {
92
+ RouteMatcher
93
+ };
@@ -1,5 +1,5 @@
1
1
  import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
- export class ModernRoute {
2
+ class ModernRoute {
3
3
  constructor(routeSpec) {
4
4
  _define_property(this, "entryName", void 0);
5
5
  _define_property(this, "urlPath", void 0);
@@ -20,3 +20,6 @@ export class ModernRoute {
20
20
  this.responseHeaders = routeSpec.responseHeaders;
21
21
  }
22
22
  }
23
+ export {
24
+ ModernRoute
25
+ };
@@ -12,7 +12,7 @@ const removedPrefix = (req, prefix) => {
12
12
  };
13
13
  }
14
14
  };
15
- export const faviconFallbackHandler = (context, next) => {
15
+ const faviconFallbackHandler = (context, next) => {
16
16
  if (context.url === "/favicon.ico") {
17
17
  context.res.statusCode = 204;
18
18
  context.res.end();
@@ -20,7 +20,7 @@ export const faviconFallbackHandler = (context, next) => {
20
20
  next();
21
21
  }
22
22
  };
23
- export const createStaticFileHandler = (rules, assetPrefix = "/") => (
23
+ const createStaticFileHandler = (rules, assetPrefix = "/") => (
24
24
  // eslint-disable-next-line consistent-return
25
25
  async (context, next) => {
26
26
  const { url: requestUrl, req, res } = context;
@@ -43,3 +43,7 @@ export const createStaticFileHandler = (rules, assetPrefix = "/") => (
43
43
  }
44
44
  }
45
45
  );
46
+ export {
47
+ createStaticFileHandler,
48
+ faviconFallbackHandler
49
+ };
@@ -1,6 +1,6 @@
1
1
  import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
2
  const SERVER_TIMING = "Server-Timing";
3
- export class ServerTiming {
3
+ class ServerTiming {
4
4
  addServeTiming(name, dur, desc) {
5
5
  const _name = `bd-${this.meta}-${name}`;
6
6
  const serverTiming = this.res.getHeader(SERVER_TIMING) || this.res.getHeader(SERVER_TIMING.toLocaleLowerCase());
@@ -15,3 +15,6 @@ export class ServerTiming {
15
15
  this.res = res;
16
16
  }
17
17
  }
18
+ export {
19
+ ServerTiming
20
+ };
@@ -1,71 +1,80 @@
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
+ };
1
5
  import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
6
  import { OutgoingMessage } from "http";
3
7
  import { Readable } from "stream";
4
8
  import { Socket } from "net";
5
9
  import { Server } from "./server";
6
10
  import { isRedirect } from "./utils";
7
- class IncomingMessageLike extends Readable {
8
- constructor({ method, url, headers }) {
9
- super();
10
- _define_property(this, "headers", void 0);
11
- _define_property(this, "method", void 0);
12
- _define_property(this, "url", void 0);
13
- _define_property(this, "socket", void 0);
14
- this.socket = new Socket();
15
- this.headers = headers || {};
16
- this.headers.host = "localhost:8080";
17
- this.method = method || "get";
18
- this.url = url;
19
- }
20
- }
21
- class ServerResponseLike extends OutgoingMessage {
22
- end(chunk, _encoding, cb) {
23
- this.data.push(chunk.toString());
24
- cb && cb();
25
- this.emit("finish");
26
- return this;
27
- }
28
- constructor() {
29
- super();
30
- _define_property(this, "statusCode", void 0);
31
- _define_property(this, "data", void 0);
32
- this.statusCode = 200;
33
- this.data = [];
34
- }
35
- }
36
- class CustomServer extends Server {
37
- async render(req, res, _url) {
38
- const handler = this.getRequestHandler();
39
- handler(req, res);
40
- return null;
41
- }
42
- }
43
- async function renderHtml({ url, method, headers, body, serverOptions }) {
44
- const req = new IncomingMessageLike({
45
- method,
46
- url,
47
- headers
48
- });
49
- if (body) {
50
- req.push(body);
51
- req.push(null);
52
- }
53
- const res = new ServerResponseLike();
54
- const customServer = new CustomServer(serverOptions);
55
- await customServer.init({
56
- disableHttpServer: true
57
- });
58
- customServer.render(req, res);
59
- return new Promise((resolve) => {
60
- res.addListener("finish", () => {
61
- resolve({
62
- headers: res.getHeaders(),
63
- redirected: isRedirect(res.statusCode),
64
- status: res.statusCode,
11
+ var require_renderHtml = __commonJS({
12
+ "src/renderHtml.ts"(exports, module) {
13
+ class IncomingMessageLike extends Readable {
14
+ constructor({ method, url, headers }) {
15
+ super();
16
+ _define_property(this, "headers", void 0);
17
+ _define_property(this, "method", void 0);
18
+ _define_property(this, "url", void 0);
19
+ _define_property(this, "socket", void 0);
20
+ this.socket = new Socket();
21
+ this.headers = headers || {};
22
+ this.headers.host = "localhost:8080";
23
+ this.method = method || "get";
24
+ this.url = url;
25
+ }
26
+ }
27
+ class ServerResponseLike extends OutgoingMessage {
28
+ end(chunk, _encoding, cb) {
29
+ this.data.push(chunk.toString());
30
+ cb && cb();
31
+ this.emit("finish");
32
+ return this;
33
+ }
34
+ constructor() {
35
+ super();
36
+ _define_property(this, "statusCode", void 0);
37
+ _define_property(this, "data", void 0);
38
+ this.statusCode = 200;
39
+ this.data = [];
40
+ }
41
+ }
42
+ class CustomServer extends Server {
43
+ async render(req, res, _url) {
44
+ const handler = this.getRequestHandler();
45
+ handler(req, res);
46
+ return null;
47
+ }
48
+ }
49
+ async function renderHtml({ url, method, headers, body, serverOptions }) {
50
+ const req = new IncomingMessageLike({
51
+ method,
65
52
  url,
66
- body: res.data.join()
53
+ headers
54
+ });
55
+ if (body) {
56
+ req.push(body);
57
+ req.push(null);
58
+ }
59
+ const res = new ServerResponseLike();
60
+ const customServer = new CustomServer(serverOptions);
61
+ await customServer.init({
62
+ disableHttpServer: true
67
63
  });
68
- });
69
- });
70
- }
71
- module.exports = renderHtml;
64
+ customServer.render(req, res);
65
+ return new Promise((resolve) => {
66
+ res.addListener("finish", () => {
67
+ resolve({
68
+ headers: res.getHeaders(),
69
+ redirected: isRedirect(res.statusCode),
70
+ status: res.statusCode,
71
+ url,
72
+ body: res.data.join()
73
+ });
74
+ });
75
+ });
76
+ }
77
+ module.exports = renderHtml;
78
+ }
79
+ });
80
+ export default require_renderHtml();
@@ -1,12 +1,12 @@
1
1
  import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
2
  import path from "path";
3
- import { fs, Logger, SHARED_DIR, OUTPUT_CONFIG_FILE, dotenv, dotenvExpand, INTERNAL_SERVER_PLUGINS } from "@modern-js/utils";
3
+ import { fs, createLogger, SHARED_DIR, OUTPUT_CONFIG_FILE, dotenv, dotenvExpand, INTERNAL_SERVER_PLUGINS, ensureAbsolutePath } from "@modern-js/utils";
4
4
  import { serverManager, AppContext, ConfigContext, loadPlugins } from "@modern-js/server-core";
5
5
  import { metrics as defaultMetrics } from "../libs/metrics";
6
6
  import { loadConfig, getServerConfigPath, requireConfig } from "../libs/loadConfig";
7
7
  import { debug } from "../utils";
8
8
  import { createProdServer } from "./modernServerSplit";
9
- export class Server {
9
+ class Server {
10
10
  /**
11
11
  * 初始化顺序
12
12
  * - 读取 .env.{process.env.MODERN_ENV} 文件,加载环境变量
@@ -80,7 +80,7 @@ export class Server {
80
80
  const { pwd, config } = options;
81
81
  const { serverConfig } = this;
82
82
  const finalServerConfig = this.runConfigHook(runner, serverConfig);
83
- const resolvedConfigPath = path.join(pwd, config.output.path || "dist", OUTPUT_CONFIG_FILE);
83
+ const resolvedConfigPath = ensureAbsolutePath(pwd, path.join(config.output.path || "dist", OUTPUT_CONFIG_FILE));
84
84
  options.config = loadConfig({
85
85
  cliConfig: config,
86
86
  serverConfig: finalServerConfig,
@@ -92,8 +92,7 @@ export class Server {
92
92
  }
93
93
  listen(options, listener) {
94
94
  const callback = () => {
95
- var _listener;
96
- (_listener = listener) === null || _listener === void 0 ? void 0 : _listener();
95
+ listener === null || listener === void 0 ? void 0 : listener();
97
96
  };
98
97
  if (typeof options === "object") {
99
98
  if (process.env.PORT) {
@@ -143,7 +142,6 @@ export class Server {
143
142
  });
144
143
  }
145
144
  initAppContext() {
146
- var _appContext, _appContext1, _appContext2;
147
145
  const { options } = this;
148
146
  const { pwd: appDirectory, plugins = [], config, appContext } = options;
149
147
  const serverPlugins = plugins.map((p) => ({
@@ -151,9 +149,9 @@ export class Server {
151
149
  }));
152
150
  return {
153
151
  appDirectory,
154
- apiDirectory: (_appContext = appContext) === null || _appContext === void 0 ? void 0 : _appContext.apiDirectory,
155
- lambdaDirectory: (_appContext1 = appContext) === null || _appContext1 === void 0 ? void 0 : _appContext1.lambdaDirectory,
156
- sharedDirectory: ((_appContext2 = appContext) === null || _appContext2 === void 0 ? void 0 : _appContext2.sharedDirectory) || path.resolve(appDirectory, SHARED_DIR),
152
+ apiDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.apiDirectory,
153
+ lambdaDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.lambdaDirectory,
154
+ sharedDirectory: (appContext === null || appContext === void 0 ? void 0 : appContext.sharedDirectory) || path.resolve(appDirectory, SHARED_DIR),
157
155
  distDirectory: path.join(appDirectory, config.output.path || "dist"),
158
156
  plugins: serverPlugins
159
157
  };
@@ -182,7 +180,7 @@ export class Server {
182
180
  _define_property(this, "app", void 0);
183
181
  _define_property(this, "runner", void 0);
184
182
  _define_property(this, "serverConfig", void 0);
185
- options.logger = options.logger || new Logger({
183
+ options.logger = options.logger || createLogger({
186
184
  level: "warn"
187
185
  });
188
186
  options.metrics = options.metrics || defaultMetrics;
@@ -190,3 +188,6 @@ export class Server {
190
188
  this.serverConfig = {};
191
189
  }
192
190
  }
191
+ export {
192
+ Server
193
+ };
@@ -2,7 +2,7 @@ import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
2
  import { createServer } from "http";
3
3
  import path from "path";
4
4
  import { fs, isPromise, isWebOnly, mime, ROUTE_SPEC_FILE } from "@modern-js/utils";
5
- import { time } from "@modern-js/utils/universal/time";
5
+ import { time } from "@modern-js/runtime-utils/time";
6
6
  import { RouteMatchManager } from "../libs/route";
7
7
  import { createRenderHandler } from "../libs/render";
8
8
  import { createStaticFileHandler, faviconFallbackHandler } from "../libs/serveFile";
@@ -13,10 +13,10 @@ import { createContext } from "../libs/context";
13
13
  import { AGGRED_DIR, ERROR_DIGEST, ERROR_PAGE_TEXT, RUN_MODE, ServerReportTimings } from "../constants";
14
14
  import { createAfterMatchContext, createAfterRenderContext, createMiddlewareContext } from "../libs/hook-api";
15
15
  const SERVER_DIR = "./server";
16
- export class ModernServer {
16
+ class ModernServer {
17
17
  // server prepare
18
18
  async onInit(runner, app) {
19
- var _conf_bff, _app, _this_conf_output;
19
+ var _conf_bff, _this_conf_output;
20
20
  this.runner = runner;
21
21
  const { distDir, conf } = this;
22
22
  this.initReader();
@@ -28,7 +28,7 @@ export class ModernServer {
28
28
  this.addHandler(handler);
29
29
  });
30
30
  }
31
- (_app = app) === null || _app === void 0 ? void 0 : _app.on("close", () => {
31
+ app === null || app === void 0 ? void 0 : app.on("close", () => {
32
32
  this.reader.close();
33
33
  });
34
34
  const usageRoutes = this.filterRoutes(this.getRoutes());
@@ -164,10 +164,9 @@ export class ModernServer {
164
164
  return handler;
165
165
  }
166
166
  async prepareAPIHandler(extension) {
167
- var _bff, _bff1;
168
167
  const { workDir, runner, conf } = this;
169
168
  const { bff } = conf;
170
- const prefix = ((_bff = bff) === null || _bff === void 0 ? void 0 : _bff.prefix) || "/api";
169
+ const prefix = (bff === null || bff === void 0 ? void 0 : bff.prefix) || "/api";
171
170
  const webOnly = await isWebOnly();
172
171
  if (webOnly && process.env.NODE_ENV === "development") {
173
172
  return (req, res) => {
@@ -179,7 +178,7 @@ export class ModernServer {
179
178
  pwd: workDir,
180
179
  config: extension,
181
180
  prefix: Array.isArray(prefix) ? prefix[0] : prefix,
182
- httpMethodDecider: (_bff1 = bff) === null || _bff1 === void 0 ? void 0 : _bff1.httpMethodDecider,
181
+ httpMethodDecider: bff === null || bff === void 0 ? void 0 : bff.httpMethodDecider,
183
182
  render: this.render.bind(this)
184
183
  }, {
185
184
  onLast: () => null
@@ -290,16 +289,14 @@ export class ModernServer {
290
289
  await this.handleAPI(context);
291
290
  return;
292
291
  }
293
- if (route.entryName) {
292
+ if (route.entryName && this.runMode === RUN_MODE.FULL) {
294
293
  const afterMatchContext = createAfterMatchContext(context, route.entryName);
295
- if (this.runMode === RUN_MODE.FULL) {
296
- const end2 = time();
297
- await this.runner.afterMatch(afterMatchContext, {
298
- onLast: noop
299
- });
300
- const cost = end2();
301
- cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_MATCH, cost);
302
- }
294
+ const end2 = time();
295
+ await this.runner.afterMatch(afterMatchContext, {
296
+ onLast: noop
297
+ });
298
+ const cost = end2();
299
+ cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_MATCH, cost);
303
300
  if (this.isSend(res)) {
304
301
  return;
305
302
  }
@@ -342,16 +339,14 @@ export class ModernServer {
342
339
  responseStream.pipe(res);
343
340
  return;
344
341
  }
345
- if (route.entryName) {
342
+ if (route.entryName && this.runMode === RUN_MODE.FULL) {
346
343
  const afterRenderContext = createAfterRenderContext(context, response.toString());
347
- if (this.runMode === RUN_MODE.FULL) {
348
- const end2 = time();
349
- await this.runner.afterRender(afterRenderContext, {
350
- onLast: noop
351
- });
352
- const cost = end2();
353
- cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_RENDER, cost);
354
- }
344
+ const end2 = time();
345
+ await this.runner.afterRender(afterRenderContext, {
346
+ onLast: noop
347
+ });
348
+ const cost = end2();
349
+ cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_RENDER, cost);
355
350
  if (this.isSend(res)) {
356
351
  return;
357
352
  }
@@ -360,7 +355,11 @@ export class ModernServer {
360
355
  res.end(response);
361
356
  }
362
357
  isSend(res) {
363
- if (res.writableEnded) {
358
+ if (res.modernFlushedHeaders) {
359
+ if (res.writableFinished) {
360
+ return true;
361
+ }
362
+ } else if (res.headersSent) {
364
363
  return true;
365
364
  }
366
365
  if (res.getHeader("Location") && isRedirect(res.statusCode)) {
@@ -465,7 +464,6 @@ export class ModernServer {
465
464
  context.res.end(createErrorDocument(status, text));
466
465
  }
467
466
  constructor({ pwd, config, routes, staticGenerate, logger, metrics, runMode, proxyTarget, appContext }) {
468
- var _appContext;
469
467
  _define_property(this, "pwd", void 0);
470
468
  _define_property(this, "distDir", void 0);
471
469
  _define_property(this, "workDir", void 0);
@@ -499,6 +497,9 @@ export class ModernServer {
499
497
  this.proxyTarget = proxyTarget;
500
498
  this.staticGenerate = staticGenerate || false;
501
499
  this.runMode = runMode || RUN_MODE.FULL;
502
- this.metaName = (_appContext = appContext) === null || _appContext === void 0 ? void 0 : _appContext.metaName;
500
+ this.metaName = appContext === null || appContext === void 0 ? void 0 : appContext.metaName;
503
501
  }
504
502
  }
503
+ export {
504
+ ModernServer
505
+ };
@@ -27,7 +27,7 @@ class ModernWebServer extends ModernServer {
27
27
  return super.handleWeb(context, route);
28
28
  }
29
29
  }
30
- export const createProdServer = (options) => {
30
+ const createProdServer = (options) => {
31
31
  if (options.apiOnly) {
32
32
  return new ModernAPIServer(options);
33
33
  } else if (options.ssrOnly) {
@@ -38,3 +38,6 @@ export const createProdServer = (options) => {
38
38
  return new ModernServer(options);
39
39
  }
40
40
  };
41
+ export {
42
+ createProdServer
43
+ };
@@ -1 +0,0 @@
1
- export {};