@bleedingdev/modern-js-runtime 3.5.0-ultramodern.98 → 3.8.1-ultramodern.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.
- package/dist/cjs/cli/index.js +1 -11
- package/dist/cjs/cli/ssr/index.js +1 -0
- package/dist/cjs/core/browser/hydrate.js +31 -27
- package/dist/cjs/core/browser/index.js +4 -15
- package/dist/cjs/core/react/wrapper.js +23 -28
- package/dist/cjs/core/server/requestResponse.js +5 -5
- package/dist/cjs/core/server/scriptOrder.js +1 -1
- package/dist/cjs/core/server/stream/beforeTemplate.worker.js +1 -10
- package/dist/cjs/core/server/string/index.js +3 -3
- package/dist/cjs/core/server/utils.js +3 -3
- package/dist/cjs/document/cli/index.js +5 -2
- package/dist/cjs/module-federation/distributed-ssr.js +13 -12
- package/dist/cjs/module-federation/last-known-good.js +1 -1
- package/dist/cjs/module-federation/manifest-recovery-runtime-plugin.js +27 -38
- package/dist/cjs/router/cli/code/index.js +16 -9
- package/dist/cjs/router/cli/code/templates.js +36 -27
- package/dist/cjs/router/cli/handler.js +7 -1
- package/dist/cjs/router/runtime/plugin.js +22 -17
- package/dist/cjs/router/runtime/plugin.node.js +11 -3
- package/dist/cjs/router/runtime/provider.js +2 -2
- package/dist/cjs/router/runtime/redirect.js +51 -0
- package/dist/cjs/router/runtime/routerHelper.js +4 -0
- package/dist/cjs/router/runtime/rsc-router.js +2 -13
- package/dist/cjs/router/runtime/utils.js +3 -2
- package/dist/esm/cli/index.mjs +2 -12
- package/dist/esm/cli/ssr/index.mjs +1 -0
- package/dist/esm/core/browser/hydrate.mjs +30 -22
- package/dist/esm/core/browser/index.mjs +5 -13
- package/dist/esm/core/react/wrapper.mjs +23 -28
- package/dist/esm/core/server/requestResponse.mjs +4 -4
- package/dist/esm/core/server/scriptOrder.mjs +1 -1
- package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +1 -10
- package/dist/esm/core/server/string/index.mjs +3 -3
- package/dist/esm/core/server/utils.mjs +1 -1
- package/dist/esm/document/cli/index.mjs +1 -1
- package/dist/esm/module-federation/distributed-ssr.mjs +13 -12
- package/dist/esm/module-federation/last-known-good.mjs +1 -1
- package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +22 -33
- package/dist/esm/router/cli/code/index.mjs +16 -9
- package/dist/esm/router/cli/code/templates.mjs +36 -27
- package/dist/esm/router/cli/handler.mjs +7 -1
- package/dist/esm/router/runtime/plugin.mjs +24 -19
- package/dist/esm/router/runtime/plugin.node.mjs +12 -4
- package/dist/esm/router/runtime/provider.mjs +2 -2
- package/dist/esm/router/runtime/redirect.mjs +13 -0
- package/dist/esm/router/runtime/routerHelper.mjs +2 -1
- package/dist/esm/router/runtime/rsc-router.mjs +2 -13
- package/dist/esm/router/runtime/utils.mjs +2 -1
- package/dist/esm-node/cli/index.mjs +2 -12
- package/dist/esm-node/cli/ssr/index.mjs +1 -0
- package/dist/esm-node/core/browser/hydrate.mjs +30 -22
- package/dist/esm-node/core/browser/index.mjs +5 -13
- package/dist/esm-node/core/react/wrapper.mjs +23 -28
- package/dist/esm-node/core/server/requestResponse.mjs +4 -4
- package/dist/esm-node/core/server/scriptOrder.mjs +1 -1
- package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +1 -10
- package/dist/esm-node/core/server/string/index.mjs +3 -3
- package/dist/esm-node/core/server/utils.mjs +1 -1
- package/dist/esm-node/document/cli/index.mjs +1 -1
- package/dist/esm-node/module-federation/distributed-ssr.mjs +13 -12
- package/dist/esm-node/module-federation/last-known-good.mjs +1 -1
- package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +22 -33
- package/dist/esm-node/router/cli/code/index.mjs +16 -9
- package/dist/esm-node/router/cli/code/templates.mjs +36 -27
- package/dist/esm-node/router/cli/handler.mjs +7 -1
- package/dist/esm-node/router/runtime/plugin.mjs +24 -19
- package/dist/esm-node/router/runtime/plugin.node.mjs +12 -4
- package/dist/esm-node/router/runtime/provider.mjs +2 -2
- package/dist/esm-node/router/runtime/redirect.mjs +14 -0
- package/dist/esm-node/router/runtime/routerHelper.mjs +2 -1
- package/dist/esm-node/router/runtime/rsc-router.mjs +2 -13
- package/dist/esm-node/router/runtime/utils.mjs +2 -1
- package/dist/types/core/browser/hydrate.d.ts +0 -1
- package/dist/types/core/browser/index.d.ts +0 -1
- package/dist/types/core/server/utils.d.ts +1 -1
- package/dist/types/document/cli/index.d.ts +1 -0
- package/dist/types/module-federation/distributed-ssr.d.ts +3 -3
- package/dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts +1 -1
- package/dist/types/router/cli/code/index.d.ts +6 -1
- package/dist/types/router/cli/code/templates.d.ts +8 -3
- package/dist/types/router/cli/handler.d.ts +4 -0
- package/dist/types/router/runtime/redirect.d.ts +1 -0
- package/dist/types/router/runtime/routerHelper.d.ts +7 -0
- package/dist/types/router/runtime/rsc-router.d.ts +1 -2
- package/package.json +15 -14
- package/rstest.config.mts +2 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { merge } from "@modern-js/runtime-utils/merge";
|
|
3
|
-
import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFromElements, useHref, useLocation, useMatches } from "@modern-js/runtime-utils/router";
|
|
3
|
+
import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFromElements, useHref, useInRouterContext, useLocation, useMatches, useNavigate, useParams } from "@modern-js/runtime-utils/router";
|
|
4
4
|
import { normalizePathname } from "@modern-js/runtime-utils/url";
|
|
5
5
|
import * as __rspack_external_react from "react";
|
|
6
|
-
import { InternalRuntimeContext, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
|
|
6
|
+
import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
|
|
7
7
|
import { applyRouterRuntimeState } from "./lifecycle.mjs";
|
|
8
|
+
import { Link } from "./PrefetchLink.mjs";
|
|
8
9
|
import { routerProviderRegistryHooks } from "./provider.mjs";
|
|
9
10
|
import { createClientRouterFromPayload } from "./rsc-router.mjs";
|
|
10
11
|
import { createRouteObjectsFromConfig, deserializeErrors, renderRoutes, urlJoin } from "./utils.mjs";
|
|
@@ -38,9 +39,13 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
41
|
context.router = {
|
|
42
|
+
Link: Link,
|
|
41
43
|
useMatches: useMatches,
|
|
42
44
|
useLocation: useLocation,
|
|
43
|
-
useHref: useHref
|
|
45
|
+
useHref: useHref,
|
|
46
|
+
useInRouterContext: useInRouterContext,
|
|
47
|
+
useNavigate: useNavigate,
|
|
48
|
+
useParams: useParams
|
|
44
49
|
};
|
|
45
50
|
Object.defineProperty(context, 'routes', {
|
|
46
51
|
get () {
|
|
@@ -64,7 +69,7 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
64
69
|
};
|
|
65
70
|
let cachedRouter = null;
|
|
66
71
|
const RouterWrapper = (props)=>{
|
|
67
|
-
const routerResult = useRouterCreation(
|
|
72
|
+
const routerResult = useRouterCreation(("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) ? {
|
|
68
73
|
...props,
|
|
69
74
|
rscPayload: props?.rscPayload
|
|
70
75
|
} : props, {
|
|
@@ -82,18 +87,18 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
82
87
|
const { routes } = routerResult;
|
|
83
88
|
routesContainer.current = routes;
|
|
84
89
|
beforeCreateRouter = false;
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
90
|
+
const routerContent = /*#__PURE__*/ jsxs(Fragment, {
|
|
91
|
+
children: [
|
|
92
|
+
/*#__PURE__*/ jsx(RouterProvider, {
|
|
93
|
+
router: router
|
|
94
|
+
}),
|
|
95
|
+
/*#__PURE__*/ jsx(EmptyComponent, {}),
|
|
96
|
+
/*#__PURE__*/ jsx(EmptyComponent, {})
|
|
97
|
+
]
|
|
98
|
+
});
|
|
94
99
|
return App ? /*#__PURE__*/ jsx(App, {
|
|
95
|
-
children:
|
|
96
|
-
}) :
|
|
100
|
+
children: routerContent
|
|
101
|
+
}) : routerContent;
|
|
97
102
|
};
|
|
98
103
|
return RouterWrapper;
|
|
99
104
|
});
|
|
@@ -121,15 +126,15 @@ function useRouterCreation(props, options) {
|
|
|
121
126
|
const baseUrl = selectBasePath(location.pathname).replace(/^\/*/, '/');
|
|
122
127
|
const _basename = '/' === baseUrl ? urlJoin(baseUrl, runtimeContext._internalRouterBaseName || basename || '') : baseUrl;
|
|
123
128
|
const { unstable_getBlockNavState: getBlockNavState } = runtimeContext;
|
|
124
|
-
const rscPayload =
|
|
125
|
-
let hydrationData =
|
|
129
|
+
const rscPayload = ("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && props?.rscPayload ? safeUse(props.rscPayload) : null;
|
|
130
|
+
let hydrationData = "u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ ? window._ROUTER_DATA || rscPayload : window._ROUTER_DATA : true === getGlobalEnableRsc() ? window._ROUTER_DATA || rscPayload : window._ROUTER_DATA;
|
|
126
131
|
return (0, __rspack_external_react.useMemo)(()=>{
|
|
127
132
|
if (hydrationData?.errors) hydrationData = {
|
|
128
133
|
...hydrationData,
|
|
129
134
|
errors: deserializeErrors(hydrationData.errors)
|
|
130
135
|
};
|
|
131
136
|
let routes = null;
|
|
132
|
-
routes =
|
|
137
|
+
routes = ("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && getGlobalIsRscClient() ? createRoutes ? createRoutes() : createRouteObjectsFromConfig({
|
|
133
138
|
routesConfig: finalRouteConfig
|
|
134
139
|
}) : createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
|
|
135
140
|
routesConfig: finalRouteConfig,
|
|
@@ -137,7 +142,7 @@ function useRouterCreation(props, options) {
|
|
|
137
142
|
}));
|
|
138
143
|
if (!routes) routes = [];
|
|
139
144
|
const hooks = api.getHooks();
|
|
140
|
-
if (
|
|
145
|
+
if (("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && rscPayload) try {
|
|
141
146
|
const router = createClientRouterFromPayload(rscPayload, routes, _basename);
|
|
142
147
|
return {
|
|
143
148
|
router,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { merge } from "@modern-js/runtime-utils/merge";
|
|
3
3
|
import { createRequestContext } from "@modern-js/runtime-utils/node";
|
|
4
|
-
import { StaticRouterProvider, createRoutesFromElements, createStaticHandler, createStaticRouter } from "@modern-js/runtime-utils/router";
|
|
4
|
+
import { StaticRouterProvider, createRoutesFromElements, createStaticHandler, createStaticRouter, useInRouterContext, useLocation, useNavigate, useParams } from "@modern-js/runtime-utils/router";
|
|
5
5
|
import { time } from "@modern-js/runtime-utils/time";
|
|
6
6
|
import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
|
|
7
7
|
import { useContext } from "react";
|
|
@@ -9,6 +9,7 @@ import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalLayoutApp, getGlob
|
|
|
9
9
|
import { setServerPayload } from "../../core/context/serverPayload/index.server.mjs";
|
|
10
10
|
import DeferredDataScripts_node from "./DeferredDataScripts.node.mjs";
|
|
11
11
|
import { applyRouterRuntimeState, createRouterServerSnapshot } from "./lifecycle.mjs";
|
|
12
|
+
import { Link } from "./PrefetchLink.mjs";
|
|
12
13
|
import { routerProviderRegistryHooks } from "./provider.mjs";
|
|
13
14
|
import { RSCStaticRouter, createServerPayload, handleRSCRedirect, prepareRSCRoutes } from "./rsc-router.mjs";
|
|
14
15
|
import { createRouteObjectsFromConfig, renderRoutes, urlJoin } from "./utils.mjs";
|
|
@@ -46,6 +47,13 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
46
47
|
setup: (api)=>{
|
|
47
48
|
let finalRouteConfig = {};
|
|
48
49
|
api.onBeforeRender(async (context, interrupt)=>{
|
|
50
|
+
context.router = {
|
|
51
|
+
Link: Link,
|
|
52
|
+
useInRouterContext: useInRouterContext,
|
|
53
|
+
useLocation: useLocation,
|
|
54
|
+
useNavigate: useNavigate,
|
|
55
|
+
useParams: useParams
|
|
56
|
+
};
|
|
49
57
|
const pluginConfig = api.getRuntimeConfig();
|
|
50
58
|
const { basename = '', routesConfig, createRoutes } = merge(pluginConfig.router || {}, userConfig);
|
|
51
59
|
finalRouteConfig = {
|
|
@@ -134,10 +142,8 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
134
142
|
const enableRsc = getGlobalEnableRsc();
|
|
135
143
|
return (props)=>{
|
|
136
144
|
const context = useContext(InternalRuntimeContext);
|
|
137
|
-
const { routerContext,
|
|
138
|
-
const { nonce, mode, useJsonScript } = ssrContext;
|
|
145
|
+
const { routerContext, routes } = context;
|
|
139
146
|
const { basename } = routerContext;
|
|
140
|
-
const remixRouter = createStaticRouter(routes, routerContext);
|
|
141
147
|
if (enableRsc) return App ? /*#__PURE__*/ jsx(App, {
|
|
142
148
|
children: /*#__PURE__*/ jsx(RSCStaticRouter, {
|
|
143
149
|
basename: basename
|
|
@@ -146,6 +152,8 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
146
152
|
basename: basename
|
|
147
153
|
});
|
|
148
154
|
{
|
|
155
|
+
const { nonce, mode, useJsonScript } = context.ssrContext;
|
|
156
|
+
const remixRouter = createStaticRouter(routes, routerContext);
|
|
149
157
|
const routerWrapper = /*#__PURE__*/ jsxs(Fragment, {
|
|
150
158
|
children: [
|
|
151
159
|
/*#__PURE__*/ jsx(StaticRouterProvider, {
|
|
@@ -16,7 +16,7 @@ function createRouterProviderRealm(registrations) {
|
|
|
16
16
|
const providers = new Map();
|
|
17
17
|
let defaultProvider;
|
|
18
18
|
for (const registration of registrations){
|
|
19
|
-
if (
|
|
19
|
+
if (0 === registration.name.length) throw new Error('[@modern-js/runtime] A router provider realm cannot contain an unnamed provider.');
|
|
20
20
|
if (providers.has(registration.name)) throw new Error(`[@modern-js/runtime] Router provider "${registration.name}" is declared more than once in the same runtime realm.`);
|
|
21
21
|
if (true === registration.isDefault && void 0 !== defaultProvider && defaultProvider !== registration.name) throw new Error(`[@modern-js/runtime] Router provider realm declares both "${defaultProvider}" and "${registration.name}" as defaults.`);
|
|
22
22
|
providers.set(registration.name, registration.factory);
|
|
@@ -26,7 +26,7 @@ function createRouterProviderRealm(registrations) {
|
|
|
26
26
|
...providers.keys()
|
|
27
27
|
]);
|
|
28
28
|
return Object.freeze({
|
|
29
|
-
...defaultProvider ? {
|
|
29
|
+
...void 0 !== defaultProvider ? {
|
|
30
30
|
defaultProvider
|
|
31
31
|
} : {},
|
|
32
32
|
get: (name)=>providers.get(name),
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const handleRSCRedirect = (headers, basename, status)=>{
|
|
2
|
+
const newHeaders = new Headers(headers);
|
|
3
|
+
let redirectUrl = headers.get('Location');
|
|
4
|
+
if ('/' !== basename) redirectUrl = redirectUrl.replace(basename, '');
|
|
5
|
+
newHeaders.set('X-Modernjs-Redirect', redirectUrl);
|
|
6
|
+
newHeaders.set('X-Modernjs-BaseUrl', basename);
|
|
7
|
+
newHeaders.delete('Location');
|
|
8
|
+
return new Response(null, {
|
|
9
|
+
status,
|
|
10
|
+
headers: newHeaders
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
export { handleRSCRedirect };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ROUTE_MODULES } from "@modern-js/utils/universal/constants";
|
|
2
|
+
const isRouteErrorResponse = (error)=>null !== error && 'object' == typeof error && 'number' == typeof error.status && 'string' == typeof error.statusText && 'boolean' == typeof error.internal && 'data' in error;
|
|
2
3
|
const isObjectLike = (value)=>'object' == typeof value && null !== value || 'function' == typeof value;
|
|
3
4
|
const isRouteComponent = (value)=>'function' == typeof value || isObjectLike(value) && '$$typeof' in value;
|
|
4
5
|
const getRouteModules = ()=>{
|
|
@@ -51,4 +52,4 @@ const handleRouteModuleError = (error)=>{
|
|
|
51
52
|
console.error(error);
|
|
52
53
|
return null;
|
|
53
54
|
};
|
|
54
|
-
export { createShouldRevalidate, handleRouteModule, handleRouteModuleError, resolveRouteComponent };
|
|
55
|
+
export { createShouldRevalidate, handleRouteModule, handleRouteModuleError, isRouteErrorResponse, resolveRouteComponent };
|
|
@@ -85,18 +85,6 @@ const createServerPayload = (routerContext, routes)=>{
|
|
|
85
85
|
})
|
|
86
86
|
};
|
|
87
87
|
};
|
|
88
|
-
const handleRSCRedirect = (headers, basename, status)=>{
|
|
89
|
-
const newHeaders = new Headers(headers);
|
|
90
|
-
let redirectUrl = headers.get('Location');
|
|
91
|
-
if ('/' !== basename) redirectUrl = redirectUrl.replace(basename, '');
|
|
92
|
-
newHeaders.set('X-Modernjs-Redirect', redirectUrl);
|
|
93
|
-
newHeaders.set('X-Modernjs-BaseUrl', basename);
|
|
94
|
-
newHeaders.delete('Location');
|
|
95
|
-
return new Response(null, {
|
|
96
|
-
status: status,
|
|
97
|
-
headers: newHeaders
|
|
98
|
-
});
|
|
99
|
-
};
|
|
100
88
|
const prepareRSCRoutes = async (routes)=>{
|
|
101
89
|
const isLazyComponent = (component)=>null != component && 'object' == typeof component && '_init' in component && '_payload' in component;
|
|
102
90
|
const processRoutes = async (routesList)=>{
|
|
@@ -325,4 +313,5 @@ const RSCStaticRouter = ({ basename })=>{
|
|
|
325
313
|
children: createRSCStaticRouterComponent(payload, basename)
|
|
326
314
|
});
|
|
327
315
|
};
|
|
328
|
-
export {
|
|
316
|
+
export { handleRSCRedirect } from "./redirect.mjs";
|
|
317
|
+
export { RSCStaticRouter, createClientRouterFromPayload, createServerPayload, prepareRSCRoutes };
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import { renderNestedRoute } from "@modern-js/runtime-utils/browser";
|
|
3
|
-
import { Route, UNSAFE_ErrorResponseImpl
|
|
3
|
+
import { Route, UNSAFE_ErrorResponseImpl } from "@modern-js/runtime-utils/router";
|
|
4
4
|
import react from "react";
|
|
5
5
|
import { DefaultNotFound } from "./DefaultNotFound.mjs";
|
|
6
6
|
import DeferredDataScripts from "./DeferredDataScripts.mjs";
|
|
7
|
+
import { isRouteErrorResponse } from "./routerHelper.mjs";
|
|
7
8
|
function getRouteComponents(routes, { globalApp, ssrMode, props }) {
|
|
8
9
|
const Layout = ({ Component, ...props })=>{
|
|
9
10
|
const GlobalLayout = globalApp;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import __rslib_shim_module__ from "node:module";
|
|
2
2
|
const require = /*#__PURE__*/ __rslib_shim_module__.createRequire(/*#__PURE__*/ (()=>import.meta.url)());
|
|
3
|
-
import { cleanRequireCache
|
|
3
|
+
import { cleanRequireCache } from "@modern-js/utils";
|
|
4
4
|
import path_0 from "path";
|
|
5
5
|
import { documentPlugin } from "../document/cli/index.mjs";
|
|
6
6
|
import { getEntrypointRoutesDir, getEntrypointRoutesOwner, handleFileChange, handleGeneratorEntryCode, handleModifyEntrypoints, isRouteEntry, routerPlugin, updateNestedRoutesSpec } from "../router/cli/index.mjs";
|
|
@@ -56,12 +56,10 @@ const runtimePlugin = (params)=>({
|
|
|
56
56
|
});
|
|
57
57
|
api.config(()=>{
|
|
58
58
|
const { appDirectory, metaName } = api.getAppContext();
|
|
59
|
-
const isReact18 = utils_isReact18(appDirectory);
|
|
60
|
-
process.env.IS_REACT18 = isReact18.toString();
|
|
61
59
|
return {
|
|
62
60
|
source: {
|
|
63
61
|
globalVars: {
|
|
64
|
-
'process.env.IS_REACT18':
|
|
62
|
+
'process.env.IS_REACT18': 'true'
|
|
65
63
|
},
|
|
66
64
|
include: [
|
|
67
65
|
new RegExp(`[\\\\/]node_modules[\\\\/]@${metaName}[\\\\/]runtime[\\\\/].*[\\\\/]head\\.`)
|
|
@@ -70,14 +68,6 @@ const runtimePlugin = (params)=>({
|
|
|
70
68
|
tools: {
|
|
71
69
|
bundlerChain: (chain)=>{
|
|
72
70
|
chain.module.rule('modern-entry').test(/\.jsx?$/).include.add(path_0.resolve(appDirectory, 'node_modules', `.${metaName}`)).end().sideEffects(true);
|
|
73
|
-
},
|
|
74
|
-
rspack: (_config, { appendPlugins, rspack })=>{
|
|
75
|
-
if (!isReact18) appendPlugins([
|
|
76
|
-
new rspack.IgnorePlugin({
|
|
77
|
-
resourceRegExp: /^react-dom\/client$/,
|
|
78
|
-
contextRegExp: /@modern-js\/runtime/
|
|
79
|
-
})
|
|
80
|
-
]);
|
|
81
71
|
}
|
|
82
72
|
}
|
|
83
73
|
};
|
|
@@ -108,6 +108,7 @@ const ssrBuilderPlugin = (modernAPI, outputModule, exportLoadablePath)=>({
|
|
|
108
108
|
'process.env.MODERN_SSR_ENV': JSON.stringify(ssrEnv),
|
|
109
109
|
'process.env.MODERN_ENABLE_HYDRATION': JSON.stringify(isUseSSRBundle(userConfig)),
|
|
110
110
|
'process.env.MODERN_ENABLE_RSC': JSON.stringify(Boolean(userConfig.server?.rsc)),
|
|
111
|
+
__MODERN_ENABLE_RSC__: JSON.stringify(Boolean(userConfig.server?.rsc)),
|
|
111
112
|
'process.env.MODERN_MF_APP_SSR': JSON.stringify(isModuleFederationAppSSR)
|
|
112
113
|
}
|
|
113
114
|
},
|
|
@@ -6,15 +6,23 @@ import { hydrateRoot } from "react-dom/client";
|
|
|
6
6
|
import { RenderLevel } from "../constants.mjs";
|
|
7
7
|
import { wrapRuntimeContextProvider } from "../react/wrapper.mjs";
|
|
8
8
|
import { WithCallback } from "./withCallback.mjs";
|
|
9
|
-
const isReact18 = ()=>'true' === process.env.IS_REACT18;
|
|
10
9
|
const runtimeProcess = Reflect.get(globalThis, 'process');
|
|
10
|
+
const runtimeEnvironment = null !== runtimeProcess && 'object' == typeof runtimeProcess ? Reflect.get(runtimeProcess, 'env') : void 0;
|
|
11
|
+
const readRuntimeEnvironment = (name)=>{
|
|
12
|
+
if (null === runtimeEnvironment || 'object' != typeof runtimeEnvironment) return;
|
|
13
|
+
const value = Reflect.get(runtimeEnvironment, name);
|
|
14
|
+
return 'string' == typeof value ? value : void 0;
|
|
15
|
+
};
|
|
11
16
|
const loadableReadyOptions = {
|
|
12
|
-
chunkLoadingGlobal:
|
|
17
|
+
chunkLoadingGlobal: (()=>{
|
|
18
|
+
const configured = readRuntimeEnvironment('MODERN_CHUNK_LOADING_GLOBAL');
|
|
19
|
+
return void 0 === configured || '' === configured ? '__LOADABLE_LOADED_CHUNKS__' : configured;
|
|
20
|
+
})()
|
|
13
21
|
};
|
|
14
|
-
|
|
15
|
-
return hydrateRoot(rootElement, App, {
|
|
22
|
+
function hydrateWithReact(App, rootElement) {
|
|
23
|
+
return Promise.resolve(hydrateRoot(rootElement, App, {
|
|
16
24
|
identifierPrefix: SSR_HYDRATION_ID_PREFIX
|
|
17
|
-
});
|
|
25
|
+
}));
|
|
18
26
|
}
|
|
19
27
|
function hydrate_hydrateRoot(App, context, ModernRender, ModernHydrate) {
|
|
20
28
|
const hydrateContext = {
|
|
@@ -27,9 +35,9 @@ function hydrate_hydrateRoot(App, context, ModernRender, ModernHydrate) {
|
|
|
27
35
|
const callback = ()=>{
|
|
28
36
|
delete hydrateContext._hydration;
|
|
29
37
|
};
|
|
30
|
-
const renderLevel = window?._SSR_DATA?.renderLevel
|
|
31
|
-
const renderMode = window?._SSR_DATA?.mode
|
|
32
|
-
if (
|
|
38
|
+
const renderLevel = window?._SSR_DATA?.renderLevel ?? RenderLevel.CLIENT_RENDER;
|
|
39
|
+
const renderMode = window?._SSR_DATA?.mode ?? 'string';
|
|
40
|
+
if ('stream' === renderMode) return streamSSRHydrate();
|
|
33
41
|
function streamSSRHydrate() {
|
|
34
42
|
if (renderLevel !== RenderLevel.SERVER_RENDER) return ModernRender(wrapRuntimeContextProvider(App, context));
|
|
35
43
|
{
|
|
@@ -43,23 +51,23 @@ function hydrate_hydrateRoot(App, context, ModernRender, ModernHydrate) {
|
|
|
43
51
|
return stringSSRHydrate();
|
|
44
52
|
function stringSSRHydrate() {
|
|
45
53
|
if (renderLevel === RenderLevel.CLIENT_RENDER) return ModernRender(wrapRuntimeContextProvider(App, context));
|
|
46
|
-
|
|
47
|
-
|
|
54
|
+
{
|
|
55
|
+
if (renderLevel === RenderLevel.SERVER_RENDER) return loadableReady(()=>void 0, loadableReadyOptions).then(()=>{
|
|
48
56
|
const SSRApp = ()=>/*#__PURE__*/ jsx(WithCallback, {
|
|
49
57
|
callback: callback,
|
|
50
58
|
children: App
|
|
51
59
|
});
|
|
52
|
-
ModernHydrate(wrapRuntimeContextProvider(/*#__PURE__*/ jsx(SSRApp, {}), hydrateContext))
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
return ModernHydrate(wrapRuntimeContextProvider(/*#__PURE__*/ jsx(SSRApp, {}), hydrateContext));
|
|
61
|
+
});
|
|
62
|
+
const runtimeConsole = Reflect.get(globalThis, 'console');
|
|
63
|
+
if (null !== runtimeConsole && 'object' == typeof runtimeConsole) {
|
|
64
|
+
const warn = Reflect.get(runtimeConsole, 'warn');
|
|
65
|
+
if ('function' == typeof warn) Reflect.apply(warn, runtimeConsole, [
|
|
66
|
+
`unknow render level: ${renderLevel}, execute render()`
|
|
67
|
+
]);
|
|
68
|
+
}
|
|
69
|
+
return ModernRender(wrapRuntimeContextProvider(App, context));
|
|
70
|
+
}
|
|
63
71
|
}
|
|
64
72
|
}
|
|
65
|
-
export { hydrateWithReact, hydrate_hydrateRoot as hydrateRoot
|
|
73
|
+
export { hydrateWithReact, hydrate_hydrateRoot as hydrateRoot };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
import { SSR_HYDRATION_ID_PREFIX } from "@modern-js/utils/universal/constants";
|
|
3
2
|
import { parseCookie } from "cookie";
|
|
3
|
+
import { createRoot } from "react-dom/client";
|
|
4
4
|
import { getGlobalInternalRuntimeContext } from "../context/index.mjs";
|
|
5
5
|
import { getInitialContext } from "../context/runtime.mjs";
|
|
6
6
|
import { wrapRuntimeContextProvider } from "../react/wrapper.mjs";
|
|
@@ -70,8 +70,8 @@ async function renderApp(App, id, hydrateFromSsrData, internalRuntimeContext) {
|
|
|
70
70
|
return renderFunc(App, rootElement);
|
|
71
71
|
}
|
|
72
72
|
async function ModernHydrate(App, callback) {
|
|
73
|
-
|
|
74
|
-
return
|
|
73
|
+
if (IS_REACT18) return hydrateWithReact(App, rootElement);
|
|
74
|
+
return hydrateWithReact17(App, rootElement, callback);
|
|
75
75
|
}
|
|
76
76
|
if (hydrateFromSsrData && process.env.MODERN_ENABLE_HYDRATION && window._SSR_DATA) return hydrateRoot(App, context, ModernRender, ModernHydrate);
|
|
77
77
|
return ModernRender(wrapRuntimeContextProvider(App, context));
|
|
@@ -86,8 +86,7 @@ function createNestedAppRenderer() {
|
|
|
86
86
|
return (App, id)=>renderApp(App, id, false, internalRuntimeContext);
|
|
87
87
|
}
|
|
88
88
|
async function renderWithReact18(App, rootElement) {
|
|
89
|
-
const
|
|
90
|
-
const root = ReactDOM.createRoot(rootElement);
|
|
89
|
+
const root = createRoot(rootElement);
|
|
91
90
|
root.render(App);
|
|
92
91
|
return root;
|
|
93
92
|
}
|
|
@@ -96,16 +95,9 @@ async function renderWithReact17(App, rootElement) {
|
|
|
96
95
|
ReactDOM.render(App, rootElement);
|
|
97
96
|
return rootElement;
|
|
98
97
|
}
|
|
99
|
-
async function hydrateWithReact18(App, rootElement) {
|
|
100
|
-
const ReactDOM = await import("react-dom/client");
|
|
101
|
-
const root = ReactDOM.hydrateRoot(rootElement, App, {
|
|
102
|
-
identifierPrefix: SSR_HYDRATION_ID_PREFIX
|
|
103
|
-
});
|
|
104
|
-
return root;
|
|
105
|
-
}
|
|
106
98
|
async function hydrateWithReact17(App, rootElement, callback) {
|
|
107
99
|
const ReactDOM = await import("react-dom");
|
|
108
100
|
const root = ReactDOM.hydrate(App, rootElement, callback);
|
|
109
101
|
return root;
|
|
110
102
|
}
|
|
111
|
-
export { createNestedAppRenderer, hydrateWithReact, hydrateWithReact17,
|
|
103
|
+
export { createNestedAppRenderer, hydrateWithReact, hydrateWithReact17, render, renderWithReact17, renderWithReact18 };
|
|
@@ -4,39 +4,34 @@ import { HelmetProvider } from "react-helmet-async";
|
|
|
4
4
|
import { InternalRuntimeContext, RuntimeContext, getGlobalEnableRsc } from "../context/index.mjs";
|
|
5
5
|
import { stripRuntimeContextExtensions } from "../context/extensions.mjs";
|
|
6
6
|
import { ensureHelmetContext } from "../context/helmetContext.mjs";
|
|
7
|
-
function
|
|
8
|
-
if (
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
function createRscSafeRequestContext(ssrContext) {
|
|
8
|
+
if (void 0 === ssrContext) return {
|
|
9
|
+
request: {},
|
|
10
|
+
response: {
|
|
11
|
+
locals: {}
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
const { request, response } = ssrContext;
|
|
14
15
|
return {
|
|
15
|
-
|
|
16
|
-
useJsonScript: ssrContext.useJsonScript,
|
|
17
|
-
htmlModifiers: [],
|
|
18
|
-
baseUrl: ssrContext.baseUrl,
|
|
19
|
-
request: request ? {
|
|
16
|
+
request: {
|
|
20
17
|
url: request.url,
|
|
21
18
|
userAgent: request.userAgent,
|
|
22
19
|
cookie: request.cookie,
|
|
23
20
|
pathname: request.pathname,
|
|
24
|
-
query:
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
query: {
|
|
22
|
+
...request.query
|
|
23
|
+
},
|
|
24
|
+
params: {
|
|
25
|
+
...request.params
|
|
26
|
+
},
|
|
27
|
+
headers: {
|
|
28
|
+
...request.headers
|
|
29
|
+
},
|
|
27
30
|
host: request.host,
|
|
28
31
|
referer: request.referer
|
|
29
|
-
}
|
|
30
|
-
mode: ssrContext.mode,
|
|
31
|
-
loaderFailureMode: ssrContext.loaderFailureMode
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
function createRscSafeRequestContext(ssrContext) {
|
|
35
|
-
const safeSsrContext = createRscSafeSsrContext(ssrContext);
|
|
36
|
-
return {
|
|
37
|
-
request: safeSsrContext?.request || {},
|
|
32
|
+
},
|
|
38
33
|
response: {
|
|
39
|
-
locals:
|
|
34
|
+
locals: response.locals ?? {}
|
|
40
35
|
}
|
|
41
36
|
};
|
|
42
37
|
}
|
|
@@ -52,14 +47,14 @@ function wrapRuntimeContextProvider(App, contextValue) {
|
|
|
52
47
|
...rest
|
|
53
48
|
};
|
|
54
49
|
stripRuntimeContextExtensions(runtimeContextValue);
|
|
55
|
-
if (getGlobalEnableRsc() &&
|
|
50
|
+
if (true === getGlobalEnableRsc() && false === isBrowser) {
|
|
56
51
|
const rscSafeRequestContext = createRscSafeRequestContext(ssrContext);
|
|
57
52
|
const rscInternalContextValue = {
|
|
58
53
|
...internalContextValue,
|
|
59
54
|
context: rscSafeRequestContext,
|
|
60
|
-
requestContext: rscSafeRequestContext
|
|
61
|
-
ssrContext: createRscSafeSsrContext(ssrContext)
|
|
55
|
+
requestContext: rscSafeRequestContext
|
|
62
56
|
};
|
|
57
|
+
delete rscInternalContextValue.ssrContext;
|
|
63
58
|
const rscRuntimeContextValue = {
|
|
64
59
|
...runtimeContextValue,
|
|
65
60
|
context: rscSafeRequestContext,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import { getRouterServerSnapshot } from "../../router/runtime/lifecycle.mjs";
|
|
3
|
-
import { handleRSCRedirect } from "../../router/runtime/
|
|
3
|
+
import { handleRSCRedirect } from "../../router/runtime/redirect.mjs";
|
|
4
4
|
import { SSRErrors } from "./tracer.mjs";
|
|
5
5
|
const isRedirectStatus = (status)=>status >= 300 && status <= 399;
|
|
6
6
|
const isNullBodyStatus = (status)=>204 === status || 205 === status || 304 === status;
|
|
@@ -14,12 +14,12 @@ const processRedirect = (headers, status, ctx)=>{
|
|
|
14
14
|
const applyRouterSnapshotResult = (context, onError)=>{
|
|
15
15
|
const routerServerSnapshot = getRouterServerSnapshot(context);
|
|
16
16
|
const routerStatusCode = routerServerSnapshot?.statusCode ?? context.routerContext?.statusCode;
|
|
17
|
-
if (routerStatusCode && 200 !== routerStatusCode) context.ssrContext?.response.status(routerStatusCode);
|
|
17
|
+
if (void 0 !== routerStatusCode && 0 !== routerStatusCode && !Number.isNaN(routerStatusCode) && 200 !== routerStatusCode) context.ssrContext?.response.status(routerStatusCode);
|
|
18
18
|
const errors = Object.values(routerServerSnapshot?.errors || context.routerContext?.errors || {});
|
|
19
19
|
if (errors.length > 0) onError(errors[0], SSRErrors.LOADER_ERROR);
|
|
20
20
|
};
|
|
21
21
|
const createLoaderRedirectResponse = (beforeRenderResult, redirectCtx)=>{
|
|
22
|
-
if (
|
|
22
|
+
if (void 0 === beforeRenderResult || !isRedirectStatus(beforeRenderResult.status)) return;
|
|
23
23
|
if (beforeRenderResult.headers.has('X-Modernjs-Redirect')) return beforeRenderResult;
|
|
24
24
|
const redirectUrl = beforeRenderResult.headers.get('Location') || '/';
|
|
25
25
|
return processRedirect(new Headers({
|
|
@@ -27,7 +27,7 @@ const createLoaderRedirectResponse = (beforeRenderResult, redirectCtx)=>{
|
|
|
27
27
|
}), beforeRenderResult.status, redirectCtx);
|
|
28
28
|
};
|
|
29
29
|
const finalizeRenderResponse = (response, responseProxy, redirectCtx, routerCleanup)=>{
|
|
30
|
-
if (-1 !== responseProxy.status && isRedirectStatus(responseProxy.status) && responseProxy.headers.Location) return processRedirect(new Headers(responseProxy.headers), responseProxy.status, redirectCtx);
|
|
30
|
+
if (-1 !== responseProxy.status && isRedirectStatus(responseProxy.status) && void 0 !== responseProxy.headers.Location && '' !== responseProxy.headers.Location) return processRedirect(new Headers(responseProxy.headers), responseProxy.status, redirectCtx);
|
|
31
31
|
Object.entries(responseProxy.headers).forEach(([key, value])=>{
|
|
32
32
|
response.headers.set(key, value);
|
|
33
33
|
});
|
|
@@ -44,7 +44,7 @@ function getMatchedRouteAssets(runtimeContext, routeManifest) {
|
|
|
44
44
|
return matchedRouteIds.flatMap((routeId)=>routeAssets[routeId]?.assets ?? []);
|
|
45
45
|
}
|
|
46
46
|
function getMatchedRouteChunks(runtimeContext, routeManifest, routeAssetToChunk) {
|
|
47
|
-
if (
|
|
47
|
+
if (void 0 === routeManifest) return [];
|
|
48
48
|
return getMatchedRouteAssets(runtimeContext, routeManifest).map(routeAssetToChunk);
|
|
49
49
|
}
|
|
50
50
|
const orderHydrationScriptChunks = ({ asyncEntryChunks, collectedChunks, matchedRouteChunks, entryName })=>{
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
import { matchRoutes } from "@modern-js/runtime-utils/router";
|
|
3
2
|
import { getRouterMatchedRouteIds } from "../../../router/runtime/lifecycle.mjs";
|
|
4
3
|
import { CHUNK_CSS_PLACEHOLDER } from "../constants.mjs";
|
|
5
4
|
import { createFederatedCssLinks } from "../federatedCss.mjs";
|
|
@@ -28,20 +27,12 @@ async function buildShellBeforeTemplate(beforeAppTemplate, options) {
|
|
|
28
27
|
});
|
|
29
28
|
return safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
|
|
30
29
|
async function getCssChunks() {
|
|
31
|
-
const { routeManifest
|
|
30
|
+
const { routeManifest } = runtimeContext;
|
|
32
31
|
const routeAssets = routeManifest?.routeAssets;
|
|
33
32
|
if (!routeAssets) return '';
|
|
34
33
|
let matchedRouteManifests = [];
|
|
35
34
|
const matchedRouteIds = getRouterMatchedRouteIds(runtimeContext);
|
|
36
35
|
if (matchedRouteIds?.length) matchedRouteManifests = matchedRouteIds.map((routeId)=>routeAssets[routeId]).filter(Boolean);
|
|
37
|
-
else if (routerContext && routes) {
|
|
38
|
-
const matches = matchRoutes(routes, routerContext.location, routerContext.basename);
|
|
39
|
-
matchedRouteManifests = matches?.map((match, index)=>{
|
|
40
|
-
if (!index) return;
|
|
41
|
-
const routeId = match.route.id;
|
|
42
|
-
if (routeId) return routeAssets[routeId];
|
|
43
|
-
}).filter((routeManifest)=>void 0 !== routeManifest) ?? [];
|
|
44
|
-
}
|
|
45
36
|
const asyncEntry = routeAssets[`async-${entryName}`];
|
|
46
37
|
if (asyncEntry) matchedRouteManifests.push(asyncEntry);
|
|
47
38
|
const cssChunks = matchedRouteManifests.reduce((chunks, routeManifest)=>{
|
|
@@ -86,7 +86,7 @@ async function generateHtml(App, htmlTemplate, chunkSet, collectors, htmlModifie
|
|
|
86
86
|
createReplaceHtml(html),
|
|
87
87
|
createReplaceChunkJs(jsChunk, entryName),
|
|
88
88
|
createReplaceChunkCss(cssChunk),
|
|
89
|
-
createReplaceSSRDataScript(ssrScripts),
|
|
89
|
+
createReplaceSSRDataScript(ssrScripts, entryName),
|
|
90
90
|
createReplaceHelemt(helmetData),
|
|
91
91
|
...htmlModifiers
|
|
92
92
|
]);
|
|
@@ -95,8 +95,8 @@ async function generateHtml(App, htmlTemplate, chunkSet, collectors, htmlModifie
|
|
|
95
95
|
function createReplaceHtml(html) {
|
|
96
96
|
return (template)=>safeReplace(template, HTML_PLACEHOLDER, html);
|
|
97
97
|
}
|
|
98
|
-
function createReplaceSSRDataScript(data) {
|
|
99
|
-
return (template)=>
|
|
98
|
+
function createReplaceSSRDataScript(data, entryName) {
|
|
99
|
+
return (template)=>replaceChunkJsPlaceholder(template, data, entryName, SSR_DATA_PLACEHOLDER);
|
|
100
100
|
}
|
|
101
101
|
function createReplaceChunkJs(js, entryName) {
|
|
102
102
|
return (template)=>replaceChunkJsPlaceholder(template, js, entryName);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
import { isRouteErrorResponse } from "
|
|
2
|
+
import { isRouteErrorResponse } from "../../router/runtime/routerHelper.mjs";
|
|
3
3
|
function attributesToString(attributes) {
|
|
4
4
|
return Object.entries(attributes).reduce((str, [key, value])=>void 0 === value ? str : `${str} ${key}="${value}"`, '');
|
|
5
5
|
}
|