@bleedingdev/modern-js-runtime 3.9.0-ultramodern.2 → 3.9.0-ultramodern.21
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/cli/ssr/loadable-bundler-plugin.js +2 -0
- package/dist/cjs/cli/template.server.js +1 -2
- package/dist/cjs/core/browser/hydrate.js +9 -10
- package/dist/cjs/core/browser/index.js +4 -5
- package/dist/cjs/core/context/index.js +12 -45
- package/dist/cjs/core/context/public.js +4 -7
- package/dist/cjs/core/context/runtime.js +10 -4
- package/dist/cjs/core/index.js +3 -3
- package/dist/cjs/core/plugin/index.js +2 -2
- package/dist/cjs/core/react/index.js +3 -3
- package/dist/cjs/core/react/wrapper.js +23 -67
- package/dist/cjs/core/server/helmet.js +5 -4
- package/dist/cjs/core/server/requestHandler.js +6 -7
- 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 +37 -28
- package/dist/cjs/core/server/stream/beforeTemplate.worker.js +30 -23
- package/dist/cjs/core/server/stream/createReadableStream.js +222 -125
- package/dist/cjs/core/server/stream/createReadableStream.worker.js +171 -90
- package/dist/cjs/core/server/stream/deferredScript.js +3 -3
- package/dist/cjs/core/server/stream/shared.js +6 -2
- package/dist/cjs/core/server/string/index.js +104 -66
- package/dist/cjs/core/server/string/loadable.js +38 -23
- package/dist/cjs/core/server/string/ssrData.js +5 -12
- package/dist/cjs/core/server/utils.js +1 -2
- package/dist/cjs/document/cli/index.js +14 -5
- package/dist/cjs/exports/head.js +7 -14
- package/dist/cjs/internal.js +2 -2
- package/dist/cjs/router/cli/code/nestedRoutes.js +1 -2
- package/dist/cjs/router/cli/code/templates.js +1 -1
- package/dist/cjs/router/cli/code/utils.js +2 -2
- package/dist/cjs/router/runtime/DeferredDataScripts.node.js +10 -9
- package/dist/cjs/router/runtime/PrefetchLink.js +69 -125
- 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 +19 -34
- package/dist/cjs/router/runtime/plugin.node.js +9 -37
- 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/cli/ssr/loadable-bundler-plugin.mjs +2 -0
- package/dist/esm/cli/template.server.mjs +1 -2
- package/dist/esm/core/browser/hydrate.mjs +10 -11
- package/dist/esm/core/browser/index.mjs +1 -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 +6 -3
- package/dist/esm/core/index.mjs +1 -1
- package/dist/esm/core/plugin/index.mjs +1 -1
- package/dist/esm/core/react/index.mjs +1 -1
- package/dist/esm/core/react/wrapper.mjs +20 -67
- package/dist/esm/core/server/helmet.mjs +5 -4
- package/dist/esm/core/server/requestHandler.mjs +1 -2
- 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 +40 -31
- package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +33 -26
- package/dist/esm/core/server/stream/createReadableStream.mjs +220 -123
- package/dist/esm/core/server/stream/createReadableStream.worker.mjs +161 -90
- package/dist/esm/core/server/stream/deferredScript.mjs +3 -3
- package/dist/esm/core/server/stream/shared.mjs +4 -3
- package/dist/esm/core/server/string/index.mjs +106 -68
- package/dist/esm/core/server/string/loadable.mjs +38 -23
- package/dist/esm/core/server/string/ssrData.mjs +5 -12
- package/dist/esm/core/server/utils.mjs +1 -2
- package/dist/esm/document/cli/index.mjs +12 -6
- package/dist/esm/exports/head.mjs +7 -14
- package/dist/esm/internal.mjs +1 -1
- package/dist/esm/router/cli/code/nestedRoutes.mjs +1 -2
- package/dist/esm/router/cli/code/templates.mjs +1 -1
- package/dist/esm/router/cli/code/utils.mjs +2 -2
- package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +10 -9
- package/dist/esm/router/runtime/PrefetchLink.mjs +68 -124
- 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 +10 -25
- package/dist/esm/router/runtime/plugin.node.mjs +3 -31
- 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/cli/ssr/loadable-bundler-plugin.mjs +2 -0
- package/dist/esm-node/cli/template.server.mjs +1 -2
- package/dist/esm-node/core/browser/hydrate.mjs +10 -11
- package/dist/esm-node/core/browser/index.mjs +1 -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 +6 -3
- package/dist/esm-node/core/index.mjs +1 -1
- package/dist/esm-node/core/plugin/index.mjs +1 -1
- package/dist/esm-node/core/react/index.mjs +1 -1
- package/dist/esm-node/core/react/wrapper.mjs +20 -67
- package/dist/esm-node/core/server/helmet.mjs +5 -4
- package/dist/esm-node/core/server/requestHandler.mjs +1 -2
- 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 +40 -31
- package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +33 -26
- package/dist/esm-node/core/server/stream/createReadableStream.mjs +220 -123
- package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +161 -90
- package/dist/esm-node/core/server/stream/deferredScript.mjs +3 -3
- package/dist/esm-node/core/server/stream/shared.mjs +4 -3
- package/dist/esm-node/core/server/string/index.mjs +106 -68
- package/dist/esm-node/core/server/string/loadable.mjs +38 -23
- 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/document/cli/index.mjs +12 -6
- package/dist/esm-node/exports/head.mjs +7 -14
- package/dist/esm-node/internal.mjs +1 -1
- package/dist/esm-node/router/cli/code/nestedRoutes.mjs +1 -2
- package/dist/esm-node/router/cli/code/templates.mjs +1 -1
- package/dist/esm-node/router/cli/code/utils.mjs +2 -2
- package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +10 -9
- package/dist/esm-node/router/runtime/PrefetchLink.mjs +68 -124
- 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 +10 -25
- package/dist/esm-node/router/runtime/plugin.node.mjs +3 -31
- 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/index.d.ts +1 -1
- package/dist/types/core/react/wrapper.d.ts +7 -1
- package/dist/types/core/server/helmet.d.ts +4 -5
- package/dist/types/core/server/requestHandler.d.ts +3 -3
- 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 +16 -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/document/cli/index.d.ts +1 -0
- package/dist/types/exports/head.d.ts +2 -2
- package/dist/types/internal.d.ts +1 -1
- 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/rslib.config.mts +3 -0
- package/rstest.config.mts +28 -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/cjs/rsc/server.worker.js +0 -62
- 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/rsc/server.worker.mjs +0 -1
- 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/esm-node/rsc/server.worker.mjs +0 -2
- 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
- package/dist/types/rsc/server.worker.d.ts +0 -1
|
@@ -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";
|
|
@@ -30,18 +30,23 @@ function hydrate_hydrateRoot(App, context, ModernRender, ModernHydrate) {
|
|
|
30
30
|
if ('stream' === renderMode) return streamSSRHydrate();
|
|
31
31
|
function streamSSRHydrate() {
|
|
32
32
|
if (renderLevel !== RenderLevel.SERVER_RENDER) return ModernRender(wrapRuntimeContextProvider(App, context));
|
|
33
|
-
{
|
|
33
|
+
else {
|
|
34
34
|
const SSRApp = ()=>/*#__PURE__*/ jsx(WithCallback, {
|
|
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
47
|
function stringSSRHydrate() {
|
|
43
48
|
if (renderLevel === RenderLevel.CLIENT_RENDER) return ModernRender(wrapRuntimeContextProvider(App, context));
|
|
44
|
-
{
|
|
49
|
+
else {
|
|
45
50
|
if (renderLevel === RenderLevel.SERVER_RENDER) return loadableReady(()=>void 0, loadableReadyOptions).then(()=>{
|
|
46
51
|
const SSRApp = ()=>/*#__PURE__*/ jsx(WithCallback, {
|
|
47
52
|
callback: callback,
|
|
@@ -49,13 +54,7 @@ function hydrate_hydrateRoot(App, context, ModernRender, ModernHydrate) {
|
|
|
49
54
|
});
|
|
50
55
|
return ModernHydrate(wrapRuntimeContextProvider(/*#__PURE__*/ jsx(SSRApp, {}), hydrateContext));
|
|
51
56
|
});
|
|
52
|
-
|
|
53
|
-
if (null !== runtimeConsole && 'object' == typeof runtimeConsole) {
|
|
54
|
-
const warn = Reflect.get(runtimeConsole, 'warn');
|
|
55
|
-
if ('function' == typeof warn) Reflect.apply(warn, runtimeConsole, [
|
|
56
|
-
`unknow render level: ${renderLevel}, execute render()`
|
|
57
|
-
]);
|
|
58
|
-
}
|
|
57
|
+
console.warn(`unknow render level: ${renderLevel}, execute render()`);
|
|
59
58
|
return ModernRender(wrapRuntimeContextProvider(App, context));
|
|
60
59
|
}
|
|
61
60
|
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
+
import { getGlobalInternalRuntimeContext, getInitialContext } from "@modern-js/runtime/context";
|
|
2
3
|
import { parseCookie } from "cookie";
|
|
3
4
|
import { createRoot } from "react-dom/client";
|
|
4
|
-
import { getGlobalInternalRuntimeContext } from "../context/index.mjs";
|
|
5
|
-
import { getInitialContext } from "../context/runtime.mjs";
|
|
6
5
|
import { wrapRuntimeContextProvider } from "../react/wrapper.mjs";
|
|
7
6
|
import { hydrateRoot, hydrateWithReact } from "./hydrate.mjs";
|
|
8
7
|
const IS_REACT18 = 'true' === process.env.IS_REACT18;
|
|
@@ -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, ReactRuntimeContext, RuntimeComponentResolverContext, RuntimeContext, getInitialContext, useRuntimeContext } 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 "@modern-js/runtime/context";
|
|
@@ -1,7 +1,11 @@
|
|
|
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
|
const InternalRuntimeContext = createContext({});
|
|
5
|
+
const RuntimeContext = createContext({});
|
|
6
|
+
const RuntimeComponentResolverContext = createContext(void 0);
|
|
7
|
+
const ReactRuntimeContext = RuntimeContext;
|
|
8
|
+
const useRuntimeContext = ()=>useContext(RuntimeContext);
|
|
5
9
|
const getInitialContext = (isBrowser = true, routeManifest)=>{
|
|
6
10
|
const requestContext = {
|
|
7
11
|
request: {
|
|
@@ -25,5 +29,4 @@ const getInitialContext = (isBrowser = true, routeManifest)=>{
|
|
|
25
29
|
context: requestContext
|
|
26
30
|
};
|
|
27
31
|
};
|
|
28
|
-
export { ReactRuntimeContext, RuntimeContext, useRuntimeContext }
|
|
29
|
-
export { InternalRuntimeContext, getInitialContext };
|
|
32
|
+
export { InternalRuntimeContext, ReactRuntimeContext, RuntimeComponentResolverContext, RuntimeContext, getInitialContext, useRuntimeContext };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import { runtime } from "@modern-js/plugin/runtime";
|
|
3
|
+
import { setGlobalInternalRuntimeContext } from "@modern-js/runtime/context";
|
|
3
4
|
import { merge } from "@modern-js/runtime-utils/merge";
|
|
4
5
|
import { compatPlugin } from "../compat/index.mjs";
|
|
5
6
|
import { handleSetupResult } from "../compat/hooks.mjs";
|
|
6
7
|
import { requestContextPlugin } from "../compat/requestContext.mjs";
|
|
7
|
-
import { setGlobalInternalRuntimeContext } from "../context/index.mjs";
|
|
8
8
|
function registerPlugin(internalPlugins, runtimeConfig) {
|
|
9
9
|
const { plugins = [] } = runtimeConfig || {};
|
|
10
10
|
const { runtimeContext } = runtime.run({
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
+
import { getGlobalApp, getGlobalInternalRuntimeContext } from "@modern-js/runtime/context";
|
|
2
3
|
import { parsedJSONFromElement } from "@modern-js/runtime-utils/parsed";
|
|
3
4
|
import { isBrowser } from "../../common.mjs";
|
|
4
5
|
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../constants.mjs";
|
|
5
|
-
import { getGlobalApp, getGlobalInternalRuntimeContext } from "../context/index.mjs";
|
|
6
6
|
function createRoot(UserApp) {
|
|
7
7
|
const App = UserApp || getGlobalApp();
|
|
8
8
|
if (isBrowser()) {
|
|
@@ -1,46 +1,14 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const requestContext = getInitialContext().requestContext;
|
|
9
|
-
Object.defineProperty(requestContext.response, 'setHeader', {
|
|
10
|
-
enumerable: false
|
|
3
|
+
import { InternalRuntimeContext, RuntimeComponentResolverContext, RuntimeContext, getGlobalEnableRsc, getGlobalInternalRuntimeContext } from "@modern-js/runtime/context";
|
|
4
|
+
function wrapRuntimeComponentResolver(root, hooks = getGlobalInternalRuntimeContext()?.hooks) {
|
|
5
|
+
return /*#__PURE__*/ jsx(RuntimeComponentResolverContext.Provider, {
|
|
6
|
+
value: hooks?.resolveComponent?.call,
|
|
7
|
+
children: root
|
|
11
8
|
});
|
|
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
9
|
}
|
|
40
10
|
function wrapRuntimeContextProvider(App, contextValue) {
|
|
41
11
|
const { isBrowser, initialData, routes, context, routeManifest, routerContext, unstable_getBlockNavState, ssrContext, _internalContext, _internalRouterBaseName, ...rest } = contextValue;
|
|
42
|
-
const internalContextValue = contextValue;
|
|
43
|
-
const helmetContext = ensureHelmetContext(internalContextValue);
|
|
44
12
|
const runtimeContextValue = {
|
|
45
13
|
isBrowser,
|
|
46
14
|
initialData,
|
|
@@ -48,37 +16,22 @@ function wrapRuntimeContextProvider(App, contextValue) {
|
|
|
48
16
|
context,
|
|
49
17
|
...rest
|
|
50
18
|
};
|
|
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,
|
|
19
|
+
const isRsc = true === getGlobalEnableRsc();
|
|
20
|
+
const projection = {
|
|
21
|
+
internalContext: contextValue,
|
|
22
|
+
publicContext: runtimeContextValue
|
|
23
|
+
};
|
|
24
|
+
const values = getGlobalInternalRuntimeContext()?.hooks.transformRuntimeContext?.call(projection, {
|
|
25
|
+
context: contextValue,
|
|
26
|
+
isRsc
|
|
27
|
+
}) ?? projection;
|
|
28
|
+
const root = /*#__PURE__*/ jsx(InternalRuntimeContext.Provider, {
|
|
29
|
+
value: values.internalContext,
|
|
75
30
|
children: /*#__PURE__*/ jsx(RuntimeContext.Provider, {
|
|
76
|
-
value:
|
|
77
|
-
children:
|
|
78
|
-
context: helmetContext,
|
|
79
|
-
children: App
|
|
80
|
-
})
|
|
31
|
+
value: values.publicContext,
|
|
32
|
+
children: App
|
|
81
33
|
})
|
|
82
34
|
});
|
|
35
|
+
return isRsc && false === isBrowser ? root : wrapRuntimeComponentResolver(root);
|
|
83
36
|
}
|
|
84
|
-
export { wrapRuntimeContextProvider };
|
|
37
|
+
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,10 +1,9 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { getGlobalInternalRuntimeContext, getGlobalRSCRoot, getInitialContext } from "@modern-js/runtime/context";
|
|
3
4
|
import { storage } from "@modern-js/runtime-utils/node";
|
|
4
5
|
import { getPathname, parseCookie, parseHeaders, parseQuery } from "@modern-js/runtime-utils/universal/request";
|
|
5
6
|
import react, { Fragment } from "react";
|
|
6
|
-
import { getGlobalInternalRuntimeContext, getGlobalRSCRoot } from "../context/index.mjs";
|
|
7
|
-
import { getInitialContext } from "../context/runtime.mjs";
|
|
8
7
|
import { getServerPayload } from "../context/serverPayload/index.mjs";
|
|
9
8
|
import { createRoot } from "../react/index.mjs";
|
|
10
9
|
import { CHUNK_CSS_PLACEHOLDER } from "./constants.mjs";
|
|
@@ -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 {
|
|
@@ -1,5 +1,157 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
+
import { attributesToString, hasStylesheetLink, safeReplace } from "./utils.mjs";
|
|
2
3
|
function buildHtml(template, callbacks) {
|
|
3
4
|
return callbacks.reduce((promise, buildHtmlCb)=>promise.then((template)=>buildHtmlCb(template)), Promise.resolve(template));
|
|
4
5
|
}
|
|
5
|
-
|
|
6
|
+
function createSSRRenderLifecycle(observers) {
|
|
7
|
+
let terminal;
|
|
8
|
+
return {
|
|
9
|
+
transformAssets (groups, info) {
|
|
10
|
+
let assets = groups.flatMap((group)=>group.assets);
|
|
11
|
+
for (const observer of observers)assets = observer.transformAssets?.(assets, {
|
|
12
|
+
...info,
|
|
13
|
+
groups
|
|
14
|
+
}) ?? assets;
|
|
15
|
+
return assets;
|
|
16
|
+
},
|
|
17
|
+
transformTemplateChunk (chunk) {
|
|
18
|
+
for (const observer of observers)chunk = observer.transformTemplateChunk?.(chunk, {
|
|
19
|
+
attributesToString: attributesToString,
|
|
20
|
+
hasStylesheetLink: hasStylesheetLink
|
|
21
|
+
}) ?? chunk;
|
|
22
|
+
return chunk;
|
|
23
|
+
},
|
|
24
|
+
getRouterData () {
|
|
25
|
+
let data;
|
|
26
|
+
for (const observer of observers)data = observer.getRouterData?.() ?? data;
|
|
27
|
+
return data;
|
|
28
|
+
},
|
|
29
|
+
get terminal () {
|
|
30
|
+
return terminal;
|
|
31
|
+
},
|
|
32
|
+
beforeReact () {
|
|
33
|
+
for (const observer of observers)observer.beforeReact?.();
|
|
34
|
+
},
|
|
35
|
+
completedBody (html, phase) {
|
|
36
|
+
for (const observer of observers)html = observer.completedBody?.(html, {
|
|
37
|
+
phase
|
|
38
|
+
}) ?? html;
|
|
39
|
+
return html;
|
|
40
|
+
},
|
|
41
|
+
finish (result) {
|
|
42
|
+
if (void 0 !== terminal) return;
|
|
43
|
+
terminal = result;
|
|
44
|
+
for (const observer of observers)try {
|
|
45
|
+
observer.onTerminal?.(result);
|
|
46
|
+
} catch {}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function replaceSSRTemplateChunk(chunk, lifecycle, options = {}) {
|
|
51
|
+
const result = lifecycle?.transformTemplateChunk(chunk) ?? chunk;
|
|
52
|
+
if (true === options.preserveEmpty && '' === result.content) return result.template;
|
|
53
|
+
return safeReplace(result.template, result.placeholder, result.content);
|
|
54
|
+
}
|
|
55
|
+
function orderSSRStreamTransforms(extenders) {
|
|
56
|
+
return [
|
|
57
|
+
...extenders.filter((extender)=>'body' !== extender.streamPhase),
|
|
58
|
+
...extenders.filter((extender)=>'body' === extender.streamPhase)
|
|
59
|
+
];
|
|
60
|
+
}
|
|
61
|
+
function createSSRStreamErrorReporter(onError) {
|
|
62
|
+
let reported = false;
|
|
63
|
+
return (error)=>{
|
|
64
|
+
if (reported) return;
|
|
65
|
+
reported = true;
|
|
66
|
+
try {
|
|
67
|
+
onError(error);
|
|
68
|
+
} catch {}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function observeSSRStream(source, options) {
|
|
72
|
+
const reader = source.getReader();
|
|
73
|
+
let controller;
|
|
74
|
+
let ended = false;
|
|
75
|
+
let cancellation;
|
|
76
|
+
const cleanup = ()=>{
|
|
77
|
+
options.signal.removeEventListener('abort', onAbort);
|
|
78
|
+
reader.releaseLock();
|
|
79
|
+
};
|
|
80
|
+
const cancel = (reason)=>{
|
|
81
|
+
if (void 0 !== cancellation) return cancellation;
|
|
82
|
+
if (ended) return Promise.resolve();
|
|
83
|
+
ended = true;
|
|
84
|
+
options.lifecycle.finish({
|
|
85
|
+
status: 'cancelled',
|
|
86
|
+
reason
|
|
87
|
+
});
|
|
88
|
+
cancellation = (async ()=>{
|
|
89
|
+
try {
|
|
90
|
+
const observer = Promise.withResolvers();
|
|
91
|
+
try {
|
|
92
|
+
observer.resolve(options.onCancel?.(reason));
|
|
93
|
+
} catch (error) {
|
|
94
|
+
observer.reject(error);
|
|
95
|
+
}
|
|
96
|
+
const results = await Promise.allSettled([
|
|
97
|
+
observer.promise,
|
|
98
|
+
reader.cancel(reason)
|
|
99
|
+
]);
|
|
100
|
+
const rejected = results.find((result)=>'rejected' === result.status);
|
|
101
|
+
if (rejected?.status === 'rejected') throw rejected.reason;
|
|
102
|
+
} finally{
|
|
103
|
+
cleanup();
|
|
104
|
+
}
|
|
105
|
+
})();
|
|
106
|
+
return cancellation;
|
|
107
|
+
};
|
|
108
|
+
const onAbort = ()=>{
|
|
109
|
+
if (ended) return;
|
|
110
|
+
const reason = options.signal.reason;
|
|
111
|
+
cancel(reason).then(()=>controller.error(reason), (error)=>{
|
|
112
|
+
controller.error(reason);
|
|
113
|
+
return options.onError(error);
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
return new ReadableStream({
|
|
117
|
+
start (value) {
|
|
118
|
+
controller = value;
|
|
119
|
+
options.signal.addEventListener('abort', onAbort, {
|
|
120
|
+
once: true
|
|
121
|
+
});
|
|
122
|
+
if (options.signal.aborted) onAbort();
|
|
123
|
+
},
|
|
124
|
+
async pull (value) {
|
|
125
|
+
if (ended) return void await cancellation;
|
|
126
|
+
try {
|
|
127
|
+
const result = await reader.read();
|
|
128
|
+
if (ended) return void await cancellation;
|
|
129
|
+
if (result.done) {
|
|
130
|
+
await options.onComplete?.();
|
|
131
|
+
if (ended) return void await cancellation;
|
|
132
|
+
ended = true;
|
|
133
|
+
options.lifecycle.finish({
|
|
134
|
+
status: 'complete'
|
|
135
|
+
});
|
|
136
|
+
cleanup();
|
|
137
|
+
value.close();
|
|
138
|
+
} else value.enqueue(result.value);
|
|
139
|
+
} catch (error) {
|
|
140
|
+
if (ended) return void await cancellation;
|
|
141
|
+
ended = true;
|
|
142
|
+
options.lifecycle.finish({
|
|
143
|
+
status: 'error',
|
|
144
|
+
error
|
|
145
|
+
});
|
|
146
|
+
try {
|
|
147
|
+
await options.onError(error);
|
|
148
|
+
} finally{
|
|
149
|
+
cleanup();
|
|
150
|
+
value.error(error);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
cancel
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
export { buildHtml, createSSRRenderLifecycle, createSSRStreamErrorReporter, observeSSRStream, orderSSRStreamTransforms, replaceSSRTemplateChunk };
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import { serializeJson } from "@modern-js/runtime-utils/node";
|
|
3
|
-
import { getRouterHydrationScripts } from "../../../router/runtime/lifecycle.mjs";
|
|
4
3
|
import { SSR_DATA_JSON_ID } from "../../constants.mjs";
|
|
5
|
-
import { SSR_DATA_PLACEHOLDER } from "../constants.mjs";
|
|
6
|
-
import {
|
|
7
|
-
import { buildHtml } from "../shared.mjs";
|
|
4
|
+
import { CHUNK_JS_PLACEHOLDER, SSR_DATA_PLACEHOLDER } from "../constants.mjs";
|
|
5
|
+
import { buildHtml, replaceSSRTemplateChunk } from "../shared.mjs";
|
|
8
6
|
import { attributesToString } from "../utils.mjs";
|
|
9
7
|
function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
10
|
-
const { request, config, ssrConfig, runtimeContext, renderLevel, entryName } = options;
|
|
8
|
+
const { request, config, ssrConfig, runtimeContext, renderLevel, entryName, lifecycle } = options;
|
|
11
9
|
const callbacks = [
|
|
12
10
|
(template)=>injectJs(template, entryName, config.nonce),
|
|
13
11
|
createReplaceSSRData({
|
|
@@ -17,21 +15,28 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
|
17
15
|
useJsonScript: config.useJsonScript,
|
|
18
16
|
runtimeContext,
|
|
19
17
|
renderLevel,
|
|
20
|
-
|
|
18
|
+
lifecycle
|
|
21
19
|
})
|
|
22
20
|
];
|
|
23
21
|
async function injectJs(template, entryName, nonce) {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
const assets = runtimeContext.routeManifest?.routeAssets?.[`async-${entryName}`]?.assets ?? [];
|
|
23
|
+
const jsChunkStr = assets.filter((asset)=>asset.endsWith('.js')).map((asset)=>`<script${attributesToString({
|
|
24
|
+
src: asset,
|
|
25
|
+
nonce
|
|
26
|
+
})}></script>`).join(' ');
|
|
27
|
+
return replaceSSRTemplateChunk({
|
|
28
|
+
name: "scripts",
|
|
29
|
+
template,
|
|
30
|
+
placeholder: CHUNK_JS_PLACEHOLDER,
|
|
31
|
+
content: jsChunkStr
|
|
32
|
+
}, lifecycle, {
|
|
33
|
+
preserveEmpty: true
|
|
27
34
|
});
|
|
28
|
-
if (!jsChunkStr) return template;
|
|
29
|
-
return replaceChunkJsPlaceholder(template, jsChunkStr, entryName);
|
|
30
35
|
}
|
|
31
36
|
return buildHtml(afterAppTemplate, callbacks);
|
|
32
37
|
}
|
|
33
38
|
function createReplaceSSRData(options) {
|
|
34
|
-
const { runtimeContext, nonce, renderLevel, useJsonScript, ssrConfig,
|
|
39
|
+
const { runtimeContext, nonce, renderLevel, useJsonScript, ssrConfig, lifecycle } = options;
|
|
35
40
|
const { request, reporter } = runtimeContext.ssrContext;
|
|
36
41
|
const headers = 'object' == typeof ssrConfig && ssrConfig.unsafeHeaders ? Object.fromEntries(Object.entries(request.headers).filter(([key, _])=>ssrConfig.unsafeHeaders?.map((header)=>header.toLowerCase())?.includes(key.toLowerCase()))) : void 0;
|
|
37
42
|
const ssrData = {
|
|
@@ -60,11 +65,11 @@ function createReplaceSSRData(options) {
|
|
|
60
65
|
});
|
|
61
66
|
const serializeSSRData = serializeJson(ssrData);
|
|
62
67
|
const ssrDataScript = useJsonScript ? `<script type="application/json" id="${SSR_DATA_JSON_ID}">${serializeSSRData}</script>` : `<script${attrsStr}>window._SSR_DATA = ${serializeSSRData}</script>`;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
return (template)=>replaceSSRTemplateChunk({
|
|
69
|
+
name: 'data',
|
|
70
|
+
template,
|
|
71
|
+
placeholder: SSR_DATA_PLACEHOLDER,
|
|
72
|
+
content: ssrDataScript
|
|
73
|
+
}, lifecycle);
|
|
69
74
|
}
|
|
70
75
|
export { buildShellAfterTemplate };
|