@modern-js/runtime 3.0.0-alpha.0 → 3.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/cli/ssr/index.js +109 -124
- package/dist/cjs/cli/ssr/loadable-bundler-plugin.js +21 -4
- package/dist/cjs/core/browser/index.js +2 -1
- package/dist/cjs/core/server/stream/createReadableStream.js +2 -15
- package/dist/cjs/core/server/stream/createReadableStream.worker.js +3 -14
- package/dist/cjs/core/server/stream/shared.js +54 -4
- package/dist/cjs/document/cli/index.js +61 -38
- package/dist/cjs/router/runtime/PrefetchLink.js +1 -4
- package/dist/cjs/router/runtime/plugin.node.js +1 -3
- package/dist/cjs/rsc/server.js +2 -42
- package/dist/esm/cli/alias.mjs +1 -1
- package/dist/esm/cli/code.mjs +3 -3
- package/dist/esm/cli/entry.mjs +1 -1
- package/dist/esm/cli/index.mjs +7 -7
- package/dist/esm/cli/ssr/index.mjs +3 -19
- package/dist/esm/cli/ssr/loadable-bundler-plugin.mjs +2 -1
- package/dist/esm/cli/template.mjs +1 -1
- package/dist/esm/core/browser/hydrate.mjs +3 -3
- package/dist/esm/core/browser/index.mjs +6 -5
- package/dist/esm/core/compat/index.mjs +1 -1
- package/dist/esm/core/context/index.mjs +2 -2
- package/dist/esm/core/context/monitors/index.mjs +1 -1
- package/dist/esm/core/context/monitors/index.server.mjs +1 -1
- package/dist/esm/core/index.mjs +2 -2
- package/dist/esm/core/plugin/index.mjs +4 -4
- package/dist/esm/core/react/index.mjs +3 -3
- package/dist/esm/core/react/wrapper.mjs +1 -1
- package/dist/esm/core/server/helmet.mjs +1 -1
- package/dist/esm/core/server/index.mjs +1 -1
- package/dist/esm/core/server/react/index.mjs +2 -2
- package/dist/esm/core/server/react/no-ssr-cache/index.mjs +1 -1
- package/dist/esm/core/server/requestHandler.mjs +7 -7
- package/dist/esm/core/server/server.mjs +3 -3
- package/dist/esm/core/server/stream/afterTemplate.mjs +4 -4
- package/dist/esm/core/server/stream/beforeTemplate.mjs +4 -4
- package/dist/esm/core/server/stream/createReadableStream.mjs +11 -14
- package/dist/esm/core/server/stream/createReadableStream.worker.mjs +8 -9
- package/dist/esm/core/server/stream/deferredScript.mjs +1 -1
- package/dist/esm/core/server/stream/index.mjs +2 -2
- package/dist/esm/core/server/stream/shared.mjs +45 -8
- package/dist/esm/core/server/stream/template.mjs +2 -2
- package/dist/esm/core/server/string/index.mjs +10 -10
- package/dist/esm/core/server/string/loadable.mjs +1 -1
- package/dist/esm/core/server/string/ssrData.mjs +2 -2
- package/dist/esm/document/Body.mjs +3 -3
- package/dist/esm/document/Comment.mjs +1 -1
- package/dist/esm/document/Head.mjs +5 -5
- package/dist/esm/document/Html.mjs +3 -3
- package/dist/esm/document/Links.mjs +1 -1
- package/dist/esm/document/Root.mjs +2 -2
- package/dist/esm/document/Script.mjs +1 -1
- package/dist/esm/document/Scripts.mjs +1 -1
- package/dist/esm/document/Style.mjs +1 -1
- package/dist/esm/document/Title.mjs +1 -1
- package/dist/esm/document/cli/index.mjs +63 -40
- package/dist/esm/document/index.mjs +12 -12
- package/dist/esm/index.mjs +5 -5
- package/dist/esm/internal.mjs +1 -1
- package/dist/esm/react-server.mjs +3 -3
- package/dist/esm/router/cli/code/getClientRoutes/getRoutes.mjs +4 -4
- package/dist/esm/router/cli/code/getClientRoutes/index.mjs +1 -1
- package/dist/esm/router/cli/code/getClientRoutes/utils.mjs +1 -1
- package/dist/esm/router/cli/code/index.mjs +9 -9
- package/dist/esm/router/cli/code/inspect.mjs +2 -2
- package/dist/esm/router/cli/code/nestedRoutes.mjs +2 -2
- package/dist/esm/router/cli/code/templates.mjs +2 -2
- package/dist/esm/router/cli/code/utils.mjs +1 -1
- package/dist/esm/router/cli/config-routes/converter.mjs +2 -2
- package/dist/esm/router/cli/entry.mjs +2 -2
- package/dist/esm/router/cli/handler.mjs +5 -5
- package/dist/esm/router/cli/index.mjs +3 -3
- package/dist/esm/router/index.mjs +1 -1
- package/dist/esm/router/internal.mjs +2 -2
- package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +3 -3
- package/dist/esm/router/runtime/PrefetchLink.mjs +2 -5
- package/dist/esm/router/runtime/constants.mjs +1 -1
- package/dist/esm/router/runtime/index.mjs +2 -2
- package/dist/esm/router/runtime/internal.mjs +2 -2
- package/dist/esm/router/runtime/plugin.mjs +4 -4
- package/dist/esm/router/runtime/plugin.node.mjs +5 -7
- package/dist/esm/router/runtime/utils.mjs +2 -2
- package/dist/esm/rsc/server.mjs +0 -32
- package/dist/esm-node/cache/index.mjs +2 -0
- package/dist/esm-node/cli/alias.mjs +2 -0
- package/dist/esm-node/cli/code.mjs +2 -0
- package/dist/esm-node/cli/constants.mjs +2 -0
- package/dist/esm-node/cli/entry.mjs +2 -0
- package/dist/esm-node/cli/index.mjs +2 -0
- package/dist/esm-node/cli/ssr/index.mjs +4 -18
- package/dist/esm-node/cli/ssr/loadable-bundler-plugin.mjs +4 -1
- package/dist/esm-node/cli/ssr/mode.mjs +2 -0
- package/dist/esm-node/cli/template.mjs +2 -0
- package/dist/esm-node/cli/template.server.mjs +2 -0
- package/dist/esm-node/common.mjs +2 -0
- package/dist/esm-node/core/browser/hydrate.mjs +2 -0
- package/dist/esm-node/core/browser/index.mjs +4 -1
- package/dist/esm-node/core/browser/withCallback.mjs +2 -0
- package/dist/esm-node/core/compat/hooks.mjs +2 -0
- package/dist/esm-node/core/compat/index.mjs +2 -0
- package/dist/esm-node/core/compat/requestContext.mjs +2 -0
- package/dist/esm-node/core/config.mjs +2 -0
- package/dist/esm-node/core/constants.mjs +2 -0
- package/dist/esm-node/core/context/index.mjs +2 -0
- package/dist/esm-node/core/context/monitors/default.mjs +2 -0
- package/dist/esm-node/core/context/monitors/index.mjs +2 -0
- package/dist/esm-node/core/context/monitors/index.server.mjs +2 -0
- package/dist/esm-node/core/context/request/index.mjs +2 -0
- package/dist/esm-node/core/context/request/index.server.mjs +2 -0
- package/dist/esm-node/core/context/response/index.mjs +2 -0
- package/dist/esm-node/core/context/response/index.server.mjs +2 -0
- package/dist/esm-node/core/context/runtime.mjs +2 -0
- package/dist/esm-node/core/context/serverPayload/index.mjs +2 -0
- package/dist/esm-node/core/context/serverPayload/index.server.mjs +2 -0
- package/dist/esm-node/core/index.mjs +2 -0
- package/dist/esm-node/core/plugin/index.mjs +2 -0
- package/dist/esm-node/core/plugin/types.mjs +2 -0
- package/dist/esm-node/core/react/index.mjs +2 -0
- package/dist/esm-node/core/react/wrapper.mjs +2 -0
- package/dist/esm-node/core/server/constants.mjs +2 -0
- package/dist/esm-node/core/server/helmet.mjs +2 -0
- package/dist/esm-node/core/server/index.mjs +2 -0
- package/dist/esm-node/core/server/react/index.mjs +2 -0
- package/dist/esm-node/core/server/react/no-ssr-cache/index.mjs +2 -0
- package/dist/esm-node/core/server/react/nossr/index.mjs +2 -0
- package/dist/esm-node/core/server/requestHandler.mjs +2 -0
- package/dist/esm-node/core/server/server.mjs +2 -0
- package/dist/esm-node/core/server/shared.mjs +2 -0
- package/dist/esm-node/core/server/stream/afterTemplate.mjs +2 -0
- package/dist/esm-node/core/server/stream/beforeTemplate.mjs +6 -1
- package/dist/esm-node/core/server/stream/createReadableStream.mjs +7 -8
- package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +6 -5
- package/dist/esm-node/core/server/stream/deferredScript.mjs +2 -0
- package/dist/esm-node/core/server/stream/index.mjs +2 -0
- package/dist/esm-node/core/server/stream/shared.mjs +44 -5
- package/dist/esm-node/core/server/stream/template.mjs +2 -0
- package/dist/esm-node/core/server/string/index.mjs +2 -0
- package/dist/esm-node/core/server/string/loadable.mjs +6 -1
- package/dist/esm-node/core/server/string/ssrData.mjs +2 -0
- package/dist/esm-node/core/server/string/types.mjs +2 -0
- package/dist/esm-node/core/server/tracer.mjs +2 -0
- package/dist/esm-node/core/server/utils.mjs +2 -0
- package/dist/esm-node/core/types.mjs +2 -0
- package/dist/esm-node/document/Body.mjs +2 -0
- package/dist/esm-node/document/Comment.mjs +2 -0
- package/dist/esm-node/document/DocumentContext.mjs +2 -0
- package/dist/esm-node/document/DocumentStructureContext.mjs +2 -0
- package/dist/esm-node/document/Head.mjs +2 -0
- package/dist/esm-node/document/Html.mjs +2 -0
- package/dist/esm-node/document/Links.mjs +2 -0
- package/dist/esm-node/document/Root.mjs +2 -0
- package/dist/esm-node/document/Script.mjs +2 -0
- package/dist/esm-node/document/Scripts.mjs +2 -0
- package/dist/esm-node/document/Style.mjs +2 -0
- package/dist/esm-node/document/Title.mjs +2 -0
- package/dist/esm-node/document/cli/index.mjs +64 -39
- package/dist/esm-node/document/constants.mjs +2 -0
- package/dist/esm-node/document/index.mjs +2 -0
- package/dist/esm-node/exports/config-routes.mjs +2 -0
- package/dist/esm-node/exports/head.mjs +2 -0
- package/dist/esm-node/exports/loadable.mjs +2 -0
- package/dist/esm-node/index.mjs +2 -0
- package/dist/esm-node/internal.mjs +2 -0
- package/dist/esm-node/react-server.mjs +2 -0
- package/dist/esm-node/router/cli/code/getClientRoutes/getRoutes.mjs +2 -0
- package/dist/esm-node/router/cli/code/getClientRoutes/index.mjs +2 -0
- package/dist/esm-node/router/cli/code/getClientRoutes/utils.mjs +2 -0
- package/dist/esm-node/router/cli/code/index.mjs +2 -0
- package/dist/esm-node/router/cli/code/inspect.mjs +2 -0
- package/dist/esm-node/router/cli/code/makeLegalIdentifier.mjs +2 -0
- package/dist/esm-node/router/cli/code/nestedRoutes.mjs +2 -0
- package/dist/esm-node/router/cli/code/templates.mjs +2 -0
- package/dist/esm-node/router/cli/code/utils.mjs +2 -0
- package/dist/esm-node/router/cli/config-routes/converter.mjs +2 -0
- package/dist/esm-node/router/cli/config-routes/parseRouteConfig.mjs +2 -0
- package/dist/esm-node/router/cli/constants.mjs +2 -0
- package/dist/esm-node/router/cli/entry.mjs +2 -0
- package/dist/esm-node/router/cli/handler.mjs +2 -0
- package/dist/esm-node/router/cli/index.mjs +6 -1
- package/dist/esm-node/router/index.mjs +2 -0
- package/dist/esm-node/router/internal.mjs +2 -0
- package/dist/esm-node/router/runtime/DefaultNotFound.mjs +2 -0
- package/dist/esm-node/router/runtime/DeferredDataScripts.mjs +2 -0
- package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +2 -0
- package/dist/esm-node/router/runtime/PrefetchLink.mjs +3 -4
- package/dist/esm-node/router/runtime/constants.mjs +2 -0
- package/dist/esm-node/router/runtime/hooks.mjs +2 -0
- package/dist/esm-node/router/runtime/index.mjs +2 -0
- package/dist/esm-node/router/runtime/internal.mjs +2 -0
- package/dist/esm-node/router/runtime/plugin.mjs +2 -0
- package/dist/esm-node/router/runtime/plugin.node.mjs +3 -3
- package/dist/esm-node/router/runtime/routerHelper.mjs +2 -0
- package/dist/esm-node/router/runtime/rsc-router.mjs +2 -0
- package/dist/esm-node/router/runtime/rsc.mjs +2 -0
- package/dist/esm-node/router/runtime/server.mjs +2 -0
- package/dist/esm-node/router/runtime/types.mjs +2 -0
- package/dist/esm-node/router/runtime/utils.mjs +2 -0
- package/dist/esm-node/router/runtime/withRouter.mjs +2 -0
- package/dist/esm-node/rsc/client.mjs +2 -0
- package/dist/esm-node/rsc/server.mjs +2 -32
- package/dist/types/cli/ssr/loadable-bundler-plugin.d.ts +22 -1
- package/dist/types/core/server/stream/shared.d.ts +4 -0
- package/dist/types/rsc/server.d.ts +0 -1
- package/package.json +28 -56
- package/rstest.config.ts +83 -0
|
@@ -1,13 +1,18 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
/*#__PURE__*/ import.meta.url;
|
|
3
|
+
import { fileURLToPath as __rspack_fileURLToPath } from "node:url";
|
|
4
|
+
import { dirname as __rspack_dirname } from "node:path";
|
|
1
5
|
import { matchRoutes } from "@modern-js/runtime-utils/router";
|
|
2
6
|
import react_helmet from "react-helmet";
|
|
3
7
|
import { CHUNK_CSS_PLACEHOLDER } from "../constants.mjs";
|
|
4
8
|
import { createReplaceHelemt } from "../helmet.mjs";
|
|
5
9
|
import { buildHtml } from "../shared.mjs";
|
|
6
10
|
import { checkIsNode, safeReplace } from "../utils.mjs";
|
|
11
|
+
var beforeTemplate_dirname = __rspack_dirname(__rspack_fileURLToPath(import.meta.url));
|
|
7
12
|
const readAsset = async (chunk)=>{
|
|
8
13
|
const fs = await import("fs/promises");
|
|
9
14
|
const path = await import("path");
|
|
10
|
-
const filepath = path.join(
|
|
15
|
+
const filepath = path.join(beforeTemplate_dirname, chunk);
|
|
11
16
|
return fs.readFile(filepath, 'utf-8');
|
|
12
17
|
};
|
|
13
18
|
const checkIsInline = (chunk, enableInline)=>{
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import "node:module";
|
|
2
|
+
/*#__PURE__*/ import.meta.url;
|
|
3
|
+
import { PassThrough, Readable, Transform } from "stream";
|
|
4
|
+
import { storage } from "@modern-js/runtime-utils/node";
|
|
4
5
|
import { ESCAPED_SHELL_STREAM_END_MARK } from "../../../common.mjs";
|
|
5
6
|
import { RenderLevel } from "../../constants.mjs";
|
|
6
7
|
import { getGlobalInternalRuntimeContext } from "../../context/index.mjs";
|
|
7
8
|
import { getMonitors } from "../../context/monitors/index.mjs";
|
|
8
9
|
import { enqueueFromEntries } from "./deferredScript.mjs";
|
|
9
|
-
import { ShellChunkStatus, getReadableStreamFromString } from "./shared.mjs";
|
|
10
|
+
import { ShellChunkStatus, getReadableStreamFromString, resolveStreamingMode } from "./shared.mjs";
|
|
10
11
|
import { getTemplates } from "./template.mjs";
|
|
11
12
|
const defaultExtender = {
|
|
12
13
|
modifyRootElement: (rootElement)=>rootElement,
|
|
@@ -19,9 +20,7 @@ const createReadableStreamFromElement = async (request, rootElement, options)=>{
|
|
|
19
20
|
let shellChunkStatus = ShellChunkStatus.START;
|
|
20
21
|
let renderLevel = RenderLevel.SERVER_RENDER;
|
|
21
22
|
const forceStream2String = Boolean(process.env.MODERN_JS_STREAM_TO_STRING);
|
|
22
|
-
const
|
|
23
|
-
const isSsgRender = 'true' === request.headers.get('x-modern-ssg-render');
|
|
24
|
-
const onReady = isbot || isSsgRender || forceStream2String ? 'onAllReady' : 'onShellReady';
|
|
23
|
+
const { onReady } = resolveStreamingMode(request, forceStream2String);
|
|
25
24
|
const internalRuntimeContext = getGlobalInternalRuntimeContext();
|
|
26
25
|
const hooks = internalRuntimeContext.hooks;
|
|
27
26
|
const extenders = hooks.extendStreamSSR.call() || [];
|
|
@@ -77,7 +76,7 @@ const createReadableStreamFromElement = async (request, rootElement, options)=>{
|
|
|
77
76
|
}
|
|
78
77
|
});
|
|
79
78
|
const passThrough = new PassThrough();
|
|
80
|
-
const stream =
|
|
79
|
+
const stream = Readable.toWeb(body);
|
|
81
80
|
resolve(stream);
|
|
82
81
|
let processedStream = passThrough;
|
|
83
82
|
extenders.forEach((extender)=>{
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
/*#__PURE__*/ import.meta.url;
|
|
1
3
|
import { renderSSRStream } from "@modern-js/render/ssr";
|
|
2
4
|
import { storage } from "@modern-js/runtime-utils/node";
|
|
3
|
-
import isbot_0 from "isbot";
|
|
4
5
|
import { ESCAPED_SHELL_STREAM_END_MARK } from "../../../common.mjs";
|
|
5
6
|
import { RenderLevel } from "../../constants.mjs";
|
|
6
7
|
import { enqueueFromEntries } from "./deferredScript.mjs";
|
|
7
|
-
import { ShellChunkStatus, encodeForWebStream, getReadableStreamFromString } from "./shared.mjs";
|
|
8
|
+
import { ShellChunkStatus, encodeForWebStream, getReadableStreamFromString, resolveStreamingMode } from "./shared.mjs";
|
|
8
9
|
import { getTemplates } from "./template.mjs";
|
|
9
10
|
const createReadableStreamFromElement = async (request, rootElement, options)=>{
|
|
10
11
|
let shellChunkStatus = ShellChunkStatus.START;
|
|
@@ -33,9 +34,9 @@ const createReadableStreamFromElement = async (request, rootElement, options)=>{
|
|
|
33
34
|
readableOriginal.allReady.then(()=>{
|
|
34
35
|
options?.onAllReady?.();
|
|
35
36
|
});
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
if (
|
|
37
|
+
const forceStreamToString = Boolean("u" > typeof process && process.env?.MODERN_JS_STREAM_TO_STRING);
|
|
38
|
+
const { waitForAllReady } = resolveStreamingMode(request, forceStreamToString);
|
|
39
|
+
if (waitForAllReady) await readableOriginal.allReady;
|
|
39
40
|
const reader = readableOriginal.getReader();
|
|
40
41
|
const stream = new ReadableStream({
|
|
41
42
|
start (controller) {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
/*#__PURE__*/ import.meta.url;
|
|
1
3
|
import { createRenderStreaming } from "./shared.mjs";
|
|
2
4
|
const createReadableStreamFromElement = 'edge' === process.env.MODERN_SSR_ENV ? import("./createReadableStream.worker.mjs").then((m)=>m.createReadableStreamFromElement) : import("./createReadableStream.mjs").then((m)=>m.createReadableStreamFromElement);
|
|
3
5
|
const renderStreaming = createRenderStreaming(createReadableStreamFromElement);
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "node:module";
|
|
2
|
+
/*#__PURE__*/ import.meta.url;
|
|
3
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
4
|
import { time } from "@modern-js/runtime-utils/time";
|
|
5
|
+
import isbot from "isbot";
|
|
6
|
+
import { JSX_SHELL_STREAM_END_MARK } from "../../../common.mjs";
|
|
3
7
|
import { wrapRuntimeContextProvider } from "../../react/wrapper.mjs";
|
|
4
8
|
import { SSRErrors, SSRTimings } from "../tracer.mjs";
|
|
5
9
|
import { getSSRConfigByEntry } from "../utils.mjs";
|
|
@@ -8,6 +12,38 @@ var shared_ShellChunkStatus = /*#__PURE__*/ function(ShellChunkStatus) {
|
|
|
8
12
|
ShellChunkStatus[ShellChunkStatus["FINISH"] = 1] = "FINISH";
|
|
9
13
|
return ShellChunkStatus;
|
|
10
14
|
}({});
|
|
15
|
+
const SHOULD_STREAM_ALL_HEADER = 'x-should-stream-all';
|
|
16
|
+
function parseShouldStreamAllFlag(value) {
|
|
17
|
+
if (!value) return;
|
|
18
|
+
const normalized = value.trim().toLowerCase();
|
|
19
|
+
if ('false' === normalized) return false;
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
function resolveStreamingMode(request, forceStreamToString) {
|
|
23
|
+
const shouldStreamAll = parseShouldStreamAllFlag(request.headers.get(SHOULD_STREAM_ALL_HEADER));
|
|
24
|
+
const isSsgRender = 'true' === request.headers.get('x-modern-ssg-render');
|
|
25
|
+
const isBot = isbot(request.headers.get('user-agent'));
|
|
26
|
+
if (shouldStreamAll) return {
|
|
27
|
+
onReady: 'onAllReady',
|
|
28
|
+
waitForAllReady: true
|
|
29
|
+
};
|
|
30
|
+
if (forceStreamToString) return {
|
|
31
|
+
onReady: 'onAllReady',
|
|
32
|
+
waitForAllReady: true
|
|
33
|
+
};
|
|
34
|
+
if (isBot) return {
|
|
35
|
+
onReady: 'onAllReady',
|
|
36
|
+
waitForAllReady: true
|
|
37
|
+
};
|
|
38
|
+
if (isSsgRender) return {
|
|
39
|
+
onReady: 'onAllReady',
|
|
40
|
+
waitForAllReady: true
|
|
41
|
+
};
|
|
42
|
+
return {
|
|
43
|
+
onReady: 'onShellReady',
|
|
44
|
+
waitForAllReady: false
|
|
45
|
+
};
|
|
46
|
+
}
|
|
11
47
|
let encoder;
|
|
12
48
|
function encodeForWebStream(thing) {
|
|
13
49
|
if (!encoder) encoder = new TextEncoder();
|
|
@@ -31,13 +67,16 @@ function createRenderStreaming(createReadableStreamPromise) {
|
|
|
31
67
|
const { onError, onTiming } = options;
|
|
32
68
|
const { htmlTemplate, entryName } = resource;
|
|
33
69
|
const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries);
|
|
34
|
-
const
|
|
35
|
-
children:
|
|
70
|
+
const StreamServerRootWrapper = ({ children })=>/*#__PURE__*/ jsxs(Fragment, {
|
|
71
|
+
children: [
|
|
72
|
+
children,
|
|
73
|
+
JSX_SHELL_STREAM_END_MARK
|
|
74
|
+
]
|
|
36
75
|
});
|
|
37
76
|
let rootElement = wrapRuntimeContextProvider(serverRoot, Object.assign(runtimeContext, {
|
|
38
77
|
ssr: true
|
|
39
78
|
}));
|
|
40
|
-
rootElement = /*#__PURE__*/ jsx(
|
|
79
|
+
rootElement = /*#__PURE__*/ jsx(StreamServerRootWrapper, {
|
|
41
80
|
children: rootElement
|
|
42
81
|
});
|
|
43
82
|
const stream = await createReadableStreamFromElement(request, rootElement, {
|
|
@@ -68,4 +107,4 @@ function createRenderStreaming(createReadableStreamPromise) {
|
|
|
68
107
|
return stream;
|
|
69
108
|
};
|
|
70
109
|
}
|
|
71
|
-
export { shared_ShellChunkStatus as ShellChunkStatus, createRenderStreaming, encodeForWebStream, getReadableStreamFromString };
|
|
110
|
+
export { shared_ShellChunkStatus as ShellChunkStatus, createRenderStreaming, encodeForWebStream, getReadableStreamFromString, resolveStreamingMode };
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
/*#__PURE__*/ import.meta.url;
|
|
3
|
+
import { fileURLToPath as __rspack_fileURLToPath } from "node:url";
|
|
4
|
+
import { dirname as __rspack_dirname } from "node:path";
|
|
1
5
|
import { ChunkExtractor } from "@loadable/server";
|
|
2
6
|
import { attributesToString, checkIsNode } from "../utils.mjs";
|
|
7
|
+
var loadable_dirname = __rspack_dirname(__rspack_fileURLToPath(import.meta.url));
|
|
3
8
|
const extname = (uri)=>{
|
|
4
9
|
if ('string' != typeof uri || !uri.includes('.')) return '';
|
|
5
10
|
return `.${uri?.split('.').pop()}` || '';
|
|
@@ -13,7 +18,7 @@ const checkIsInline = (chunk, enableInline)=>{
|
|
|
13
18
|
const readAsset = async (chunk)=>{
|
|
14
19
|
const fs = await import("fs/promises");
|
|
15
20
|
const path = await import("path");
|
|
16
|
-
const filepath = path.resolve(
|
|
21
|
+
const filepath = path.resolve(loadable_dirname, chunk.filename);
|
|
17
22
|
return fs.readFile(filepath, 'utf-8');
|
|
18
23
|
};
|
|
19
24
|
class LoadableCollector {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
/*#__PURE__*/ import.meta.url;
|
|
1
3
|
import { isRouteErrorResponse } from "@modern-js/runtime-utils/router";
|
|
2
4
|
function attributesToString(attributes) {
|
|
3
5
|
return Object.entries(attributes).reduce((str, [key, value])=>void 0 === value ? str : `${str} ${key}="${value}"`, '');
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
/*#__PURE__*/ import.meta.url;
|
|
1
3
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
4
|
import { renderToString } from "react-dom/server";
|
|
3
5
|
import { DOCUMENT_SCRIPT_ATTRIBUTES_END, DOCUMENT_SCRIPT_ATTRIBUTES_START, DOCUMENT_SCRIPT_PLACEHOLDER_END, DOCUMENT_SCRIPT_PLACEHOLDER_START } from "./constants.mjs";
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import __rslib_shim_module__ from "node:module";
|
|
2
|
+
const require = /*#__PURE__*/ __rslib_shim_module__.createRequire(import.meta.url);
|
|
1
3
|
import module_0, { builtinModules } from "module";
|
|
2
4
|
import path from "path";
|
|
3
|
-
import { createDebugger, findExists, fs } from "@modern-js/utils";
|
|
5
|
+
import { createDebugger, findExists, fs, logger } from "@modern-js/utils";
|
|
4
6
|
import { decodeHTML } from "entities";
|
|
5
7
|
import { BODY_PARTICALS_SEPARATOR, DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_COMMENT_PLACEHOLDER_END, DOCUMENT_COMMENT_PLACEHOLDER_START, DOCUMENT_FILE_NAME, DOCUMENT_LINKS_PLACEHOLDER, DOCUMENT_META_PLACEHOLDER, DOCUMENT_SCRIPTS_PLACEHOLDER, DOCUMENT_SCRIPT_ATTRIBUTES_END, DOCUMENT_SCRIPT_ATTRIBUTES_START, DOCUMENT_SCRIPT_PLACEHOLDER_END, DOCUMENT_SCRIPT_PLACEHOLDER_START, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, DOCUMENT_SSR_PLACEHOLDER, DOCUMENT_STYLE_PLACEHOLDER_END, DOCUMENT_STYLE_PLACEHOLDER_START, DOCUMENT_TITLE_PLACEHOLDER, DOC_EXT, HEAD_PARTICALS_SEPARATOR, HTML_SEPARATOR, PLACEHOLDER_REPLACER_MAP, TOP_PARTICALS_SEPARATOR } from "../constants.mjs";
|
|
6
8
|
const debug = createDebugger('document');
|
|
@@ -96,12 +98,13 @@ const applyExternalsPlugin = (child, compiler)=>{
|
|
|
96
98
|
EXTERNAL_MAPPINGS
|
|
97
99
|
]).apply(child);
|
|
98
100
|
};
|
|
99
|
-
const generateEntryCode = (docPath, _entryName)
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
101
|
+
const generateEntryCode = (docPath, _entryName)=>{
|
|
102
|
+
const runtimeAPI = require.resolve('../');
|
|
103
|
+
const esmRuntimeAPI = runtimeAPI.replace("cjs", "esm").replace(/.js$/, '.mjs');
|
|
104
|
+
return `import React from 'react';
|
|
105
|
+
import ReactDomServer from 'react-dom/server';
|
|
106
|
+
import Document from ${JSON.stringify(docPath)};
|
|
107
|
+
import { DocumentContext } from ${JSON.stringify(esmRuntimeAPI)};
|
|
105
108
|
|
|
106
109
|
// expose to global for host to consume
|
|
107
110
|
var g = (typeof globalThis !== 'undefined' ? globalThis : global);
|
|
@@ -118,7 +121,8 @@ function render(documentParams) {
|
|
|
118
121
|
|
|
119
122
|
g.__MODERN_DOC_RENDERERS__[${JSON.stringify(_entryName)}] = render;
|
|
120
123
|
|
|
121
|
-
|
|
124
|
+
export default { render: render };`;
|
|
125
|
+
};
|
|
122
126
|
const processChildCompilation = async (entryName, docPath, compilation, compiler, appDirectory, internalDirectory)=>new Promise((resolve, reject)=>{
|
|
123
127
|
const outFile = path.posix.join(CONSTANTS.DOCUMENT_OUTPUT_DIR, `${CONSTANTS.HTML_OUTPUT_PREFIX}${entryName}${CONSTANTS.HTML_OUTPUT_SUFFIX}`);
|
|
124
128
|
const child = compilation.createChildCompiler(`${CONSTANTS.CHILD_COMPILER_PREFIX}${entryName}`, {
|
|
@@ -139,31 +143,48 @@ const processChildCompilation = async (entryName, docPath, compilation, compiler
|
|
|
139
143
|
name: `${CONSTANTS.CHILD_COMPILER_PREFIX}${entryName}`
|
|
140
144
|
}).apply(child);
|
|
141
145
|
child.runAsChild((err, _entries, childCompilation)=>{
|
|
142
|
-
if (err)
|
|
146
|
+
if (err) {
|
|
147
|
+
logger.error(`Document child compiler failed for entry "${entryName}": ${err.message}`);
|
|
148
|
+
return reject(err);
|
|
149
|
+
}
|
|
143
150
|
try {
|
|
144
151
|
if (!childCompilation) throw new Error('Child compilation is undefined');
|
|
145
152
|
const asset = childCompilation.assets[outFile] || childCompilation.getAsset?.(outFile)?.source;
|
|
146
153
|
const code = 'function' == typeof asset?.source ? asset.source().toString() : 'string' == typeof asset ? asset : asset?.buffer?.().toString?.() || '';
|
|
147
|
-
if (code) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
154
|
+
if (!code) {
|
|
155
|
+
const errorMsg = `Document child compiler produced empty output for entry "${entryName}". Please check your Document component for syntax errors.`;
|
|
156
|
+
logger.error(errorMsg);
|
|
157
|
+
reject(new Error(errorMsg));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
entryName2DocCode.set(entryName, code);
|
|
161
|
+
debug('Document child compiler: cached injected bundle for %s', entryName);
|
|
151
162
|
resolve();
|
|
152
163
|
} catch (e) {
|
|
153
|
-
|
|
164
|
+
const err = e;
|
|
165
|
+
logger.error(`Document child compiler failed to process output for entry "${entryName}": ${err.message}`);
|
|
166
|
+
reject(err);
|
|
154
167
|
}
|
|
155
168
|
});
|
|
156
169
|
} catch (e) {
|
|
157
|
-
|
|
170
|
+
const err = e;
|
|
171
|
+
logger.error(`Document child compiler failed to initialize for entry "${entryName}": ${err.message}`);
|
|
172
|
+
reject(err);
|
|
158
173
|
}
|
|
159
174
|
};
|
|
160
175
|
try {
|
|
161
176
|
fs.ensureFile(tempEntry).then(()=>{
|
|
162
177
|
const entryCode = generateEntryCode(docPath, entryName);
|
|
163
178
|
return fs.writeFile(tempEntry, entryCode);
|
|
164
|
-
}).then(finalize).catch((e)=>
|
|
179
|
+
}).then(finalize).catch((e)=>{
|
|
180
|
+
const err = e;
|
|
181
|
+
logger.error(`Document child compiler failed to prepare entry file for "${entryName}": ${err.message}`);
|
|
182
|
+
reject(err);
|
|
183
|
+
});
|
|
165
184
|
} catch (e) {
|
|
166
|
-
|
|
185
|
+
const err = e;
|
|
186
|
+
logger.error(`Document child compiler failed to create entry directory for "${entryName}": ${err.message}`);
|
|
187
|
+
reject(err);
|
|
167
188
|
}
|
|
168
189
|
});
|
|
169
190
|
const documentPlugin = ()=>({
|
|
@@ -189,7 +210,10 @@ const documentPlugin = ()=>({
|
|
|
189
210
|
}
|
|
190
211
|
await Promise.all(tasks);
|
|
191
212
|
} catch (e) {
|
|
213
|
+
const err = e;
|
|
214
|
+
logger.error(`Document child compiler failed: ${err.message}`);
|
|
192
215
|
debug('Document child compiler make hook failed: %o', e);
|
|
216
|
+
throw err;
|
|
193
217
|
}
|
|
194
218
|
});
|
|
195
219
|
}
|
|
@@ -197,21 +221,13 @@ const documentPlugin = ()=>({
|
|
|
197
221
|
this.name = 'ModernJsDocumentChildCompilerPlugin';
|
|
198
222
|
}
|
|
199
223
|
}
|
|
200
|
-
api.config(()=>{
|
|
201
|
-
const documentPath = require.resolve('../');
|
|
202
|
-
return {
|
|
203
|
-
resolve: {
|
|
204
|
-
alias: {
|
|
205
|
-
'@meta/runtime/document$': documentPath.replace(`${path.sep}cjs${path.sep}`, `${path.sep}esm${path.sep}`).replace(/.js$/, '.mjs')
|
|
206
|
-
}
|
|
207
|
-
},
|
|
224
|
+
api.config(()=>({
|
|
208
225
|
tools: {
|
|
209
226
|
bundlerChain: (chain)=>{
|
|
210
227
|
chain.plugin('modernjs-document-child-compiler').use(ModernJsDocumentChildCompilerPlugin, []);
|
|
211
228
|
}
|
|
212
229
|
}
|
|
213
|
-
};
|
|
214
|
-
});
|
|
230
|
+
}));
|
|
215
231
|
const getDocParams = (params)=>{
|
|
216
232
|
const { config, templateParameters, entryName } = params;
|
|
217
233
|
return {
|
|
@@ -230,11 +246,13 @@ const documentPlugin = ()=>({
|
|
|
230
246
|
renderer: globalRenderer
|
|
231
247
|
};
|
|
232
248
|
const cached = entryName2DocCode.get(entryName);
|
|
233
|
-
if (!cached) throw new Error(`
|
|
249
|
+
if (!cached) throw new Error(`Document bundle not found for entry "${entryName}". The Document component compilation may have failed.`);
|
|
234
250
|
const filename = path.join(internalDirectory, `./${CONSTANTS.DOCUMENT_OUTPUT_DIR}/${CONSTANTS.HTML_OUTPUT_PREFIX}${entryName}${CONSTANTS.HTML_OUTPUT_SUFFIX}`);
|
|
235
251
|
requireFromString(cached, filename);
|
|
252
|
+
const renderer = renderers[entryName];
|
|
253
|
+
if (!renderer) throw new Error(`Document renderer not found for entry "${entryName}". Please ensure your Document component exports a valid default component.`);
|
|
236
254
|
return {
|
|
237
|
-
renderer
|
|
255
|
+
renderer
|
|
238
256
|
};
|
|
239
257
|
};
|
|
240
258
|
const processPartials = (html, entryName, partialsByEntrypoint)=>{
|
|
@@ -250,17 +268,17 @@ const documentPlugin = ()=>({
|
|
|
250
268
|
}
|
|
251
269
|
return html.replace(TOP_PARTICALS_SEPARATOR, ()=>partialsContent.partialsTop).replace(HEAD_PARTICALS_SEPARATOR, ()=>partialsContent.partialsHead).replace(BODY_PARTICALS_SEPARATOR, ()=>partialsContent.partialsBody);
|
|
252
270
|
};
|
|
253
|
-
const extractHtmlTags = (
|
|
271
|
+
const extractHtmlTags = (htmlPlugin, templateParameters)=>{
|
|
254
272
|
const scripts = [
|
|
255
|
-
|
|
256
|
-
|
|
273
|
+
htmlPlugin.tags.headTags.filter((item)=>"script" === item.tagName).join(''),
|
|
274
|
+
htmlPlugin.tags.bodyTags.toString()
|
|
257
275
|
].join('');
|
|
258
|
-
const links =
|
|
276
|
+
const links = htmlPlugin.tags.headTags.filter((item)=>'link' === item.tagName).join('');
|
|
259
277
|
const metas = [
|
|
260
278
|
templateParameters.meta,
|
|
261
|
-
|
|
279
|
+
htmlPlugin.tags.headTags.filter((item)=>"script" !== item.tagName && 'link' !== item.tagName && 'title' !== item.tagName).join('')
|
|
262
280
|
].join('');
|
|
263
|
-
const titles =
|
|
281
|
+
const titles = htmlPlugin.tags.headTags.filter((item)=>'title' === item.tagName).join('').replace('<title>', '').replace('</title>', '');
|
|
264
282
|
return {
|
|
265
283
|
scripts,
|
|
266
284
|
links,
|
|
@@ -279,19 +297,26 @@ const documentPlugin = ()=>({
|
|
|
279
297
|
const { entrypoints, internalDirectory, appDirectory } = api.getAppContext();
|
|
280
298
|
const documentFilePath = getDocumentByEntryName(entrypoints, entryName, appDirectory);
|
|
281
299
|
if (!documentFilePath) return null;
|
|
282
|
-
return async ({
|
|
300
|
+
return async ({ htmlPlugin })=>{
|
|
283
301
|
const config = api.getNormalizedConfig();
|
|
284
302
|
const documentParams = getDocParams({
|
|
285
303
|
config: config,
|
|
286
304
|
entryName,
|
|
287
305
|
templateParameters
|
|
288
306
|
});
|
|
289
|
-
|
|
290
|
-
|
|
307
|
+
let html;
|
|
308
|
+
try {
|
|
309
|
+
const { renderer } = await loadRender(entryName, internalDirectory);
|
|
310
|
+
html = renderer(documentParams);
|
|
311
|
+
} catch (error) {
|
|
312
|
+
const err = error;
|
|
313
|
+
logger.error(`Failed to render Document for entry "${entryName}": ${err.message}`);
|
|
314
|
+
throw err;
|
|
315
|
+
}
|
|
291
316
|
debug("entry %s's document jsx rendered html: %o", entryName, html);
|
|
292
317
|
const { partialsByEntrypoint } = api.getAppContext();
|
|
293
318
|
html = processPartials(html, entryName, partialsByEntrypoint || {});
|
|
294
|
-
const { scripts, links, metas, titles } = extractHtmlTags(
|
|
319
|
+
const { scripts, links, metas, titles } = extractHtmlTags(htmlPlugin, templateParameters);
|
|
295
320
|
return processPlaceholders(html, config, scripts, links, metas, titles);
|
|
296
321
|
};
|
|
297
322
|
};
|