@bleedingdev/modern-js-runtime 3.9.0-ultramodern.1 → 3.9.0-ultramodern.11
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/code.js +3 -1
- package/dist/cjs/cli/ssr/index.js +2 -74
- package/dist/cjs/core/browser/hydrate.js +6 -1
- package/dist/cjs/core/context/index.js +4 -43
- package/dist/cjs/core/context/public.js +4 -7
- package/dist/cjs/core/context/runtime.js +17 -5
- package/dist/cjs/core/react/wrapper.js +22 -65
- package/dist/cjs/core/server/helmet.js +5 -4
- package/dist/cjs/core/server/requestResponse.js +4 -4
- package/dist/cjs/core/server/routerCleanup.js +2 -2
- package/dist/cjs/core/server/shared.js +171 -4
- package/dist/cjs/core/server/stream/afterTemplate.js +21 -16
- package/dist/cjs/core/server/stream/beforeTemplate.js +34 -25
- package/dist/cjs/core/server/stream/beforeTemplate.worker.js +28 -21
- package/dist/cjs/core/server/stream/createReadableStream.js +208 -123
- package/dist/cjs/core/server/stream/createReadableStream.worker.js +159 -90
- package/dist/cjs/core/server/stream/deferredScript.js +3 -3
- package/dist/cjs/core/server/stream/shared.js +2 -2
- package/dist/cjs/core/server/string/index.js +100 -64
- package/dist/cjs/core/server/string/loadable.js +34 -19
- package/dist/cjs/core/server/string/ssrData.js +5 -12
- package/dist/cjs/core/server/utils.js +1 -2
- package/dist/cjs/exports/head.js +7 -14
- package/dist/cjs/router/runtime/PrefetchLink.js +67 -123
- package/dist/cjs/router/runtime/hooks.js +13 -2
- package/dist/cjs/router/runtime/internal.js +7 -45
- package/dist/cjs/router/runtime/plugin.js +2 -8
- package/dist/cjs/router/runtime/plugin.node.js +2 -30
- package/dist/cjs/router/runtime/redirect.js +1 -1
- package/dist/esm/cli/code.mjs +3 -1
- package/dist/esm/cli/ssr/index.mjs +3 -72
- package/dist/esm/core/browser/hydrate.mjs +7 -2
- package/dist/esm/core/context/index.mjs +2 -5
- package/dist/esm/core/context/public.mjs +1 -5
- package/dist/esm/core/context/runtime.mjs +13 -4
- package/dist/esm/core/react/wrapper.mjs +21 -67
- package/dist/esm/core/server/helmet.mjs +5 -4
- package/dist/esm/core/server/requestResponse.mjs +3 -3
- package/dist/esm/core/server/routerCleanup.mjs +1 -1
- package/dist/esm/core/server/shared.mjs +153 -1
- package/dist/esm/core/server/stream/afterTemplate.mjs +23 -18
- package/dist/esm/core/server/stream/beforeTemplate.mjs +37 -28
- package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +31 -24
- package/dist/esm/core/server/stream/createReadableStream.mjs +207 -122
- package/dist/esm/core/server/stream/createReadableStream.worker.mjs +149 -90
- package/dist/esm/core/server/stream/deferredScript.mjs +3 -3
- package/dist/esm/core/server/stream/shared.mjs +2 -2
- package/dist/esm/core/server/string/index.mjs +104 -68
- package/dist/esm/core/server/string/loadable.mjs +34 -19
- package/dist/esm/core/server/string/ssrData.mjs +5 -12
- package/dist/esm/core/server/utils.mjs +1 -2
- package/dist/esm/exports/head.mjs +7 -14
- package/dist/esm/router/runtime/PrefetchLink.mjs +67 -123
- package/dist/esm/router/runtime/hooks.mjs +9 -1
- package/dist/esm/router/runtime/internal.mjs +2 -33
- package/dist/esm/router/runtime/plugin.mjs +1 -7
- package/dist/esm/router/runtime/plugin.node.mjs +1 -29
- package/dist/esm/router/runtime/redirect.mjs +1 -1
- package/dist/esm-node/cli/code.mjs +3 -1
- package/dist/esm-node/cli/ssr/index.mjs +3 -72
- package/dist/esm-node/core/browser/hydrate.mjs +7 -2
- package/dist/esm-node/core/context/index.mjs +2 -5
- package/dist/esm-node/core/context/public.mjs +1 -5
- package/dist/esm-node/core/context/runtime.mjs +13 -4
- package/dist/esm-node/core/react/wrapper.mjs +21 -67
- package/dist/esm-node/core/server/helmet.mjs +5 -4
- package/dist/esm-node/core/server/requestResponse.mjs +3 -3
- package/dist/esm-node/core/server/routerCleanup.mjs +1 -1
- package/dist/esm-node/core/server/shared.mjs +153 -1
- package/dist/esm-node/core/server/stream/afterTemplate.mjs +23 -18
- package/dist/esm-node/core/server/stream/beforeTemplate.mjs +37 -28
- package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +31 -24
- package/dist/esm-node/core/server/stream/createReadableStream.mjs +207 -122
- package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +149 -90
- package/dist/esm-node/core/server/stream/deferredScript.mjs +3 -3
- package/dist/esm-node/core/server/stream/shared.mjs +2 -2
- package/dist/esm-node/core/server/string/index.mjs +104 -68
- package/dist/esm-node/core/server/string/loadable.mjs +34 -19
- package/dist/esm-node/core/server/string/ssrData.mjs +5 -12
- package/dist/esm-node/core/server/utils.mjs +1 -2
- package/dist/esm-node/exports/head.mjs +7 -14
- package/dist/esm-node/router/runtime/PrefetchLink.mjs +67 -123
- package/dist/esm-node/router/runtime/hooks.mjs +9 -1
- package/dist/esm-node/router/runtime/internal.mjs +2 -33
- package/dist/esm-node/router/runtime/plugin.mjs +1 -7
- package/dist/esm-node/router/runtime/plugin.node.mjs +1 -29
- package/dist/esm-node/router/runtime/redirect.mjs +1 -1
- package/dist/types/cli/ssr/index.d.ts +0 -3
- package/dist/types/core/context/index.d.ts +4 -6
- package/dist/types/core/context/public.d.ts +1 -23
- package/dist/types/core/context/runtime.d.ts +26 -2
- package/dist/types/core/react/wrapper.d.ts +6 -0
- package/dist/types/core/server/helmet.d.ts +4 -5
- package/dist/types/core/server/requestHandler.d.ts +2 -2
- package/dist/types/core/server/requestResponse.d.ts +1 -1
- package/dist/types/core/server/routerCleanup.d.ts +1 -1
- package/dist/types/core/server/shared.d.ts +24 -1
- package/dist/types/core/server/stream/afterTemplate.d.ts +2 -1
- package/dist/types/core/server/stream/beforeTemplate.d.ts +4 -1
- package/dist/types/core/server/stream/beforeTemplate.worker.d.ts +4 -1
- package/dist/types/core/server/stream/shared.d.ts +2 -2
- package/dist/types/core/server/string/loadable.d.ts +6 -3
- package/dist/types/core/server/string/ssrData.d.ts +2 -1
- package/dist/types/core/server/string/types.d.ts +1 -5
- package/dist/types/core/server/tracer.d.ts +1 -1
- package/dist/types/core/server/utils.d.ts +1 -1
- package/dist/types/core/types.d.ts +1 -2
- package/dist/types/exports/head.d.ts +2 -2
- package/dist/types/router/runtime/PrefetchLink.d.ts +27 -2
- package/dist/types/router/runtime/hooks.d.ts +19 -2
- package/dist/types/router/runtime/internal.d.ts +4 -21
- package/dist/types/router/runtime/types.d.ts +2 -43
- package/package.json +18 -46
- package/rstest.config.mts +32 -2
- package/dist/cjs/boundary-debugger/index.js +0 -317
- package/dist/cjs/core/context/extensions.js +0 -74
- package/dist/cjs/core/context/helmetContext.js +0 -54
- package/dist/cjs/core/server/federatedCss.js +0 -58
- package/dist/cjs/core/server/scriptOrder.js +0 -140
- package/dist/cjs/module-federation/consume-surface.js +0 -199
- package/dist/cjs/module-federation/distributed-ssr.js +0 -135
- package/dist/cjs/module-federation/index.js +0 -316
- package/dist/cjs/module-federation/last-known-good.js +0 -157
- package/dist/cjs/module-federation/manifest-recovery-runtime-plugin.js +0 -129
- package/dist/cjs/module-federation/surface-resolution-types.js +0 -61
- package/dist/cjs/router/runtime/lifecycle.js +0 -167
- package/dist/cjs/router/runtime/provider.js +0 -153
- package/dist/esm/boundary-debugger/index.mjs +0 -277
- package/dist/esm/core/context/extensions.mjs +0 -33
- package/dist/esm/core/context/helmetContext.mjs +0 -13
- package/dist/esm/core/server/federatedCss.mjs +0 -20
- package/dist/esm/core/server/scriptOrder.mjs +0 -90
- package/dist/esm/module-federation/consume-surface.mjs +0 -158
- package/dist/esm/module-federation/distributed-ssr.mjs +0 -82
- package/dist/esm/module-federation/index.mjs +0 -115
- package/dist/esm/module-federation/last-known-good.mjs +0 -113
- package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +0 -89
- package/dist/esm/module-federation/surface-resolution-types.mjs +0 -8
- package/dist/esm/router/runtime/lifecycle.mjs +0 -105
- package/dist/esm/router/runtime/provider.mjs +0 -100
- package/dist/esm-node/boundary-debugger/index.mjs +0 -278
- package/dist/esm-node/core/context/extensions.mjs +0 -34
- package/dist/esm-node/core/context/helmetContext.mjs +0 -14
- package/dist/esm-node/core/server/federatedCss.mjs +0 -21
- package/dist/esm-node/core/server/scriptOrder.mjs +0 -91
- package/dist/esm-node/module-federation/consume-surface.mjs +0 -159
- package/dist/esm-node/module-federation/distributed-ssr.mjs +0 -83
- package/dist/esm-node/module-federation/index.mjs +0 -116
- package/dist/esm-node/module-federation/last-known-good.mjs +0 -114
- package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +0 -90
- package/dist/esm-node/module-federation/surface-resolution-types.mjs +0 -9
- package/dist/esm-node/router/runtime/lifecycle.mjs +0 -106
- package/dist/esm-node/router/runtime/provider.mjs +0 -101
- package/dist/types/boundary-debugger/index.d.ts +0 -28
- package/dist/types/core/context/extensions.d.ts +0 -35
- package/dist/types/core/context/helmetContext.d.ts +0 -10
- package/dist/types/core/server/federatedCss.d.ts +0 -5
- package/dist/types/core/server/scriptOrder.d.ts +0 -25
- package/dist/types/module-federation/consume-surface.d.ts +0 -104
- package/dist/types/module-federation/distributed-ssr.d.ts +0 -61
- package/dist/types/module-federation/index.d.ts +0 -71
- package/dist/types/module-federation/last-known-good.d.ts +0 -52
- package/dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts +0 -25
- package/dist/types/module-federation/surface-resolution-types.d.ts +0 -23
- package/dist/types/router/runtime/lifecycle.d.ts +0 -27
- package/dist/types/router/runtime/provider.d.ts +0 -78
|
@@ -6,4 +6,12 @@ const onBeforeCreateRouter = createRouterSyncHook();
|
|
|
6
6
|
const onAfterCreateRouter = createRouterSyncHook();
|
|
7
7
|
const onBeforeHydrateRouter = createRouterSyncHook();
|
|
8
8
|
const onAfterHydrateRouter = createRouterSyncHook();
|
|
9
|
-
|
|
9
|
+
const routerProviderRegistryHooks = {
|
|
10
|
+
modifyRoutes: modifyRoutes,
|
|
11
|
+
onBeforeCreateRoutes: onBeforeCreateRoutes,
|
|
12
|
+
onBeforeCreateRouter: onBeforeCreateRouter,
|
|
13
|
+
onAfterCreateRouter: onAfterCreateRouter,
|
|
14
|
+
onBeforeHydrateRouter: onBeforeHydrateRouter,
|
|
15
|
+
onAfterHydrateRouter: onAfterHydrateRouter
|
|
16
|
+
};
|
|
17
|
+
export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter, routerProviderRegistryHooks };
|
|
@@ -1,34 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { createRouterProviderRealm, registerRouterProvider, reportUnsupportedProviderRegistryHooks, resolveRouterProvider, routerProviderRegistryHooks } from "./provider.mjs";
|
|
4
|
-
registerRouterProvider('react-router', routerPlugin, {
|
|
5
|
-
isDefault: true
|
|
6
|
-
});
|
|
7
|
-
const createRouterPlugin = (localProviders = [])=>{
|
|
8
|
-
const providerRealm = createRouterProviderRealm([
|
|
9
|
-
{
|
|
10
|
-
name: 'react-router',
|
|
11
|
-
factory: routerPlugin,
|
|
12
|
-
isDefault: true
|
|
13
|
-
},
|
|
14
|
-
...localProviders
|
|
15
|
-
]);
|
|
16
|
-
return (userConfig = {})=>({
|
|
17
|
-
name: '@modern-js/plugin-router',
|
|
18
|
-
registryHooks: routerProviderRegistryHooks,
|
|
19
|
-
setup: (api)=>{
|
|
20
|
-
const mergedConfig = merge(api.getRuntimeConfig().router || {}, userConfig);
|
|
21
|
-
const pluginFactory = resolveRouterProvider(mergedConfig.framework, {
|
|
22
|
-
realm: providerRealm
|
|
23
|
-
});
|
|
24
|
-
const providerPlugin = pluginFactory(userConfig);
|
|
25
|
-
reportUnsupportedProviderRegistryHooks(providerPlugin);
|
|
26
|
-
providerPlugin.setup?.(api);
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
};
|
|
30
|
-
const internal_routerPlugin = createRouterPlugin();
|
|
31
|
-
const internal = internal_routerPlugin;
|
|
1
|
+
export { routerProviderRegistryHooks } from "./hooks.mjs";
|
|
2
|
+
export { modifyRoutes, routerPlugin as default, routerPlugin } from "./plugin.mjs";
|
|
32
3
|
export { renderRoutes } from "./utils.mjs";
|
|
33
|
-
export default internal;
|
|
34
|
-
export { createRouterPlugin, createRouterProviderRealm, internal_routerPlugin as routerPlugin, modifyRoutes, registerRouterProvider, resolveRouterProvider };
|
|
@@ -4,9 +4,8 @@ import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFrom
|
|
|
4
4
|
import { normalizePathname } from "@modern-js/runtime-utils/url";
|
|
5
5
|
import * as __rspack_external_react from "react";
|
|
6
6
|
import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
|
|
7
|
-
import {
|
|
7
|
+
import { routerProviderRegistryHooks } from "./hooks.mjs";
|
|
8
8
|
import { Link } from "./PrefetchLink.mjs";
|
|
9
|
-
import { routerProviderRegistryHooks } from "./provider.mjs";
|
|
10
9
|
import { createClientRouterFromPayload } from "./rsc-router.mjs";
|
|
11
10
|
import { createRouteObjectsFromConfig, deserializeErrors, renderRoutes, urlJoin } from "./utils.mjs";
|
|
12
11
|
let finalRouteConfig = {
|
|
@@ -168,11 +167,6 @@ function useRouterCreation(props, options) {
|
|
|
168
167
|
basename: _basename,
|
|
169
168
|
hydrationData
|
|
170
169
|
});
|
|
171
|
-
applyRouterRuntimeState(runtimeContext, {
|
|
172
|
-
framework: 'react-router',
|
|
173
|
-
basename: _basename,
|
|
174
|
-
instance: router
|
|
175
|
-
});
|
|
176
170
|
hooks.onAfterCreateRouter.call({
|
|
177
171
|
...routerLifecycleContext,
|
|
178
172
|
router,
|
|
@@ -8,9 +8,8 @@ import { useContext } from "react";
|
|
|
8
8
|
import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
|
|
9
9
|
import { setServerPayload } from "../../core/context/serverPayload/index.server.mjs";
|
|
10
10
|
import DeferredDataScripts_node from "./DeferredDataScripts.node.mjs";
|
|
11
|
-
import {
|
|
11
|
+
import { routerProviderRegistryHooks } from "./hooks.mjs";
|
|
12
12
|
import { Link } from "./PrefetchLink.mjs";
|
|
13
|
-
import { routerProviderRegistryHooks } from "./provider.mjs";
|
|
14
13
|
import { RSCStaticRouter, createServerPayload, handleRSCRedirect, prepareRSCRoutes } from "./rsc-router.mjs";
|
|
15
14
|
import { createRouteObjectsFromConfig, renderRoutes, urlJoin } from "./utils.mjs";
|
|
16
15
|
function createRemixRequest(request) {
|
|
@@ -23,24 +22,6 @@ function createRemixRequest(request) {
|
|
|
23
22
|
signal: controller.signal
|
|
24
23
|
});
|
|
25
24
|
}
|
|
26
|
-
function createReactRouterServerSnapshot(routerContext, basename) {
|
|
27
|
-
return createRouterServerSnapshot({
|
|
28
|
-
framework: 'react-router',
|
|
29
|
-
basename,
|
|
30
|
-
statusCode: routerContext.statusCode,
|
|
31
|
-
errors: routerContext.errors,
|
|
32
|
-
routerData: {
|
|
33
|
-
loaderData: routerContext.loaderData,
|
|
34
|
-
errors: routerContext.errors
|
|
35
|
-
},
|
|
36
|
-
matches: routerContext.matches.map((match)=>{
|
|
37
|
-
const routeId = match.route.id;
|
|
38
|
-
return 'string' == typeof routeId ? {
|
|
39
|
-
routeId
|
|
40
|
-
} : void 0;
|
|
41
|
-
}).filter((match)=>void 0 !== match)
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
25
|
const routerPlugin = (userConfig = {})=>({
|
|
45
26
|
name: '@modern-js/plugin-router',
|
|
46
27
|
registryHooks: routerProviderRegistryHooks,
|
|
@@ -107,18 +88,9 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
107
88
|
throw errors[0];
|
|
108
89
|
}
|
|
109
90
|
context.routerContext = routerContext;
|
|
110
|
-
const routerServerSnapshot = createReactRouterServerSnapshot(routerContext, _basename);
|
|
111
|
-
applyRouterRuntimeState(context, {
|
|
112
|
-
framework: 'react-router',
|
|
113
|
-
basename: _basename,
|
|
114
|
-
instance: routerContext,
|
|
115
|
-
matchedRouteIds: routerServerSnapshot.matchedRouteIds,
|
|
116
|
-
serverSnapshot: routerServerSnapshot
|
|
117
|
-
});
|
|
118
91
|
hooks.onAfterCreateRouter.call({
|
|
119
92
|
...routerLifecycleContext,
|
|
120
93
|
router: routerContext,
|
|
121
|
-
serverSnapshot: routerServerSnapshot,
|
|
122
94
|
runtimeContext: context
|
|
123
95
|
});
|
|
124
96
|
let payload;
|
|
@@ -74,7 +74,9 @@ const generateCode = async (entrypoints, appContext, config, hooks)=>{
|
|
|
74
74
|
const bootstrapFile = path.resolve(internalDirectory, `./${entryName}/${ENTRY_BOOTSTRAP_FILE_NAME}`);
|
|
75
75
|
await fs.outputFile(bootstrapFile, `import(/* webpackChunkName: "async-${entryName}" */ './${INDEX_FILE_NAME}');`, 'utf8');
|
|
76
76
|
const bootstrapServerFile = path.resolve(internalDirectory, `./${entryName}/${ENTRY_SERVER_BOOTSTRAP_FILE_NAME}`);
|
|
77
|
-
if (ssrMode) await fs.outputFile(bootstrapServerFile, `export const requestHandler = import('./${SERVER_ENTRY_POINT_FILE_NAME}').then((m) => m.requestHandler)
|
|
77
|
+
if (ssrMode) await fs.outputFile(bootstrapServerFile, `export const requestHandler = import('./${SERVER_ENTRY_POINT_FILE_NAME}').then((m) => m.requestHandler);
|
|
78
|
+
// The renderer awaits this promise later; retain its rejection without an early unhandled rejection.
|
|
79
|
+
requestHandler.catch(() => {});`, 'utf8');
|
|
78
80
|
}
|
|
79
81
|
if (ssrMode) {
|
|
80
82
|
const indexServerCode = __rspack_external__template_server_mjs_f98cfe58.serverIndex({
|
|
@@ -4,51 +4,6 @@ import { LOADABLE_STATS_FILE, isUseSSRBundle } from "@modern-js/utils";
|
|
|
4
4
|
import path from "path";
|
|
5
5
|
import loadable_bundler_plugin from "./loadable-bundler-plugin.mjs";
|
|
6
6
|
import { resolveSSRMode } from "./mode.mjs";
|
|
7
|
-
const getRspackPlugins = (rspackConfig)=>{
|
|
8
|
-
if (!rspackConfig) return [];
|
|
9
|
-
const rspackEntries = Array.isArray(rspackConfig) ? rspackConfig : [
|
|
10
|
-
rspackConfig
|
|
11
|
-
];
|
|
12
|
-
const plugins = [];
|
|
13
|
-
for (const entry of rspackEntries){
|
|
14
|
-
if (!entry || 'function' == typeof entry || 'object' != typeof entry) continue;
|
|
15
|
-
const maybePlugins = entry.plugins;
|
|
16
|
-
if (Array.isArray(maybePlugins)) {
|
|
17
|
-
for (const plugin of maybePlugins)if (plugin) plugins.push(plugin);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return plugins;
|
|
21
|
-
};
|
|
22
|
-
const getRspackPluginName = (plugin)=>{
|
|
23
|
-
if ('string' == typeof plugin) return plugin;
|
|
24
|
-
if ('function' == typeof plugin) return plugin.name;
|
|
25
|
-
if (Array.isArray(plugin)) {
|
|
26
|
-
const [first] = plugin;
|
|
27
|
-
if (!first) return;
|
|
28
|
-
if ('string' == typeof first) return first;
|
|
29
|
-
if ('function' == typeof first) return first.name;
|
|
30
|
-
if ('object' == typeof first) return first.name || first.constructor?.name;
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
return plugin.name || plugin.constructor?.name;
|
|
34
|
-
};
|
|
35
|
-
const hasServerRenderingConfig = (userConfig)=>{
|
|
36
|
-
const { output, server } = userConfig;
|
|
37
|
-
if (output?.ssg) return true;
|
|
38
|
-
if (output?.ssgByEntries && Object.keys(output.ssgByEntries).length > 0) return true;
|
|
39
|
-
if (server?.ssr) return true;
|
|
40
|
-
if (server?.ssrByEntries && Object.keys(server.ssrByEntries).length > 0) return true;
|
|
41
|
-
return false;
|
|
42
|
-
};
|
|
43
|
-
const isModuleFederationAppSSREnabledInConfig = (ssr)=>{
|
|
44
|
-
if (!ssr || 'object' != typeof ssr) return false;
|
|
45
|
-
return true === ssr.moduleFederationAppSSR;
|
|
46
|
-
};
|
|
47
|
-
const isModuleFederationAppSSREnabled = (userConfig)=>{
|
|
48
|
-
if (isModuleFederationAppSSREnabledInConfig(userConfig.server?.ssr)) return true;
|
|
49
|
-
if (userConfig.server?.ssrByEntries && 'object' == typeof userConfig.server.ssrByEntries) return Object.values(userConfig.server.ssrByEntries).some(isModuleFederationAppSSREnabledInConfig);
|
|
50
|
-
return false;
|
|
51
|
-
};
|
|
52
7
|
const checkUseStringSSR = (config, appDirectory, entrypoints)=>{
|
|
53
8
|
if (entrypoints && entrypoints.length > 0) {
|
|
54
9
|
for (const entrypoint of entrypoints){
|
|
@@ -64,41 +19,19 @@ const checkUseStringSSR = (config, appDirectory, entrypoints)=>{
|
|
|
64
19
|
}
|
|
65
20
|
return true;
|
|
66
21
|
};
|
|
67
|
-
const isModuleFederationRspackPlugin = (plugin)=>{
|
|
68
|
-
const candidate = getRspackPluginName(plugin);
|
|
69
|
-
return 'string' == typeof candidate && /modulefederation/i.test(candidate);
|
|
70
|
-
};
|
|
71
|
-
const hasModuleFederationMarker = (config)=>{
|
|
72
|
-
if ('true' === process.env.MF_SSR_PRJ) return true;
|
|
73
|
-
const define = config.source?.define || {};
|
|
74
|
-
if ('REMOTE_IP_STRATEGY' in define || 'FEDERATION_IPV4' in define) return true;
|
|
75
|
-
const plugins = getRspackPlugins(config.tools?.rspack);
|
|
76
|
-
return plugins.some(isModuleFederationRspackPlugin);
|
|
77
|
-
};
|
|
78
22
|
const isNodeEnvironmentTarget = (target)=>'string' == typeof target && ('node' === target || 'async-node' === target || target.startsWith('node'));
|
|
79
|
-
const shouldUseModuleFederationNodeOutput = (config)=>isNodeEnvironmentTarget(config.output?.target) && hasModuleFederationMarker(config);
|
|
80
23
|
const ssrBuilderPlugin = (modernAPI, outputModule, exportLoadablePath)=>({
|
|
81
24
|
name: '@modern-js/builder-plugin-ssr',
|
|
82
25
|
setup (api) {
|
|
83
26
|
api.modifyEnvironmentConfig((config, { name, mergeEnvironmentConfig })=>{
|
|
84
27
|
const isServerEnvironment = isNodeEnvironmentTarget(config.output.target) || 'workerSSR' === name;
|
|
85
28
|
const userConfig = modernAPI.getNormalizedConfig();
|
|
86
|
-
const hasServerRendering = hasServerRenderingConfig(userConfig);
|
|
87
|
-
const hasModuleFederationRuntimeMarker = hasServerRendering && shouldUseModuleFederationNodeOutput(config);
|
|
88
|
-
const hasExplicitMfSsrFlag = isModuleFederationAppSSREnabled(userConfig);
|
|
89
|
-
const requireExplicitMfSsrFlag = 'true' === process.env.MODERN_MF_APP_SSR_REQUIRE_EXPLICIT;
|
|
90
|
-
if (hasServerRendering && hasModuleFederationRuntimeMarker && !hasExplicitMfSsrFlag) {
|
|
91
|
-
const warningMessage = '[modernjs][mf-ssr] Module Federation SSR was auto-detected from runtime markers. Set server.ssr.moduleFederationAppSSR=true explicitly in host and remotes to avoid heuristic drift.';
|
|
92
|
-
if (requireExplicitMfSsrFlag) throw new Error(`${warningMessage} (enforced by MODERN_MF_APP_SSR_REQUIRE_EXPLICIT=true)`);
|
|
93
|
-
console.warn(warningMessage);
|
|
94
|
-
}
|
|
95
|
-
const isModuleFederationAppSSR = hasServerRendering && hasExplicitMfSsrFlag;
|
|
96
29
|
const ssrEnv = userConfig.deploy?.worker?.ssr || userConfig.server?.rsc ? 'edge' : 'node';
|
|
97
30
|
const appContext = modernAPI.getAppContext();
|
|
98
31
|
const { appDirectory, entrypoints } = appContext;
|
|
99
32
|
const useLoadablePlugin = isUseSSRBundle(userConfig) && !isServerEnvironment && checkUseStringSSR(userConfig, appDirectory, entrypoints);
|
|
100
33
|
const outputConfig = {
|
|
101
|
-
module: isServerEnvironment &&
|
|
34
|
+
module: isServerEnvironment && outputModule
|
|
102
35
|
};
|
|
103
36
|
const useLoadableComponents = isUseSSRBundle(userConfig) && checkUseStringSSR(userConfig, appDirectory, entrypoints);
|
|
104
37
|
return mergeEnvironmentConfig(config, {
|
|
@@ -108,12 +41,10 @@ const ssrBuilderPlugin = (modernAPI, outputModule, exportLoadablePath)=>({
|
|
|
108
41
|
'process.env.MODERN_SSR_ENV': JSON.stringify(ssrEnv),
|
|
109
42
|
'process.env.MODERN_ENABLE_HYDRATION': JSON.stringify(isUseSSRBundle(userConfig)),
|
|
110
43
|
'process.env.MODERN_ENABLE_RSC': JSON.stringify(Boolean(userConfig.server?.rsc)),
|
|
111
|
-
__MODERN_ENABLE_RSC__: JSON.stringify(Boolean(userConfig.server?.rsc))
|
|
112
|
-
'process.env.MODERN_MF_APP_SSR': JSON.stringify(String(isModuleFederationAppSSR))
|
|
44
|
+
__MODERN_ENABLE_RSC__: JSON.stringify(Boolean(userConfig.server?.rsc))
|
|
113
45
|
}
|
|
114
46
|
},
|
|
115
47
|
output: outputConfig,
|
|
116
|
-
splitChunks: isServerEnvironment && (hasModuleFederationRuntimeMarker || hasExplicitMfSsrFlag) ? false : void 0,
|
|
117
48
|
tools: {
|
|
118
49
|
bundlerChain: useLoadablePlugin ? (chain)=>{
|
|
119
50
|
chain.plugin('loadable').use(loadable_bundler_plugin, [
|
|
@@ -182,4 +113,4 @@ const ssrPlugin = ()=>({
|
|
|
182
113
|
});
|
|
183
114
|
const cli_ssr = ssrPlugin;
|
|
184
115
|
export default cli_ssr;
|
|
185
|
-
export {
|
|
116
|
+
export { ssrPlugin };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { loadableReady } from "@loadable/component";
|
|
4
4
|
import { SSR_HYDRATION_ID_PREFIX } from "@modern-js/utils/universal/constants";
|
|
5
5
|
import { hydrateRoot } from "react-dom/client";
|
|
@@ -35,7 +35,12 @@ function hydrate_hydrateRoot(App, context, ModernRender, ModernHydrate) {
|
|
|
35
35
|
callback: callback,
|
|
36
36
|
children: App
|
|
37
37
|
});
|
|
38
|
-
return ModernHydrate(
|
|
38
|
+
return ModernHydrate(/*#__PURE__*/ jsxs(Fragment, {
|
|
39
|
+
children: [
|
|
40
|
+
wrapRuntimeContextProvider(/*#__PURE__*/ jsx(SSRApp, {}), hydrateContext),
|
|
41
|
+
null
|
|
42
|
+
]
|
|
43
|
+
}));
|
|
39
44
|
}
|
|
40
45
|
}
|
|
41
46
|
return stringSSRHydrate();
|
|
@@ -42,10 +42,7 @@ function getGlobalBasename() {
|
|
|
42
42
|
return globalContext.basename;
|
|
43
43
|
}
|
|
44
44
|
export { DefaultNotFound } from "../../router/runtime/DefaultNotFound.mjs";
|
|
45
|
-
export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter } from "../../router/runtime/hooks.mjs";
|
|
46
|
-
export {
|
|
47
|
-
export { createRouterProviderRealm, registerRouterProvider, resolveRouterProvider, routerProviderRegistryHooks } from "../../router/runtime/provider.mjs";
|
|
48
|
-
export { createRuntimeContextExtension } from "./extensions.mjs";
|
|
49
|
-
export { InternalRuntimeContext, RuntimeContext, getInitialContext } from "./runtime.mjs";
|
|
45
|
+
export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter, routerProviderRegistryHooks } from "../../router/runtime/hooks.mjs";
|
|
46
|
+
export { InternalRuntimeContext, RuntimeComponentResolverContext, RuntimeContext, getInitialContext } from "./runtime.mjs";
|
|
50
47
|
export { getServerPayload, setServerPayload } from "./serverPayload/index.mjs";
|
|
51
48
|
export { getCurrentEntryName, getGlobalApp, getGlobalBasename, getGlobalEnableRsc, getGlobalInternalRuntimeContext, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRSCRoot, getGlobalRoutes, setGlobalContext, setGlobalInternalRuntimeContext };
|
|
@@ -1,6 +1,2 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
|
|
3
|
-
const RuntimeContext = createContext({});
|
|
4
|
-
const ReactRuntimeContext = RuntimeContext;
|
|
5
|
-
const useRuntimeContext = ()=>useContext(RuntimeContext);
|
|
6
|
-
export { ReactRuntimeContext, RuntimeContext, useRuntimeContext };
|
|
2
|
+
export { ReactRuntimeContext, RuntimeContext, useRuntimeContext } from "./runtime.mjs";
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
import { createContext } from "react";
|
|
2
|
+
import { createContext, useContext } from "react";
|
|
3
3
|
const ROUTE_MANIFEST = '_MODERNJS_ROUTE_MANIFEST';
|
|
4
|
-
|
|
4
|
+
function getRuntimeReactContext(kind, create) {
|
|
5
|
+
const key = Symbol.for(`@modern-js/runtime:react-context:v1:${kind}`);
|
|
6
|
+
const contexts = globalThis;
|
|
7
|
+
contexts[key] ??= create();
|
|
8
|
+
return contexts[key];
|
|
9
|
+
}
|
|
10
|
+
const InternalRuntimeContext = getRuntimeReactContext('internal', ()=>createContext({}));
|
|
11
|
+
const RuntimeContext = getRuntimeReactContext('public', ()=>createContext({}));
|
|
12
|
+
const RuntimeComponentResolverContext = getRuntimeReactContext('component-resolver', ()=>createContext(void 0));
|
|
13
|
+
const ReactRuntimeContext = RuntimeContext;
|
|
14
|
+
const useRuntimeContext = ()=>useContext(RuntimeContext);
|
|
5
15
|
const getInitialContext = (isBrowser = true, routeManifest)=>{
|
|
6
16
|
const requestContext = {
|
|
7
17
|
request: {
|
|
@@ -25,5 +35,4 @@ const getInitialContext = (isBrowser = true, routeManifest)=>{
|
|
|
25
35
|
context: requestContext
|
|
26
36
|
};
|
|
27
37
|
};
|
|
28
|
-
export { ReactRuntimeContext, RuntimeContext, useRuntimeContext }
|
|
29
|
-
export { InternalRuntimeContext, getInitialContext };
|
|
38
|
+
export { InternalRuntimeContext, ReactRuntimeContext, RuntimeComponentResolverContext, RuntimeContext, getInitialContext, useRuntimeContext };
|
|
@@ -1,46 +1,15 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
Object.defineProperty(requestContext.response, 'setHeader', {
|
|
10
|
-
enumerable: false
|
|
3
|
+
import { InternalRuntimeContext, RuntimeContext, getGlobalEnableRsc, getGlobalInternalRuntimeContext } from "../context/index.mjs";
|
|
4
|
+
import { RuntimeComponentResolverContext } from "../context/runtime.mjs";
|
|
5
|
+
function wrapRuntimeComponentResolver(root, hooks = getGlobalInternalRuntimeContext()?.hooks) {
|
|
6
|
+
return /*#__PURE__*/ jsx(RuntimeComponentResolverContext.Provider, {
|
|
7
|
+
value: hooks?.resolveComponent?.call,
|
|
8
|
+
children: root
|
|
11
9
|
});
|
|
12
|
-
Object.defineProperty(requestContext.response, 'status', {
|
|
13
|
-
enumerable: false
|
|
14
|
-
});
|
|
15
|
-
if (void 0 === ssrContext) return requestContext;
|
|
16
|
-
const { request, response } = ssrContext;
|
|
17
|
-
return {
|
|
18
|
-
request: {
|
|
19
|
-
url: request.url,
|
|
20
|
-
userAgent: request.userAgent,
|
|
21
|
-
cookie: request.cookie,
|
|
22
|
-
pathname: request.pathname,
|
|
23
|
-
query: {
|
|
24
|
-
...request.query
|
|
25
|
-
},
|
|
26
|
-
params: {
|
|
27
|
-
...request.params
|
|
28
|
-
},
|
|
29
|
-
headers: {
|
|
30
|
-
...request.headers
|
|
31
|
-
},
|
|
32
|
-
host: request.host,
|
|
33
|
-
referer: request.referer
|
|
34
|
-
},
|
|
35
|
-
response: Object.assign(requestContext.response, {
|
|
36
|
-
locals: response.locals ?? {}
|
|
37
|
-
})
|
|
38
|
-
};
|
|
39
10
|
}
|
|
40
11
|
function wrapRuntimeContextProvider(App, contextValue) {
|
|
41
12
|
const { isBrowser, initialData, routes, context, routeManifest, routerContext, unstable_getBlockNavState, ssrContext, _internalContext, _internalRouterBaseName, ...rest } = contextValue;
|
|
42
|
-
const internalContextValue = contextValue;
|
|
43
|
-
const helmetContext = ensureHelmetContext(internalContextValue);
|
|
44
13
|
const runtimeContextValue = {
|
|
45
14
|
isBrowser,
|
|
46
15
|
initialData,
|
|
@@ -48,37 +17,22 @@ function wrapRuntimeContextProvider(App, contextValue) {
|
|
|
48
17
|
context,
|
|
49
18
|
...rest
|
|
50
19
|
};
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
context: rscSafeRequestContext,
|
|
63
|
-
requestContext: rscSafeRequestContext
|
|
64
|
-
};
|
|
65
|
-
return /*#__PURE__*/ jsx(InternalRuntimeContext.Provider, {
|
|
66
|
-
value: rscInternalContextValue,
|
|
67
|
-
children: /*#__PURE__*/ jsx(RuntimeContext.Provider, {
|
|
68
|
-
value: rscRuntimeContextValue,
|
|
69
|
-
children: App
|
|
70
|
-
})
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
return /*#__PURE__*/ jsx(InternalRuntimeContext.Provider, {
|
|
74
|
-
value: internalContextValue,
|
|
20
|
+
const isRsc = true === getGlobalEnableRsc();
|
|
21
|
+
const projection = {
|
|
22
|
+
internalContext: contextValue,
|
|
23
|
+
publicContext: runtimeContextValue
|
|
24
|
+
};
|
|
25
|
+
const values = getGlobalInternalRuntimeContext()?.hooks.transformRuntimeContext?.call(projection, {
|
|
26
|
+
context: contextValue,
|
|
27
|
+
isRsc
|
|
28
|
+
}) ?? projection;
|
|
29
|
+
const root = /*#__PURE__*/ jsx(InternalRuntimeContext.Provider, {
|
|
30
|
+
value: values.internalContext,
|
|
75
31
|
children: /*#__PURE__*/ jsx(RuntimeContext.Provider, {
|
|
76
|
-
value:
|
|
77
|
-
children:
|
|
78
|
-
context: helmetContext,
|
|
79
|
-
children: App
|
|
80
|
-
})
|
|
32
|
+
value: values.publicContext,
|
|
33
|
+
children: App
|
|
81
34
|
})
|
|
82
35
|
});
|
|
36
|
+
return isRsc && false === isBrowser ? root : wrapRuntimeComponentResolver(root);
|
|
83
37
|
}
|
|
84
|
-
export { wrapRuntimeContextProvider };
|
|
38
|
+
export { wrapRuntimeComponentResolver, wrapRuntimeContextProvider };
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
import { getHelmetContext } from "../context/helmetContext.mjs";
|
|
3
2
|
import { safeReplace } from "./utils.mjs";
|
|
4
3
|
const EOL = '\n';
|
|
5
4
|
const RE_HTML_ATTR = /<html[^>]*>/;
|
|
@@ -7,8 +6,10 @@ const RE_BODY_ATTR = /<body[^>]*>/;
|
|
|
7
6
|
const RE_LAST_IN_HEAD = /<\/head>/;
|
|
8
7
|
const RE_TITLE = /<title[^>]*>([\s\S\n\r]*?)<\/title>/;
|
|
9
8
|
const TEST_TITLE_CONTENT = /(?<=<title[^>]*>)([\s\S\n\r]*?)([.|\S])([\s\S\n\r]*?)(?=<\/title>)/;
|
|
10
|
-
function getHelmetData(
|
|
11
|
-
|
|
9
|
+
function getHelmetData(providers) {
|
|
10
|
+
let result;
|
|
11
|
+
for (const provider of providers)result = provider.getHeadData?.() ?? result;
|
|
12
|
+
return result;
|
|
12
13
|
}
|
|
13
14
|
function createReplaceHelemt(helmetData) {
|
|
14
15
|
return helmetData ? (template)=>helmetReplace(template, helmetData) : (tempalte)=>tempalte;
|
|
@@ -20,7 +21,7 @@ function helmetReplace(content, helmetData) {
|
|
|
20
21
|
const htmlAttributes = helmetData.htmlAttributes.toString();
|
|
21
22
|
if (htmlAttributes) result = safeReplace(result, RE_HTML_ATTR, `<html ${htmlAttributes}>`);
|
|
22
23
|
const base = helmetData.base.toString();
|
|
23
|
-
const priority = helmetData.priority
|
|
24
|
+
const priority = helmetData.priority?.toString() ?? '';
|
|
24
25
|
const link = helmetData.link.toString();
|
|
25
26
|
const meta = helmetData.meta.toString();
|
|
26
27
|
const noscript = helmetData.noscript.toString();
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
import { getRouterServerSnapshot } from "
|
|
2
|
+
import { getRouterServerSnapshot } from "@modern-js/runtime-extensions/router-state";
|
|
3
3
|
import { handleRSCRedirect } from "../../router/runtime/redirect.mjs";
|
|
4
4
|
import { SSRErrors } from "./tracer.mjs";
|
|
5
5
|
const isRedirectStatus = (status)=>301 === status || 302 === status || 303 === status || 307 === status || 308 === status;
|
|
6
6
|
const isNullBodyStatus = (status)=>204 === status || 205 === status || 304 === status;
|
|
7
7
|
const getRedirectLocation = (headers)=>{
|
|
8
8
|
const location = headers.get('Location');
|
|
9
|
-
return location && URL.canParse(location, 'http://localhost') ? location : void 0;
|
|
9
|
+
return null !== location && '' !== location && URL.canParse(location, 'http://localhost') ? location : void 0;
|
|
10
10
|
};
|
|
11
11
|
const processRedirect = (headers, status, ctx)=>{
|
|
12
12
|
headers.delete('content-length');
|
|
@@ -28,7 +28,7 @@ const createLoaderRedirectResponse = (beforeRenderResult, redirectCtx)=>{
|
|
|
28
28
|
if (void 0 === beforeRenderResult || !isRedirectStatus(beforeRenderResult.status)) return;
|
|
29
29
|
if (beforeRenderResult.headers.has('X-Modernjs-Redirect')) return beforeRenderResult;
|
|
30
30
|
const redirectUrl = getRedirectLocation(beforeRenderResult.headers);
|
|
31
|
-
if (
|
|
31
|
+
if (void 0 === redirectUrl) return;
|
|
32
32
|
return processRedirect(new Headers(beforeRenderResult.headers), beforeRenderResult.status, redirectCtx);
|
|
33
33
|
};
|
|
34
34
|
const finalizeRenderResponse = async (response, responseProxy, redirectCtx, routerCleanup)=>{
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
import { getRouterRuntimeState } from "
|
|
2
|
+
import { getRouterRuntimeState } from "@modern-js/runtime-extensions/router-state";
|
|
3
3
|
const ROUTER_CLEANUP_ERROR = 'An error occurs during router runtime cleanup';
|
|
4
4
|
async function runWithRouterCleanupOnError(routerCleanup, callback) {
|
|
5
5
|
try {
|