@modern-js/runtime 2.65.1 → 2.65.3
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.
- package/dist/cjs/cache/index.js +22 -0
- package/dist/cjs/cli/code.js +1 -0
- package/dist/cjs/cli/ssr/index.js +1 -1
- package/dist/cjs/cli/template.js +7 -3
- package/dist/cjs/core/browser/index.js +1 -3
- package/dist/cjs/core/compat/requestContext.js +48 -0
- package/dist/cjs/core/compatible.js +2 -14
- package/dist/cjs/core/context/index.js +6 -0
- package/dist/cjs/core/context/monitors/default.js +38 -0
- package/dist/cjs/core/context/monitors/index.js +31 -0
- package/dist/cjs/core/context/monitors/index.server.js +33 -0
- package/dist/cjs/core/context/request/index.js +30 -0
- package/dist/cjs/core/context/request/index.server.js +32 -0
- package/dist/cjs/core/context/response/index.js +43 -0
- package/dist/cjs/core/context/response/index.server.js +62 -0
- package/dist/cjs/core/plugin/index.js +2 -0
- package/dist/cjs/core/server/requestHandler.js +83 -73
- package/dist/cjs/core/server/stream/shared.js +40 -45
- package/dist/cjs/core/server/string/index.js +50 -55
- package/dist/cjs/core/server/string/prefetch.js +47 -52
- package/dist/cjs/index.js +13 -0
- package/dist/cjs/react-server.js +38 -0
- package/dist/cjs/router/cli/code/templates.js +3 -1
- package/dist/cjs/router/cli/handler.js +1 -0
- package/dist/cjs/router/runtime/plugin.node.js +1 -2
- package/dist/cjs/router/runtime/utils.js +4 -6
- package/dist/esm/cache/index.js +1 -0
- package/dist/esm/cli/code.js +1 -0
- package/dist/esm/cli/ssr/index.js +1 -1
- package/dist/esm/cli/template.js +4 -4
- package/dist/esm/core/browser/index.js +3 -4
- package/dist/esm/core/compat/requestContext.js +25 -0
- package/dist/esm/core/compatible.js +5 -16
- package/dist/esm/core/context/index.js +5 -0
- package/dist/esm/core/context/monitors/default.js +20 -0
- package/dist/esm/core/context/monitors/index.js +7 -0
- package/dist/esm/core/context/monitors/index.server.js +9 -0
- package/dist/esm/core/context/request/index.js +6 -0
- package/dist/esm/core/context/request/index.server.js +8 -0
- package/dist/esm/core/context/response/index.js +16 -0
- package/dist/esm/core/context/response/index.server.js +41 -0
- package/dist/esm/core/plugin/index.js +3 -1
- package/dist/esm/core/server/requestHandler.js +134 -118
- package/dist/esm/core/server/stream/shared.js +49 -63
- package/dist/esm/core/server/string/index.js +82 -93
- package/dist/esm/core/server/string/prefetch.js +83 -94
- package/dist/esm/index.js +8 -0
- package/dist/esm/react-server.js +10 -0
- package/dist/esm/router/cli/code/templates.js +3 -3
- package/dist/esm/router/cli/handler.js +1 -0
- package/dist/esm/router/runtime/plugin.node.js +1 -2
- package/dist/esm/router/runtime/utils.js +4 -6
- package/dist/esm-node/cache/index.js +1 -0
- package/dist/esm-node/cli/code.js +1 -0
- package/dist/esm-node/cli/ssr/index.js +1 -1
- package/dist/esm-node/cli/template.js +7 -3
- package/dist/esm-node/core/browser/index.js +1 -3
- package/dist/esm-node/core/compat/requestContext.js +23 -0
- package/dist/esm-node/core/compatible.js +2 -14
- package/dist/esm-node/core/context/index.js +5 -0
- package/dist/esm-node/core/context/monitors/default.js +14 -0
- package/dist/esm-node/core/context/monitors/index.js +7 -0
- package/dist/esm-node/core/context/monitors/index.server.js +9 -0
- package/dist/esm-node/core/context/request/index.js +6 -0
- package/dist/esm-node/core/context/request/index.server.js +8 -0
- package/dist/esm-node/core/context/response/index.js +16 -0
- package/dist/esm-node/core/context/response/index.server.js +35 -0
- package/dist/esm-node/core/plugin/index.js +2 -0
- package/dist/esm-node/core/server/requestHandler.js +83 -73
- package/dist/esm-node/core/server/stream/shared.js +40 -45
- package/dist/esm-node/core/server/string/index.js +50 -55
- package/dist/esm-node/core/server/string/prefetch.js +47 -52
- package/dist/esm-node/index.js +8 -0
- package/dist/esm-node/react-server.js +10 -0
- package/dist/esm-node/router/cli/code/templates.js +3 -1
- package/dist/esm-node/router/cli/handler.js +1 -0
- package/dist/esm-node/router/runtime/plugin.node.js +1 -2
- package/dist/esm-node/router/runtime/utils.js +4 -6
- package/dist/types/cache/index.d.ts +1 -0
- package/dist/types/cli/template.d.ts +2 -1
- package/dist/types/core/compat/requestContext.d.ts +27 -0
- package/dist/types/core/compatible.d.ts +2 -2
- package/dist/types/core/config.d.ts +1 -1
- package/dist/types/core/context/index.d.ts +2 -0
- package/dist/types/core/context/monitors/default.d.ts +2 -0
- package/dist/types/core/context/monitors/index.d.ts +1 -0
- package/dist/types/core/context/monitors/index.server.d.ts +2 -0
- package/dist/types/core/context/request/index.d.ts +1 -0
- package/dist/types/core/context/request/index.server.d.ts +1 -0
- package/dist/types/core/context/response/index.d.ts +4 -0
- package/dist/types/core/context/response/index.server.d.ts +7 -0
- package/dist/types/core/context/runtime.d.ts +1 -0
- package/dist/types/core/types.d.ts +4 -17
- package/dist/types/index.d.ts +3 -0
- package/dist/types/react-server.d.ts +3 -0
- package/dist/types/router/cli/code/templates.d.ts +2 -1
- package/dist/types/router/runtime/utils.d.ts +3 -5
- package/package.json +22 -12
|
@@ -70,7 +70,8 @@ import './${ENTRY_POINT_RUNTIME_REGISTER_FILE_NAME}';
|
|
|
70
70
|
`;
|
|
71
71
|
const getImportRuntimeConfigCode = (srcDirectory, internalSrcAlias, runtimeConfigFile) => {
|
|
72
72
|
if (runtimeConfigFile && findExists(JS_EXTENSIONS.map((ext) => path.resolve(srcDirectory, `${runtimeConfigFile}${ext}`)))) {
|
|
73
|
-
return `import
|
|
73
|
+
return `import modernRuntime from '${internalSrcAlias}/${runtimeConfigFile}';
|
|
74
|
+
const runtimeConfig = typeof modernRuntime === 'function' ? modernRuntime(getCurrentEntryName()) : modernRuntime`;
|
|
74
75
|
}
|
|
75
76
|
return `let runtimeConfig;`;
|
|
76
77
|
};
|
|
@@ -79,7 +80,8 @@ const getRegisterRuntimePluginCode = (entryName, name, config) => {
|
|
|
79
80
|
return `plugins.push(${name}Plugin(mergeConfig(${JSON.stringify(config)}, (runtimeConfig || {})['${configName}'], ((runtimeConfig || {})['${configName}ByEntries'] || {})['${entryName}'], (getGlobalAppConfig() || {})['${configName}'])));`;
|
|
80
81
|
};
|
|
81
82
|
const runtimeRegister = ({ entryName, srcDirectory, internalSrcAlias, metaName, runtimeConfigFile, runtimePlugins }) => `import { registerPlugin, mergeConfig } from '@${metaName}/runtime/plugin';
|
|
82
|
-
import { getGlobalAppConfig, getGlobalLayoutApp } from '@${metaName}/runtime/context';
|
|
83
|
+
import { getGlobalAppConfig, getGlobalLayoutApp, getCurrentEntryName } from '@${metaName}/runtime/context';
|
|
84
|
+
|
|
83
85
|
${getImportRuntimeConfigCode(srcDirectory, internalSrcAlias, runtimeConfigFile)}
|
|
84
86
|
|
|
85
87
|
const plugins = [];
|
|
@@ -90,13 +92,15 @@ ${getRegisterRuntimePluginCode(entryName, name, config)}
|
|
|
90
92
|
`).join("\n")}
|
|
91
93
|
registerPlugin(plugins, runtimeConfig);
|
|
92
94
|
`;
|
|
93
|
-
const runtimeGlobalContext = ({ srcDirectory, internalSrcAlias, metaName, entry, customEntry }) => {
|
|
95
|
+
const runtimeGlobalContext = ({ entryName, srcDirectory, internalSrcAlias, metaName, entry, customEntry }) => {
|
|
94
96
|
return `import { setGlobalContext } from '@${metaName}/runtime/context'
|
|
95
97
|
|
|
96
98
|
import App from '${// We need to get the path of App.tsx here, but the entry is `src/entry.tsx`
|
|
97
99
|
formatImportPath(customEntry ? entry.replace(/entry\.[tj]sx/, "App").replace(srcDirectory, internalSrcAlias) : entry.replace(srcDirectory, internalSrcAlias).replace(/\.[tj]sx/, ""))}';
|
|
98
100
|
|
|
101
|
+
const entryName = '${entryName}';
|
|
99
102
|
setGlobalContext({
|
|
103
|
+
entryName,
|
|
100
104
|
App,
|
|
101
105
|
});`;
|
|
102
106
|
};
|
|
@@ -75,9 +75,7 @@ async function render(App, id) {
|
|
|
75
75
|
}),
|
|
76
76
|
// garfish plugin params
|
|
77
77
|
_internalRouterBaseName: App.props.basename,
|
|
78
|
-
|
|
79
|
-
ssrContext: ssrData.context
|
|
80
|
-
}
|
|
78
|
+
ssrContext: ssrData.context
|
|
81
79
|
});
|
|
82
80
|
context.initialData = (_ssrData_data1 = ssrData.data) === null || _ssrData_data1 === void 0 ? void 0 : _ssrData_data1.initialData;
|
|
83
81
|
const initialData = await runBeforeRender(context);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const makeRequestContext = (context) => {
|
|
2
|
+
const baseSSRContext = context.ssrContext;
|
|
3
|
+
const requestContext = baseSSRContext ? {
|
|
4
|
+
isBrowser: context.isBrowser,
|
|
5
|
+
request: baseSSRContext.request || {},
|
|
6
|
+
response: baseSSRContext.response || {},
|
|
7
|
+
logger: baseSSRContext.logger || {}
|
|
8
|
+
} : {};
|
|
9
|
+
return requestContext;
|
|
10
|
+
};
|
|
11
|
+
const requestContextPlugin = () => ({
|
|
12
|
+
name: "@modern-js/runtime-plugin-request-context",
|
|
13
|
+
setup(api) {
|
|
14
|
+
api.onBeforeRender((context) => {
|
|
15
|
+
const requestContext = makeRequestContext(context);
|
|
16
|
+
context.context = requestContext;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
export {
|
|
21
|
+
makeRequestContext,
|
|
22
|
+
requestContextPlugin
|
|
23
|
+
};
|
|
@@ -76,9 +76,7 @@ const bootstrap = async (BootApp, id, root, ReactDOM) => {
|
|
|
76
76
|
loaderManager: createLoaderManager(initialLoadersState, {
|
|
77
77
|
skipStatic: true
|
|
78
78
|
}),
|
|
79
|
-
|
|
80
|
-
ssrContext: ssrData === null || ssrData === void 0 ? void 0 : ssrData.context
|
|
81
|
-
} : {}
|
|
79
|
+
ssrContext: (ssrData === null || ssrData === void 0 ? void 0 : ssrData.context) || {}
|
|
82
80
|
});
|
|
83
81
|
context.initialData = ssrData === null || ssrData === void 0 ? void 0 : (_ssrData_data1 = ssrData.data) === null || _ssrData_data1 === void 0 ? void 0 : _ssrData_data1.initialData;
|
|
84
82
|
const initialData = await runBeforeRender(context);
|
|
@@ -138,19 +136,9 @@ const bootstrap = async (BootApp, id, root, ReactDOM) => {
|
|
|
138
136
|
const useRuntimeContext = () => {
|
|
139
137
|
var _context_ssrContext, _context_ssrContext1;
|
|
140
138
|
const context = useContext(RuntimeReactContext);
|
|
141
|
-
const baseSSRContext = context.ssrContext;
|
|
142
|
-
const tSSRContext = baseSSRContext ? {
|
|
143
|
-
isBrowser: context.isBrowser,
|
|
144
|
-
request: baseSSRContext.request || {},
|
|
145
|
-
response: baseSSRContext.response || {},
|
|
146
|
-
logger: baseSSRContext.logger || {},
|
|
147
|
-
getInitData: () => {
|
|
148
|
-
return Object.freeze(context.initialData);
|
|
149
|
-
}
|
|
150
|
-
} : {};
|
|
151
139
|
const pickedContext = {
|
|
152
140
|
...context,
|
|
153
|
-
context:
|
|
141
|
+
context: context.context || {},
|
|
154
142
|
request: (_context_ssrContext = context.ssrContext) === null || _context_ssrContext === void 0 ? void 0 : _context_ssrContext.request,
|
|
155
143
|
response: (_context_ssrContext1 = context.ssrContext) === null || _context_ssrContext1 === void 0 ? void 0 : _context_ssrContext1.response
|
|
156
144
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { RuntimeReactContext, getInitialContext } from "./runtime";
|
|
2
2
|
const globalContext = {};
|
|
3
3
|
function setGlobalContext(context) {
|
|
4
|
+
globalContext.entryName = context.entryName;
|
|
4
5
|
globalContext.App = context.App;
|
|
5
6
|
globalContext.routes = context.routes;
|
|
6
7
|
globalContext.appInit = context.appInit;
|
|
@@ -8,6 +9,9 @@ function setGlobalContext(context) {
|
|
|
8
9
|
globalContext.layoutApp = context.layoutApp;
|
|
9
10
|
globalContext.RSCRoot = context.RSCRoot;
|
|
10
11
|
}
|
|
12
|
+
function getCurrentEntryName() {
|
|
13
|
+
return globalContext.entryName;
|
|
14
|
+
}
|
|
11
15
|
function getGlobalRSCRoot() {
|
|
12
16
|
return globalContext.RSCRoot;
|
|
13
17
|
}
|
|
@@ -36,6 +40,7 @@ function getGlobalLayoutApp() {
|
|
|
36
40
|
}
|
|
37
41
|
export {
|
|
38
42
|
RuntimeReactContext,
|
|
43
|
+
getCurrentEntryName,
|
|
39
44
|
getGlobalApp,
|
|
40
45
|
getGlobalAppConfig,
|
|
41
46
|
getGlobalAppInit,
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { storage } from "@modern-js/runtime-utils/node";
|
|
2
|
+
import { defaultMonitors } from "./default";
|
|
3
|
+
const getMonitors = () => {
|
|
4
|
+
const storageContext = storage.useContext();
|
|
5
|
+
return storageContext.monitors || defaultMonitors;
|
|
6
|
+
};
|
|
7
|
+
export {
|
|
8
|
+
getMonitors
|
|
9
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const getResponseProxy = () => {
|
|
2
|
+
return null;
|
|
3
|
+
};
|
|
4
|
+
const setHeaders = (headers) => {
|
|
5
|
+
};
|
|
6
|
+
const setStatus = (status) => {
|
|
7
|
+
};
|
|
8
|
+
const redirect = (url, init) => {
|
|
9
|
+
console.warn(`You should not use this API in the browser, please use the router's redirect or useNavigate method.`);
|
|
10
|
+
};
|
|
11
|
+
export {
|
|
12
|
+
getResponseProxy,
|
|
13
|
+
redirect,
|
|
14
|
+
setHeaders,
|
|
15
|
+
setStatus
|
|
16
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { storage } from "@modern-js/runtime-utils/node";
|
|
2
|
+
const getResponseProxy = () => {
|
|
3
|
+
const context = storage.useContext();
|
|
4
|
+
return context === null || context === void 0 ? void 0 : context.responseProxy;
|
|
5
|
+
};
|
|
6
|
+
const setHeaders = (headers) => {
|
|
7
|
+
const responseProxy = getResponseProxy();
|
|
8
|
+
Object.entries(headers).forEach(([key, value]) => {
|
|
9
|
+
responseProxy.headers[key] = value;
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
const setStatus = (status) => {
|
|
13
|
+
const responseProxy = getResponseProxy();
|
|
14
|
+
responseProxy.status = status;
|
|
15
|
+
};
|
|
16
|
+
const redirect = (url, init) => {
|
|
17
|
+
var _init_status;
|
|
18
|
+
const status = init === void 0 ? 307 : typeof init === "number" ? init : (_init_status = init.status) !== null && _init_status !== void 0 ? _init_status : 307;
|
|
19
|
+
var _init_headers;
|
|
20
|
+
const headers = init === void 0 ? {} : typeof init === "number" ? {} : (_init_headers = init.headers) !== null && _init_headers !== void 0 ? _init_headers : {};
|
|
21
|
+
setStatus(status);
|
|
22
|
+
setHeaders({
|
|
23
|
+
Location: url,
|
|
24
|
+
...init && typeof init === "object" ? Object.fromEntries(Object.entries(headers).map(([k, v]) => [
|
|
25
|
+
k,
|
|
26
|
+
String(v)
|
|
27
|
+
])) : {}
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
export {
|
|
31
|
+
getResponseProxy,
|
|
32
|
+
redirect,
|
|
33
|
+
setHeaders,
|
|
34
|
+
setStatus
|
|
35
|
+
};
|
|
@@ -2,12 +2,14 @@ import { runtime } from "@modern-js/plugin-v2/runtime";
|
|
|
2
2
|
import { merge } from "@modern-js/runtime-utils/merge";
|
|
3
3
|
import { compatPlugin } from "../compat";
|
|
4
4
|
import { handleSetupResult } from "../compat/hooks";
|
|
5
|
+
import { requestContextPlugin } from "../compat/requestContext";
|
|
5
6
|
import { setGlobalInternalRuntimeContext } from "../context";
|
|
6
7
|
function registerPlugin(internalPlugins, runtimeConfig) {
|
|
7
8
|
const { plugins = [] } = runtimeConfig || {};
|
|
8
9
|
const { runtimeContext } = runtime.run({
|
|
9
10
|
plugins: [
|
|
10
11
|
compatPlugin(),
|
|
12
|
+
requestContextPlugin(),
|
|
11
13
|
...internalPlugins,
|
|
12
14
|
...plugins
|
|
13
15
|
],
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { storage } from "@modern-js/runtime-utils/node";
|
|
1
2
|
import { getPathname, parseCookie, parseHeaders, parseQuery } from "@modern-js/runtime-utils/universal/request";
|
|
2
3
|
import { getGlobalAppInit, getGlobalInternalRuntimeContext, getGlobalRSCRoot } from "../context";
|
|
3
4
|
import { getInitialContext } from "../context/runtime";
|
|
@@ -44,6 +45,7 @@ function createSSRContext(request, options) {
|
|
|
44
45
|
params,
|
|
45
46
|
headers: headersData,
|
|
46
47
|
host,
|
|
48
|
+
referer: headers.get("referer"),
|
|
47
49
|
raw: request
|
|
48
50
|
},
|
|
49
51
|
response: {
|
|
@@ -51,7 +53,7 @@ function createSSRContext(request, options) {
|
|
|
51
53
|
responseProxy.headers[key] = value;
|
|
52
54
|
},
|
|
53
55
|
status(code) {
|
|
54
|
-
responseProxy.
|
|
56
|
+
responseProxy.status = code;
|
|
55
57
|
},
|
|
56
58
|
locals: locals || {}
|
|
57
59
|
},
|
|
@@ -64,85 +66,93 @@ function createSSRContext(request, options) {
|
|
|
64
66
|
}
|
|
65
67
|
const createRequestHandler = async (handleRequest, createRequestOptions) => {
|
|
66
68
|
const requestHandler = async (request, options) => {
|
|
67
|
-
|
|
68
|
-
const Root = createRoot();
|
|
69
|
-
const internalRuntimeContext = getGlobalInternalRuntimeContext();
|
|
70
|
-
const hooks = internalRuntimeContext.hooks;
|
|
71
|
-
const { routeManifest } = options.resource;
|
|
72
|
-
const context = getInitialContext(false, routeManifest);
|
|
73
|
-
const runBeforeRender = async (context2) => {
|
|
74
|
-
const result = await hooks.onBeforeRender.call(context2);
|
|
75
|
-
if (typeof Response !== "undefined" && result instanceof Response) {
|
|
76
|
-
return result;
|
|
77
|
-
}
|
|
78
|
-
const init = getGlobalAppInit();
|
|
79
|
-
return init === null || init === void 0 ? void 0 : init(context2);
|
|
80
|
-
};
|
|
69
|
+
const headersData = parseHeaders(request);
|
|
81
70
|
const responseProxy = {
|
|
82
71
|
headers: {},
|
|
83
|
-
|
|
72
|
+
status: -1
|
|
84
73
|
};
|
|
85
|
-
|
|
86
|
-
|
|
74
|
+
return storage.run({
|
|
75
|
+
headers: headersData,
|
|
76
|
+
request,
|
|
77
|
+
monitors: options.monitors,
|
|
87
78
|
responseProxy
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
79
|
+
}, async () => {
|
|
80
|
+
var _context_routerContext, _context_routerContext1, _context_routerContext2;
|
|
81
|
+
const Root = createRoot();
|
|
82
|
+
const internalRuntimeContext = getGlobalInternalRuntimeContext();
|
|
83
|
+
const hooks = internalRuntimeContext.hooks;
|
|
84
|
+
const { routeManifest } = options.resource;
|
|
85
|
+
const context = getInitialContext(false, routeManifest);
|
|
86
|
+
const runBeforeRender = async (context2) => {
|
|
87
|
+
const result = await hooks.onBeforeRender.call(context2);
|
|
88
|
+
if (typeof Response !== "undefined" && result instanceof Response) {
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
const init = getGlobalAppInit();
|
|
92
|
+
return init === null || init === void 0 ? void 0 : init(context2);
|
|
93
|
+
};
|
|
94
|
+
const ssrContext = createSSRContext(request, {
|
|
95
|
+
...options,
|
|
96
|
+
responseProxy
|
|
97
|
+
});
|
|
98
|
+
Object.assign(context, {
|
|
99
|
+
ssrContext,
|
|
100
|
+
isBrowser: false,
|
|
101
|
+
loaderManager: createLoaderManager({}, {
|
|
102
|
+
skipNonStatic: options.staticGenerate,
|
|
103
|
+
// if not static generate, only non-static loader can exec on prod env
|
|
104
|
+
skipStatic: process.env.NODE_ENV === "production" && !options.staticGenerate
|
|
105
|
+
})
|
|
106
|
+
});
|
|
107
|
+
const getRedirectResponse = (result) => {
|
|
108
|
+
if (typeof Response !== "undefined" && // fix: ssg workflow doesn't inject Web Response
|
|
109
|
+
result instanceof Response && result.status >= 300 && result.status <= 399) {
|
|
110
|
+
const { status } = result;
|
|
111
|
+
const redirectUrl = result.headers.get("Location") || "/";
|
|
112
|
+
const { ssrContext: ssrContext2 } = context;
|
|
113
|
+
if (ssrContext2) {
|
|
114
|
+
return new Response(null, {
|
|
115
|
+
status,
|
|
116
|
+
headers: {
|
|
117
|
+
Location: redirectUrl
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
111
121
|
}
|
|
122
|
+
return void 0;
|
|
123
|
+
};
|
|
124
|
+
const initialData = await runBeforeRender(context);
|
|
125
|
+
if (((_context_routerContext = context.routerContext) === null || _context_routerContext === void 0 ? void 0 : _context_routerContext.statusCode) && ((_context_routerContext1 = context.routerContext) === null || _context_routerContext1 === void 0 ? void 0 : _context_routerContext1.statusCode) !== 200) {
|
|
126
|
+
var _context_routerContext3, _context_ssrContext;
|
|
127
|
+
(_context_ssrContext = context.ssrContext) === null || _context_ssrContext === void 0 ? void 0 : _context_ssrContext.response.status((_context_routerContext3 = context.routerContext) === null || _context_routerContext3 === void 0 ? void 0 : _context_routerContext3.statusCode);
|
|
112
128
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
options.
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
const response = await handleRequest(request, Root, {
|
|
132
|
-
...options,
|
|
133
|
-
runtimeContext: context,
|
|
134
|
-
RSCRoot: (createRequestOptions === null || createRequestOptions === void 0 ? void 0 : createRequestOptions.enableRsc) && getGlobalRSCRoot()
|
|
135
|
-
});
|
|
136
|
-
Object.entries(responseProxy.headers).forEach(([key, value]) => {
|
|
137
|
-
response.headers.set(key, value);
|
|
138
|
-
});
|
|
139
|
-
if (responseProxy.code !== -1) {
|
|
140
|
-
return new Response(response.body, {
|
|
141
|
-
status: responseProxy.code,
|
|
142
|
-
headers: response.headers
|
|
129
|
+
const errors = Object.values(((_context_routerContext2 = context.routerContext) === null || _context_routerContext2 === void 0 ? void 0 : _context_routerContext2.errors) || {});
|
|
130
|
+
if (errors.length > 0) {
|
|
131
|
+
options.onError(errors[0], SSRErrors.LOADER_ERROR);
|
|
132
|
+
}
|
|
133
|
+
context.initialData = initialData;
|
|
134
|
+
const redirectResponse = getRedirectResponse(initialData);
|
|
135
|
+
if (redirectResponse) {
|
|
136
|
+
return redirectResponse;
|
|
137
|
+
}
|
|
138
|
+
const { htmlTemplate } = options.resource;
|
|
139
|
+
options.resource.htmlTemplate = htmlTemplate.replace("</head>", `${CHUNK_CSS_PLACEHOLDER}</head>`);
|
|
140
|
+
const response = await handleRequest(request, Root, {
|
|
141
|
+
...options,
|
|
142
|
+
runtimeContext: context,
|
|
143
|
+
RSCRoot: (createRequestOptions === null || createRequestOptions === void 0 ? void 0 : createRequestOptions.enableRsc) && getGlobalRSCRoot()
|
|
144
|
+
});
|
|
145
|
+
Object.entries(responseProxy.headers).forEach(([key, value]) => {
|
|
146
|
+
response.headers.set(key, value);
|
|
143
147
|
});
|
|
144
|
-
|
|
145
|
-
|
|
148
|
+
if (responseProxy.status !== -1) {
|
|
149
|
+
return new Response(response.body, {
|
|
150
|
+
status: responseProxy.status,
|
|
151
|
+
headers: response.headers
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return response;
|
|
155
|
+
});
|
|
146
156
|
};
|
|
147
157
|
return requestHandler;
|
|
148
158
|
};
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { run } from "@modern-js/runtime-utils/node";
|
|
3
2
|
import { time } from "@modern-js/runtime-utils/time";
|
|
4
|
-
import { parseHeaders } from "@modern-js/runtime-utils/universal/request";
|
|
5
3
|
import { wrapRuntimeContextProvider } from "../../react/wrapper";
|
|
6
4
|
import { SSRErrors, SSRTimings } from "../tracer";
|
|
7
5
|
import { getSSRConfigByEntry } from "../utils";
|
|
@@ -32,51 +30,48 @@ function getReadableStreamFromString(content) {
|
|
|
32
30
|
function createRenderStreaming(createReadableStreamPromise) {
|
|
33
31
|
return async (request, serverRoot, options) => {
|
|
34
32
|
const createReadableStreamFromElement = await createReadableStreamPromise;
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return /* @__PURE__ */ _jsx(_Fragment, {
|
|
44
|
-
children
|
|
45
|
-
});
|
|
46
|
-
};
|
|
47
|
-
let rootElement = wrapRuntimeContextProvider(serverRoot, Object.assign(runtimeContext, {
|
|
48
|
-
ssr: true
|
|
49
|
-
}));
|
|
50
|
-
rootElement = /* @__PURE__ */ _jsx(RSCServerRoot, {
|
|
51
|
-
children: rootElement
|
|
33
|
+
const end = time();
|
|
34
|
+
const { runtimeContext, config, resource } = options;
|
|
35
|
+
const { onError, onTiming } = options;
|
|
36
|
+
const { htmlTemplate, entryName } = resource;
|
|
37
|
+
const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries);
|
|
38
|
+
const RSCServerRoot = ({ children }) => {
|
|
39
|
+
return /* @__PURE__ */ _jsx(_Fragment, {
|
|
40
|
+
children
|
|
52
41
|
});
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
|
|
42
|
+
};
|
|
43
|
+
let rootElement = wrapRuntimeContextProvider(serverRoot, Object.assign(runtimeContext, {
|
|
44
|
+
ssr: true
|
|
45
|
+
}));
|
|
46
|
+
rootElement = /* @__PURE__ */ _jsx(RSCServerRoot, {
|
|
47
|
+
children: rootElement
|
|
48
|
+
});
|
|
49
|
+
const stream = await createReadableStreamFromElement(request, rootElement, {
|
|
50
|
+
config,
|
|
51
|
+
htmlTemplate,
|
|
52
|
+
runtimeContext,
|
|
53
|
+
ssrConfig,
|
|
54
|
+
entryName,
|
|
55
|
+
rscClientManifest: options.rscClientManifest,
|
|
56
|
+
rscSSRManifest: options.rscSSRManifest,
|
|
57
|
+
rscServerManifest: options.rscServerManifest,
|
|
58
|
+
rscRoot: options.rscRoot,
|
|
59
|
+
onShellReady() {
|
|
60
|
+
const cost = end();
|
|
61
|
+
onTiming(SSRTimings.RENDER_SHELL, cost);
|
|
62
|
+
},
|
|
63
|
+
onAllReady() {
|
|
64
|
+
const cost = end();
|
|
65
|
+
onTiming(SSRTimings.RENDER_HTML, cost);
|
|
66
|
+
},
|
|
67
|
+
onShellError(error) {
|
|
68
|
+
onError(error, SSRErrors.RENDER_SHELL);
|
|
69
|
+
},
|
|
70
|
+
onError(error) {
|
|
71
|
+
onError(error, SSRErrors.RENDER_STREAM);
|
|
72
|
+
}
|
|
79
73
|
});
|
|
74
|
+
return stream;
|
|
80
75
|
};
|
|
81
76
|
}
|
|
82
77
|
export {
|