@modern-js/runtime 2.21.1 → 2.22.1

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 (111) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/cjs/cli/index.js +11 -1
  3. package/dist/cjs/common.js +9 -3
  4. package/dist/cjs/core/appConfig.js +6 -2
  5. package/dist/cjs/core/compatible.js +9 -3
  6. package/dist/cjs/core/index.js +24 -8
  7. package/dist/cjs/core/loader/index.js +3 -1
  8. package/dist/cjs/core/loader/loaderManager.js +6 -2
  9. package/dist/cjs/core/loader/useLoader.js +3 -1
  10. package/dist/cjs/core/plugin.js +12 -4
  11. package/dist/cjs/document/Body.js +3 -1
  12. package/dist/cjs/document/Comment.js +3 -1
  13. package/dist/cjs/document/DocumentContext.js +3 -1
  14. package/dist/cjs/document/DocumentStructureContext.js +3 -1
  15. package/dist/cjs/document/Head.js +6 -2
  16. package/dist/cjs/document/Html.js +5 -2
  17. package/dist/cjs/document/Links.js +3 -1
  18. package/dist/cjs/document/Root.js +6 -2
  19. package/dist/cjs/document/Script.js +3 -1
  20. package/dist/cjs/document/Scripts.js +3 -1
  21. package/dist/cjs/document/Style.js +26 -0
  22. package/dist/cjs/document/cli/index.js +9 -2
  23. package/dist/cjs/document/constants.js +59 -17
  24. package/dist/cjs/document/index.js +1 -0
  25. package/dist/cjs/exports/head.js +3 -1
  26. package/dist/cjs/exports/loadable.js +3 -1
  27. package/dist/cjs/exports/server.js +3 -1
  28. package/dist/cjs/exports/styled.js +3 -1
  29. package/dist/cjs/index.js +27 -9
  30. package/dist/cjs/router/cli/index.js +3 -1
  31. package/dist/cjs/router/index.js +6 -2
  32. package/dist/cjs/router/runtime/DefaultNotFound.js +3 -1
  33. package/dist/cjs/router/runtime/DeferredDataScripts.js +3 -1
  34. package/dist/cjs/router/runtime/DeferredDataScripts.node.js +12 -5
  35. package/dist/cjs/router/runtime/PrefetchLink.js +9 -3
  36. package/dist/cjs/router/runtime/fetch.js +3 -1
  37. package/dist/cjs/router/runtime/fetch.node.js +3 -1
  38. package/dist/cjs/router/runtime/fetch.worker.js +3 -1
  39. package/dist/cjs/router/runtime/hooks.js +3 -1
  40. package/dist/cjs/router/runtime/index.js +183 -61
  41. package/dist/cjs/router/runtime/plugin.js +33 -5
  42. package/dist/cjs/router/runtime/plugin.node.js +33 -8
  43. package/dist/cjs/router/runtime/utils.js +21 -7
  44. package/dist/cjs/router/runtime/withRouter.js +3 -1
  45. package/dist/cjs/runtimeContext.js +6 -2
  46. package/dist/cjs/ssr/cli/index.js +10 -3
  47. package/dist/cjs/ssr/index.js +11 -4
  48. package/dist/cjs/ssr/index.node.js +6 -2
  49. package/dist/cjs/ssr/prefetch.js +3 -1
  50. package/dist/cjs/ssr/react/index.js +6 -2
  51. package/dist/cjs/ssr/react/nossr/index.js +3 -1
  52. package/dist/cjs/ssr/react/prerender/index.js +3 -1
  53. package/dist/cjs/ssr/react/prerender/util.js +15 -5
  54. package/dist/cjs/ssr/react/withCallback/index.js +3 -1
  55. package/dist/cjs/ssr/serverRender/helmet.js +3 -1
  56. package/dist/cjs/ssr/serverRender/index.js +3 -1
  57. package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +3 -1
  58. package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.share.js +6 -2
  59. package/dist/cjs/ssr/serverRender/renderToStream/bulidTemplate.before.js +3 -1
  60. package/dist/cjs/ssr/serverRender/renderToStream/index.js +3 -1
  61. package/dist/cjs/ssr/serverRender/renderToStream/loadable.js +3 -1
  62. package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.js +3 -1
  63. package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.worker.js +3 -1
  64. package/dist/cjs/ssr/serverRender/renderToStream/styledComponent.js +3 -1
  65. package/dist/cjs/ssr/serverRender/renderToStream/template.js +3 -1
  66. package/dist/cjs/ssr/serverRender/renderToString/entry.js +3 -1
  67. package/dist/cjs/ssr/serverRender/renderToString/index.js +3 -1
  68. package/dist/cjs/ssr/serverRender/renderToString/loadable.js +3 -1
  69. package/dist/cjs/ssr/serverRender/renderToString/reduce.js +3 -1
  70. package/dist/cjs/ssr/serverRender/renderToString/styledComponent.js +3 -1
  71. package/dist/cjs/ssr/serverRender/renderToString/template.js +6 -2
  72. package/dist/cjs/ssr/serverRender/renderToString/type.js +3 -1
  73. package/dist/cjs/ssr/serverRender/time.js +3 -1
  74. package/dist/cjs/ssr/serverRender/time.worker.js +3 -1
  75. package/dist/cjs/ssr/serverRender/types.js +3 -1
  76. package/dist/cjs/ssr/serverRender/utils.js +15 -5
  77. package/dist/cjs/ssr/utils.js +15 -5
  78. package/dist/cjs/state/cli/index.js +3 -1
  79. package/dist/cjs/state/index.js +6 -2
  80. package/dist/cjs/state/plugins.js +12 -4
  81. package/dist/cjs/state/runtime/index.js +3 -1
  82. package/dist/cjs/state/runtime/plugin.js +3 -1
  83. package/dist/esm/cli/index.js +8 -0
  84. package/dist/esm/document/Html.js +8 -3
  85. package/dist/esm/document/Style.js +14 -0
  86. package/dist/esm/document/cli/index.js +6 -1
  87. package/dist/esm/document/constants.js +2 -0
  88. package/dist/esm/document/index.js +1 -0
  89. package/dist/esm/router/runtime/DeferredDataScripts.node.js +9 -4
  90. package/dist/esm/router/runtime/plugin.js +20 -0
  91. package/dist/esm/router/runtime/plugin.node.js +25 -6
  92. package/dist/esm/ssr/cli/index.js +10 -2
  93. package/dist/esm/ssr/index.js +5 -2
  94. package/dist/esm-node/cli/index.js +8 -0
  95. package/dist/esm-node/document/Html.js +2 -1
  96. package/dist/esm-node/document/Style.js +14 -0
  97. package/dist/esm-node/document/cli/index.js +4 -1
  98. package/dist/esm-node/document/constants.js +2 -0
  99. package/dist/esm-node/document/index.js +1 -0
  100. package/dist/esm-node/router/runtime/DeferredDataScripts.node.js +9 -4
  101. package/dist/esm-node/router/runtime/plugin.js +20 -0
  102. package/dist/esm-node/router/runtime/plugin.node.js +24 -5
  103. package/dist/esm-node/ssr/cli/index.js +7 -2
  104. package/dist/esm-node/ssr/index.js +5 -2
  105. package/dist/types/document/Style.d.ts +5 -0
  106. package/dist/types/document/constants.d.ts +2 -0
  107. package/dist/types/document/index.d.ts +1 -0
  108. package/dist/types/router/runtime/DeferredDataScripts.node.d.ts +3 -1
  109. package/dist/types/runtimeContext.d.ts +5 -1
  110. package/dist/types/ssr/serverRender/types.d.ts +1 -0
  111. package/package.json +10 -9
@@ -8,7 +8,7 @@ import { serializeErrors } from "./utils";
8
8
  var setupFnStr = "function s(r,e){_ROUTER_DATA.r=_ROUTER_DATA.r||{},_ROUTER_DATA.r[r]=_ROUTER_DATA.r[r]||{};return new Promise((function(A,R){_ROUTER_DATA.r[r][e]={resolve:A,reject:R}}))};";
9
9
  var resolveFnStr = "function r(e,r,o,A){A?_ROUTER_DATA.r[e][r].reject(A):_ROUTER_DATA.r[e][r].resolve(o)};";
10
10
  var preResolvedFnStr = "function p(e,r){return void 0!==r?Promise.reject(new Error(r.message)):Promise.resolve(e)};";
11
- var DeferredDataScripts = function() {
11
+ var DeferredDataScripts = function(props) {
12
12
  var context = useContext(DataRouterContext);
13
13
  var staticContext = (context || {}).staticContext;
14
14
  var hydratedRef = useRef(false);
@@ -38,6 +38,7 @@ var DeferredDataScripts = function() {
38
38
  var deferredKeyPromiseStr = deferredKeys.map(function(key) {
39
39
  if (pendingKeys.has(key)) {
40
40
  deferredDataScripts.push(/* @__PURE__ */ _jsx(DeferredDataScript, {
41
+ nonce: props === null || props === void 0 ? void 0 : props.nonce,
41
42
  data: deferredData.data[key],
42
43
  dataKey: key,
43
44
  routeId: routeId
@@ -73,6 +74,7 @@ var DeferredDataScripts = function() {
73
74
  children: [
74
75
  !hydratedRef.current && /* @__PURE__ */ _jsx("script", {
75
76
  async: true,
77
+ nonce: props === null || props === void 0 ? void 0 : props.nonce,
76
78
  suppressHydrationWarning: true,
77
79
  dangerouslySetInnerHTML: {
78
80
  __html: deferredScripts[0]
@@ -84,17 +86,19 @@ var DeferredDataScripts = function() {
84
86
  });
85
87
  };
86
88
  var DeferredDataScript = function(param) {
87
- var data = param.data, routeId = param.routeId, dataKey = param.dataKey;
89
+ var data = param.data, routeId = param.routeId, dataKey = param.dataKey, nonce = param.nonce;
88
90
  return /* @__PURE__ */ _jsx(Suspense, {
89
91
  children: typeof document === "undefined" && data && dataKey && routeId ? /* @__PURE__ */ _jsx(Await, {
90
92
  resolve: data,
91
93
  errorElement: /* @__PURE__ */ _jsx(ErrorDeferredDataScript, {
92
94
  routeId: routeId,
93
- dataKey: dataKey
95
+ dataKey: dataKey,
96
+ nonce: nonce
94
97
  }),
95
98
  children: function(data2) {
96
99
  return /* @__PURE__ */ _jsx("script", {
97
100
  async: true,
101
+ nonce: nonce,
98
102
  suppressHydrationWarning: true,
99
103
  dangerouslySetInnerHTML: {
100
104
  __html: "_ROUTER_DATA.r(".concat(JSON.stringify(routeId), ", ").concat(JSON.stringify(dataKey), ", ").concat(serializeJson(data2), ");")
@@ -105,9 +109,10 @@ var DeferredDataScript = function(param) {
105
109
  });
106
110
  };
107
111
  var ErrorDeferredDataScript = function(param) {
108
- var routeId = param.routeId, dataKey = param.dataKey;
112
+ var routeId = param.routeId, dataKey = param.dataKey, nonce = param.nonce;
109
113
  var error = useAsyncError();
110
114
  return /* @__PURE__ */ _jsx("script", {
115
+ nonce: nonce,
111
116
  suppressHydrationWarning: true,
112
117
  dangerouslySetInnerHTML: {
113
118
  __html: "_ROUTER_DATA.r(".concat(JSON.stringify(routeId), ", ").concat(JSON.stringify(dataKey), ", ").concat(void 0, ", ").concat(serializeJson({
@@ -1,9 +1,11 @@
1
1
  import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
2
2
  import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
3
3
  import { jsx as _jsx } from "react/jsx-runtime";
4
+ import { useContext } from "react";
4
5
  import { createBrowserRouter, createHashRouter, RouterProvider, createRoutesFromElements, useMatches, useLocation } from "@modern-js/utils/runtime/router";
5
6
  import hoistNonReactStatics from "hoist-non-react-statics";
6
7
  import { parsedJSONFromElement } from "@modern-js/utils/runtime-browser";
8
+ import { RuntimeReactContext } from "../../core";
7
9
  import { modifyRoutes as modifyRoutesHook } from "./hooks";
8
10
  import { deserializeErrors, renderRoutes, urlJoin } from "./utils";
9
11
  export var finalRouteConfig = {
@@ -83,6 +85,8 @@ export var routerPlugin = function(param) {
83
85
  basename: _basename,
84
86
  hydrationData: hydrationData
85
87
  });
88
+ var runtimeContext = useContext(RuntimeReactContext);
89
+ runtimeContext.remixRouter = router;
86
90
  return /* @__PURE__ */ _jsx(App, _object_spread_props(_object_spread({}, props), {
87
91
  children: /* @__PURE__ */ _jsx(RouterProvider, {
88
92
  router: router
@@ -102,6 +106,22 @@ export var routerPlugin = function(param) {
102
106
  return next({
103
107
  App: RouteApp
104
108
  });
109
+ },
110
+ pickContext: function(param2, next) {
111
+ var context = param2.context, pickedContext = param2.pickedContext;
112
+ var remixRouter = context.remixRouter;
113
+ var router = {
114
+ navigate: remixRouter.navigate,
115
+ get location() {
116
+ return remixRouter.state.location;
117
+ }
118
+ };
119
+ return next({
120
+ context: context,
121
+ pickedContext: _object_spread_props(_object_spread({}, pickedContext), {
122
+ router: router
123
+ })
124
+ });
105
125
  }
106
126
  };
107
127
  }
@@ -87,7 +87,7 @@ export var routerPlugin = function(param) {
87
87
  init: function init(param2, next) {
88
88
  var context = param2.context;
89
89
  return _async_to_generator(function() {
90
- var _context_ssrContext, request, ssrMode, baseUrl, _basename, routes, query, remixRequest, routerContext, router, runner;
90
+ var _context_ssrContext, request, ssrMode, nonce, baseUrl, _basename, routes, query, remixRequest, routerContext, router, runner;
91
91
  return _ts_generator(this, function(_state) {
92
92
  switch (_state.label) {
93
93
  case 0:
@@ -99,12 +99,15 @@ export var routerPlugin = function(param) {
99
99
  })
100
100
  ];
101
101
  }
102
- _context_ssrContext = context.ssrContext, request = _context_ssrContext.request, ssrMode = _context_ssrContext.mode;
102
+ _context_ssrContext = context.ssrContext, request = _context_ssrContext.request, ssrMode = _context_ssrContext.mode, nonce = _context_ssrContext.nonce;
103
103
  baseUrl = request.baseUrl;
104
104
  _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
105
105
  routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
106
106
  routesConfig: routesConfig,
107
- ssrMode: ssrMode
107
+ ssrMode: ssrMode,
108
+ props: {
109
+ nonce: nonce
110
+ }
108
111
  }));
109
112
  query = createStaticHandler(routes, {
110
113
  basename: _basename
@@ -123,7 +126,7 @@ export var routerPlugin = function(param) {
123
126
  ];
124
127
  }
125
128
  router = createStaticRouter(routes, routerContext);
126
- context.router = router;
129
+ context.remixRouter = router;
127
130
  context.routerContext = routerContext;
128
131
  context.routes = routes;
129
132
  context.routeManifest = context.ssrContext.routeManifest;
@@ -148,10 +151,10 @@ export var routerPlugin = function(param) {
148
151
  }
149
152
  var getRouteApp = function() {
150
153
  return function(props) {
151
- var _useContext = useContext(RuntimeReactContext), router = _useContext.router, routerContext = _useContext.routerContext;
154
+ var _useContext = useContext(RuntimeReactContext), remixRouter = _useContext.remixRouter, routerContext = _useContext.routerContext;
152
155
  return /* @__PURE__ */ _jsx(App, _object_spread_props(_object_spread({}, props), {
153
156
  children: /* @__PURE__ */ _jsx(StaticRouterProvider, {
154
- router: router,
157
+ router: remixRouter,
155
158
  context: routerContext,
156
159
  hydrate: false
157
160
  })
@@ -167,6 +170,22 @@ export var routerPlugin = function(param) {
167
170
  return next({
168
171
  App: RouteApp
169
172
  });
173
+ },
174
+ pickContext: function(param2, next) {
175
+ var context = param2.context, pickedContext = param2.pickedContext;
176
+ var remixRouter = context.remixRouter;
177
+ var router = {
178
+ navigate: remixRouter.navigate,
179
+ get location() {
180
+ return remixRouter.state.location;
181
+ }
182
+ };
183
+ return next({
184
+ context: context,
185
+ pickedContext: _object_spread_props(_object_spread({}, pickedContext), {
186
+ router: router
187
+ })
188
+ });
170
189
  }
171
190
  };
172
191
  }
@@ -1,3 +1,5 @@
1
+ import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
2
+ import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
1
3
  import path from "path";
2
4
  import { getEntryOptions, SERVER_RENDER_FUNCTION_NAME, LOADABLE_STATS_FILE, isUseSSRBundle, createRuntimeExportsUtils, isSSGEntry } from "@modern-js/utils";
3
5
  var PLUGIN_IDENTIFIER = "ssr";
@@ -137,11 +139,17 @@ export default function() {
137
139
  };
138
140
  },
139
141
  modifyEntryRuntimePlugins: function modifyEntryRuntimePlugins(param) {
140
- var entrypoint = param.entrypoint, plugins = param.plugins;
142
+ var entrypoint = param.entrypoint, plugins = param.plugins, bundlerConfigs = param.bundlerConfigs;
141
143
  if (ssrConfigMap.get(entrypoint.entryName)) {
144
+ var _bundlerConfigs_find, _bundlerConfigs_find_output;
145
+ var chunkLoadingGlobal = (_bundlerConfigs_find = bundlerConfigs === null || bundlerConfigs === void 0 ? void 0 : bundlerConfigs.find(function(config) {
146
+ return config.name === "client";
147
+ })) === null || _bundlerConfigs_find === void 0 ? void 0 : (_bundlerConfigs_find_output = _bundlerConfigs_find.output) === null || _bundlerConfigs_find_output === void 0 ? void 0 : _bundlerConfigs_find_output.chunkLoadingGlobal;
142
148
  plugins.push({
143
149
  name: PLUGIN_IDENTIFIER,
144
- options: JSON.stringify(ssrConfigMap.get(entrypoint.entryName))
150
+ options: JSON.stringify(_object_spread_props(_object_spread({}, ssrConfigMap.get(entrypoint.entryName) || {}), {
151
+ chunkLoadingGlobal: chunkLoadingGlobal
152
+ }))
145
153
  });
146
154
  }
147
155
  return {
@@ -29,6 +29,9 @@ export var ssr = function(config) {
29
29
  context: context
30
30
  }));
31
31
  } else if (renderLevel === RenderLevel.SERVER_RENDER) {
32
+ var loadableReadyOptions = {
33
+ chunkLoadingGlobal: config.chunkLoadingGlobal
34
+ };
32
35
  if (isReact18()) {
33
36
  loadableReady(function() {
34
37
  var SSRApp = function() {
@@ -41,13 +44,13 @@ export var ssr = function(config) {
41
44
  };
42
45
  SSRApp = hoistNonReactStatics(SSRApp, App);
43
46
  ModernHydrate(/* @__PURE__ */ _jsx(SSRApp, {}));
44
- });
47
+ }, loadableReadyOptions);
45
48
  } else {
46
49
  loadableReady(function() {
47
50
  ModernHydrate(/* @__PURE__ */ _jsx(App, {
48
51
  context: hydrateContext
49
52
  }), callback);
50
- });
53
+ }, loadableReadyOptions);
51
54
  }
52
55
  } else {
53
56
  console.warn("unknow render level: ".concat(renderLevel, ", execute render()"));
@@ -40,6 +40,14 @@ export default () => ({
40
40
  globalVars: {
41
41
  "process.env.IS_REACT18": process.env.IS_REACT18
42
42
  }
43
+ },
44
+ tools: {
45
+ styledComponents: {
46
+ // https://github.com/styled-components/babel-plugin-styled-components/issues/287
47
+ topLevelImportPaths: [
48
+ "@modern-js/runtime/styled"
49
+ ]
50
+ }
43
51
  }
44
52
  };
45
53
  },
@@ -25,7 +25,7 @@ function findTargetElement(tag, children) {
25
25
  return findTargetElement(tag, nextChildren);
26
26
  }
27
27
  export function Html(props) {
28
- const { children } = props;
28
+ const { children, ...rest } = props;
29
29
  const hasSetHead = Boolean(findTargetChild("Head", children));
30
30
  const hasSetScripts = Boolean(findTargetElement("Scripts", children));
31
31
  const hasSetLinks = Boolean(findTargetElement("Links", children));
@@ -58,6 +58,7 @@ export function Html(props) {
58
58
  });
59
59
  }
60
60
  return /* @__PURE__ */ _jsx("html", {
61
+ ...rest,
61
62
  children: /* @__PURE__ */ _jsxs(DocumentStructureContext.Provider, {
62
63
  value: {
63
64
  hasSetHead,
@@ -0,0 +1,14 @@
1
+ import { jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { DOCUMENT_STYLE_PLACEHOLDER_START, DOCUMENT_STYLE_PLACEHOLDER_END } from "./constants";
3
+ export function Style(props) {
4
+ const { content, children } = props;
5
+ const contentStr = children || content;
6
+ const contentIIFE = encodeURIComponent(`(${contentStr})()`);
7
+ return /* @__PURE__ */ _jsxs(_Fragment, {
8
+ children: [
9
+ `${DOCUMENT_STYLE_PLACEHOLDER_START}`,
10
+ `${contentIIFE}`,
11
+ `${DOCUMENT_STYLE_PLACEHOLDER_END}`
12
+ ]
13
+ });
14
+ }
@@ -4,7 +4,7 @@ import ReactDomServer from "react-dom/server";
4
4
  import { build } from "esbuild";
5
5
  import { createDebugger, findExists, fs } from "@modern-js/utils";
6
6
  import { DocumentContext } from "../DocumentContext";
7
- import { DOCUMENT_SCRIPTS_PLACEHOLDER, DOCUMENT_LINKS_PLACEHOLDER, DOCUMENT_FILE_NAME, DOCUMENT_META_PLACEHOLDER, PLACEHOLDER_REPLACER_MAP, DOC_EXT, DOCUMENT_SSR_PLACEHOLDER, DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, DOCUMENT_SCRIPT_PLACEHOLDER_START, DOCUMENT_SCRIPT_PLACEHOLDER_END, HTML_SEPARATOR, DOCUMENT_COMMENT_PLACEHOLDER_START, DOCUMENT_COMMENT_PLACEHOLDER_END } from "../constants";
7
+ import { DOCUMENT_SCRIPTS_PLACEHOLDER, DOCUMENT_LINKS_PLACEHOLDER, DOCUMENT_FILE_NAME, DOCUMENT_META_PLACEHOLDER, PLACEHOLDER_REPLACER_MAP, DOC_EXT, DOCUMENT_SSR_PLACEHOLDER, DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, DOCUMENT_SCRIPT_PLACEHOLDER_START, DOCUMENT_SCRIPT_PLACEHOLDER_END, HTML_SEPARATOR, DOCUMENT_COMMENT_PLACEHOLDER_START, DOCUMENT_COMMENT_PLACEHOLDER_END, DOCUMENT_STYLE_PLACEHOLDER_START, DOCUMENT_STYLE_PLACEHOLDER_END } from "../constants";
8
8
  const debug = createDebugger("html_genarate");
9
9
  export const getDocumenByEntryName = function(entrypoints, entryName, fallbackDir) {
10
10
  var _entrypoints_find;
@@ -126,6 +126,9 @@ export default () => {
126
126
  const nonceAttr = nonce ? `nonce=${nonce}` : "";
127
127
  html = html.replace(new RegExp(`${DOCUMENT_SCRIPT_PLACEHOLDER_START}(.*?)${DOCUMENT_SCRIPT_PLACEHOLDER_END}`, "g"), (_scriptStr, $1) => `<script ${nonceAttr}>${decodeURIComponent($1)}</script>`);
128
128
  }
129
+ if (html.includes(DOCUMENT_STYLE_PLACEHOLDER_START) && html.includes(DOCUMENT_STYLE_PLACEHOLDER_END)) {
130
+ html = html.replace(new RegExp(`${DOCUMENT_STYLE_PLACEHOLDER_START}(.*?)${DOCUMENT_STYLE_PLACEHOLDER_END}`, "g"), (_styleStr, $1) => `<style>${decodeURIComponent($1)}</style>`);
131
+ }
129
132
  if (html.includes(DOCUMENT_COMMENT_PLACEHOLDER_START) && html.includes(DOCUMENT_COMMENT_PLACEHOLDER_END)) {
130
133
  html = html.replace(new RegExp(`${DOCUMENT_COMMENT_PLACEHOLDER_START}(.*?)${DOCUMENT_COMMENT_PLACEHOLDER_END}`, "g"), (_scriptStr, $1) => `${decodeURIComponent($1)}`);
131
134
  }
@@ -17,6 +17,8 @@ export const DOCUMENT_LINKS_PLACEHOLDER = encodeURIComponent("<!-- chunk links p
17
17
  export const DOCUMENT_NO_SCRIPTE_PLACEHOLDER = encodeURIComponent("<!-- no-script -->");
18
18
  export const DOCUMENT_SCRIPT_PLACEHOLDER_START = encodeURIComponent("<!-- script-start -->");
19
19
  export const DOCUMENT_SCRIPT_PLACEHOLDER_END = encodeURIComponent("<!-- script-end -->");
20
+ export const DOCUMENT_STYLE_PLACEHOLDER_START = encodeURIComponent("<!-- style-start -->");
21
+ export const DOCUMENT_STYLE_PLACEHOLDER_END = encodeURIComponent("<!-- style-end -->");
20
22
  export const DOCUMENT_COMMENT_PLACEHOLDER_START = encodeURIComponent("<!-- comment-start -->");
21
23
  export const DOCUMENT_COMMENT_PLACEHOLDER_END = encodeURIComponent("<!-- comment-end -->");
22
24
  export const PLACEHOLDER_REPLACER_MAP = {
@@ -6,6 +6,7 @@ export * from "./Body";
6
6
  export * from "./Root";
7
7
  export * from "./Links";
8
8
  export * from "./Comment";
9
+ export * from "./Style";
9
10
  export * from "./Scripts";
10
11
  export * from "./Script";
11
12
  export * from "./constants";
@@ -7,7 +7,7 @@ import { serializeErrors } from "./utils";
7
7
  const setupFnStr = `function s(r,e){_ROUTER_DATA.r=_ROUTER_DATA.r||{},_ROUTER_DATA.r[r]=_ROUTER_DATA.r[r]||{};return new Promise((function(A,R){_ROUTER_DATA.r[r][e]={resolve:A,reject:R}}))};`;
8
8
  const resolveFnStr = `function r(e,r,o,A){A?_ROUTER_DATA.r[e][r].reject(A):_ROUTER_DATA.r[e][r].resolve(o)};`;
9
9
  const preResolvedFnStr = `function p(e,r){return void 0!==r?Promise.reject(new Error(r.message)):Promise.resolve(e)};`;
10
- const DeferredDataScripts = () => {
10
+ const DeferredDataScripts = (props) => {
11
11
  const context = useContext(DataRouterContext);
12
12
  const { staticContext } = context || {};
13
13
  const hydratedRef = useRef(false);
@@ -36,6 +36,7 @@ const DeferredDataScripts = () => {
36
36
  const deferredKeyPromiseStr = deferredKeys.map((key) => {
37
37
  if (pendingKeys.has(key)) {
38
38
  deferredDataScripts.push(/* @__PURE__ */ _jsx(DeferredDataScript, {
39
+ nonce: props === null || props === void 0 ? void 0 : props.nonce,
39
40
  data: deferredData.data[key],
40
41
  dataKey: key,
41
42
  routeId
@@ -71,6 +72,7 @@ const DeferredDataScripts = () => {
71
72
  children: [
72
73
  !hydratedRef.current && /* @__PURE__ */ _jsx("script", {
73
74
  async: true,
75
+ nonce: props === null || props === void 0 ? void 0 : props.nonce,
74
76
  suppressHydrationWarning: true,
75
77
  dangerouslySetInnerHTML: {
76
78
  __html: deferredScripts[0]
@@ -81,16 +83,18 @@ const DeferredDataScripts = () => {
81
83
  ]
82
84
  });
83
85
  };
84
- const DeferredDataScript = ({ data, routeId, dataKey }) => {
86
+ const DeferredDataScript = ({ data, routeId, dataKey, nonce }) => {
85
87
  return /* @__PURE__ */ _jsx(Suspense, {
86
88
  children: typeof document === "undefined" && data && dataKey && routeId ? /* @__PURE__ */ _jsx(Await, {
87
89
  resolve: data,
88
90
  errorElement: /* @__PURE__ */ _jsx(ErrorDeferredDataScript, {
89
91
  routeId,
90
- dataKey
92
+ dataKey,
93
+ nonce
91
94
  }),
92
95
  children: (data2) => /* @__PURE__ */ _jsx("script", {
93
96
  async: true,
97
+ nonce,
94
98
  suppressHydrationWarning: true,
95
99
  dangerouslySetInnerHTML: {
96
100
  __html: `_ROUTER_DATA.r(${JSON.stringify(routeId)}, ${JSON.stringify(dataKey)}, ${serializeJson(data2)});`
@@ -99,9 +103,10 @@ const DeferredDataScript = ({ data, routeId, dataKey }) => {
99
103
  }) : null
100
104
  });
101
105
  };
102
- const ErrorDeferredDataScript = ({ routeId, dataKey }) => {
106
+ const ErrorDeferredDataScript = ({ routeId, dataKey, nonce }) => {
103
107
  const error = useAsyncError();
104
108
  return /* @__PURE__ */ _jsx("script", {
109
+ nonce,
105
110
  suppressHydrationWarning: true,
106
111
  dangerouslySetInnerHTML: {
107
112
  __html: `_ROUTER_DATA.r(${JSON.stringify(routeId)}, ${JSON.stringify(dataKey)}, ${void 0}, ${serializeJson({
@@ -1,7 +1,9 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useContext } from "react";
2
3
  import { createBrowserRouter, createHashRouter, RouterProvider, createRoutesFromElements, useMatches, useLocation } from "@modern-js/utils/runtime/router";
3
4
  import hoistNonReactStatics from "hoist-non-react-statics";
4
5
  import { parsedJSONFromElement } from "@modern-js/utils/runtime-browser";
6
+ import { RuntimeReactContext } from "../../core";
5
7
  import { modifyRoutes as modifyRoutesHook } from "./hooks";
6
8
  import { deserializeErrors, renderRoutes, urlJoin } from "./utils";
7
9
  export let finalRouteConfig = {
@@ -75,6 +77,8 @@ export const routerPlugin = ({ serverBase = [], supportHtml5History = true, base
75
77
  basename: _basename,
76
78
  hydrationData
77
79
  });
80
+ const runtimeContext = useContext(RuntimeReactContext);
81
+ runtimeContext.remixRouter = router;
78
82
  return /* @__PURE__ */ _jsx(App, {
79
83
  ...props,
80
84
  children: /* @__PURE__ */ _jsx(RouterProvider, {
@@ -95,6 +99,22 @@ export const routerPlugin = ({ serverBase = [], supportHtml5History = true, base
95
99
  return next({
96
100
  App: RouteApp
97
101
  });
102
+ },
103
+ pickContext: ({ context, pickedContext }, next) => {
104
+ const { remixRouter } = context;
105
+ const router = {
106
+ navigate: remixRouter.navigate,
107
+ get location() {
108
+ return remixRouter.state.location;
109
+ }
110
+ };
111
+ return next({
112
+ context,
113
+ pickedContext: {
114
+ ...pickedContext,
115
+ router
116
+ }
117
+ });
98
118
  }
99
119
  };
100
120
  }
@@ -49,12 +49,15 @@ export const routerPlugin = ({ basename = "", routesConfig, createRoutes }) => {
49
49
  context
50
50
  });
51
51
  }
52
- const { request, mode: ssrMode } = context.ssrContext;
52
+ const { request, mode: ssrMode, nonce } = context.ssrContext;
53
53
  const baseUrl = request.baseUrl;
54
54
  const _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
55
55
  const routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
56
56
  routesConfig,
57
- ssrMode
57
+ ssrMode,
58
+ props: {
59
+ nonce
60
+ }
58
61
  }));
59
62
  const { query } = createStaticHandler(routes, {
60
63
  basename: _basename
@@ -65,7 +68,7 @@ export const routerPlugin = ({ basename = "", routesConfig, createRoutes }) => {
65
68
  return routerContext;
66
69
  }
67
70
  const router = createStaticRouter(routes, routerContext);
68
- context.router = router;
71
+ context.remixRouter = router;
69
72
  context.routerContext = routerContext;
70
73
  context.routes = routes;
71
74
  context.routeManifest = context.ssrContext.routeManifest;
@@ -83,11 +86,11 @@ export const routerPlugin = ({ basename = "", routesConfig, createRoutes }) => {
83
86
  }
84
87
  const getRouteApp = () => {
85
88
  return (props) => {
86
- const { router, routerContext } = useContext(RuntimeReactContext);
89
+ const { remixRouter, routerContext } = useContext(RuntimeReactContext);
87
90
  return /* @__PURE__ */ _jsx(App, {
88
91
  ...props,
89
92
  children: /* @__PURE__ */ _jsx(StaticRouterProvider, {
90
- router,
93
+ router: remixRouter,
91
94
  context: routerContext,
92
95
  hydrate: false
93
96
  })
@@ -103,6 +106,22 @@ export const routerPlugin = ({ basename = "", routesConfig, createRoutes }) => {
103
106
  return next({
104
107
  App: RouteApp
105
108
  });
109
+ },
110
+ pickContext: ({ context, pickedContext }, next) => {
111
+ const { remixRouter } = context;
112
+ const router = {
113
+ navigate: remixRouter.navigate,
114
+ get location() {
115
+ return remixRouter.state.location;
116
+ }
117
+ };
118
+ return next({
119
+ context,
120
+ pickedContext: {
121
+ ...pickedContext,
122
+ router
123
+ }
124
+ });
106
125
  }
107
126
  };
108
127
  }
@@ -114,11 +114,16 @@ export default () => {
114
114
  imports
115
115
  };
116
116
  },
117
- modifyEntryRuntimePlugins({ entrypoint, plugins }) {
117
+ modifyEntryRuntimePlugins({ entrypoint, plugins, bundlerConfigs }) {
118
118
  if (ssrConfigMap.get(entrypoint.entryName)) {
119
+ var _bundlerConfigs_find, _bundlerConfigs_find_output;
120
+ const chunkLoadingGlobal = (_bundlerConfigs_find = bundlerConfigs === null || bundlerConfigs === void 0 ? void 0 : bundlerConfigs.find((config) => config.name === "client")) === null || _bundlerConfigs_find === void 0 ? void 0 : (_bundlerConfigs_find_output = _bundlerConfigs_find.output) === null || _bundlerConfigs_find_output === void 0 ? void 0 : _bundlerConfigs_find_output.chunkLoadingGlobal;
119
121
  plugins.push({
120
122
  name: PLUGIN_IDENTIFIER,
121
- options: JSON.stringify(ssrConfigMap.get(entrypoint.entryName))
123
+ options: JSON.stringify({
124
+ ...ssrConfigMap.get(entrypoint.entryName) || {},
125
+ chunkLoadingGlobal
126
+ })
122
127
  });
123
128
  }
124
129
  return {
@@ -39,6 +39,9 @@ export const ssr = (config) => {
39
39
  context
40
40
  }));
41
41
  } else if (renderLevel === RenderLevel.SERVER_RENDER) {
42
+ const loadableReadyOptions = {
43
+ chunkLoadingGlobal: config.chunkLoadingGlobal
44
+ };
42
45
  if (isReact18()) {
43
46
  loadableReady(() => {
44
47
  let SSRApp = () => /* @__PURE__ */ _jsx(WithCallback, {
@@ -49,13 +52,13 @@ export const ssr = (config) => {
49
52
  });
50
53
  SSRApp = hoistNonReactStatics(SSRApp, App);
51
54
  ModernHydrate(/* @__PURE__ */ _jsx(SSRApp, {}));
52
- });
55
+ }, loadableReadyOptions);
53
56
  } else {
54
57
  loadableReady(() => {
55
58
  ModernHydrate(/* @__PURE__ */ _jsx(App, {
56
59
  context: hydrateContext
57
60
  }), callback);
58
- });
61
+ }, loadableReadyOptions);
59
62
  }
60
63
  } else {
61
64
  console.warn(`unknow render level: ${renderLevel}, execute render()`);
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ export declare function Style(props: {
3
+ children?: string;
4
+ content?: string;
5
+ }): JSX.Element;
@@ -12,6 +12,8 @@ export declare const DOCUMENT_LINKS_PLACEHOLDER: string;
12
12
  export declare const DOCUMENT_NO_SCRIPTE_PLACEHOLDER: string;
13
13
  export declare const DOCUMENT_SCRIPT_PLACEHOLDER_START: string;
14
14
  export declare const DOCUMENT_SCRIPT_PLACEHOLDER_END: string;
15
+ export declare const DOCUMENT_STYLE_PLACEHOLDER_START: string;
16
+ export declare const DOCUMENT_STYLE_PLACEHOLDER_END: string;
15
17
  export declare const DOCUMENT_COMMENT_PLACEHOLDER_START: string;
16
18
  export declare const DOCUMENT_COMMENT_PLACEHOLDER_END: string;
17
19
  export declare const PLACEHOLDER_REPLACER_MAP: {
@@ -6,6 +6,7 @@ export * from './Body';
6
6
  export * from './Root';
7
7
  export * from './Links';
8
8
  export * from './Comment';
9
+ export * from './Style';
9
10
  export * from './Scripts';
10
11
  export * from './Script';
11
12
  export * from './constants';
@@ -3,5 +3,7 @@
3
3
  * DeferredDataScripts only renders in server side,
4
4
  * it doesn't need to be hydrated in client side.
5
5
  */
6
- declare const DeferredDataScripts: () => JSX.Element | null;
6
+ declare const DeferredDataScripts: (props?: {
7
+ nonce?: string;
8
+ }) => JSX.Element | null;
7
9
  export default DeferredDataScripts;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { Store } from '@modern-js-reduck/store';
3
- import type { StaticHandlerContext } from '@modern-js/utils/runtime/remix-router';
3
+ import { type StaticHandlerContext, type Router, type RouterState } from '@modern-js/utils/runtime/remix-router';
4
4
  import { createLoaderManager } from './core/loader/loaderManager';
5
5
  import { runtime } from './core/plugin';
6
6
  import { RouteManifest } from './router/runtime/types';
@@ -24,6 +24,10 @@ export interface BaseTRuntimeContext {
24
24
  request?: SSRServerContext['request'];
25
25
  response?: SSRServerContext['response'];
26
26
  store?: Store;
27
+ router?: {
28
+ navigate: Router['navigate'];
29
+ location: RouterState['location'];
30
+ };
27
31
  }
28
32
  export interface TRuntimeContext extends BaseTRuntimeContext {
29
33
  [key: string]: any;
@@ -7,6 +7,7 @@ export type ModernSSRReactComponent = React.ComponentType<any>;
7
7
  export { RuntimeContext, RenderLevel };
8
8
  export type SSRPluginConfig = {
9
9
  crossorigin?: boolean | 'anonymous' | 'use-credentials';
10
+ chunkLoadingGlobal?: string;
10
11
  } & Exclude<ServerUserConfig['ssr'], boolean>;
11
12
  export type ServerRenderOptions = {
12
13
  App: ModernSSRReactComponent;
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "modern",
16
16
  "modern.js"
17
17
  ],
18
- "version": "2.21.1",
18
+ "version": "2.22.1",
19
19
  "engines": {
20
20
  "node": ">=14.17.6"
21
21
  },
@@ -169,9 +169,9 @@
169
169
  "redux-logger": "^3.0.6",
170
170
  "styled-components": "^5.3.1",
171
171
  "@swc/helpers": "0.5.1",
172
- "@modern-js/plugin": "2.21.1",
173
- "@modern-js/types": "2.21.1",
174
- "@modern-js/utils": "2.21.1"
172
+ "@modern-js/plugin": "2.22.1",
173
+ "@modern-js/types": "2.22.1",
174
+ "@modern-js/utils": "2.22.1"
175
175
  },
176
176
  "peerDependencies": {
177
177
  "react": ">=17",
@@ -191,11 +191,12 @@
191
191
  "react-dom": "^18",
192
192
  "ts-jest": "^29.1.0",
193
193
  "typescript": "^5",
194
- "@modern-js/app-tools": "2.21.1",
195
- "@modern-js/core": "2.21.1",
196
- "@modern-js/server-core": "2.21.1",
197
- "@scripts/jest-config": "2.21.1",
198
- "@scripts/build": "2.21.1"
194
+ "webpack": "^5.82.1",
195
+ "@modern-js/app-tools": "2.22.1",
196
+ "@modern-js/core": "2.22.1",
197
+ "@modern-js/server-core": "2.22.1",
198
+ "@scripts/build": "2.22.1",
199
+ "@scripts/jest-config": "2.22.1"
199
200
  },
200
201
  "sideEffects": false,
201
202
  "modernConfig": {},