@modern-js/runtime 2.5.0-alpha.0 → 2.6.0

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 (135) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/cjs/cli/index.js +9 -0
  3. package/dist/cjs/common.js +0 -6
  4. package/dist/cjs/core/app-config.js +5 -1
  5. package/dist/cjs/core/compatible.js +8 -7
  6. package/dist/cjs/core/loader/index.js +4 -0
  7. package/dist/cjs/core/loader/loaderManager.js +6 -0
  8. package/dist/cjs/core/loader/useLoader.js +4 -0
  9. package/dist/cjs/document/Body.js +6 -8
  10. package/dist/cjs/document/DocumentContext.js +4 -0
  11. package/dist/cjs/document/DocumentStructureContext.js +4 -0
  12. package/dist/cjs/document/Head.js +7 -11
  13. package/dist/cjs/document/Html.js +24 -22
  14. package/dist/cjs/document/Links.js +1 -3
  15. package/dist/cjs/document/Root.js +8 -14
  16. package/dist/cjs/document/Script.js +5 -7
  17. package/dist/cjs/document/Scripts.js +1 -3
  18. package/dist/cjs/document/cli/index.js +7 -1
  19. package/dist/cjs/exports/head.js +4 -0
  20. package/dist/cjs/exports/loadable.js +4 -0
  21. package/dist/cjs/exports/styled.js +4 -0
  22. package/dist/cjs/router/cli/index.js +3 -7
  23. package/dist/cjs/router/index.js +4 -0
  24. package/dist/cjs/router/runtime/DefaultNotFound.js +13 -10
  25. package/dist/cjs/router/runtime/index.js +3 -52
  26. package/dist/cjs/router/runtime/plugin.js +6 -14
  27. package/dist/cjs/router/runtime/plugin.node.js +54 -10
  28. package/dist/cjs/router/runtime/utils.js +80 -28
  29. package/dist/cjs/router/runtime/withRouter.js +9 -6
  30. package/dist/cjs/ssr/cli/babel-plugin-ssr-loader-id.js +4 -0
  31. package/dist/cjs/ssr/cli/index.js +4 -0
  32. package/dist/cjs/ssr/index.js +10 -24
  33. package/dist/cjs/ssr/index.node.js +4 -0
  34. package/dist/cjs/ssr/prefetch.js +3 -6
  35. package/dist/cjs/ssr/react/nossr/index.js +4 -0
  36. package/dist/cjs/ssr/react/prerender/index.js +4 -0
  37. package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +19 -5
  38. package/dist/cjs/ssr/serverRender/renderToStream/bulidTemplate.before.js +5 -0
  39. package/dist/cjs/ssr/serverRender/renderToStream/index.js +4 -0
  40. package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.js +7 -22
  41. package/dist/cjs/ssr/serverRender/renderToStream/template.js +1 -2
  42. package/dist/cjs/ssr/serverRender/renderToString/entry.js +14 -12
  43. package/dist/cjs/ssr/serverRender/renderToString/index.js +4 -0
  44. package/dist/cjs/ssr/serverRender/renderToString/loadable.js +1 -1
  45. package/dist/cjs/ssr/serverRender/time.worker.js +1 -1
  46. package/dist/cjs/ssr/serverRender/utils.js +1 -1
  47. package/dist/cjs/ssr/utils.js +16 -4
  48. package/dist/cjs/state/index.js +4 -0
  49. package/dist/cjs/state/plugins.js +4 -0
  50. package/dist/cjs/state/runtime/index.js +4 -0
  51. package/dist/cjs/state/runtime/plugin.js +5 -7
  52. package/dist/esm/cli/index.js +5 -1
  53. package/dist/esm/common.js +1 -3
  54. package/dist/esm/core/app-config.js +3 -1
  55. package/dist/esm/core/compatible.js +3 -1
  56. package/dist/esm/core/loader/loaderManager.js +3 -1
  57. package/dist/esm/document/cli/index.js +3 -1
  58. package/dist/esm/router/cli/index.js +1 -5
  59. package/dist/esm/router/runtime/index.js +2 -3
  60. package/dist/esm/router/runtime/plugin.js +2 -5
  61. package/dist/esm/router/runtime/plugin.node.js +65 -8
  62. package/dist/esm/router/runtime/utils.js +106 -5
  63. package/dist/esm/ssr/prefetch.js +1 -0
  64. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.js +39 -8
  65. package/dist/esm/ssr/serverRender/renderToStream/bulidTemplate.before.js +1 -0
  66. package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.js +8 -19
  67. package/dist/esm/ssr/serverRender/renderToStream/template.js +1 -2
  68. package/dist/esm/ssr/serverRender/renderToString/entry.js +29 -16
  69. package/dist/esm/ssr/serverRender/time.worker.js +1 -1
  70. package/dist/esm/ssr/utils.js +6 -4
  71. package/dist/esm-node/cli/index.js +5 -0
  72. package/dist/esm-node/common.js +0 -4
  73. package/dist/esm-node/core/app-config.js +5 -1
  74. package/dist/esm-node/core/compatible.js +4 -7
  75. package/dist/esm-node/core/loader/loaderManager.js +2 -0
  76. package/dist/esm-node/document/Body.js +6 -8
  77. package/dist/esm-node/document/Head.js +7 -11
  78. package/dist/esm-node/document/Html.js +24 -22
  79. package/dist/esm-node/document/Links.js +1 -3
  80. package/dist/esm-node/document/Root.js +8 -14
  81. package/dist/esm-node/document/Script.js +5 -7
  82. package/dist/esm-node/document/Scripts.js +1 -3
  83. package/dist/esm-node/document/cli/index.js +3 -1
  84. package/dist/esm-node/router/cli/index.js +2 -5
  85. package/dist/esm-node/router/runtime/DefaultNotFound.js +13 -10
  86. package/dist/esm-node/router/runtime/index.js +2 -51
  87. package/dist/esm-node/router/runtime/plugin.js +2 -14
  88. package/dist/esm-node/router/runtime/plugin.node.js +53 -10
  89. package/dist/esm-node/router/runtime/utils.js +80 -22
  90. package/dist/esm-node/router/runtime/withRouter.js +9 -6
  91. package/dist/esm-node/ssr/index.js +6 -24
  92. package/dist/esm-node/ssr/prefetch.js +3 -6
  93. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.js +9 -5
  94. package/dist/esm-node/ssr/serverRender/renderToStream/bulidTemplate.before.js +1 -0
  95. package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.js +7 -22
  96. package/dist/esm-node/ssr/serverRender/renderToStream/template.js +1 -2
  97. package/dist/esm-node/ssr/serverRender/renderToString/entry.js +10 -12
  98. package/dist/esm-node/ssr/serverRender/renderToString/loadable.js +1 -1
  99. package/dist/esm-node/ssr/serverRender/time.worker.js +1 -1
  100. package/dist/esm-node/ssr/serverRender/utils.js +1 -1
  101. package/dist/esm-node/ssr/utils.js +6 -4
  102. package/dist/esm-node/state/runtime/plugin.js +1 -7
  103. package/dist/types/common.d.ts +1 -3
  104. package/dist/types/core/index.d.ts +0 -1
  105. package/dist/types/core/loader/index.d.ts +2 -1
  106. package/dist/types/core/loader/useLoader.d.ts +15 -1
  107. package/dist/types/router/runtime/index.d.ts +2 -4
  108. package/dist/types/runtime-context.d.ts +0 -2
  109. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +0 -2
  110. package/dist/types/ssr/serverRender/renderToString/type.d.ts +1 -0
  111. package/package.json +17 -12
  112. package/dist/cjs/core/types.js +0 -15
  113. package/dist/cjs/router/index.node.js +0 -31
  114. package/dist/cjs/router/runtime/DeferredDataScripts.js +0 -148
  115. package/dist/cjs/ssr/prefetch.worker.js +0 -67
  116. package/dist/cjs/ssr/serverRender/renderToStream/index.worker.js +0 -64
  117. package/dist/cjs/ssr/serverRender/renderToString/index.worker.js +0 -58
  118. package/dist/esm/core/types.js +0 -1
  119. package/dist/esm/router/index.node.js +0 -4
  120. package/dist/esm/router/runtime/DeferredDataScripts.js +0 -158
  121. package/dist/esm/ssr/prefetch.worker.js +0 -191
  122. package/dist/esm/ssr/serverRender/renderToStream/index.worker.js +0 -32
  123. package/dist/esm/ssr/serverRender/renderToString/index.worker.js +0 -167
  124. package/dist/esm-node/core/types.js +0 -0
  125. package/dist/esm-node/router/index.node.js +0 -7
  126. package/dist/esm-node/router/runtime/DeferredDataScripts.js +0 -131
  127. package/dist/esm-node/ssr/prefetch.worker.js +0 -46
  128. package/dist/esm-node/ssr/serverRender/renderToStream/index.worker.js +0 -35
  129. package/dist/esm-node/ssr/serverRender/renderToString/index.worker.js +0 -29
  130. package/dist/types/core/types.d.ts +0 -21
  131. package/dist/types/router/index.node.d.ts +0 -3
  132. package/dist/types/router/runtime/DeferredDataScripts.d.ts +0 -8
  133. package/dist/types/ssr/prefetch.worker.d.ts +0 -13
  134. package/dist/types/ssr/serverRender/renderToStream/index.worker.d.ts +0 -6
  135. package/dist/types/ssr/serverRender/renderToString/index.worker.d.ts +0 -6
@@ -17,6 +17,10 @@ var __copyProps = (to, from, except, desc) => {
17
17
  return to;
18
18
  };
19
19
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
20
24
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
25
  mod
22
26
  ));
@@ -28,7 +32,7 @@ __export(entry_exports, {
28
32
  module.exports = __toCommonJS(entry_exports);
29
33
  var import_react = __toESM(require("react"));
30
34
  var import_server = __toESM(require("react-dom/server"));
31
- var import_serialize = require("@modern-js/utils/serialize");
35
+ var import_serialize_javascript = __toESM(require("serialize-javascript"));
32
36
  var import_react_helmet = __toESM(require("react-helmet"));
33
37
  var import_helmet = __toESM(require("../helmet"));
34
38
  var import_types = require("../types");
@@ -38,11 +42,13 @@ var import_template = require("./template");
38
42
  var import_reduce = require("./reduce");
39
43
  var loadableRenderer = __toESM(require("./loadable"));
40
44
  var styledComponentRenderer = __toESM(require("./styledComponent"));
41
- const buildTemplateData = (context, data, routerData, renderLevel) => {
42
- const { request } = context;
45
+ const buildTemplateData = (context, data, renderLevel) => {
46
+ const { request, enableUnsafeCtx } = context;
47
+ const unsafeContext = {
48
+ headers: request.headers
49
+ };
43
50
  return {
44
51
  data,
45
- routerData,
46
52
  context: {
47
53
  request: {
48
54
  params: request.params,
@@ -50,8 +56,7 @@ const buildTemplateData = (context, data, routerData, renderLevel) => {
50
56
  pathname: request.pathname,
51
57
  host: request.host,
52
58
  url: request.url,
53
- headers: request.headers,
54
- cookieMap: request.cookieMap
59
+ ...enableUnsafeCtx ? unsafeContext : {}
55
60
  }
56
61
  },
57
62
  renderLevel
@@ -97,15 +102,10 @@ class Entry {
97
102
  if ((_c = ssrContext.redirection) == null ? void 0 : _c.url) {
98
103
  return "";
99
104
  }
100
- const { routerContext } = context;
101
- const routerData = routerContext != null ? routerContext : {
102
- loaderData: routerContext.loaderData
103
- };
104
105
  let html = "";
105
106
  const templateData = buildTemplateData(
106
107
  ssrContext,
107
108
  prefetchData,
108
- routerData,
109
109
  this.result.renderLevel
110
110
  );
111
111
  const SSRData = this.getSSRDataScript(templateData);
@@ -168,7 +168,9 @@ class Entry {
168
168
  getSSRDataScript(templateData) {
169
169
  return {
170
170
  SSRDataScript: `
171
- <script>window._SSR_DATA = ${(0, import_serialize.serializeJson)(templateData)}<\/script>
171
+ <script>window._SSR_DATA = ${(0, import_serialize_javascript.default)(templateData, {
172
+ isJSON: true
173
+ })}</script>
172
174
  `
173
175
  };
174
176
  }
@@ -17,6 +17,10 @@ var __copyProps = (to, from, except, desc) => {
17
17
  return to;
18
18
  };
19
19
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
20
24
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
25
  mod
22
26
  ));
@@ -58,7 +58,7 @@ const toHtml = (jsx, renderer, next) => {
58
58
  }
59
59
  chunksMap[fileType] += `<script src="${v.url}" ${props.join(
60
60
  " "
61
- )}><\/script>`;
61
+ )}></script>`;
62
62
  } else if (fileType === "css") {
63
63
  chunksMap[fileType] += `<link href="${v.url}" rel="stylesheet" />`;
64
64
  }
@@ -21,7 +21,7 @@ __export(time_worker_exports, {
21
21
  });
22
22
  module.exports = __toCommonJS(time_worker_exports);
23
23
  function processHrtime(previousTimestamp) {
24
- const now = new Date().getTime();
24
+ const now = (/* @__PURE__ */ new Date()).getTime();
25
25
  const clocktime = now * 1e-3;
26
26
  let seconds = Math.floor(clocktime);
27
27
  let nanoseconds = Math.floor(clocktime % 1 * 1e9);
@@ -26,7 +26,7 @@ function getLoadableScripts(extractor) {
26
26
  if (!check(scripts)) {
27
27
  return "";
28
28
  }
29
- return scripts.split("<\/script>").slice(0, 2).map((i) => `${i}<\/script>`).join("");
29
+ return scripts.split("</script>").slice(0, 2).map((i) => `${i}</script>`).join("");
30
30
  }
31
31
  // Annotate the CommonJS export names for ESM import in node:
32
32
  0 && (module.exports = {
@@ -1,6 +1,8 @@
1
+ var __create = Object.create;
1
2
  var __defProp = Object.defineProperty;
2
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
4
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
5
7
  var __export = (target, all) => {
6
8
  for (var name in all)
@@ -14,6 +16,14 @@ var __copyProps = (to, from, except, desc) => {
14
16
  }
15
17
  return to;
16
18
  };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
17
27
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
28
  var utils_exports = {};
19
29
  __export(utils_exports, {
@@ -24,6 +34,7 @@ __export(utils_exports, {
24
34
  mockResponse: () => mockResponse
25
35
  });
26
36
  module.exports = __toCommonJS(utils_exports);
37
+ var import_cookie = __toESM(require("cookie"));
27
38
  const isReact18 = () => process.env.IS_REACT18 === "true";
28
39
  const formatServer = (request) => {
29
40
  const {
@@ -33,6 +44,7 @@ const formatServer = (request) => {
33
44
  } = request.headers || {};
34
45
  return {
35
46
  cookie,
47
+ cookieMap: import_cookie.default.parse(cookie || "") || {},
36
48
  userAgent,
37
49
  referer,
38
50
  ...request
@@ -46,15 +58,15 @@ const getQuery = () => window.location.search.substring(1).split("&").reduce((re
46
58
  return res;
47
59
  }, {});
48
60
  const formatClient = (request) => {
49
- var _a, _b;
61
+ var _a;
50
62
  return {
51
63
  params: request.params || {},
52
64
  host: request.host || location.host,
53
65
  pathname: request.pathname || location.pathname,
54
66
  headers: request.headers || {},
55
- cookieMap: request.cookieMap || {},
56
- cookie: ((_a = request.headers) == null ? void 0 : _a.cookie) || document.cookie,
57
- userAgent: ((_b = request.headers) == null ? void 0 : _b["user-agent"]) || navigator.userAgent,
67
+ cookieMap: import_cookie.default.parse(document.cookie || "") || {},
68
+ cookie: document.cookie || "",
69
+ userAgent: ((_a = request.headers) == null ? void 0 : _a["user-agent"]) || navigator.userAgent,
58
70
  referer: request.referer || document.referrer,
59
71
  query: request.query || getQuery(),
60
72
  url: location.href
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
18
18
  };
19
19
  var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
20
20
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
25
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
26
  mod
23
27
  ));
@@ -17,6 +17,10 @@ var __copyProps = (to, from, except, desc) => {
17
17
  return to;
18
18
  };
19
19
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
20
24
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
25
  mod
22
26
  ));
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
18
18
  };
19
19
  var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
20
20
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
25
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
26
  mod
23
27
  ));
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
18
18
  };
19
19
  var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
20
20
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
25
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
26
  mod
23
27
  ));
@@ -70,13 +74,7 @@ const state = (config) => ({
70
74
  hoc({ App }, next) {
71
75
  const getStateApp = (props) => {
72
76
  const context = (0, import_react.useContext)(import_core.RuntimeReactContext);
73
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react2.Provider, {
74
- store: context.store,
75
- config: storeConfig,
76
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(App, {
77
- ...props
78
- })
79
- });
77
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react2.Provider, { store: context.store, config: storeConfig, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(App, { ...props }) });
80
78
  };
81
79
  return next({
82
80
  App: (0, import_hoist_non_react_statics.default)(getStateApp, App)
@@ -154,7 +154,11 @@ var cli_default = function() {
154
154
  runtimeByEntries: {},
155
155
  source: {
156
156
  alias: {
157
- "styled-components": require.resolve("styled-components")
157
+ /**
158
+ * twin.macro inserts styled-components into the code during the compilation process
159
+ * But it will not be installed under the user project.
160
+ * So need to add alias
161
+ */ "styled-components": require.resolve("styled-components")
158
162
  },
159
163
  globalVars: {
160
164
  "process.env.IS_REACT18": process.env.IS_REACT18
@@ -1,6 +1,4 @@
1
1
  var isBrowser = function() {
2
2
  return typeof window !== "undefined" && window.name !== "nodejs";
3
3
  };
4
- var JSX_SHELL_STREAM_END_MARK = "<!--<?- SHELL_STREAM_END ?>-->";
5
- var ESCAPED_SHELL_STREAM_END_MARK = "&lt;!--&lt;?- SHELL_STREAM_END ?&gt;--&gt;";
6
- export { ESCAPED_SHELL_STREAM_END_MARK, JSX_SHELL_STREAM_END_MARK, isBrowser };
4
+ export { isBrowser };
@@ -1,6 +1,8 @@
1
1
  var APP_CONFIG_SYMBOL = "config";
2
2
  var getConfig = function(Component) {
3
- return Component[APP_CONFIG_SYMBOL];
3
+ return(// eslint-disable-next-line @typescript-eslint/ban-ts-comment
4
+ // @ts-expect-error
5
+ Component[APP_CONFIG_SYMBOL]);
4
6
  };
5
7
  var defineConfig = function(Component, config) {
6
8
  Component[APP_CONFIG_SYMBOL] = config;
@@ -419,11 +419,13 @@ var bootstrap = function() {
419
419
  isBrowser: false,
420
420
  loaderManager: createLoaderManager({}, {
421
421
  skipNonStatic: id.staticGenerate,
422
+ // if not static generate, only non-static loader can exec on prod env
422
423
  skipStatic: process.env.NODE_ENV === "production" && !id.staticGenerate
423
424
  })
424
425
  });
425
426
  isRedirectResponse = function(result) {
426
- if (typeof Response !== "undefined" && _instanceof(result, Response) && result.status >= 300 && result.status <= 399) {
427
+ if (typeof Response !== "undefined" && // fix: ssg workflow doesn't inject Web Response
428
+ _instanceof(result, Response) && result.status >= 300 && result.status <= 399) {
427
429
  var status = result.status;
428
430
  var redirectUrl = result.headers.get("Location") || "/";
429
431
  var ssrContext = context.ssrContext;
@@ -266,6 +266,7 @@ var createLoader = function(id) {
266
266
  reloading: hasLoaded && status === 1 /* loading */ ,
267
267
  data: data,
268
268
  error: _instanceof(error, Error) ? "".concat(error.message) : error,
269
+ // redundant fields for ssr log
269
270
  _error: error
270
271
  };
271
272
  };
@@ -306,7 +307,8 @@ var createLoaderManager = function(initialDataMap) {
306
307
  var skipExec = ignoreNonStatic || ignoreStatic;
307
308
  loader = createLoader(id, typeof initialDataMap[id] !== "undefined" ? initialDataMap[id] : {
308
309
  data: loaderOptions.initialData
309
- }, loaderFn, skipExec);
310
+ }, loaderFn, // Todo whether static loader is exec when CSR
311
+ skipExec);
310
312
  loadersMap.set(id, loader);
311
313
  }
312
314
  return id;
@@ -285,6 +285,7 @@ var cli_default = function() {
285
285
  ],
286
286
  outfile: htmlOutputFile,
287
287
  platform: "node",
288
+ // change esbuild use the rootDir tsconfig.json as default to tempTsConfigFile
288
289
  tsconfig: tempTsConfigFile,
289
290
  target: "es6",
290
291
  loader: {
@@ -370,7 +371,8 @@ var cli_default = function() {
370
371
  tools: {
371
372
  htmlPlugin: function(options, entry) {
372
373
  var hackParameters = typeof (options === null || options === void 0 ? void 0 : options.templateParameters) === "function" ? options === null || options === void 0 ? void 0 : options.templateParameters({}, {}, {}, {}) : _objectSpread({}, options === null || options === void 0 ? void 0 : options.templateParameters);
373
- var templateContent = documentEntry(entry.entryName, hackParameters);
374
+ var templateContent = documentEntry(entry.entryName, // options,
375
+ hackParameters);
374
376
  var documentHtmlOptions = templateContent ? {
375
377
  templateContent: templateContent,
376
378
  inject: false
@@ -50,13 +50,9 @@ function _objectSpreadProps(target, source) {
50
50
  }
51
51
  return target;
52
52
  }
53
- import { getEntryOptions, createRuntimeExportsUtils, PLUGIN_SCHEMAS } from "@modern-js/utils";
53
+ import { getEntryOptions, createRuntimeExportsUtils, PLUGIN_SCHEMAS, isRouterV5 as isV5 } from "@modern-js/utils";
54
54
  var PLUGIN_IDENTIFIER = "router";
55
55
  var ROUTES_IDENTIFIER = "routes";
56
- var isV5 = function(config) {
57
- var _config_runtime, _config_runtime_router;
58
- return (config === null || config === void 0 ? void 0 : (_config_runtime = config.runtime) === null || _config_runtime === void 0 ? void 0 : (_config_runtime_router = _config_runtime.router) === null || _config_runtime_router === void 0 ? void 0 : _config_runtime_router.mode) === "react-router-5";
59
- };
60
56
  var cli_default = function() {
61
57
  return {
62
58
  name: "@modern-js/plugin-router",
@@ -1,7 +1,6 @@
1
1
  import { routerPlugin } from "./plugin";
2
2
  var runtime_default = routerPlugin;
3
3
  import { modifyRoutes } from "./plugin";
4
+ export * from "react-router-dom";
4
5
  export * from "./withRouter";
5
- import { Form, Outlet, useAsyncError, useAsyncValue, isRouteErrorResponse, useBeforeUnload, useFormAction, useHref, useLocation, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useSearchParams, useSubmit, unstable_useBlocker, unstable_usePrompt } from "react-router-dom";
6
- import { defer } from "@modern-js/utils/remix-router";
7
- export { Form, Outlet, runtime_default as default, defer, isRouteErrorResponse, modifyRoutes, unstable_useBlocker, unstable_usePrompt, useAsyncError, useAsyncValue, useBeforeUnload, useFormAction, useHref, useLocation, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useSearchParams, useSubmit };
6
+ export { runtime_default as default, modifyRoutes };
@@ -103,13 +103,10 @@ var routerPlugin = function(param) {
103
103
  var routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes(finalRouteConfig));
104
104
  var baseUrl = ((_window__SERVER_DATA = window._SERVER_DATA) === null || _window__SERVER_DATA === void 0 ? void 0 : _window__SERVER_DATA.router.baseUrl) || select(location.pathname);
105
105
  var _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
106
- var hydrationData = window._ROUTER_DATA;
107
106
  var router = supportHtml5History ? createBrowserRouter(routes, {
108
- basename: _basename,
109
- hydrationData: hydrationData
107
+ basename: _basename
110
108
  }) : createHashRouter(routes, {
111
- basename: _basename,
112
- hydrationData: hydrationData
109
+ basename: _basename
113
110
  });
114
111
  return /* @__PURE__ */ jsx(App, _objectSpreadProps(_objectSpread({}, props), {
115
112
  children: /* @__PURE__ */ jsx(RouterProvider, {
@@ -227,9 +227,10 @@ var __generator = this && this.__generator || function(thisArg, body) {
227
227
  };
228
228
  }
229
229
  };
230
- import { jsx } from "react/jsx-runtime";
230
+ import { jsx, jsxs } from "react/jsx-runtime";
231
231
  import { useContext } from "react";
232
- import { createStaticHandler } from "@modern-js/utils/remix-router";
232
+ import serialize from "serialize-javascript";
233
+ import { createStaticHandler, isRouteErrorResponse } from "@remix-run/router";
233
234
  import { createStaticRouter, StaticRouterProvider } from "react-router-dom/server";
234
235
  import hoistNonReactStatics from "hoist-non-react-statics";
235
236
  import { createRoutesFromElements } from "react-router-dom";
@@ -297,6 +298,45 @@ function createFetchHeaders(requestHeaders) {
297
298
  }
298
299
  return headers;
299
300
  }
301
+ function serializeErrors(errors) {
302
+ if (!errors) {
303
+ return null;
304
+ }
305
+ var entries = Object.entries(errors);
306
+ var serialized = {};
307
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
308
+ try {
309
+ for(var _iterator = entries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
310
+ var _step_value = _slicedToArray(_step.value, 2), key = _step_value[0], val = _step_value[1];
311
+ if (isRouteErrorResponse(val)) {
312
+ serialized[key] = _objectSpreadProps(_objectSpread({}, val), {
313
+ __type: "RouteErrorResponse"
314
+ });
315
+ } else if (_instanceof(val, Error)) {
316
+ serialized[key] = {
317
+ message: val.message,
318
+ __type: "Error"
319
+ };
320
+ } else {
321
+ serialized[key] = val;
322
+ }
323
+ }
324
+ } catch (err) {
325
+ _didIteratorError = true;
326
+ _iteratorError = err;
327
+ } finally{
328
+ try {
329
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
330
+ _iterator.return();
331
+ }
332
+ } finally{
333
+ if (_didIteratorError) {
334
+ throw _iteratorError;
335
+ }
336
+ }
337
+ }
338
+ return serialized;
339
+ }
300
340
  var routerPlugin = function(param) {
301
341
  var _param_basename = param.basename, basename = _param_basename === void 0 ? "" : _param_basename, routesConfig = param.routesConfig, createRoutes = param.createRoutes;
302
342
  return {
@@ -363,12 +403,29 @@ var routerPlugin = function(param) {
363
403
  var getRouteApp = function() {
364
404
  return function(props) {
365
405
  var _useContext = useContext(RuntimeReactContext), router = _useContext.router, routerContext = _useContext.routerContext;
366
- return /* @__PURE__ */ jsx(App, _objectSpreadProps(_objectSpread({}, props), {
367
- children: /* @__PURE__ */ jsx(StaticRouterProvider, {
368
- router: router,
369
- context: routerContext,
370
- hydrate: false
371
- })
406
+ var data = {
407
+ loaderData: routerContext.loaderData,
408
+ actionData: routerContext.actionData,
409
+ errors: serializeErrors(routerContext.errors)
410
+ };
411
+ var hydrateScript = "window.__staticRouterHydrationData = ".concat(serialize(data, {
412
+ isJSON: true
413
+ }), ";");
414
+ return /* @__PURE__ */ jsxs(App, _objectSpreadProps(_objectSpread({}, props), {
415
+ children: [
416
+ /* @__PURE__ */ jsx(StaticRouterProvider, {
417
+ router: router,
418
+ context: routerContext,
419
+ hydrate: false
420
+ }),
421
+ /* @__PURE__ */ jsx("script", {
422
+ suppressHydrationWarning: true,
423
+ id: "the-nonce",
424
+ dangerouslySetInnerHTML: {
425
+ __html: hydrateScript
426
+ }
427
+ })
428
+ ]
372
429
  }));
373
430
  };
374
431
  };
@@ -26,6 +26,30 @@ function _objectSpread(target) {
26
26
  }
27
27
  return target;
28
28
  }
29
+ function ownKeys(object, enumerableOnly) {
30
+ var keys = Object.keys(object);
31
+ if (Object.getOwnPropertySymbols) {
32
+ var symbols = Object.getOwnPropertySymbols(object);
33
+ if (enumerableOnly) {
34
+ symbols = symbols.filter(function(sym) {
35
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
36
+ });
37
+ }
38
+ keys.push.apply(keys, symbols);
39
+ }
40
+ return keys;
41
+ }
42
+ function _objectSpreadProps(target, source) {
43
+ source = source != null ? source : {};
44
+ if (Object.getOwnPropertyDescriptors) {
45
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
46
+ } else {
47
+ ownKeys(Object(source)).forEach(function(key) {
48
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
49
+ });
50
+ }
51
+ return target;
52
+ }
29
53
  function _objectWithoutProperties(source, excluded) {
30
54
  if (source == null) return {};
31
55
  var target = _objectWithoutPropertiesLoose(source, excluded);
@@ -54,10 +78,68 @@ function _objectWithoutPropertiesLoose(source, excluded) {
54
78
  return target;
55
79
  }
56
80
  import { jsx } from "react/jsx-runtime";
81
+ import { Suspense } from "react";
57
82
  import { Route } from "react-router-dom";
58
- import { renderNestedRoute } from "@modern-js/utils/nestedRoutes";
59
83
  import { DefaultNotFound } from "./DefaultNotFound";
60
- import DeferredDataScripts from "./DeferredDataScripts";
84
+ var renderNestedRoute = function(nestedRoute, parent) {
85
+ var children = nestedRoute.children, index = nestedRoute.index, id = nestedRoute.id, component = nestedRoute.component, isRoot = nestedRoute.isRoot;
86
+ var Component = component;
87
+ var routeProps = {
88
+ caseSensitive: nestedRoute.caseSensitive,
89
+ path: nestedRoute.path,
90
+ id: nestedRoute.id,
91
+ loader: createLoader(nestedRoute),
92
+ action: nestedRoute.action,
93
+ hasErrorBoundary: nestedRoute.hasErrorBoundary,
94
+ shouldRevalidate: nestedRoute.shouldRevalidate,
95
+ handle: nestedRoute.handle,
96
+ index: nestedRoute.index,
97
+ element: nestedRoute.element,
98
+ errorElement: nestedRoute.errorElement
99
+ };
100
+ if (nestedRoute.error) {
101
+ var errorElement = /* @__PURE__ */ jsx(nestedRoute.error, {});
102
+ routeProps.errorElement = errorElement;
103
+ }
104
+ var element;
105
+ if (Component) {
106
+ if (parent === null || parent === void 0 ? void 0 : parent.loading) {
107
+ var Loading = parent.loading;
108
+ if (isLoadableComponent(Component)) {
109
+ element = /* @__PURE__ */ jsx(Component, {
110
+ fallback: /* @__PURE__ */ jsx(Loading, {})
111
+ });
112
+ } else {
113
+ element = /* @__PURE__ */ jsx(Suspense, {
114
+ fallback: /* @__PURE__ */ jsx(Loading, {}),
115
+ children: /* @__PURE__ */ jsx(Component, {})
116
+ });
117
+ }
118
+ } else if (isLoadableComponent(Component) || isRoot) {
119
+ element = /* @__PURE__ */ jsx(Component, {});
120
+ } else {
121
+ element = /* @__PURE__ */ jsx(Suspense, {
122
+ fallback: null,
123
+ children: /* @__PURE__ */ jsx(Component, {})
124
+ });
125
+ }
126
+ } else {
127
+ nestedRoute.loading = parent === null || parent === void 0 ? void 0 : parent.loading;
128
+ }
129
+ if (element) {
130
+ routeProps.element = element;
131
+ }
132
+ var childElements = children === null || children === void 0 ? void 0 : children.map(function(childRoute) {
133
+ return renderNestedRoute(childRoute, nestedRoute);
134
+ });
135
+ var routeElement = index ? /* @__PURE__ */ jsx(Route, _objectSpreadProps(_objectSpread({}, routeProps), {
136
+ index: true
137
+ }), id) : /* @__PURE__ */ jsx(Route, _objectSpreadProps(_objectSpread({}, routeProps), {
138
+ index: false,
139
+ children: childElements
140
+ }), id);
141
+ return routeElement;
142
+ };
61
143
  function getRouteComponents(routes, globalApp) {
62
144
  var Layout = function(_param) {
63
145
  var Component = _param.Component, props = _objectWithoutProperties(_param, [
@@ -77,9 +159,7 @@ function getRouteComponents(routes, globalApp) {
77
159
  for(var _iterator = routes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
78
160
  var route = _step.value;
79
161
  if (route.type === "nested") {
80
- var routeElement = renderNestedRoute(route, {
81
- DeferredDataComponent: DeferredDataScripts
82
- });
162
+ var routeElement = renderNestedRoute(route);
83
163
  routeElements.push(routeElement);
84
164
  } else {
85
165
  var routeElement1 = /* @__PURE__ */ jsx(Route, {
@@ -156,4 +236,25 @@ function standardSlash(str) {
156
236
  }
157
237
  return addr;
158
238
  }
239
+ function createLoader(route) {
240
+ var loader = route.loader;
241
+ if (loader) {
242
+ return function(args) {
243
+ if (typeof route.lazyImport === "function") {
244
+ route.lazyImport();
245
+ }
246
+ return loader(args);
247
+ };
248
+ } else {
249
+ return function() {
250
+ if (typeof route.lazyImport === "function") {
251
+ route.lazyImport();
252
+ }
253
+ return null;
254
+ };
255
+ }
256
+ }
257
+ function isLoadableComponent(component) {
258
+ return component && component.displayName === "Loadable" && component.preload && typeof component.preload === "function";
259
+ }
159
260
  export { getLocation, getRouteComponents, renderRoutes, standardSlash, urlJoin };
@@ -182,6 +182,7 @@ var prefetch = function() {
182
182
  loadersData: loadersData,
183
183
  initialData: context.initialData,
184
184
  i18nData: context.__i18nData__,
185
+ // todo: move to plugin state
185
186
  storeState: context === null || context === void 0 ? void 0 : (_context_store = context.store) === null || _context_store === void 0 ? void 0 : _context_store.getState()
186
187
  }
187
188
  ];