@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.
Files changed (204) hide show
  1. package/dist/cjs/cli/ssr/index.js +109 -124
  2. package/dist/cjs/cli/ssr/loadable-bundler-plugin.js +21 -4
  3. package/dist/cjs/core/browser/index.js +2 -1
  4. package/dist/cjs/core/server/stream/createReadableStream.js +2 -15
  5. package/dist/cjs/core/server/stream/createReadableStream.worker.js +3 -14
  6. package/dist/cjs/core/server/stream/shared.js +54 -4
  7. package/dist/cjs/document/cli/index.js +61 -38
  8. package/dist/cjs/router/runtime/PrefetchLink.js +1 -4
  9. package/dist/cjs/router/runtime/plugin.node.js +1 -3
  10. package/dist/cjs/rsc/server.js +2 -42
  11. package/dist/esm/cli/alias.mjs +1 -1
  12. package/dist/esm/cli/code.mjs +3 -3
  13. package/dist/esm/cli/entry.mjs +1 -1
  14. package/dist/esm/cli/index.mjs +7 -7
  15. package/dist/esm/cli/ssr/index.mjs +3 -19
  16. package/dist/esm/cli/ssr/loadable-bundler-plugin.mjs +2 -1
  17. package/dist/esm/cli/template.mjs +1 -1
  18. package/dist/esm/core/browser/hydrate.mjs +3 -3
  19. package/dist/esm/core/browser/index.mjs +6 -5
  20. package/dist/esm/core/compat/index.mjs +1 -1
  21. package/dist/esm/core/context/index.mjs +2 -2
  22. package/dist/esm/core/context/monitors/index.mjs +1 -1
  23. package/dist/esm/core/context/monitors/index.server.mjs +1 -1
  24. package/dist/esm/core/index.mjs +2 -2
  25. package/dist/esm/core/plugin/index.mjs +4 -4
  26. package/dist/esm/core/react/index.mjs +3 -3
  27. package/dist/esm/core/react/wrapper.mjs +1 -1
  28. package/dist/esm/core/server/helmet.mjs +1 -1
  29. package/dist/esm/core/server/index.mjs +1 -1
  30. package/dist/esm/core/server/react/index.mjs +2 -2
  31. package/dist/esm/core/server/react/no-ssr-cache/index.mjs +1 -1
  32. package/dist/esm/core/server/requestHandler.mjs +7 -7
  33. package/dist/esm/core/server/server.mjs +3 -3
  34. package/dist/esm/core/server/stream/afterTemplate.mjs +4 -4
  35. package/dist/esm/core/server/stream/beforeTemplate.mjs +4 -4
  36. package/dist/esm/core/server/stream/createReadableStream.mjs +11 -14
  37. package/dist/esm/core/server/stream/createReadableStream.worker.mjs +8 -9
  38. package/dist/esm/core/server/stream/deferredScript.mjs +1 -1
  39. package/dist/esm/core/server/stream/index.mjs +2 -2
  40. package/dist/esm/core/server/stream/shared.mjs +45 -8
  41. package/dist/esm/core/server/stream/template.mjs +2 -2
  42. package/dist/esm/core/server/string/index.mjs +10 -10
  43. package/dist/esm/core/server/string/loadable.mjs +1 -1
  44. package/dist/esm/core/server/string/ssrData.mjs +2 -2
  45. package/dist/esm/document/Body.mjs +3 -3
  46. package/dist/esm/document/Comment.mjs +1 -1
  47. package/dist/esm/document/Head.mjs +5 -5
  48. package/dist/esm/document/Html.mjs +3 -3
  49. package/dist/esm/document/Links.mjs +1 -1
  50. package/dist/esm/document/Root.mjs +2 -2
  51. package/dist/esm/document/Script.mjs +1 -1
  52. package/dist/esm/document/Scripts.mjs +1 -1
  53. package/dist/esm/document/Style.mjs +1 -1
  54. package/dist/esm/document/Title.mjs +1 -1
  55. package/dist/esm/document/cli/index.mjs +63 -40
  56. package/dist/esm/document/index.mjs +12 -12
  57. package/dist/esm/index.mjs +5 -5
  58. package/dist/esm/internal.mjs +1 -1
  59. package/dist/esm/react-server.mjs +3 -3
  60. package/dist/esm/router/cli/code/getClientRoutes/getRoutes.mjs +4 -4
  61. package/dist/esm/router/cli/code/getClientRoutes/index.mjs +1 -1
  62. package/dist/esm/router/cli/code/getClientRoutes/utils.mjs +1 -1
  63. package/dist/esm/router/cli/code/index.mjs +9 -9
  64. package/dist/esm/router/cli/code/inspect.mjs +2 -2
  65. package/dist/esm/router/cli/code/nestedRoutes.mjs +2 -2
  66. package/dist/esm/router/cli/code/templates.mjs +2 -2
  67. package/dist/esm/router/cli/code/utils.mjs +1 -1
  68. package/dist/esm/router/cli/config-routes/converter.mjs +2 -2
  69. package/dist/esm/router/cli/entry.mjs +2 -2
  70. package/dist/esm/router/cli/handler.mjs +5 -5
  71. package/dist/esm/router/cli/index.mjs +3 -3
  72. package/dist/esm/router/index.mjs +1 -1
  73. package/dist/esm/router/internal.mjs +2 -2
  74. package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +3 -3
  75. package/dist/esm/router/runtime/PrefetchLink.mjs +2 -5
  76. package/dist/esm/router/runtime/constants.mjs +1 -1
  77. package/dist/esm/router/runtime/index.mjs +2 -2
  78. package/dist/esm/router/runtime/internal.mjs +2 -2
  79. package/dist/esm/router/runtime/plugin.mjs +4 -4
  80. package/dist/esm/router/runtime/plugin.node.mjs +5 -7
  81. package/dist/esm/router/runtime/utils.mjs +2 -2
  82. package/dist/esm/rsc/server.mjs +0 -32
  83. package/dist/esm-node/cache/index.mjs +2 -0
  84. package/dist/esm-node/cli/alias.mjs +2 -0
  85. package/dist/esm-node/cli/code.mjs +2 -0
  86. package/dist/esm-node/cli/constants.mjs +2 -0
  87. package/dist/esm-node/cli/entry.mjs +2 -0
  88. package/dist/esm-node/cli/index.mjs +2 -0
  89. package/dist/esm-node/cli/ssr/index.mjs +4 -18
  90. package/dist/esm-node/cli/ssr/loadable-bundler-plugin.mjs +4 -1
  91. package/dist/esm-node/cli/ssr/mode.mjs +2 -0
  92. package/dist/esm-node/cli/template.mjs +2 -0
  93. package/dist/esm-node/cli/template.server.mjs +2 -0
  94. package/dist/esm-node/common.mjs +2 -0
  95. package/dist/esm-node/core/browser/hydrate.mjs +2 -0
  96. package/dist/esm-node/core/browser/index.mjs +4 -1
  97. package/dist/esm-node/core/browser/withCallback.mjs +2 -0
  98. package/dist/esm-node/core/compat/hooks.mjs +2 -0
  99. package/dist/esm-node/core/compat/index.mjs +2 -0
  100. package/dist/esm-node/core/compat/requestContext.mjs +2 -0
  101. package/dist/esm-node/core/config.mjs +2 -0
  102. package/dist/esm-node/core/constants.mjs +2 -0
  103. package/dist/esm-node/core/context/index.mjs +2 -0
  104. package/dist/esm-node/core/context/monitors/default.mjs +2 -0
  105. package/dist/esm-node/core/context/monitors/index.mjs +2 -0
  106. package/dist/esm-node/core/context/monitors/index.server.mjs +2 -0
  107. package/dist/esm-node/core/context/request/index.mjs +2 -0
  108. package/dist/esm-node/core/context/request/index.server.mjs +2 -0
  109. package/dist/esm-node/core/context/response/index.mjs +2 -0
  110. package/dist/esm-node/core/context/response/index.server.mjs +2 -0
  111. package/dist/esm-node/core/context/runtime.mjs +2 -0
  112. package/dist/esm-node/core/context/serverPayload/index.mjs +2 -0
  113. package/dist/esm-node/core/context/serverPayload/index.server.mjs +2 -0
  114. package/dist/esm-node/core/index.mjs +2 -0
  115. package/dist/esm-node/core/plugin/index.mjs +2 -0
  116. package/dist/esm-node/core/plugin/types.mjs +2 -0
  117. package/dist/esm-node/core/react/index.mjs +2 -0
  118. package/dist/esm-node/core/react/wrapper.mjs +2 -0
  119. package/dist/esm-node/core/server/constants.mjs +2 -0
  120. package/dist/esm-node/core/server/helmet.mjs +2 -0
  121. package/dist/esm-node/core/server/index.mjs +2 -0
  122. package/dist/esm-node/core/server/react/index.mjs +2 -0
  123. package/dist/esm-node/core/server/react/no-ssr-cache/index.mjs +2 -0
  124. package/dist/esm-node/core/server/react/nossr/index.mjs +2 -0
  125. package/dist/esm-node/core/server/requestHandler.mjs +2 -0
  126. package/dist/esm-node/core/server/server.mjs +2 -0
  127. package/dist/esm-node/core/server/shared.mjs +2 -0
  128. package/dist/esm-node/core/server/stream/afterTemplate.mjs +2 -0
  129. package/dist/esm-node/core/server/stream/beforeTemplate.mjs +6 -1
  130. package/dist/esm-node/core/server/stream/createReadableStream.mjs +7 -8
  131. package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +6 -5
  132. package/dist/esm-node/core/server/stream/deferredScript.mjs +2 -0
  133. package/dist/esm-node/core/server/stream/index.mjs +2 -0
  134. package/dist/esm-node/core/server/stream/shared.mjs +44 -5
  135. package/dist/esm-node/core/server/stream/template.mjs +2 -0
  136. package/dist/esm-node/core/server/string/index.mjs +2 -0
  137. package/dist/esm-node/core/server/string/loadable.mjs +6 -1
  138. package/dist/esm-node/core/server/string/ssrData.mjs +2 -0
  139. package/dist/esm-node/core/server/string/types.mjs +2 -0
  140. package/dist/esm-node/core/server/tracer.mjs +2 -0
  141. package/dist/esm-node/core/server/utils.mjs +2 -0
  142. package/dist/esm-node/core/types.mjs +2 -0
  143. package/dist/esm-node/document/Body.mjs +2 -0
  144. package/dist/esm-node/document/Comment.mjs +2 -0
  145. package/dist/esm-node/document/DocumentContext.mjs +2 -0
  146. package/dist/esm-node/document/DocumentStructureContext.mjs +2 -0
  147. package/dist/esm-node/document/Head.mjs +2 -0
  148. package/dist/esm-node/document/Html.mjs +2 -0
  149. package/dist/esm-node/document/Links.mjs +2 -0
  150. package/dist/esm-node/document/Root.mjs +2 -0
  151. package/dist/esm-node/document/Script.mjs +2 -0
  152. package/dist/esm-node/document/Scripts.mjs +2 -0
  153. package/dist/esm-node/document/Style.mjs +2 -0
  154. package/dist/esm-node/document/Title.mjs +2 -0
  155. package/dist/esm-node/document/cli/index.mjs +64 -39
  156. package/dist/esm-node/document/constants.mjs +2 -0
  157. package/dist/esm-node/document/index.mjs +2 -0
  158. package/dist/esm-node/exports/config-routes.mjs +2 -0
  159. package/dist/esm-node/exports/head.mjs +2 -0
  160. package/dist/esm-node/exports/loadable.mjs +2 -0
  161. package/dist/esm-node/index.mjs +2 -0
  162. package/dist/esm-node/internal.mjs +2 -0
  163. package/dist/esm-node/react-server.mjs +2 -0
  164. package/dist/esm-node/router/cli/code/getClientRoutes/getRoutes.mjs +2 -0
  165. package/dist/esm-node/router/cli/code/getClientRoutes/index.mjs +2 -0
  166. package/dist/esm-node/router/cli/code/getClientRoutes/utils.mjs +2 -0
  167. package/dist/esm-node/router/cli/code/index.mjs +2 -0
  168. package/dist/esm-node/router/cli/code/inspect.mjs +2 -0
  169. package/dist/esm-node/router/cli/code/makeLegalIdentifier.mjs +2 -0
  170. package/dist/esm-node/router/cli/code/nestedRoutes.mjs +2 -0
  171. package/dist/esm-node/router/cli/code/templates.mjs +2 -0
  172. package/dist/esm-node/router/cli/code/utils.mjs +2 -0
  173. package/dist/esm-node/router/cli/config-routes/converter.mjs +2 -0
  174. package/dist/esm-node/router/cli/config-routes/parseRouteConfig.mjs +2 -0
  175. package/dist/esm-node/router/cli/constants.mjs +2 -0
  176. package/dist/esm-node/router/cli/entry.mjs +2 -0
  177. package/dist/esm-node/router/cli/handler.mjs +2 -0
  178. package/dist/esm-node/router/cli/index.mjs +6 -1
  179. package/dist/esm-node/router/index.mjs +2 -0
  180. package/dist/esm-node/router/internal.mjs +2 -0
  181. package/dist/esm-node/router/runtime/DefaultNotFound.mjs +2 -0
  182. package/dist/esm-node/router/runtime/DeferredDataScripts.mjs +2 -0
  183. package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +2 -0
  184. package/dist/esm-node/router/runtime/PrefetchLink.mjs +3 -4
  185. package/dist/esm-node/router/runtime/constants.mjs +2 -0
  186. package/dist/esm-node/router/runtime/hooks.mjs +2 -0
  187. package/dist/esm-node/router/runtime/index.mjs +2 -0
  188. package/dist/esm-node/router/runtime/internal.mjs +2 -0
  189. package/dist/esm-node/router/runtime/plugin.mjs +2 -0
  190. package/dist/esm-node/router/runtime/plugin.node.mjs +3 -3
  191. package/dist/esm-node/router/runtime/routerHelper.mjs +2 -0
  192. package/dist/esm-node/router/runtime/rsc-router.mjs +2 -0
  193. package/dist/esm-node/router/runtime/rsc.mjs +2 -0
  194. package/dist/esm-node/router/runtime/server.mjs +2 -0
  195. package/dist/esm-node/router/runtime/types.mjs +2 -0
  196. package/dist/esm-node/router/runtime/utils.mjs +2 -0
  197. package/dist/esm-node/router/runtime/withRouter.mjs +2 -0
  198. package/dist/esm-node/rsc/client.mjs +2 -0
  199. package/dist/esm-node/rsc/server.mjs +2 -32
  200. package/dist/types/cli/ssr/loadable-bundler-plugin.d.ts +22 -1
  201. package/dist/types/core/server/stream/shared.d.ts +4 -0
  202. package/dist/types/rsc/server.d.ts +0 -1
  203. package/package.json +28 -56
  204. package/rstest.config.ts +83 -0
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { jsx } from "react/jsx-runtime";
2
4
  import { InternalRuntimeContext, RuntimeContext } from "../context/index.mjs";
3
5
  function wrapRuntimeContextProvider(App, contextValue) {
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  const HTML_PLACEHOLDER = '<!--<?- html ?>-->';
2
4
  const SSR_DATA_PLACEHOLDER = '<!--<?- SSRDataScript ?>-->';
3
5
  const CHUNK_JS_PLACEHOLDER = '<!--<?- chunksMap.js ?>-->';
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { EOL } from "os";
2
4
  import { safeReplace } from "./utils.mjs";
3
5
  const RE_HTML_ATTR = /<html[^>]*>/;
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { NoSSR, NoSSRCache } from "./react/index.mjs";
2
4
  const ssr = (_config)=>({
3
5
  name: '@modern-js/plugin-ssr',
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { NoSSR } from "./nossr/index.mjs";
2
4
  import { NoSSRCache } from "./no-ssr-cache/index.mjs";
3
5
  export { NoSSR, NoSSRCache };
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { jsx } from "react/jsx-runtime";
2
4
  import "react";
3
5
  import { Helmet } from "../../../../exports/head.mjs";
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import react, { useEffect, useState } from "react";
2
4
  const NoSSR = (props)=>{
3
5
  const [isMounted, setMounted] = useState(false);
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { jsx } from "react/jsx-runtime";
2
4
  import { storage } from "@modern-js/runtime-utils/node";
3
5
  import { getPathname, parseCookie, parseHeaders, parseQuery } from "@modern-js/runtime-utils/universal/request";
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { renderString } from "./string/index.mjs";
2
4
  import { renderStreaming } from "./stream/index.mjs";
3
5
  import { createRequestHandler } from "./requestHandler.mjs";
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  function buildHtml(template, callbacks) {
2
4
  return callbacks.reduce((promise, buildHtmlCb)=>promise.then((template)=>buildHtmlCb(template)), Promise.resolve(template));
3
5
  }
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { serializeJson } from "@modern-js/runtime-utils/node";
2
4
  import { SSR_DATA_JSON_ID } from "../../constants.mjs";
3
5
  import { SSR_DATA_PLACEHOLDER } from "../constants.mjs";
@@ -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(__dirname, chunk);
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 { PassThrough, Transform } from "stream";
2
- import { createReadableStreamFromReadable, storage } from "@modern-js/runtime-utils/node";
3
- import isbot_0 from "isbot";
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 isbot = isbot_0(request.headers.get('user-agent'));
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 = createReadableStreamFromReadable(body);
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 isbot = isbot_0(request.headers.get('user-agent'));
37
- const isSsgRender = 'true' === request.headers.get('x-modern-ssg-render');
38
- if (isbot || isSsgRender) await readableOriginal.allReady;
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 { runRouterDataFnStr } from "../../../router/runtime/constants.mjs";
2
4
  const HTML_ESCAPE_MAP = {
3
5
  '&': '&amp;',
@@ -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 { Fragment, jsx } from "react/jsx-runtime";
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 RSCServerRoot = ({ children })=>/*#__PURE__*/ jsx(Fragment, {
35
- children: 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(RSCServerRoot, {
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,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { buildShellAfterTemplate } from "./afterTemplate.mjs";
2
4
  import { buildShellBeforeTemplate } from "./beforeTemplate.mjs";
3
5
  const HTML_SEPARATOR = '<!--<?- html ?>-->';
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { time } from "@modern-js/runtime-utils/time";
2
4
  import server from "react-dom/server";
3
5
  import react_helmet from "react-helmet";
@@ -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(__dirname, chunk.filename);
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 { serializeJson } from "@modern-js/runtime-utils/node";
2
4
  import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../../constants.mjs";
3
5
  import { attributesToString, serializeErrors } from "../utils.mjs";
@@ -0,0 +1,2 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  var tracer_SSRTimings = /*#__PURE__*/ function(SSRTimings) {
2
4
  SSRTimings["PRERENDER"] = "ssr-prerender";
3
5
  SSRTimings["RENDER_HTML"] = "ssr-render-html";
@@ -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}"`, '');
@@ -0,0 +1,2 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { jsx, jsxs } from "react/jsx-runtime";
2
4
  import { useContext } from "react";
3
5
  import { DocumentStructureContext } from "./DocumentStructureContext.mjs";
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { Fragment, jsxs } from "react/jsx-runtime";
2
4
  import "react";
3
5
  import { DOCUMENT_COMMENT_PLACEHOLDER_END, DOCUMENT_COMMENT_PLACEHOLDER_START } from "./constants.mjs";
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import react from "react";
2
4
  const DocumentContext = /*#__PURE__*/ react.createContext({
3
5
  config: {},
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import react from "react";
2
4
  const DocumentStructureContext = /*#__PURE__*/ react.createContext({
3
5
  hasSetHead: false,
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { jsx, jsxs } from "react/jsx-runtime";
2
4
  import { useContext } from "react";
3
5
  import { DocumentStructureContext } from "./DocumentStructureContext.mjs";
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { jsx, jsxs } from "react/jsx-runtime";
2
4
  import "react";
3
5
  import { Body } from "./Body.mjs";
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { Fragment, jsx } from "react/jsx-runtime";
2
4
  import "react";
3
5
  import { DOCUMENT_LINKS_PLACEHOLDER } from "./constants.mjs";
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { jsxs } from "react/jsx-runtime";
2
4
  import { omit } from "@modern-js/utils/lodash";
3
5
  import { useContext } from "react";
@@ -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,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { Fragment, jsx } from "react/jsx-runtime";
2
4
  import "react";
3
5
  import { DOCUMENT_SCRIPTS_PLACEHOLDER } from "./constants.mjs";
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { Fragment, jsxs } from "react/jsx-runtime";
2
4
  import "react";
3
5
  import { DOCUMENT_STYLE_PLACEHOLDER_END, DOCUMENT_STYLE_PLACEHOLDER_START } from "./constants.mjs";
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { jsx } from "react/jsx-runtime";
2
4
  import { DOCUMENT_TITLE_PLACEHOLDER } from "./constants.mjs";
3
5
  function Title() {
@@ -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)=>`var React = require('react');
100
- var ReactDomServer = require('react-dom/server');
101
- var exp = require(${JSON.stringify(docPath)});
102
- var DocumentContext = require('@meta/runtime/document').DocumentContext;
103
-
104
- var Document = exp && exp.default;
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
- module.exports = { render: render };`;
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) return reject(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
- entryName2DocCode.set(entryName, code);
149
- debug('Document child compiler: cached injected bundle for %s', entryName);
150
- } else debug('Document child compiler: empty asset for %s', entryName);
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
- reject(e);
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
- reject(e);
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)=>reject(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
- reject(e);
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(`Failed to load Document bundle for entry "${entryName}". This is likely because the Document component compilation failed or the bundle was not generated correctly. Please check your Document component implementation.`);
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: renderers[entryName]
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 = (htmlWebpackPlugin, templateParameters)=>{
271
+ const extractHtmlTags = (htmlPlugin, templateParameters)=>{
254
272
  const scripts = [
255
- htmlWebpackPlugin.tags.headTags.filter((item)=>"script" === item.tagName).join(''),
256
- htmlWebpackPlugin.tags.bodyTags.toString()
273
+ htmlPlugin.tags.headTags.filter((item)=>"script" === item.tagName).join(''),
274
+ htmlPlugin.tags.bodyTags.toString()
257
275
  ].join('');
258
- const links = htmlWebpackPlugin.tags.headTags.filter((item)=>'link' === item.tagName).join('');
276
+ const links = htmlPlugin.tags.headTags.filter((item)=>'link' === item.tagName).join('');
259
277
  const metas = [
260
278
  templateParameters.meta,
261
- htmlWebpackPlugin.tags.headTags.filter((item)=>"script" !== item.tagName && 'link' !== item.tagName && 'title' !== item.tagName).join('')
279
+ htmlPlugin.tags.headTags.filter((item)=>"script" !== item.tagName && 'link' !== item.tagName && 'title' !== item.tagName).join('')
262
280
  ].join('');
263
- const titles = htmlWebpackPlugin.tags.headTags.filter((item)=>'title' === item.tagName).join('').replace('<title>', '').replace('</title>', '');
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 ({ htmlWebpackPlugin })=>{
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
- const { renderer } = await loadRender(entryName, internalDirectory);
290
- let html = renderer?.(documentParams);
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(htmlWebpackPlugin, templateParameters);
319
+ const { scripts, links, metas, titles } = extractHtmlTags(htmlPlugin, templateParameters);
295
320
  return processPlaceholders(html, config, scripts, links, metas, titles);
296
321
  };
297
322
  };
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  import { HTML_CHUNKSMAP_SEPARATOR } from "@modern-js/utils/universal/constants";
2
4
  const DOC_EXT = [
3
5
  'jsx',
@@ -1,3 +1,5 @@
1
+ import "node:module";
2
+ /*#__PURE__*/ import.meta.url;
1
3
  export * from "./Html.mjs";
2
4
  export * from "./DocumentContext.mjs";
3
5
  export * from "./DocumentStructureContext.mjs";