@modern-js/server-core 2.47.0 → 2.47.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 (142) hide show
  1. package/dist/cjs/base/adapters/node/bff.js +69 -0
  2. package/dist/cjs/base/adapters/node/hono.js +62 -0
  3. package/dist/cjs/base/adapters/node/index.js +32 -0
  4. package/dist/cjs/base/adapters/node/loadServer.js +56 -0
  5. package/dist/cjs/base/adapters/node/middlewares/index.js +26 -0
  6. package/dist/cjs/base/adapters/node/middlewares/mock.js +113 -0
  7. package/dist/cjs/base/adapters/node/middlewares/serverStatic.js +105 -0
  8. package/dist/cjs/base/adapters/node/middlewares/templates.js +65 -0
  9. package/dist/cjs/base/adapters/node/node.js +121 -0
  10. package/dist/cjs/base/adapters/node/polyfills/index.js +24 -0
  11. package/dist/cjs/base/adapters/node/polyfills/install.js +57 -0
  12. package/dist/cjs/base/adapters/node/polyfills/stream.js +159 -0
  13. package/dist/cjs/base/constants.js +55 -0
  14. package/dist/cjs/base/index.js +73 -0
  15. package/dist/cjs/base/middlewares/customServer/base.js +115 -0
  16. package/dist/cjs/base/middlewares/customServer/context.js +78 -0
  17. package/dist/cjs/base/middlewares/customServer/index.js +138 -0
  18. package/dist/cjs/base/middlewares/customServer/routerApi.js +48 -0
  19. package/dist/cjs/base/middlewares/customServer/template.js +60 -0
  20. package/dist/cjs/base/middlewares/dataHandler.js +69 -0
  21. package/dist/cjs/base/middlewares/faviconFallback.js +34 -0
  22. package/dist/cjs/base/middlewares/index.js +28 -0
  23. package/dist/cjs/base/middlewares/monitor.js +75 -0
  24. package/dist/cjs/base/middlewares/renderHandler/index.js +92 -0
  25. package/dist/cjs/base/middlewares/renderHandler/render.js +90 -0
  26. package/dist/cjs/base/middlewares/renderHandler/serverTiming.js +43 -0
  27. package/dist/cjs/base/middlewares/renderHandler/ssrCache.js +173 -0
  28. package/dist/cjs/base/middlewares/renderHandler/ssrRender.js +183 -0
  29. package/dist/cjs/base/serverBase.js +167 -0
  30. package/dist/cjs/base/utils/debug.js +29 -0
  31. package/dist/cjs/base/utils/entry.js +30 -0
  32. package/dist/cjs/base/utils/env.js +45 -0
  33. package/dist/cjs/base/utils/error.js +65 -0
  34. package/dist/cjs/base/utils/index.js +40 -0
  35. package/dist/cjs/base/utils/middlewareCollector.js +54 -0
  36. package/dist/cjs/base/utils/path.js +46 -0
  37. package/dist/cjs/base/utils/request.js +65 -0
  38. package/dist/cjs/base/utils/serverConfig.js +71 -0
  39. package/dist/cjs/base/utils/transformStream.js +38 -0
  40. package/dist/cjs/base/utils/warmup.js +43 -0
  41. package/dist/cjs/core/hono.js +16 -0
  42. package/dist/cjs/core/index.js +24 -0
  43. package/dist/cjs/{loadPlugins.js → core/loadPlugins.js} +1 -1
  44. package/dist/cjs/{plugin.js → core/plugin.js} +1 -3
  45. package/dist/cjs/core/render.js +16 -0
  46. package/dist/cjs/core/server.js +22 -0
  47. package/dist/cjs/index.js +6 -4
  48. package/dist/esm/base/adapters/node/bff.js +45 -0
  49. package/dist/esm/base/adapters/node/hono.js +37 -0
  50. package/dist/esm/base/adapters/node/index.js +6 -0
  51. package/dist/esm/base/adapters/node/loadServer.js +22 -0
  52. package/dist/esm/base/adapters/node/middlewares/index.js +3 -0
  53. package/dist/esm/base/adapters/node/middlewares/mock.js +79 -0
  54. package/dist/esm/base/adapters/node/middlewares/serverStatic.js +71 -0
  55. package/dist/esm/base/adapters/node/middlewares/templates.js +31 -0
  56. package/dist/esm/base/adapters/node/node.js +95 -0
  57. package/dist/esm/base/adapters/node/polyfills/index.js +2 -0
  58. package/dist/esm/base/adapters/node/polyfills/install.js +33 -0
  59. package/dist/esm/base/adapters/node/polyfills/stream.js +132 -0
  60. package/dist/esm/base/constants.js +29 -0
  61. package/dist/esm/base/index.js +32 -0
  62. package/dist/esm/base/middlewares/customServer/base.js +91 -0
  63. package/dist/esm/base/middlewares/customServer/context.js +51 -0
  64. package/dist/esm/base/middlewares/customServer/index.js +114 -0
  65. package/dist/esm/base/middlewares/customServer/routerApi.js +24 -0
  66. package/dist/esm/base/middlewares/customServer/template.js +36 -0
  67. package/dist/esm/base/middlewares/dataHandler.js +35 -0
  68. package/dist/esm/base/middlewares/faviconFallback.js +10 -0
  69. package/dist/esm/base/middlewares/index.js +4 -0
  70. package/dist/esm/base/middlewares/monitor.js +49 -0
  71. package/dist/esm/base/middlewares/renderHandler/index.js +67 -0
  72. package/dist/esm/base/middlewares/renderHandler/render.js +66 -0
  73. package/dist/esm/base/middlewares/renderHandler/serverTiming.js +19 -0
  74. package/dist/esm/base/middlewares/renderHandler/ssrCache.js +149 -0
  75. package/dist/esm/base/middlewares/renderHandler/ssrRender.js +149 -0
  76. package/dist/esm/base/serverBase.js +143 -0
  77. package/dist/esm/base/utils/debug.js +5 -0
  78. package/dist/esm/base/utils/entry.js +6 -0
  79. package/dist/esm/base/utils/env.js +20 -0
  80. package/dist/esm/base/utils/error.js +41 -0
  81. package/dist/esm/base/utils/index.js +10 -0
  82. package/dist/esm/base/utils/middlewareCollector.js +29 -0
  83. package/dist/esm/base/utils/path.js +12 -0
  84. package/dist/esm/base/utils/request.js +38 -0
  85. package/dist/esm/base/utils/serverConfig.js +35 -0
  86. package/dist/esm/base/utils/transformStream.js +14 -0
  87. package/dist/esm/base/utils/warmup.js +9 -0
  88. package/dist/esm/core/hono.js +0 -0
  89. package/dist/esm/core/index.js +2 -0
  90. package/dist/esm/{loadPlugins.js → core/loadPlugins.js} +1 -1
  91. package/dist/esm/{plugin.js → core/plugin.js} +1 -3
  92. package/dist/esm/core/render.js +0 -0
  93. package/dist/esm/core/server.js +1 -0
  94. package/dist/esm/index.js +3 -2
  95. package/dist/types/base/adapters/node/bff.d.ts +4 -0
  96. package/dist/types/base/adapters/node/hono.d.ts +30 -0
  97. package/dist/types/base/adapters/node/index.d.ts +6 -0
  98. package/dist/types/base/adapters/node/loadServer.d.ts +3 -0
  99. package/dist/types/base/adapters/node/middlewares/index.d.ts +3 -0
  100. package/dist/types/base/adapters/node/middlewares/mock.d.ts +5 -0
  101. package/dist/types/base/adapters/node/middlewares/serverStatic.d.ts +9 -0
  102. package/dist/types/base/adapters/node/middlewares/templates.d.ts +3 -0
  103. package/dist/types/base/adapters/node/node.d.ts +12 -0
  104. package/dist/types/base/adapters/node/polyfills/index.d.ts +2 -0
  105. package/dist/types/base/adapters/node/polyfills/install.d.ts +1 -0
  106. package/dist/types/base/adapters/node/polyfills/stream.d.ts +18 -0
  107. package/dist/types/base/constants.d.ts +23 -0
  108. package/dist/types/base/index.d.ts +9 -0
  109. package/dist/types/base/middlewares/customServer/base.d.ts +3 -0
  110. package/dist/types/base/middlewares/customServer/context.d.ts +7 -0
  111. package/dist/types/base/middlewares/customServer/index.d.ts +13 -0
  112. package/dist/types/base/middlewares/customServer/routerApi.d.ts +9 -0
  113. package/dist/types/base/middlewares/customServer/template.d.ts +11 -0
  114. package/dist/types/base/middlewares/dataHandler.d.ts +3 -0
  115. package/dist/types/base/middlewares/faviconFallback.d.ts +2 -0
  116. package/dist/types/base/middlewares/index.d.ts +4 -0
  117. package/dist/types/base/middlewares/monitor.d.ts +7 -0
  118. package/dist/types/base/middlewares/renderHandler/index.d.ts +9 -0
  119. package/dist/types/base/middlewares/renderHandler/render.d.ts +12 -0
  120. package/dist/types/base/middlewares/renderHandler/serverTiming.d.ts +7 -0
  121. package/dist/types/base/middlewares/renderHandler/ssrCache.d.ts +17 -0
  122. package/dist/types/base/middlewares/renderHandler/ssrRender.d.ts +18 -0
  123. package/dist/types/base/serverBase.d.ts +49 -0
  124. package/dist/types/base/utils/debug.d.ts +1 -0
  125. package/dist/types/base/utils/entry.d.ts +2 -0
  126. package/dist/types/base/utils/env.d.ts +2 -0
  127. package/dist/types/base/utils/error.d.ts +1 -0
  128. package/dist/types/base/utils/index.d.ts +10 -0
  129. package/dist/types/base/utils/middlewareCollector.d.ts +12 -0
  130. package/dist/types/base/utils/path.d.ts +3 -0
  131. package/dist/types/base/utils/request.d.ts +12 -0
  132. package/dist/types/base/utils/serverConfig.d.ts +14 -0
  133. package/dist/types/base/utils/transformStream.d.ts +2 -0
  134. package/dist/types/base/utils/warmup.d.ts +1 -0
  135. package/dist/types/core/hono.d.ts +1 -0
  136. package/dist/types/core/index.d.ts +2 -0
  137. package/dist/types/{loadPlugins.d.ts → core/loadPlugins.d.ts} +1 -1
  138. package/dist/types/{plugin.d.ts → core/plugin.d.ts} +32 -35
  139. package/dist/types/core/render.d.ts +11 -0
  140. package/dist/types/core/server.d.ts +71 -0
  141. package/dist/types/index.d.ts +3 -2
  142. package/package.json +25 -2
@@ -0,0 +1,149 @@
1
+ import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
+ import { Readable } from "stream";
3
+ import { LOADABLE_STATS_FILE, ROUTE_MANIFEST_FILE, SERVER_RENDER_FUNCTION_NAME } from "@modern-js/utils";
4
+ import * as isbot from "isbot";
5
+ import { createTransformStream, getPathModule } from "../../utils";
6
+ import { REPLACE_REG } from "../../constants";
7
+ import { parseHeaders, parseQuery, getHost } from "../../utils/request";
8
+ import { createReadableStreamFromReadable } from "../../adapters/node/polyfills/stream";
9
+ import { ServerTiming } from "./serverTiming";
10
+ import { ssrCache } from "./ssrCache";
11
+ const defaultReporter = {
12
+ init() {
13
+ },
14
+ reportError() {
15
+ },
16
+ reportTiming() {
17
+ },
18
+ reportInfo() {
19
+ },
20
+ reportWarn() {
21
+ }
22
+ };
23
+ async function ssrRender(request, { routeInfo, pwd, html, staticGenerate, nonce, metaName, reporter, logger, nodeReq }) {
24
+ const { entryName } = routeInfo;
25
+ const path = await getPathModule();
26
+ const jsBundlePath = path.join(pwd, routeInfo.bundle);
27
+ const loadableUri = path.join(pwd, LOADABLE_STATS_FILE);
28
+ let loadableStats = {};
29
+ try {
30
+ loadableStats = await import(loadableUri);
31
+ } catch (_) {
32
+ }
33
+ const routesManifestUri = path.join(pwd, ROUTE_MANIFEST_FILE);
34
+ let routeManifest;
35
+ try {
36
+ routeManifest = await import(routesManifestUri);
37
+ } catch (_) {
38
+ }
39
+ const host = getHost(request);
40
+ const isSpider = isbot.default(request.headers.get("user-agent"));
41
+ const responseProxy = new ResponseProxy();
42
+ const query = parseQuery(request);
43
+ const headers = parseHeaders(request);
44
+ const ssrContext = {
45
+ request: {
46
+ baseUrl: routeInfo.urlPath,
47
+ params: {},
48
+ // eslint-disable-next-line node/no-unsupported-features/node-builtins, node/prefer-global/url
49
+ pathname: new URL(request.url).pathname,
50
+ host,
51
+ query,
52
+ url: request.url,
53
+ headers
54
+ },
55
+ response: {
56
+ setHeader(key, value) {
57
+ responseProxy.headers.set(key, value);
58
+ },
59
+ status(code) {
60
+ responseProxy.status = code;
61
+ }
62
+ },
63
+ redirection: {},
64
+ template: html,
65
+ loadableStats,
66
+ routeManifest,
67
+ entryName,
68
+ staticGenerate,
69
+ logger,
70
+ serverTiming: new ServerTiming(responseProxy.headers, metaName),
71
+ reporter: reporter || defaultReporter,
72
+ /** @deprecated node req */
73
+ req: void 0,
74
+ /** @deprecated node res */
75
+ res: void 0,
76
+ isSpider,
77
+ nonce
78
+ };
79
+ const jsBundle = await import(jsBundlePath);
80
+ const incomingMessage = nodeReq ? nodeReq : new IncomingMessgeProxy(request);
81
+ const cacheControl = await ssrCache.matchCacheControl(incomingMessage);
82
+ let ssrResult;
83
+ const render = jsBundle[SERVER_RENDER_FUNCTION_NAME];
84
+ if (cacheControl) {
85
+ ssrResult = await ssrCache.getCache(request, cacheControl, render, ssrContext);
86
+ } else {
87
+ ssrResult = await render(ssrContext);
88
+ }
89
+ const { redirection } = ssrContext;
90
+ if (redirection.url) {
91
+ const { headers: headers2 } = responseProxy;
92
+ headers2.set("Location", redirection.url);
93
+ return new Response(null, {
94
+ status: redirection.status || 302,
95
+ headers: {
96
+ Location: redirection.url
97
+ }
98
+ });
99
+ }
100
+ const serverData = {
101
+ router: {
102
+ baseUrl: routeInfo.urlPath,
103
+ // TODO: parse
104
+ params: {}
105
+ }
106
+ };
107
+ const data = ssrResult instanceof Readable ? createReadableStreamFromReadable(ssrResult) : ssrResult;
108
+ const body = injectServerData(data, serverData);
109
+ return new Response(body, {
110
+ status: responseProxy.status,
111
+ headers: responseProxy.headers
112
+ });
113
+ }
114
+ function injectServerData(data, serverData) {
115
+ const { head } = REPLACE_REG.before;
116
+ const searchValue = new RegExp(head);
117
+ const replcaeCb = (beforeHead) => `${beforeHead}<script type="application/json" id="__MODERN_SERVER_DATA__">${JSON.stringify(serverData)}</script>`;
118
+ if (typeof data === "string") {
119
+ return data.replace(searchValue, replcaeCb);
120
+ } else {
121
+ const stream = createTransformStream((before) => {
122
+ return before.replace(searchValue, replcaeCb);
123
+ });
124
+ data.pipeThrough(stream);
125
+ return stream.readable;
126
+ }
127
+ }
128
+ class ResponseProxy {
129
+ constructor() {
130
+ _define_property(this, "headers", new Headers());
131
+ _define_property(this, "status", 200);
132
+ this.headers.set("content-type", "text/html; charset=UTF-8");
133
+ }
134
+ }
135
+ class IncomingMessgeProxy {
136
+ constructor(req) {
137
+ _define_property(this, "headers", {});
138
+ _define_property(this, "method", void 0);
139
+ _define_property(this, "url", void 0);
140
+ req.headers.forEach((value, key) => {
141
+ this.headers[key] = value;
142
+ });
143
+ this.method = req.method;
144
+ this.url = new URL(req.url).pathname;
145
+ }
146
+ }
147
+ export {
148
+ ssrRender
149
+ };
@@ -0,0 +1,143 @@
1
+ import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
+ import { INTERNAL_SERVER_PLUGINS, OUTPUT_CONFIG_FILE, SHARED_DIR, ensureAbsolutePath } from "@modern-js/utils";
3
+ import { Hono } from "hono";
4
+ import { AppContext, ConfigContext, loadPlugins, serverManager } from "../core";
5
+ import { debug, getPathModule, getServerConfigPath, loadConfig, requireConfig } from "./utils";
6
+ class ServerBase {
7
+ /**
8
+ * 初始化顺序
9
+ * - 获取 server runtime config
10
+ * - 设置 context
11
+ * - 创建 hooksRunner
12
+ * - 合并插件,内置插件和 serverConfig 中配置的插件
13
+ * - 执行 config hook
14
+ * - 获取最终的配置
15
+ * - 设置配置到 context
16
+ * - 执行 prepare hook
17
+ */
18
+ async init() {
19
+ const { options } = this;
20
+ await this.initServerConfig(options);
21
+ await this.injectContext(options);
22
+ this.runner = await this.createHookRunner();
23
+ await this.initConfig(this.runner, options);
24
+ await this.injectContext(options);
25
+ await this.runner.prepare();
26
+ return this;
27
+ }
28
+ async createHookRunner() {
29
+ serverManager.clear();
30
+ const { options } = this;
31
+ const { internalPlugins = INTERNAL_SERVER_PLUGINS, pwd, plugins = [] } = options;
32
+ const serverPlugins = this.serverConfig.plugins || [];
33
+ const loadedPlugins = loadPlugins(options.appContext.appDirectory || pwd, [
34
+ ...serverPlugins,
35
+ ...plugins
36
+ ], {
37
+ internalPlugins
38
+ });
39
+ debug("plugins", loadedPlugins);
40
+ loadedPlugins.forEach((p) => {
41
+ serverManager.usePlugin(p);
42
+ });
43
+ const hooksRunner = await serverManager.init();
44
+ return hooksRunner;
45
+ }
46
+ async initServerConfig(options) {
47
+ const { pwd, serverConfigFile } = options;
48
+ const serverConfigPath = await getServerConfigPath(pwd, serverConfigFile);
49
+ const serverConfig = requireConfig(serverConfigPath);
50
+ this.serverConfig = serverConfig;
51
+ }
52
+ async injectContext(options) {
53
+ const appContext = await this.initAppContext();
54
+ const { config, pwd } = options;
55
+ ConfigContext.set(config);
56
+ AppContext.set({
57
+ ...appContext,
58
+ serverBase: this,
59
+ distDirectory: pwd
60
+ });
61
+ }
62
+ async initAppContext() {
63
+ const path = await getPathModule();
64
+ const { options } = this;
65
+ const { pwd, plugins = [], appContext } = options;
66
+ const serverPlugins = plugins.map((p) => ({
67
+ server: p
68
+ }));
69
+ return {
70
+ appDirectory: (appContext === null || appContext === void 0 ? void 0 : appContext.appDirectory) || "",
71
+ apiDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.apiDirectory,
72
+ lambdaDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.lambdaDirectory,
73
+ sharedDirectory: (appContext === null || appContext === void 0 ? void 0 : appContext.sharedDirectory) || path.resolve(appContext.appDirectory || "", SHARED_DIR),
74
+ distDirectory: pwd,
75
+ plugins: serverPlugins
76
+ };
77
+ }
78
+ /**
79
+ * Execute config hooks
80
+ * @param runner
81
+ * @param options
82
+ */
83
+ runConfigHook(runner, serverConfig) {
84
+ const newServerConfig = runner.config(serverConfig || {});
85
+ return newServerConfig;
86
+ }
87
+ async initConfig(runner, options) {
88
+ const path = await getPathModule();
89
+ const { pwd, config } = options;
90
+ const { serverConfig } = this;
91
+ const finalServerConfig = this.runConfigHook(runner, serverConfig);
92
+ const resolvedConfigPath = ensureAbsolutePath(pwd, path.join(config.output.path || "dist", OUTPUT_CONFIG_FILE));
93
+ options.config = loadConfig({
94
+ cliConfig: config,
95
+ serverConfig: finalServerConfig,
96
+ resolvedConfigPath
97
+ });
98
+ }
99
+ get all() {
100
+ return this.app.all;
101
+ }
102
+ get use() {
103
+ return this.app.use;
104
+ }
105
+ get get() {
106
+ return this.app.get;
107
+ }
108
+ get post() {
109
+ return this.app.post;
110
+ }
111
+ get put() {
112
+ return this.app.put;
113
+ }
114
+ get delete() {
115
+ return this.app.delete;
116
+ }
117
+ get patch() {
118
+ return this.app.patch;
119
+ }
120
+ get handle() {
121
+ return this.app.fetch;
122
+ }
123
+ get request() {
124
+ return this.app.request;
125
+ }
126
+ get notFound() {
127
+ return this.app.notFound;
128
+ }
129
+ get onError() {
130
+ return this.app.onError;
131
+ }
132
+ constructor(options) {
133
+ _define_property(this, "options", void 0);
134
+ _define_property(this, "runner", void 0);
135
+ _define_property(this, "app", void 0);
136
+ _define_property(this, "serverConfig", {});
137
+ this.options = options;
138
+ this.app = new Hono();
139
+ }
140
+ }
141
+ export {
142
+ ServerBase
143
+ };
@@ -0,0 +1,5 @@
1
+ import { createDebugger } from "@modern-js/utils";
2
+ const debug = createDebugger("prod-server");
3
+ export {
4
+ debug
5
+ };
@@ -0,0 +1,6 @@
1
+ const sortRoutes = (route1, route2) => {
2
+ return route2.urlPath.length - route1.urlPath.length;
3
+ };
4
+ export {
5
+ sortRoutes
6
+ };
@@ -0,0 +1,20 @@
1
+ const getRuntimeEnv = () => {
2
+ var _global_process_release, _global_process, _global;
3
+ if (((_global = global) === null || _global === void 0 ? void 0 : (_global_process = _global.process) === null || _global_process === void 0 ? void 0 : (_global_process_release = _global_process.release) === null || _global_process_release === void 0 ? void 0 : _global_process_release.name) === "node") {
4
+ return "node";
5
+ }
6
+ return "other";
7
+ };
8
+ const checkIsProd = () => {
9
+ const env = getRuntimeEnv();
10
+ switch (env) {
11
+ case "node":
12
+ return process.env.NODE_ENV === "production";
13
+ default:
14
+ return false;
15
+ }
16
+ };
17
+ export {
18
+ checkIsProd,
19
+ getRuntimeEnv
20
+ };
@@ -0,0 +1,41 @@
1
+ const ERROR_PAGE_TEXT = {
2
+ 404: "This page could not be found.",
3
+ 500: "Internal Server Error."
4
+ };
5
+ const createErrorHtml = (status) => {
6
+ const text = ERROR_PAGE_TEXT[status] || "";
7
+ const title = `${status}: ${text}`;
8
+ return `<!DOCTYPE html>
9
+ <html lang="en">
10
+ <head>
11
+ <meta charset="utf-8">
12
+ <meta name="viewport" content="width=device-width">
13
+ <title>${title}</title>
14
+ <style>
15
+ html,body {
16
+ margin: 0;
17
+ }
18
+
19
+ .page-container {
20
+ color: #000;
21
+ background: #fff;
22
+ height: 100vh;
23
+ text-align: center;
24
+ display: flex;
25
+ flex-direction: column;
26
+ align-items: center;
27
+ justify-content: center;
28
+ }
29
+ </style>
30
+ </head>
31
+ <body>
32
+ <div class="page-container">
33
+ <h1>${status}</h1>
34
+ <div>${text}</div>
35
+ </body>
36
+ </html>
37
+ `;
38
+ };
39
+ export {
40
+ createErrorHtml
41
+ };
@@ -0,0 +1,10 @@
1
+ export * from "./env";
2
+ export * from "./request";
3
+ export * from "./serverConfig";
4
+ export * from "./debug";
5
+ export * from "./transformStream";
6
+ export * from "./middlewareCollector";
7
+ export * from "./error";
8
+ export * from "./warmup";
9
+ export * from "./entry";
10
+ export * from "./path";
@@ -0,0 +1,29 @@
1
+ const mergeExtension = (users) => {
2
+ const output = [];
3
+ return {
4
+ middleware: output.concat(users)
5
+ };
6
+ };
7
+ const createMiddlewareCollecter = () => {
8
+ const webMiddlewares = [];
9
+ const apiMiddlewares = [];
10
+ const addWebMiddleware = (input) => {
11
+ webMiddlewares.push(input);
12
+ };
13
+ const addAPIMiddleware = (input) => {
14
+ apiMiddlewares.push(input);
15
+ };
16
+ const getMiddlewares = () => ({
17
+ web: webMiddlewares,
18
+ api: apiMiddlewares
19
+ });
20
+ return {
21
+ getMiddlewares,
22
+ addWebMiddleware,
23
+ addAPIMiddleware
24
+ };
25
+ };
26
+ export {
27
+ createMiddlewareCollecter,
28
+ mergeExtension
29
+ };
@@ -0,0 +1,12 @@
1
+ async function getPathModule() {
2
+ let path;
3
+ try {
4
+ path = await import("path");
5
+ } catch (_) {
6
+ path = await import("path-browserify");
7
+ }
8
+ return path;
9
+ }
10
+ export {
11
+ getPathModule
12
+ };
@@ -0,0 +1,38 @@
1
+ function parseQuery(request) {
2
+ const { url } = request;
3
+ const q = url.split("?")[1];
4
+ const query = {};
5
+ if (q) {
6
+ q.split("&").forEach((item) => {
7
+ const [key, value] = item.split("=");
8
+ query[key] = value;
9
+ });
10
+ }
11
+ return query;
12
+ }
13
+ function parseHeaders(request) {
14
+ const headersData = {};
15
+ request.headers.forEach((value, key) => {
16
+ headersData[key] = value;
17
+ });
18
+ return headersData;
19
+ }
20
+ function getPathname(request) {
21
+ const match = request.url.match(/^https?:\/\/[^/]+(\/[^?]*)/);
22
+ return match ? match[1] : "/";
23
+ }
24
+ function getHost(request) {
25
+ const { headers } = request;
26
+ let host = headers.get("X-Forwarded-Host");
27
+ if (!host) {
28
+ host = headers.get("Host");
29
+ }
30
+ host = (host === null || host === void 0 ? void 0 : host.split(/\s*,\s*/, 1)[0]) || "undefined";
31
+ return host;
32
+ }
33
+ export {
34
+ getHost,
35
+ getPathname,
36
+ parseHeaders,
37
+ parseQuery
38
+ };
@@ -0,0 +1,35 @@
1
+ import { compatRequire, fs, DEFAULT_SERVER_CONFIG } from "@modern-js/utils";
2
+ import mergeDeep from "merge-deep";
3
+ import { getPathModule } from "./path";
4
+ const getServerConfigPath = async (distDirectory, serverConfigFile = DEFAULT_SERVER_CONFIG) => {
5
+ const path = await getPathModule();
6
+ const serverConfigPath = path.join(distDirectory, serverConfigFile);
7
+ return `${serverConfigPath}.js`;
8
+ };
9
+ const requireConfig = (serverConfigPath) => {
10
+ if (fs.pathExistsSync(serverConfigPath)) {
11
+ return compatRequire(serverConfigPath);
12
+ }
13
+ return {};
14
+ };
15
+ const loadConfig = ({ cliConfig, serverConfig, resolvedConfigPath }) => {
16
+ let config = null;
17
+ if (process.env.NODE_ENV === "production") {
18
+ const resolvedConfig = requireConfig(resolvedConfigPath);
19
+ config = mergeDeep({
20
+ ...resolvedConfig,
21
+ plugins: []
22
+ }, serverConfig, cliConfig);
23
+ } else {
24
+ config = mergeDeep({
25
+ ...cliConfig,
26
+ plugins: []
27
+ }, serverConfig);
28
+ }
29
+ return config;
30
+ };
31
+ export {
32
+ getServerConfigPath,
33
+ loadConfig,
34
+ requireConfig
35
+ };
@@ -0,0 +1,14 @@
1
+ function createTransformStream(fn) {
2
+ const decoder = new TextDecoder();
3
+ const encoder = new TextEncoder();
4
+ return new TransformStream({
5
+ async transform(chunk, controller) {
6
+ const content = decoder.decode(chunk);
7
+ const newContent = await fn(content);
8
+ controller.enqueue(encoder.encode(newContent));
9
+ }
10
+ });
11
+ }
12
+ export {
13
+ createTransformStream
14
+ };
@@ -0,0 +1,9 @@
1
+ function warmup(bundles) {
2
+ bundles.forEach((bundle) => {
3
+ bundle && import(bundle).catch((_) => {
4
+ });
5
+ });
6
+ }
7
+ export {
8
+ warmup
9
+ };
File without changes
@@ -0,0 +1,2 @@
1
+ export * from "./plugin";
2
+ export * from "./loadPlugins";
@@ -1,5 +1,5 @@
1
1
  import { compatRequire, getInternalPlugins, tryResolve } from "@modern-js/utils";
2
- import { createPlugin } from "./plugin";
2
+ import { createPlugin } from "../core/plugin";
3
3
  const resolvePlugin = (p, appDirectory) => {
4
4
  const isPluginInstance = typeof p !== "string";
5
5
  if (isPluginInstance) {
@@ -5,10 +5,9 @@ const prepare = createWaterfall();
5
5
  const prepareLoaderHandler = createAsyncPipeline();
6
6
  const prepareWebServer = createAsyncPipeline();
7
7
  const prepareApiServer = createAsyncPipeline();
8
- const onApiChange = createWaterfall();
8
+ const onApiChange = createAsyncWaterfall();
9
9
  const repack = createWaterfall();
10
10
  const beforeServerInit = createAsyncWaterfall();
11
- const afterServerInit = createAsyncWaterfall();
12
11
  const setupCompiler = createParallelWorkflow();
13
12
  const beforeRouteSet = createAsyncPipeline();
14
13
  const afterRouteSet = createAsyncPipeline();
@@ -52,7 +51,6 @@ const serverHooks = {
52
51
  repack,
53
52
  onApiChange,
54
53
  beforeServerInit,
55
- afterServerInit,
56
54
  setupCompiler,
57
55
  beforeRouteSet,
58
56
  afterRouteSet,
File without changes
@@ -0,0 +1 @@
1
+ export * from "./hono";
package/dist/esm/index.js CHANGED
@@ -1,4 +1,5 @@
1
- export * from "./plugin";
1
+ export * from "./core/plugin";
2
+ export * from "./core/render";
2
3
  export * from "@modern-js/plugin";
3
- export * from "./loadPlugins";
4
+ export * from "./core/loadPlugins";
4
5
  export * from "./types/config";
@@ -0,0 +1,4 @@
1
+ import type { ServerBaseOptions } from '../../../core/server';
2
+ import { BindRenderHandleOptions } from '../../../base/middlewares';
3
+ import { ServerBase } from '../../serverBase';
4
+ export declare const bindBFFHandler: (server: ServerBase, options: ServerBaseOptions & BindRenderHandleOptions) => Promise<void>;
@@ -0,0 +1,30 @@
1
+ import { Metrics, Reporter } from '@modern-js/types/server';
2
+ import { Logger } from '@modern-js/types';
3
+ import { NodeRequest, NodeResponse } from '../../../core/plugin';
4
+ import { HonoContext, HonoRequest, Middleware, Next } from '../../../core/server';
5
+ type NodeBindings = {
6
+ node: {
7
+ req: NodeRequest & {
8
+ __honoRequest: HonoRequest;
9
+ __templates: Record<string, string>;
10
+ };
11
+ res: NodeResponse;
12
+ };
13
+ };
14
+ type NodeVariables = {
15
+ reporter: Reporter;
16
+ logger: Logger;
17
+ templates?: Record<string, string>;
18
+ metrics?: Metrics;
19
+ };
20
+ export type HonoNodeEnv = {
21
+ Bindings: NodeBindings;
22
+ Variables: NodeVariables;
23
+ };
24
+ export type ServerNodeMiddleware = Middleware<HonoNodeEnv>;
25
+ export type ServerNodeContext = HonoContext<HonoNodeEnv>;
26
+ type Handler = (req: NodeRequest, res: NodeResponse) => void | Promise<void>;
27
+ export declare const httpCallBack2HonoMid: (handler: Handler) => (context: HonoContext<HonoNodeEnv>, next: Next) => Promise<void>;
28
+ type ConnectMiddleware = ((req: NodeRequest, res: NodeResponse, callback: (...args: unknown[]) => void) => void) | ((req: NodeRequest, res: NodeResponse) => void);
29
+ export declare const connectMid2HonoMid: (handler: ConnectMiddleware) => Middleware;
30
+ export {};
@@ -0,0 +1,6 @@
1
+ export * from './loadServer';
2
+ export * from './hono';
3
+ export * from './node';
4
+ export * from './bff';
5
+ export * from './middlewares';
6
+ export * from './polyfills';
@@ -0,0 +1,3 @@
1
+ import { ServerBaseOptions } from '../../../core/server';
2
+ /** 读取 .env.{process.env.MODERN_ENV} 文件,加载环境变量 */
3
+ export declare function loadServerEnv(options: ServerBaseOptions): Promise<void>;
@@ -0,0 +1,3 @@
1
+ export * from './mock';
2
+ export * from './serverStatic';
3
+ export * from './templates';
@@ -0,0 +1,5 @@
1
+ import type { ServerBase } from '../../../serverBase';
2
+ export declare const registerMockHandlers: ({ pwd, server, }: {
3
+ pwd: string;
4
+ server: ServerBase;
5
+ }) => Promise<null | undefined>;
@@ -0,0 +1,9 @@
1
+ import type { OutputNormalizedConfig, HtmlNormalizedConfig } from '../../../../types/config';
2
+ import { Middleware } from '../../../../core/server';
3
+ interface ServerStaticOptions {
4
+ pwd: string;
5
+ output: OutputNormalizedConfig;
6
+ html: HtmlNormalizedConfig;
7
+ }
8
+ export declare function createStaticMiddleware(options: ServerStaticOptions): Middleware;
9
+ export {};
@@ -0,0 +1,3 @@
1
+ import { ServerRoute } from '@modern-js/types';
2
+ import { ServerNodeMiddleware } from '../hono';
3
+ export declare function createInjectHtml(pwd: string, routes?: ServerRoute[]): ServerNodeMiddleware;
@@ -0,0 +1,12 @@
1
+ /// <reference types="node" />
2
+ import { Server as NodeServer } from 'node:http';
3
+ import { NodeRequest, NodeResponse } from '../../../core/plugin';
4
+ import { RequestHandler } from '../../../core/server';
5
+ export declare const createWebRequest: (req: NodeRequest, res: NodeResponse) => Request;
6
+ export declare const sendResponse: (response: Response, res: NodeResponse) => Promise<void>;
7
+ declare const getRequestListener: (handler: RequestHandler) => (req: NodeRequest, res: NodeResponse) => Promise<void>;
8
+ type NodeServerWrapper = NodeServer & {
9
+ getRequestHandler: () => ReturnType<typeof getRequestListener>;
10
+ };
11
+ export declare const createNodeServer: (handleRequest: RequestHandler) => NodeServerWrapper;
12
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from './install';
2
+ export * from './stream';
@@ -0,0 +1 @@
1
+ export declare const installGlobals: () => void;