@modern-js/server-core 2.49.4 → 2.49.5-alpha.1

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 (44) hide show
  1. package/dist/cjs/base/adapters/node/node.js +3 -3
  2. package/dist/cjs/base/index.js +2 -0
  3. package/dist/cjs/base/middlewares/customServer/index.js +48 -8
  4. package/dist/cjs/base/middlewares/customServer/loader.js +37 -0
  5. package/dist/cjs/base/middlewares/index.js +9 -0
  6. package/dist/cjs/base/middlewares/renderHandler/index.js +10 -2
  7. package/dist/cjs/base/middlewares/renderHandler/render.js +4 -3
  8. package/dist/cjs/base/middlewares/renderHandler/ssrCache.js +1 -1
  9. package/dist/cjs/base/middlewares/renderHandler/ssrRender.js +2 -1
  10. package/dist/cjs/base/utils/index.js +3 -3
  11. package/dist/cjs/base/utils/request.js +19 -6
  12. package/dist/esm/base/adapters/node/node.js +3 -3
  13. package/dist/esm/base/index.js +2 -1
  14. package/dist/esm/base/middlewares/customServer/index.js +122 -59
  15. package/dist/esm/base/middlewares/customServer/loader.js +13 -0
  16. package/dist/esm/base/middlewares/index.js +4 -0
  17. package/dist/esm/base/middlewares/renderHandler/index.js +75 -27
  18. package/dist/esm/base/middlewares/renderHandler/render.js +5 -4
  19. package/dist/esm/base/middlewares/renderHandler/ssrCache.js +1 -1
  20. package/dist/esm/base/middlewares/renderHandler/ssrRender.js +3 -2
  21. package/dist/esm/base/utils/index.js +1 -1
  22. package/dist/esm/base/utils/request.js +18 -6
  23. package/dist/esm-node/base/adapters/node/node.js +3 -3
  24. package/dist/esm-node/base/index.js +2 -1
  25. package/dist/esm-node/base/middlewares/customServer/index.js +46 -7
  26. package/dist/esm-node/base/middlewares/customServer/loader.js +13 -0
  27. package/dist/esm-node/base/middlewares/index.js +4 -0
  28. package/dist/esm-node/base/middlewares/renderHandler/index.js +11 -3
  29. package/dist/esm-node/base/middlewares/renderHandler/render.js +4 -3
  30. package/dist/esm-node/base/middlewares/renderHandler/ssrCache.js +1 -1
  31. package/dist/esm-node/base/middlewares/renderHandler/ssrRender.js +2 -1
  32. package/dist/esm-node/base/utils/index.js +1 -1
  33. package/dist/esm-node/base/utils/request.js +18 -6
  34. package/dist/types/base/adapters/node/node.d.ts +1 -1
  35. package/dist/types/base/index.d.ts +1 -1
  36. package/dist/types/base/middlewares/customServer/index.d.ts +2 -1
  37. package/dist/types/base/middlewares/customServer/loader.d.ts +10 -0
  38. package/dist/types/base/middlewares/index.d.ts +1 -0
  39. package/dist/types/base/middlewares/renderHandler/ssrRender.d.ts +2 -1
  40. package/dist/types/base/utils/index.d.ts +1 -1
  41. package/dist/types/base/utils/request.d.ts +7 -2
  42. package/dist/types/core/plugin.d.ts +8 -8
  43. package/dist/types/core/render.d.ts +1 -0
  44. package/package.json +5 -5
@@ -1,14 +1,15 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
2
  import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
3
+ import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
3
4
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
4
5
  import { checkIsProd, sortRoutes, getRuntimeEnv } from "../../utils";
5
6
  import { initReporter } from "../monitor";
6
- import { CustomServer } from "../customServer";
7
+ import { CustomServer, getLoaderCtx } from "../customServer";
7
8
  import { createRender } from "./render";
8
9
  function createRenderHandler(render) {
9
10
  return function() {
10
11
  var _ref = _async_to_generator(function(c, _) {
11
- var _c_env_node, logger, reporter, templates, serverManifest, locals, metrics, request, nodeReq, res, body, status, headers, headersData;
12
+ var _c_env_node, logger, reporter, templates, serverManifest, locals, metrics, loaderContext, request, nodeReq, res, body, status, headers, headersData;
12
13
  return _ts_generator(this, function(_state) {
13
14
  switch (_state.label) {
14
15
  case 0:
@@ -18,6 +19,7 @@ function createRenderHandler(render) {
18
19
  serverManifest = c.get("serverManifest") || {};
19
20
  locals = c.get("locals");
20
21
  metrics = c.get("metrics");
22
+ loaderContext = getLoaderCtx(c);
21
23
  request = c.req.raw;
22
24
  nodeReq = (_c_env_node = c.env.node) === null || _c_env_node === void 0 ? void 0 : _c_env_node.req;
23
25
  return [
@@ -29,6 +31,7 @@ function createRenderHandler(render) {
29
31
  templates,
30
32
  metrics,
31
33
  serverManifest,
34
+ loaderContext,
32
35
  locals
33
36
  })
34
37
  ];
@@ -114,7 +117,7 @@ function bindRenderHandler(server, options) {
114
117
  }
115
118
  function _bindRenderHandler() {
116
119
  _bindRenderHandler = _async_to_generator(function(server, options) {
117
- var routes, pwd, disableCustomHook, runner, customServer, cacheModuleName, ssrCache, pageRoutes, render, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, route, originUrlPath, entryName, urlPath, customServerHookMiddleware, customServerMiddleware;
120
+ var routes, pwd, disableCustomHook, runner, customServer, cacheModuleName, ssrCache, pageRoutes, render, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, route, originUrlPath, entryName, urlPath, customServerHookMiddleware, customServerMiddleware, _server, err;
118
121
  return _ts_generator(this, function(_state) {
119
122
  switch (_state.label) {
120
123
  case 0:
@@ -123,7 +126,7 @@ function _bindRenderHandler() {
123
126
  if (!(routes && routes.length > 0))
124
127
  return [
125
128
  3,
126
- 5
129
+ 12
127
130
  ];
128
131
  customServer = new CustomServer(runner, server, pwd);
129
132
  if (!(getRuntimeEnv() === "node"))
@@ -156,34 +159,79 @@ function _bindRenderHandler() {
156
159
  case 4:
157
160
  render = _state.sent();
158
161
  _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
159
- try {
160
- for (_iterator = pageRoutes[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
161
- route = _step.value;
162
- originUrlPath = route.urlPath, entryName = route.entryName;
163
- urlPath = originUrlPath.endsWith("/") ? "".concat(originUrlPath, "*") : "".concat(originUrlPath, "/*");
164
- customServerHookMiddleware = customServer.getHookMiddleware(entryName || "main", routes);
165
- server.use(urlPath, initReporter(entryName));
166
- !disableCustomHook && server.use(urlPath, customServerHookMiddleware);
167
- customServerMiddleware = customServer.getServerMiddleware();
162
+ _state.label = 5;
163
+ case 5:
164
+ _state.trys.push([
165
+ 5,
166
+ 10,
167
+ 11,
168
+ 12
169
+ ]);
170
+ _iterator = pageRoutes[Symbol.iterator]();
171
+ _state.label = 6;
172
+ case 6:
173
+ if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done))
174
+ return [
175
+ 3,
176
+ 9
177
+ ];
178
+ route = _step.value;
179
+ originUrlPath = route.urlPath, entryName = route.entryName;
180
+ urlPath = originUrlPath.endsWith("/") ? "".concat(originUrlPath, "*") : "".concat(originUrlPath, "/*");
181
+ customServerHookMiddleware = customServer.getHookMiddleware(entryName || "main", routes);
182
+ server.use(urlPath, initReporter(entryName));
183
+ !disableCustomHook && server.use(urlPath, customServerHookMiddleware);
184
+ return [
185
+ 4,
186
+ customServer.getServerMiddleware()
187
+ ];
188
+ case 7:
189
+ customServerMiddleware = _state.sent();
190
+ if (customServerMiddleware) {
191
+ if (Array.isArray(customServerMiddleware)) {
192
+ ;
193
+ (_server = server).use.apply(_server, [
194
+ urlPath
195
+ ].concat(_to_consumable_array(customServerMiddleware)));
196
+ } else {
168
197
  server.use(urlPath, customServerMiddleware);
169
- render && server.all(urlPath, createRenderHandler(render));
170
198
  }
171
- } catch (err) {
172
- _didIteratorError = true;
173
- _iteratorError = err;
199
+ }
200
+ render && server.all(urlPath, createRenderHandler(render));
201
+ _state.label = 8;
202
+ case 8:
203
+ _iteratorNormalCompletion = true;
204
+ return [
205
+ 3,
206
+ 6
207
+ ];
208
+ case 9:
209
+ return [
210
+ 3,
211
+ 12
212
+ ];
213
+ case 10:
214
+ err = _state.sent();
215
+ _didIteratorError = true;
216
+ _iteratorError = err;
217
+ return [
218
+ 3,
219
+ 12
220
+ ];
221
+ case 11:
222
+ try {
223
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
224
+ _iterator.return();
225
+ }
174
226
  } finally {
175
- try {
176
- if (!_iteratorNormalCompletion && _iterator.return != null) {
177
- _iterator.return();
178
- }
179
- } finally {
180
- if (_didIteratorError) {
181
- throw _iteratorError;
182
- }
227
+ if (_didIteratorError) {
228
+ throw _iteratorError;
183
229
  }
184
230
  }
185
- _state.label = 5;
186
- case 5:
231
+ return [
232
+ 7
233
+ ];
234
+ case 12:
187
235
  return [
188
236
  2
189
237
  ];
@@ -3,8 +3,8 @@ import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
3
3
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
4
4
  import { cutNameByHyphen } from "@modern-js/utils/universal";
5
5
  import { TrieRouter } from "hono/router/trie-router";
6
+ import { parseQuery, getPathname, createErrorHtml, sortRoutes, transformResponse, onError as onErrorFn, ErrorDigest } from "../../utils";
6
7
  import { REPLACE_REG } from "../../../base/constants";
7
- import { createErrorHtml, sortRoutes, parseQuery, transformResponse, getPathname, onError as onErrorFn, ErrorDigest } from "../../utils";
8
8
  import { dataHandler } from "./dataHandler";
9
9
  import { ssrRender } from "./ssrRender";
10
10
  function getRouter(routes) {
@@ -53,11 +53,11 @@ function _createRender() {
53
53
  2,
54
54
  function() {
55
55
  var _ref = _async_to_generator(function(req, param2) {
56
- var logger, nodeReq, reporter, templates, serverManifest, locals, metrics, _matchRoute, routeInfo, params, onFallback, html, renderMode, onError, renderOptions, response;
56
+ var logger, nodeReq, reporter, templates, serverManifest, locals, metrics, loaderContext, _matchRoute, routeInfo, params, onFallback, html, renderMode, onError, renderOptions, response;
57
57
  return _ts_generator(this, function(_state2) {
58
58
  switch (_state2.label) {
59
59
  case 0:
60
- logger = param2.logger, nodeReq = param2.nodeReq, reporter = param2.reporter, templates = param2.templates, serverManifest = param2.serverManifest, locals = param2.locals, metrics = param2.metrics;
60
+ logger = param2.logger, nodeReq = param2.nodeReq, reporter = param2.reporter, templates = param2.templates, serverManifest = param2.serverManifest, locals = param2.locals, metrics = param2.metrics, loaderContext = param2.loaderContext;
61
61
  _matchRoute = _sliced_to_array(matchRoute(router, req), 2), routeInfo = _matchRoute[0], params = _matchRoute[1];
62
62
  onFallback = function() {
63
63
  var _ref2 = _async_to_generator(function(reason, error) {
@@ -141,7 +141,8 @@ function _createRender() {
141
141
  params,
142
142
  locals,
143
143
  serverManifest,
144
- metrics
144
+ metrics,
145
+ loaderContext: loaderContext || /* @__PURE__ */ new Map()
145
146
  };
146
147
  switch (renderMode) {
147
148
  case "data":
@@ -6,8 +6,8 @@ import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
6
6
  import { Readable } from "stream";
7
7
  import { SERVER_DIR, requireExistModule } from "@modern-js/utils";
8
8
  import { createMemoryStorage } from "@modern-js/runtime-utils/storer";
9
- import { createReadableStreamFromReadable } from "../../adapters/node/polyfills/stream";
10
9
  import { createTransformStream, getPathname } from "../../utils";
10
+ import { createReadableStreamFromReadable } from "../../adapters/node/polyfills/stream";
11
11
  var CacheManager = /* @__PURE__ */ function() {
12
12
  "use strict";
13
13
  function CacheManager2(container) {
@@ -24,11 +24,11 @@ function ssrRender(request, _) {
24
24
  }
25
25
  function _ssrRender() {
26
26
  _ssrRender = _async_to_generator(function(request, param) {
27
- var routeInfo, html, staticGenerate, nonce, metaName, reporter, logger, nodeReq, serverManifest, locals, params, metrics, _serverManifest_renderBundles, entryName, loadableStats, routeManifest, host, isSpider, responseProxy, query, headers, key, ssrContext, renderBundle, runtimeEnv, ssrResult, cacheStatus, render, cacheModuleName, ssrCache, incomingMessage, cacheControl, _ref, data, status, redirection, headers1, Readable, streamModule, createReadableStreamFromReadable, _tmp, data1;
27
+ var routeInfo, html, staticGenerate, nonce, metaName, reporter, logger, nodeReq, serverManifest, locals, params, metrics, loaderContext, _serverManifest_renderBundles, entryName, loadableStats, routeManifest, host, isSpider, responseProxy, query, headers, key, ssrContext, renderBundle, runtimeEnv, ssrResult, cacheStatus, render, cacheModuleName, ssrCache, incomingMessage, cacheControl, _ref, data, status, redirection, headers1, Readable, streamModule, createReadableStreamFromReadable, _tmp, data1;
28
28
  return _ts_generator(this, function(_state) {
29
29
  switch (_state.label) {
30
30
  case 0:
31
- routeInfo = param.routeInfo, html = param.html, staticGenerate = param.staticGenerate, nonce = param.nonce, metaName = param.metaName, reporter = param.reporter, logger = param.logger, nodeReq = param.nodeReq, serverManifest = param.serverManifest, locals = param.locals, params = param.params, metrics = param.metrics;
31
+ routeInfo = param.routeInfo, html = param.html, staticGenerate = param.staticGenerate, nonce = param.nonce, metaName = param.metaName, reporter = param.reporter, logger = param.logger, nodeReq = param.nodeReq, serverManifest = param.serverManifest, locals = param.locals, params = param.params, metrics = param.metrics, loaderContext = param.loaderContext;
32
32
  entryName = routeInfo.entryName;
33
33
  loadableStats = serverManifest.loadableStats || {};
34
34
  routeManifest = serverManifest.routeManifest || {};
@@ -66,6 +66,7 @@ function _ssrRender() {
66
66
  redirection: {},
67
67
  template: html,
68
68
  loadableStats,
69
+ loaderContext,
69
70
  routeManifest,
70
71
  entryName,
71
72
  staticGenerate,
@@ -1,7 +1,7 @@
1
1
  export * from "./env";
2
- export * from "./request";
3
2
  export * from "./transformStream";
4
3
  export * from "./middlewareCollector";
5
4
  export * from "./error";
6
5
  export * from "./warmup";
7
6
  export * from "./entry";
7
+ export * from "./request";
@@ -1,12 +1,12 @@
1
1
  import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
2
- function parseQuery(request) {
3
- var url = request.url;
4
- var q = url.split("?")[1];
2
+ function parseQuery(req) {
5
3
  var query = {};
4
+ var url = req.url;
5
+ var q = url.split("?")[1];
6
6
  if (q) {
7
- q.split("&").forEach(function(item) {
8
- var _item_split = _sliced_to_array(item.split("="), 2), key = _item_split[0], value = _item_split[1];
9
- query[key] = value;
7
+ var search = new URLSearchParams(q);
8
+ search.forEach(function(v, k) {
9
+ query[k] = v;
10
10
  });
11
11
  }
12
12
  return query;
@@ -31,9 +31,21 @@ function getHost(request) {
31
31
  host = (host === null || host === void 0 ? void 0 : host.split(/\s*,\s*/, 1)[0]) || "undefined";
32
32
  return host;
33
33
  }
34
+ function parseCookie(req) {
35
+ var _cookie = req.headers.get("Cookie");
36
+ var cookie = {};
37
+ _cookie === null || _cookie === void 0 ? void 0 : _cookie.trim().split(";").forEach(function(item) {
38
+ var _item_trim_split = _sliced_to_array(item.trim().split("="), 2), k = _item_trim_split[0], v = _item_trim_split[1];
39
+ if (k) {
40
+ cookie[k] = v;
41
+ }
42
+ });
43
+ return cookie;
44
+ }
34
45
  export {
35
46
  getHost,
36
47
  getPathname,
48
+ parseCookie,
37
49
  parseHeaders,
38
50
  parseQuery
39
51
  };
@@ -2,7 +2,7 @@ import { ServerResponse } from "node:http";
2
2
  import { createReadableStreamFromReadable, writeReadableStreamToWritable } from "./polyfills/stream";
3
3
  import { installGlobals } from "./polyfills/install";
4
4
  installGlobals();
5
- const createWebRequest = (req, res) => {
5
+ const createWebRequest = (req, res, body) => {
6
6
  var _req_url;
7
7
  const headerRecord = [];
8
8
  const len = req.rawHeaders.length;
@@ -20,8 +20,8 @@ const createWebRequest = (req, res) => {
20
20
  signal: controller.signal
21
21
  };
22
22
  res.on("close", () => controller.abort());
23
- if (!(method === "GET" || method === "HEAD") && ((_req_url = req.url) === null || _req_url === void 0 ? void 0 : _req_url.includes("__loader"))) {
24
- init.body = createReadableStreamFromReadable(req);
23
+ if (body || !(method === "GET" || method === "HEAD") && ((_req_url = req.url) === null || _req_url === void 0 ? void 0 : _req_url.includes("__loader"))) {
24
+ init.body = body !== null && body !== void 0 ? body : createReadableStreamFromReadable(req);
25
25
  init.duplex = "half";
26
26
  }
27
27
  const url = `http://${req.headers.host}${req.url}`;
@@ -1,6 +1,6 @@
1
1
  import { createErrorHtml, onError, ErrorDigest } from "./utils";
2
2
  import { AGGRED_DIR } from "./constants";
3
- import { favionFallbackMiddleware, injectReporter, injectLogger, getRenderHandler, bindRenderHandler, logHandler, processedBy } from "./middlewares";
3
+ import { favionFallbackMiddleware, injectReporter, injectLogger, getRenderHandler, bindRenderHandler, logHandler, processedBy, getLoaderCtx } from "./middlewares";
4
4
  import { createServerBase } from "./serverBase";
5
5
  export {
6
6
  AGGRED_DIR,
@@ -9,6 +9,7 @@ export {
9
9
  createErrorHtml,
10
10
  createServerBase,
11
11
  favionFallbackMiddleware,
12
+ getLoaderCtx,
12
13
  getRenderHandler,
13
14
  injectLogger,
14
15
  injectReporter,
@@ -1,8 +1,10 @@
1
1
  import { time } from "@modern-js/runtime-utils/time";
2
2
  import { transformResponse } from "../../utils";
3
3
  import { ServerReportTimings } from "../../constants";
4
+ import { getLoaderCtx } from "./loader";
4
5
  import { getAfterMatchCtx, getAfterRenderCtx, createCustomMiddlewaresCtx, createAfterStreamingRenderContext } from "./context";
5
6
  import { createBaseHookContext } from "./base";
7
+ import { getLoaderCtx as getLoaderCtx2 } from "./loader";
6
8
  const noop = () => {
7
9
  };
8
10
  const isHtmlResponse = (response) => {
@@ -70,13 +72,16 @@ class CustomServer {
70
72
  }
71
73
  };
72
74
  }
73
- getServerMiddleware() {
75
+ async getServerMiddleware() {
76
+ const serverMiddleware = await this.serverMiddlewarePromise;
77
+ if (!serverMiddleware) {
78
+ return;
79
+ }
80
+ if (Array.isArray(serverMiddleware)) {
81
+ return getUnstableMiddlewares(serverMiddleware);
82
+ }
74
83
  return async (c, next) => {
75
84
  var _c_env;
76
- const serverMiddleware = await this.serverMiddlewarePromise;
77
- if (!serverMiddleware) {
78
- return next();
79
- }
80
85
  const reporter = c.get("reporter");
81
86
  const locals = {};
82
87
  const resArgs = {
@@ -109,7 +114,7 @@ class CustomServer {
109
114
  middleware: webExtension
110
115
  }
111
116
  }, {
112
- onLast: () => null
117
+ onLast: () => []
113
118
  });
114
119
  }
115
120
  }
@@ -121,6 +126,40 @@ function isRedirect(headers, code) {
121
126
  308
122
127
  ].includes(code || 0) || headers.get("Location");
123
128
  }
129
+ function getUnstableMiddlewares(serverMiddleware) {
130
+ return serverMiddleware.map((middleware) => {
131
+ return async (c, next) => {
132
+ const context = createMiddlewareContextFromHono(c);
133
+ return middleware(context, next);
134
+ };
135
+ });
136
+ }
137
+ function createMiddlewareContextFromHono(c) {
138
+ const loaderContext = getLoaderCtx(c);
139
+ return {
140
+ get request() {
141
+ return c.req.raw;
142
+ },
143
+ get response() {
144
+ return c.res;
145
+ },
146
+ set response(newRes) {
147
+ c.res = newRes;
148
+ },
149
+ get(key) {
150
+ return loaderContext.get(key);
151
+ },
152
+ set(key, value) {
153
+ return loaderContext.set(key, value);
154
+ },
155
+ status: c.status.bind(c),
156
+ header: c.header.bind(c),
157
+ body: c.body.bind(c),
158
+ html: c.html.bind(c),
159
+ redirect: c.redirect.bind(c)
160
+ };
161
+ }
124
162
  export {
125
- CustomServer
163
+ CustomServer,
164
+ getLoaderCtx2 as getLoaderCtx
126
165
  };
@@ -0,0 +1,13 @@
1
+ function getLoaderCtx(c) {
2
+ const loaderContext = c.get("loaderContext");
3
+ if (loaderContext) {
4
+ return loaderContext;
5
+ } else {
6
+ const loaderContext2 = /* @__PURE__ */ new Map();
7
+ c.set("loaderContext", loaderContext2);
8
+ return loaderContext2;
9
+ }
10
+ }
11
+ export {
12
+ getLoaderCtx
13
+ };
@@ -3,3 +3,7 @@ export * from "./monitor";
3
3
  export * from "./renderHandler";
4
4
  export * from "./logger";
5
5
  export * from "./frameworkHeader";
6
+ import { getLoaderCtx } from "./customServer";
7
+ export {
8
+ getLoaderCtx
9
+ };
@@ -1,6 +1,6 @@
1
1
  import { checkIsProd, sortRoutes, getRuntimeEnv } from "../../utils";
2
2
  import { initReporter } from "../monitor";
3
- import { CustomServer } from "../customServer";
3
+ import { CustomServer, getLoaderCtx } from "../customServer";
4
4
  import { createRender } from "./render";
5
5
  function createRenderHandler(render) {
6
6
  return async (c, _) => {
@@ -11,6 +11,7 @@ function createRenderHandler(render) {
11
11
  const serverManifest = c.get("serverManifest") || {};
12
12
  const locals = c.get("locals");
13
13
  const metrics = c.get("metrics");
14
+ const loaderContext = getLoaderCtx(c);
14
15
  const request = c.req.raw;
15
16
  const nodeReq = (_c_env_node = c.env.node) === null || _c_env_node === void 0 ? void 0 : _c_env_node.req;
16
17
  const res = await render(request, {
@@ -20,6 +21,7 @@ function createRenderHandler(render) {
20
21
  templates,
21
22
  metrics,
22
23
  serverManifest,
24
+ loaderContext,
23
25
  locals
24
26
  });
25
27
  const { body, status, headers } = res;
@@ -74,8 +76,14 @@ async function bindRenderHandler(server, options) {
74
76
  const customServerHookMiddleware = customServer.getHookMiddleware(entryName || "main", routes);
75
77
  server.use(urlPath, initReporter(entryName));
76
78
  !disableCustomHook && server.use(urlPath, customServerHookMiddleware);
77
- const customServerMiddleware = customServer.getServerMiddleware();
78
- server.use(urlPath, customServerMiddleware);
79
+ const customServerMiddleware = await customServer.getServerMiddleware();
80
+ if (customServerMiddleware) {
81
+ if (Array.isArray(customServerMiddleware)) {
82
+ server.use(urlPath, ...customServerMiddleware);
83
+ } else {
84
+ server.use(urlPath, customServerMiddleware);
85
+ }
86
+ }
79
87
  render && server.all(urlPath, createRenderHandler(render));
80
88
  }
81
89
  }
@@ -1,7 +1,7 @@
1
1
  import { cutNameByHyphen } from "@modern-js/utils/universal";
2
2
  import { TrieRouter } from "hono/router/trie-router";
3
+ import { parseQuery, getPathname, createErrorHtml, sortRoutes, transformResponse, onError as onErrorFn, ErrorDigest } from "../../utils";
3
4
  import { REPLACE_REG } from "../../../base/constants";
4
- import { createErrorHtml, sortRoutes, parseQuery, transformResponse, getPathname, onError as onErrorFn, ErrorDigest } from "../../utils";
5
5
  import { dataHandler } from "./dataHandler";
6
6
  import { ssrRender } from "./ssrRender";
7
7
  function getRouter(routes) {
@@ -22,7 +22,7 @@ function matchRoute(router, request) {
22
22
  }
23
23
  async function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce, onFallback: onFallbackFn }) {
24
24
  const router = getRouter(routes);
25
- return async (req, { logger, nodeReq, reporter, templates, serverManifest, locals, metrics }) => {
25
+ return async (req, { logger, nodeReq, reporter, templates, serverManifest, locals, metrics, loaderContext }) => {
26
26
  const [routeInfo, params] = matchRoute(router, req);
27
27
  const onFallback = async (reason, error) => {
28
28
  return onFallbackFn === null || onFallbackFn === void 0 ? void 0 : onFallbackFn(reason, {
@@ -67,7 +67,8 @@ async function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, n
67
67
  params,
68
68
  locals,
69
69
  serverManifest,
70
- metrics
70
+ metrics,
71
+ loaderContext: loaderContext || /* @__PURE__ */ new Map()
71
72
  };
72
73
  switch (renderMode) {
73
74
  case "data":
@@ -1,8 +1,8 @@
1
1
  import { Readable } from "stream";
2
2
  import { SERVER_DIR, requireExistModule } from "@modern-js/utils";
3
3
  import { createMemoryStorage } from "@modern-js/runtime-utils/storer";
4
- import { createReadableStreamFromReadable } from "../../adapters/node/polyfills/stream";
5
4
  import { createTransformStream, getPathname } from "../../utils";
5
+ import { createReadableStreamFromReadable } from "../../adapters/node/polyfills/stream";
6
6
  class CacheManager {
7
7
  async getCacheResult(req, cacheControl, render, ssrContext) {
8
8
  const key = this.computedKey(req, cacheControl);
@@ -15,7 +15,7 @@ const defaultReporter = {
15
15
  reportWarn() {
16
16
  }
17
17
  };
18
- async function ssrRender(request, { routeInfo, html, staticGenerate, nonce, metaName, reporter, logger, nodeReq, serverManifest, locals, params, metrics }) {
18
+ async function ssrRender(request, { routeInfo, html, staticGenerate, nonce, metaName, reporter, logger, nodeReq, serverManifest, locals, params, metrics, loaderContext }) {
19
19
  var _serverManifest_renderBundles;
20
20
  const { entryName } = routeInfo;
21
21
  const loadableStats = serverManifest.loadableStats || {};
@@ -54,6 +54,7 @@ async function ssrRender(request, { routeInfo, html, staticGenerate, nonce, meta
54
54
  redirection: {},
55
55
  template: html,
56
56
  loadableStats,
57
+ loaderContext,
57
58
  routeManifest,
58
59
  entryName,
59
60
  staticGenerate,
@@ -1,7 +1,7 @@
1
1
  export * from "./env";
2
- export * from "./request";
3
2
  export * from "./transformStream";
4
3
  export * from "./middlewareCollector";
5
4
  export * from "./error";
6
5
  export * from "./warmup";
7
6
  export * from "./entry";
7
+ export * from "./request";
@@ -1,11 +1,11 @@
1
- function parseQuery(request) {
2
- const { url } = request;
3
- const q = url.split("?")[1];
1
+ function parseQuery(req) {
4
2
  const query = {};
3
+ const { url } = req;
4
+ const q = url.split("?")[1];
5
5
  if (q) {
6
- q.split("&").forEach((item) => {
7
- const [key, value] = item.split("=");
8
- query[key] = value;
6
+ const search = new URLSearchParams(q);
7
+ search.forEach((v, k) => {
8
+ query[k] = v;
9
9
  });
10
10
  }
11
11
  return query;
@@ -30,9 +30,21 @@ function getHost(request) {
30
30
  host = (host === null || host === void 0 ? void 0 : host.split(/\s*,\s*/, 1)[0]) || "undefined";
31
31
  return host;
32
32
  }
33
+ function parseCookie(req) {
34
+ const _cookie = req.headers.get("Cookie");
35
+ const cookie = {};
36
+ _cookie === null || _cookie === void 0 ? void 0 : _cookie.trim().split(";").forEach((item) => {
37
+ const [k, v] = item.trim().split("=");
38
+ if (k) {
39
+ cookie[k] = v;
40
+ }
41
+ });
42
+ return cookie;
43
+ }
33
44
  export {
34
45
  getHost,
35
46
  getPathname,
47
+ parseCookie,
36
48
  parseHeaders,
37
49
  parseQuery
38
50
  };
@@ -4,7 +4,7 @@ import { Server as NodeServer } from 'node:http';
4
4
  import type { Server as NodeHttpsServer } from 'node:https';
5
5
  import { NodeRequest, NodeResponse } from '../../../core/plugin';
6
6
  import { RequestHandler } from '../../../core/server';
7
- export declare const createWebRequest: (req: NodeRequest, res: NodeResponse) => Request;
7
+ export declare const createWebRequest: (req: NodeRequest, res: NodeResponse, body?: BodyInit) => Request;
8
8
  export declare const sendResponse: (response: Response, res: NodeResponse) => Promise<void>;
9
9
  declare const getRequestListener: (handler: RequestHandler) => (req: NodeRequest, res: NodeResponse) => Promise<void>;
10
10
  type NodeServerWrapper = (NodeServer | NodeHttpsServer) & {
@@ -1,6 +1,6 @@
1
1
  export { createErrorHtml, onError, ErrorDigest } from './utils';
2
2
  export { AGGRED_DIR } from './constants';
3
- export { favionFallbackMiddleware, injectReporter, injectLogger, getRenderHandler, bindRenderHandler, logHandler, processedBy, } from './middlewares';
3
+ export { favionFallbackMiddleware, injectReporter, injectLogger, getRenderHandler, bindRenderHandler, logHandler, processedBy, getLoaderCtx, } from './middlewares';
4
4
  export type { BindRenderHandleOptions } from './middlewares';
5
5
  export type { ServerBase, ServerBaseOptions } from './serverBase';
6
6
  export { createServerBase } from './serverBase';
@@ -3,11 +3,12 @@ import { ServerBase } from '../../serverBase';
3
3
  import { ServerHookRunner } from '../../../core/plugin';
4
4
  import { Middleware, ServerEnv } from '../../../core/server';
5
5
  import type { ServerNodeEnv } from '../../adapters/node/hono';
6
+ export { getLoaderCtx } from './loader';
6
7
  export declare class CustomServer {
7
8
  private runner;
8
9
  private serverMiddlewarePromise;
9
10
  private serverBase;
10
11
  constructor(runner: ServerHookRunner, serverBase: ServerBase, pwd: string);
11
12
  getHookMiddleware(entryName: string, routes: ServerRoute[]): Middleware<ServerEnv>;
12
- getServerMiddleware(): Middleware<ServerNodeEnv & ServerEnv>;
13
+ getServerMiddleware(): Promise<Middleware<ServerNodeEnv & ServerEnv> | Array<Middleware<ServerNodeEnv & ServerEnv>> | undefined>;
13
14
  }
@@ -0,0 +1,10 @@
1
+ import type { Context } from '../../../core/server';
2
+ type LoaderContext = Map<string, unknown>;
3
+ type Var = {
4
+ loaderContext: LoaderContext;
5
+ };
6
+ interface Env {
7
+ Variables: Var;
8
+ }
9
+ export declare function getLoaderCtx(c: Context<Env>): LoaderContext;
10
+ export {};
@@ -3,3 +3,4 @@ export * from './monitor';
3
3
  export * from './renderHandler';
4
4
  export * from './logger';
5
5
  export * from './frameworkHeader';
6
+ export { getLoaderCtx } from './customServer';
@@ -11,6 +11,7 @@ export interface SSRRenderOptions {
11
11
  metaName: string;
12
12
  logger: Logger;
13
13
  serverManifest: ServerManifest;
14
+ loaderContext: Map<string, unknown>;
14
15
  params: Params;
15
16
  /** Produce by custom server hook */
16
17
  locals?: Record<string, any>;
@@ -19,5 +20,5 @@ export interface SSRRenderOptions {
19
20
  nodeReq?: IncomingMessage;
20
21
  nonce?: string;
21
22
  }
22
- export declare function ssrRender(request: Request, { routeInfo, html, staticGenerate, nonce, metaName, reporter, logger, nodeReq, serverManifest, locals, params, metrics, }: SSRRenderOptions): Promise<Response>;
23
+ export declare function ssrRender(request: Request, { routeInfo, html, staticGenerate, nonce, metaName, reporter, logger, nodeReq, serverManifest, locals, params, metrics, loaderContext, }: SSRRenderOptions): Promise<Response>;
23
24
  export declare function getPathnameFromNodeReq(nodeReq: IncomingMessage): string;
@@ -1,7 +1,7 @@
1
1
  export * from './env';
2
- export * from './request';
3
2
  export * from './transformStream';
4
3
  export * from './middlewareCollector';
5
4
  export * from './error';
6
5
  export * from './warmup';
7
6
  export * from './entry';
7
+ export * from './request';