@bleedingdev/modern-js-server-core 3.9.0-ultramodern.9 → 3.9.3-ultramodern.2

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 (35) hide show
  1. package/dist/cjs/adapters/node/hono.js +25 -16
  2. package/dist/cjs/adapters/node/node.js +3 -1
  3. package/dist/cjs/adapters/node/plugins/static.js +1 -1
  4. package/dist/cjs/helper.js +1 -1
  5. package/dist/cjs/plugins/log.js +2 -1
  6. package/dist/cjs/plugins/render/render.js +4 -4
  7. package/dist/cjs/plugins/render/ssrCache.js +96 -52
  8. package/dist/cjs/serverBase.js +2 -2
  9. package/dist/cjs/utils/transformStream.js +1 -1
  10. package/dist/esm/adapters/node/hono.mjs +25 -16
  11. package/dist/esm/adapters/node/node.mjs +3 -1
  12. package/dist/esm/adapters/node/plugins/static.mjs +1 -1
  13. package/dist/esm/helper.mjs +1 -1
  14. package/dist/esm/plugins/log.mjs +2 -1
  15. package/dist/esm/plugins/render/render.mjs +5 -11
  16. package/dist/esm/plugins/render/ssrCache.mjs +96 -52
  17. package/dist/esm/serverBase.mjs +2 -2
  18. package/dist/esm/utils/transformStream.mjs +1 -1
  19. package/dist/esm-node/adapters/node/hono.mjs +25 -16
  20. package/dist/esm-node/adapters/node/node.mjs +3 -1
  21. package/dist/esm-node/adapters/node/plugins/static.mjs +1 -1
  22. package/dist/esm-node/helper.mjs +1 -1
  23. package/dist/esm-node/plugins/log.mjs +2 -1
  24. package/dist/esm-node/plugins/render/render.mjs +5 -11
  25. package/dist/esm-node/plugins/render/ssrCache.mjs +96 -52
  26. package/dist/esm-node/serverBase.mjs +2 -2
  27. package/dist/esm-node/utils/transformStream.mjs +1 -1
  28. package/dist/types/adapters/node/plugins/static.d.ts +2 -2
  29. package/dist/types/types/config/bff.d.ts +1 -1
  30. package/dist/types/types/config/server.d.ts +8 -3
  31. package/dist/types/types/config/source.d.ts +1 -1
  32. package/dist/types/types/server.d.ts +2 -0
  33. package/package.json +22 -14
  34. package/dist/esm/rslib-runtime~1.mjs +0 -18
  35. package/dist/esm-node/rslib-runtime~0.mjs +0 -19
@@ -63,29 +63,38 @@ const httpCallBack2HonoMid = (handler)=>async (context, next)=>{
63
63
  } else await next();
64
64
  };
65
65
  const noop = ()=>{};
66
- const connectMid2HonoMid = (handler)=>async (context, next)=>new Promise((resolve, reject)=>{
67
- const { req, res } = context.env.node;
68
- if (handler.length < 3) resolve(handler(req, res, noop));
69
- else handler(req, res, (err)=>{
66
+ const connectMid2HonoMid = (handler)=>async (context, next)=>{
67
+ const { req, res: rawRes } = context.env.node;
68
+ const res = rawRes;
69
+ if (handler.length < 3) return handler(req, res, noop);
70
+ const continueChain = await new Promise((resolve, reject)=>{
71
+ const onFinish = ()=>{
72
+ context.res;
73
+ context.finalized = true;
74
+ resolve(false);
75
+ };
76
+ res.once?.('finish', onFinish);
77
+ handler(req, res, (err)=>{
78
+ res.removeListener?.('finish', onFinish);
70
79
  if (err) reject(err);
71
- else resolve(next());
80
+ else resolve(true);
72
81
  });
73
82
  });
74
- const connectMockMid2HonoMid = (handler)=>async (context, next)=>new Promise((resolve, reject)=>{
83
+ if (continueChain) await next();
84
+ };
85
+ const connectMockMid2HonoMid = (handler)=>{
86
+ if (handler.length >= 3) return connectMid2HonoMid(handler);
87
+ return async (context, _next)=>new Promise((resolve)=>{
75
88
  const { req, res: rawRes } = context.env.node;
76
89
  const res = rawRes;
77
- if (handler.length < 3) {
78
- res.once?.('finish', ()=>{
79
- context.res;
80
- context.finalized = true;
81
- resolve();
82
- });
83
- handler(req, res, noop);
84
- } else handler(req, res, (err)=>{
85
- if (err) reject(err);
86
- else resolve(next());
90
+ res.once?.('finish', ()=>{
91
+ context.res;
92
+ context.finalized = true;
93
+ resolve();
87
94
  });
95
+ handler(req, res, noop);
88
96
  });
97
+ };
89
98
  exports.connectMid2HonoMid = __webpack_exports__.connectMid2HonoMid;
90
99
  exports.connectMockMid2HonoMid = __webpack_exports__.connectMockMid2HonoMid;
91
100
  exports.httpCallBack2HonoMid = __webpack_exports__.httpCallBack2HonoMid;
@@ -68,7 +68,9 @@ const createWebRequest = (req, res, body)=>{
68
68
  headers: headerRecord,
69
69
  signal: controller.signal
70
70
  };
71
- res.on('close', ()=>controller.abort('res closed'));
71
+ res.on('close', ()=>{
72
+ if (!res.writableFinished || req.aborted) controller.abort('res closed');
73
+ });
72
74
  const protocol = 'encrypted' in req.socket && req.socket.encrypted ? 'https' : 'http';
73
75
  const authority = req.headers[':authority'] ?? req.headers.host;
74
76
  const url = `${protocol}://${authority}${req.url}`;
@@ -199,7 +199,7 @@ function createStaticMiddleware(options) {
199
199
  respondAsset: options.respondAsset,
200
200
  respondPublicFallback: options.respondPublicFallback
201
201
  })(c, next);
202
- {
202
+ else {
203
203
  const filepath = external_path_default().join(pwd, pathname.replace(pathPrefix, ()=>''));
204
204
  if (!isPathInside(filepath, pwd)) return next();
205
205
  if (!await utils_namespaceObject.fs.pathExists(filepath)) return next();
@@ -31,7 +31,7 @@ const LOADER_CONTEXT = 'loaderContext';
31
31
  function getLoaderCtx(c) {
32
32
  const loaderContext = c.get(LOADER_CONTEXT);
33
33
  if (loaderContext) return loaderContext;
34
- {
34
+ else {
35
35
  const loaderContext = new Map();
36
36
  c.set(LOADER_CONTEXT, loaderContext);
37
37
  return loaderContext;
@@ -72,7 +72,8 @@ function logHandler() {
72
72
  log(logFn, "<--", method, path);
73
73
  const start = Date.now();
74
74
  await next();
75
- log(logFn, "-->", method, path, c?.env?.node?.res?.statusCode ?? c.res.status, time(start));
75
+ const nodeRes = c?.env?.node?.res;
76
+ log(logFn, "-->", method, path, nodeRes?.headersSent ? nodeRes.statusCode : c.res.status, time(start));
76
77
  };
77
78
  }
78
79
  const logPlugin = ()=>({
@@ -87,8 +87,7 @@ var __webpack_exports__ = {};
87
87
  void 0,
88
88
  {}
89
89
  ];
90
- }
91
- {
90
+ } else {
92
91
  const result = matchedRoutes[0];
93
92
  if (!result) return [
94
93
  void 0,
@@ -113,6 +112,7 @@ var __webpack_exports__ = {};
113
112
  return async (req, { monitors, nodeReq, templates, serverManifest, rscClientManifest, rscSSRManifest, rscServerManifest, locals, matchEntryName, matchPathname, loaderContext, serverContext, contextForceCSR, reporter })=>{
114
113
  const forMatchpathname = matchPathname ?? (0, index_js_namespaceObject.getPathname)(req);
115
114
  const [routeInfo, params] = matchRoute(router, forMatchpathname, matchEntryName);
115
+ serverContext?.set('renderRoute', routeInfo);
116
116
  const framework = (0, universal_namespaceObject.cutNameByHyphen)(metaName || 'modern-js');
117
117
  const fallbackHeader = `x-${framework}-ssr-fallback`;
118
118
  let fallbackReason = null;
@@ -243,7 +243,7 @@ var __webpack_exports__ = {};
243
243
  if (req.headers.get('x-rsc-action')) return 'rsc-action';
244
244
  if (req.headers.get('x-rsc-tree')) return 'rsc-tree';
245
245
  if (!isSSR) return 'csr';
246
- {
246
+ else {
247
247
  if (query.__loader) return 'data';
248
248
  const fallbackHeaderValue = req.headers.get(fallbackHeader) || nodeReq?.headers[fallbackHeader];
249
249
  if (forceCSR && (query.csr || fallbackHeaderValue || contextForceCSR)) {
@@ -272,7 +272,7 @@ var __webpack_exports__ = {};
272
272
  [external_constants_js_namespaceObject.X_MODERNJS_RENDER]: 'client'
273
273
  })
274
274
  });
275
- return (0, external_csrRscRender_js_namespaceObject.csrRscRender)(request, options);
275
+ else return (0, external_csrRscRender_js_namespaceObject.csrRscRender)(request, options);
276
276
  }
277
277
  })();
278
278
  exports.createRender = __webpack_exports__.createRender;
@@ -35,54 +35,88 @@ __webpack_require__.d(__webpack_exports__, {
35
35
  const storer_namespaceObject = require("@modern-js/runtime-utils/storer");
36
36
  const external_constants_js_namespaceObject = require("../../constants.js");
37
37
  const index_js_namespaceObject = require("../../utils/index.js");
38
+ const preventsSharedCaching = (headers)=>/(?:^|,)\s*(?:private|no-store|no-cache)\s*(?:[=,]|$)/i.test(headers.get('cache-control') || '');
39
+ const isCacheableResponse = (response)=>200 === response.status && !preventsSharedCaching(response.headers) && !response.headers.has('set-cookie') && !response.headers.get('vary');
38
40
  const removeTailSlash = (s)=>s.replace(/\/+$/, '');
39
41
  const ZERO_RENDER_LEVEL = /"renderLevel":0/;
40
42
  const NO_SSR_CACHE = /<meta\s+[^>]*name=["']no-ssr-cache["'][^>]*>/i;
41
43
  async function processCache({ request, key, requestHandler, requestHandlerOptions, ttl, container, cacheStatus }) {
42
44
  const response = await requestHandler(request, requestHandlerOptions);
43
45
  const { onError } = requestHandlerOptions;
44
- const nonCacheableStatusCodes = [
45
- 204,
46
- 305,
47
- 404,
48
- 405,
49
- 500,
50
- 501,
51
- 502,
52
- 503,
53
- 504
54
- ];
55
- if (nonCacheableStatusCodes.includes(response.status)) return response;
46
+ const deleteCache = async ()=>{
47
+ try {
48
+ await container.delete(key);
49
+ } catch {
50
+ (onError || console.error)('[render-cache] delete cache failed');
51
+ }
52
+ };
53
+ if (!isCacheableResponse(response) || !response.body) {
54
+ await deleteCache();
55
+ return response;
56
+ }
57
+ const headers = Object.fromEntries(response.headers);
56
58
  const decoder = new TextDecoder();
57
59
  if (response.body) {
58
60
  const stream = (0, index_js_namespaceObject.createTransformStream)();
59
61
  const reader = response.body.getReader();
60
62
  const writer = stream.writable.getWriter();
61
63
  let html = '';
62
- const push = ()=>reader.read().then(({ done, value })=>{
63
- if (done) {
64
- const match = ZERO_RENDER_LEVEL.test(html) || NO_SSR_CACHE.test(html);
65
- if (match) return void writer.close();
66
- const current = Date.now();
67
- const cache = {
68
- val: html,
69
- cursor: current
70
- };
71
- container.set(key, JSON.stringify(cache), {
64
+ let cancelled = false;
65
+ const cancel = async (reason)=>{
66
+ cancelled = true;
67
+ await reader.cancel(reason);
68
+ };
69
+ writer.closed.catch(cancel).catch(()=>{});
70
+ const onAbort = ()=>{
71
+ Promise.allSettled([
72
+ cancel(request.signal.reason),
73
+ writer.abort(request.signal.reason)
74
+ ]);
75
+ };
76
+ request.signal.addEventListener('abort', onAbort, {
77
+ once: true
78
+ });
79
+ if (request.signal.aborted) onAbort();
80
+ const pumping = (async ()=>{
81
+ try {
82
+ for(;;){
83
+ const { done, value } = await reader.read();
84
+ if (cancelled) return;
85
+ if (done) break;
86
+ html += decoder.decode(value, {
87
+ stream: true
88
+ });
89
+ await writer.write(value);
90
+ }
91
+ html += decoder.decode();
92
+ await writer.close();
93
+ if (cancelled) return;
94
+ if (ZERO_RENDER_LEVEL.test(html) || NO_SSR_CACHE.test(html)) return void await deleteCache();
95
+ const cache = {
96
+ val: html,
97
+ cursor: Date.now(),
98
+ headers
99
+ };
100
+ try {
101
+ await container.set(key, JSON.stringify(cache), {
72
102
  ttl
73
- }).catch(()=>{
74
- if (onError) onError(`[render-cache] set cache failed, key: ${key}, value: ${JSON.stringify(cache)}`);
75
- else console.error(`[render-cache] set cache failed, key: ${key}, value: ${JSON.stringify(cache)}`);
76
103
  });
77
- writer.close();
78
- return;
104
+ } catch (error) {
105
+ (onError || console.error)('[render-cache] set cache failed');
79
106
  }
80
- const content = decoder.decode(value);
81
- html += content;
82
- writer.write(value);
83
- push();
84
- });
85
- push();
107
+ } catch (error) {
108
+ await Promise.allSettled([
109
+ cancel(error),
110
+ writer.abort(error)
111
+ ]);
112
+ if (cacheStatus) try {
113
+ (onError || console.error)('[render-cache] response stream failed');
114
+ } catch {}
115
+ } finally{
116
+ request.signal.removeEventListener('abort', onAbort);
117
+ }
118
+ })();
119
+ pumping.catch(()=>{});
86
120
  cacheStatus && response.headers.set(external_constants_js_namespaceObject.X_RENDER_CACHE, cacheStatus);
87
121
  return new Response(stream.readable, {
88
122
  status: response.status,
@@ -97,9 +131,12 @@ function computedKey(req, cacheControl) {
97
131
  const pathname = (0, index_js_namespaceObject.getPathname)(req);
98
132
  const { customKey } = cacheControl;
99
133
  const defaultKey = '/' === pathname ? pathname : removeTailSlash(pathname);
100
- if (!customKey) return defaultKey;
101
- if ('string' == typeof customKey) return customKey;
102
- return customKey(defaultKey);
134
+ if (customKey) if ('string' == typeof customKey) return customKey;
135
+ else return customKey(defaultKey);
136
+ else {
137
+ const url = new URL(req.url);
138
+ return `${url.origin}${defaultKey}${url.search}`;
139
+ }
103
140
  }
104
141
  function shouldUseCache(request) {
105
142
  const url = new URL(request.url);
@@ -110,7 +147,7 @@ function shouldUseCache(request) {
110
147
  }
111
148
  function matchCacheControl(cacheOption, req) {
112
149
  if (!cacheOption || !req) return;
113
- {
150
+ else {
114
151
  if (isCacheControl(cacheOption)) return cacheOption;
115
152
  if (isCacheOptionProvider(cacheOption)) return cacheOption(req);
116
153
  const url = req.url;
@@ -129,13 +166,15 @@ function matchCacheControl(cacheOption, req) {
129
166
  async function getCacheResult(request, options) {
130
167
  const { cacheControl, container = storage, requestHandler, requestHandlerOptions } = options;
131
168
  const { onError } = requestHandlerOptions;
132
- const key = computedKey(request, cacheControl);
169
+ const hasCredentials = request.headers.has('cookie') || request.headers.has('authorization');
170
+ if ('GET' !== request.method || !shouldUseCache(request) || preventsSharedCaching(request.headers) || hasCredentials && !cacheControl.customKey) return requestHandler(request, requestHandlerOptions);
171
+ const key = `${CACHE_NAMESPACE}:v2:${computedKey(request, cacheControl)}`;
133
172
  let value;
134
173
  try {
135
174
  value = await container.get(key);
136
175
  } catch (_) {
137
- if (onError) onError(`[render-cache] get cache failed, key: ${key}`);
138
- else console.error(`[render-cache] get cache failed, key: ${key}`);
176
+ if (onError) onError('[render-cache] get cache failed');
177
+ else console.error('[render-cache] get cache failed');
139
178
  value = void 0;
140
179
  }
141
180
  const { maxAge, staleWhileRevalidate } = cacheControl;
@@ -149,27 +188,27 @@ async function getCacheResult(request, options) {
149
188
  container,
150
189
  cacheStatus: 'miss'
151
190
  });
152
- {
191
+ else {
153
192
  const cache = JSON.parse(value);
154
193
  const interval = Date.now() - cache.cursor;
155
194
  if (interval <= maxAge) {
156
195
  const cacheStatus = 'hit';
157
196
  return new Response(cache.val, {
158
197
  headers: {
198
+ ...cache.headers,
159
199
  [external_constants_js_namespaceObject.X_RENDER_CACHE]: cacheStatus
160
200
  }
161
201
  });
162
- }
163
- if (!(interval <= staleWhileRevalidate + maxAge)) return processCache({
164
- key,
165
- request,
166
- requestHandler,
167
- requestHandlerOptions,
168
- ttl,
169
- container,
170
- cacheStatus: 'expired'
171
- });
172
- {
202
+ } else {
203
+ if (!(interval <= staleWhileRevalidate + maxAge)) return processCache({
204
+ key,
205
+ request,
206
+ requestHandler,
207
+ requestHandlerOptions,
208
+ ttl,
209
+ container,
210
+ cacheStatus: 'expired'
211
+ });
173
212
  processCache({
174
213
  key,
175
214
  request,
@@ -179,10 +218,15 @@ async function getCacheResult(request, options) {
179
218
  container
180
219
  }).then(async (response)=>{
181
220
  await response.text();
221
+ }).catch((error)=>{
222
+ try {
223
+ (onError || console.error)('[render-cache] revalidation failed');
224
+ } catch {}
182
225
  });
183
226
  const cacheStatus = 'stale';
184
227
  return new Response(cache.val, {
185
228
  headers: {
229
+ ...cache.headers,
186
230
  [external_constants_js_namespaceObject.X_RENDER_CACHE]: cacheStatus
187
231
  }
188
232
  });
@@ -179,7 +179,7 @@ function applyMiddlewares() {
179
179
  if (middleware.before) {
180
180
  const targetIndex = finalMiddlewares.findIndex((item)=>{
181
181
  if (middleware.before?.includes(item.name)) return true;
182
- return false;
182
+ else return false;
183
183
  });
184
184
  if (-1 !== targetIndex) finalMiddlewares.splice(targetIndex, 0, middleware);
185
185
  else finalMiddlewares.push(middleware);
@@ -200,7 +200,7 @@ function applyMiddlewares() {
200
200
  }
201
201
  function handler2Handlers(handler) {
202
202
  if (Array.isArray(handler)) return handler;
203
- return [
203
+ else return [
204
204
  handler
205
205
  ];
206
206
  }
@@ -43,7 +43,7 @@ function transformResponse(response, transformCb) {
43
43
  if (response.body) {
44
44
  const stream = createTransformStream(async (before)=>{
45
45
  if (Array.isArray(transformCb)) return transformCb.reduce(async (before, cb)=>cb(await before), Promise.resolve(before));
46
- return transformCb(before);
46
+ else return transformCb(before);
47
47
  });
48
48
  response.body.pipeThrough(stream);
49
49
  readable = stream.readable;
@@ -29,27 +29,36 @@ const httpCallBack2HonoMid = (handler)=>async (context, next)=>{
29
29
  } else await next();
30
30
  };
31
31
  const noop = ()=>{};
32
- const connectMid2HonoMid = (handler)=>async (context, next)=>new Promise((resolve, reject)=>{
33
- const { req, res } = context.env.node;
34
- if (handler.length < 3) resolve(handler(req, res, noop));
35
- else handler(req, res, (err)=>{
32
+ const connectMid2HonoMid = (handler)=>async (context, next)=>{
33
+ const { req, res: rawRes } = context.env.node;
34
+ const res = rawRes;
35
+ if (handler.length < 3) return handler(req, res, noop);
36
+ const continueChain = await new Promise((resolve, reject)=>{
37
+ const onFinish = ()=>{
38
+ context.res;
39
+ context.finalized = true;
40
+ resolve(false);
41
+ };
42
+ res.once?.('finish', onFinish);
43
+ handler(req, res, (err)=>{
44
+ res.removeListener?.('finish', onFinish);
36
45
  if (err) reject(err);
37
- else resolve(next());
46
+ else resolve(true);
38
47
  });
39
48
  });
40
- const connectMockMid2HonoMid = (handler)=>async (context, next)=>new Promise((resolve, reject)=>{
49
+ if (continueChain) await next();
50
+ };
51
+ const connectMockMid2HonoMid = (handler)=>{
52
+ if (handler.length >= 3) return connectMid2HonoMid(handler);
53
+ return async (context, _next)=>new Promise((resolve)=>{
41
54
  const { req, res: rawRes } = context.env.node;
42
55
  const res = rawRes;
43
- if (handler.length < 3) {
44
- res.once?.('finish', ()=>{
45
- context.res;
46
- context.finalized = true;
47
- resolve();
48
- });
49
- handler(req, res, noop);
50
- } else handler(req, res, (err)=>{
51
- if (err) reject(err);
52
- else resolve(next());
56
+ res.once?.('finish', ()=>{
57
+ context.res;
58
+ context.finalized = true;
59
+ resolve();
53
60
  });
61
+ handler(req, res, noop);
54
62
  });
63
+ };
55
64
  export { connectMid2HonoMid, connectMockMid2HonoMid, httpCallBack2HonoMid };
@@ -24,7 +24,9 @@ const createWebRequest = (req, res, body)=>{
24
24
  headers: headerRecord,
25
25
  signal: controller.signal
26
26
  };
27
- res.on('close', ()=>controller.abort('res closed'));
27
+ res.on('close', ()=>{
28
+ if (!res.writableFinished || req.aborted) controller.abort('res closed');
29
+ });
28
30
  const protocol = 'encrypted' in req.socket && req.socket.encrypted ? 'https' : 'http';
29
31
  const authority = req.headers[':authority'] ?? req.headers.host;
30
32
  const url = `${protocol}://${authority}${req.url}`;
@@ -154,7 +154,7 @@ function createStaticMiddleware(options) {
154
154
  respondAsset: options.respondAsset,
155
155
  respondPublicFallback: options.respondPublicFallback
156
156
  })(c, next);
157
- {
157
+ else {
158
158
  const filepath = path.join(pwd, pathname.replace(pathPrefix, ()=>''));
159
159
  if (!isPathInside(filepath, pwd)) return next();
160
160
  if (!await fs.pathExists(filepath)) return next();
@@ -2,7 +2,7 @@ const LOADER_CONTEXT = 'loaderContext';
2
2
  function getLoaderCtx(c) {
3
3
  const loaderContext = c.get(LOADER_CONTEXT);
4
4
  if (loaderContext) return loaderContext;
5
- {
5
+ else {
6
6
  const loaderContext = new Map();
7
7
  c.set(LOADER_CONTEXT, loaderContext);
8
8
  return loaderContext;
@@ -40,7 +40,8 @@ function logHandler() {
40
40
  log(logFn, "<--", method, path);
41
41
  const start = Date.now();
42
42
  await next();
43
- log(logFn, "-->", method, path, c?.env?.node?.res?.statusCode ?? c.res.status, time(start));
43
+ const nodeRes = c?.env?.node?.res;
44
+ log(logFn, "-->", method, path, nodeRes?.headersSent ? nodeRes.statusCode : c.res.status, time(start));
44
45
  };
45
46
  }
46
47
  const logPlugin = ()=>({
@@ -7,12 +7,6 @@ import { dataHandler } from "./dataHandler.mjs";
7
7
  import { renderRscHandler } from "./renderRscHandler.mjs";
8
8
  import { serverActionHandler } from "./serverActionHandler.mjs";
9
9
  import { ssrRender } from "./ssrRender.mjs";
10
- import { __webpack_require__ } from "../../rslib-runtime~1.mjs";
11
- __webpack_require__.add({
12
- 718 (module) {
13
- module.exports = require("@modern-js/runtime-utils/router");
14
- }
15
- });
16
10
  const DYNAMIC_ROUTE_REG = /\/:./;
17
11
  function getRouter(routes) {
18
12
  const dynamicRoutes = [];
@@ -45,8 +39,7 @@ function matchRoute(router, pathname, entryName) {
45
39
  void 0,
46
40
  {}
47
41
  ];
48
- }
49
- {
42
+ } else {
50
43
  const result = matchedRoutes[0];
51
44
  if (!result) return [
52
45
  void 0,
@@ -71,6 +64,7 @@ async function createRender({ routes, pwd, metaName, staticGenerate, cacheConfig
71
64
  return async (req, { monitors, nodeReq, templates, serverManifest, rscClientManifest, rscSSRManifest, rscServerManifest, locals, matchEntryName, matchPathname, loaderContext, serverContext, contextForceCSR, reporter })=>{
72
65
  const forMatchpathname = matchPathname ?? getPathname(req);
73
66
  const [routeInfo, params] = matchRoute(router, forMatchpathname, matchEntryName);
67
+ serverContext?.set('renderRoute', routeInfo);
74
68
  const framework = cutNameByHyphen(metaName || 'modern-js');
75
69
  const fallbackHeader = `x-${framework}-ssr-fallback`;
76
70
  let fallbackReason = null;
@@ -163,7 +157,7 @@ async function renderHandler(request, options, mode, fallbackWrapper, framework)
163
157
  const { nestedRoutesJson } = serverManifest;
164
158
  const routes = nestedRoutesJson?.[options.routeInfo.entryName];
165
159
  if (routes) {
166
- const { matchRoutes } = __webpack_require__(718);
160
+ const { matchRoutes } = require("@modern-js/runtime-utils/router");
167
161
  const url = new URL(request.url);
168
162
  const matchedRoutes = matchRoutes(routes, url.pathname, options.routeInfo.urlPath);
169
163
  if (matchedRoutes) {
@@ -201,7 +195,7 @@ async function getRenderMode(req, fallbackHeader, isSSR, forceCSR, nodeReq, onFa
201
195
  if (req.headers.get('x-rsc-action')) return 'rsc-action';
202
196
  if (req.headers.get('x-rsc-tree')) return 'rsc-tree';
203
197
  if (!isSSR) return 'csr';
204
- {
198
+ else {
205
199
  if (query.__loader) return 'data';
206
200
  const fallbackHeaderValue = req.headers.get(fallbackHeader) || nodeReq?.headers[fallbackHeader];
207
201
  if (forceCSR && (query.csr || fallbackHeaderValue || contextForceCSR)) {
@@ -230,6 +224,6 @@ async function csrRender(request, options) {
230
224
  [X_MODERNJS_RENDER]: 'client'
231
225
  })
232
226
  });
233
- return csrRscRender(request, options);
227
+ else return csrRscRender(request, options);
234
228
  }
235
229
  export { createRender, matchRoute };