@modern-js/runtime 2.13.4 → 2.14.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 (47) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/cjs/document/Comment.js +37 -0
  3. package/dist/cjs/document/cli/index.js +10 -1
  4. package/dist/cjs/document/constants.js +10 -0
  5. package/dist/cjs/document/index.js +1 -0
  6. package/dist/cjs/router/runtime/hooks.js +28 -0
  7. package/dist/cjs/router/runtime/index.js +2 -0
  8. package/dist/cjs/router/runtime/plugin.js +13 -2
  9. package/dist/cjs/router/runtime/plugin.node.js +7 -1
  10. package/dist/cjs/ssr/cli/index.js +3 -15
  11. package/dist/cjs/ssr/index.js +6 -0
  12. package/dist/cjs/ssr/serverRender/renderToStream/bulidTemplate.before.js +1 -1
  13. package/dist/cjs/ssr/serverRender/renderToString/entry.js +8 -7
  14. package/dist/cjs/ssr/serverRender/utils.js +6 -0
  15. package/dist/esm/document/Comment.js +14 -0
  16. package/dist/esm/document/cli/index.js +7 -2
  17. package/dist/esm/document/constants.js +3 -1
  18. package/dist/esm/document/index.js +1 -0
  19. package/dist/esm/router/runtime/hooks.js +3 -0
  20. package/dist/esm/router/runtime/index.js +2 -2
  21. package/dist/esm/router/runtime/plugin.js +12 -1
  22. package/dist/esm/router/runtime/plugin.node.js +8 -2
  23. package/dist/esm/ssr/cli/index.js +4 -69
  24. package/dist/esm/ssr/index.js +6 -0
  25. package/dist/esm/ssr/serverRender/renderToStream/bulidTemplate.before.js +1 -1
  26. package/dist/esm/ssr/serverRender/renderToString/entry.js +6 -2
  27. package/dist/esm/ssr/serverRender/utils.js +3 -1
  28. package/dist/esm-node/document/Comment.js +17 -0
  29. package/dist/esm-node/document/cli/index.js +13 -2
  30. package/dist/esm-node/document/constants.js +8 -0
  31. package/dist/esm-node/document/index.js +1 -0
  32. package/dist/esm-node/router/runtime/hooks.js +5 -0
  33. package/dist/esm-node/router/runtime/index.js +3 -1
  34. package/dist/esm-node/router/runtime/plugin.js +13 -2
  35. package/dist/esm-node/router/runtime/plugin.node.js +7 -1
  36. package/dist/esm-node/ssr/cli/index.js +3 -15
  37. package/dist/esm-node/ssr/index.js +6 -0
  38. package/dist/esm-node/ssr/serverRender/renderToStream/bulidTemplate.before.js +1 -1
  39. package/dist/esm-node/ssr/serverRender/renderToString/entry.js +8 -7
  40. package/dist/esm-node/ssr/serverRender/utils.js +4 -0
  41. package/dist/types/document/Comment.d.ts +5 -0
  42. package/dist/types/document/constants.d.ts +2 -0
  43. package/dist/types/document/index.d.ts +1 -0
  44. package/dist/types/router/runtime/hooks.d.ts +3 -0
  45. package/dist/types/router/runtime/index.d.ts +1 -1
  46. package/dist/types/ssr/serverRender/utils.d.ts +2 -0
  47. package/package.json +9 -9
package/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # @modern-js/runtime
2
2
 
3
+ ## 2.14.0
4
+
5
+ ### Patch Changes
6
+
7
+ - c921f30: fix: the streaming ssr may add repeated css assets, because the route-manifets would product all css link
8
+ fix: 因为 route-manifets 会生成所有 css link 信息,导致 streaming ssr 可能添加重复的 css 资源,
9
+ - ead58c8: feat: support Comment component in Document.tsx
10
+ feat: 支持 Comment 组件,可以保留用户的注释到最终的 html 上
11
+ - afe5d35: feat: add hook `modifyRoutes`
12
+ feat: 增加 hook `modifyRoutes`
13
+ - 4c74ea7: fix: ssr and document integration test error
14
+ fix: 修复 ssr 和 document 的集测错误
15
+ - 76ad173: feat: re-export `createPath` from react-router
16
+ feat: 从 react-router 导出 `createPath`
17
+ - 394470c: fix: router missing App static property
18
+ fix: router 确实 App 的静态属性
19
+ - 8b634f9: fix: 更新集测 snapshot,修复 document 功能在 node 14 下的错误
20
+ fix: update test snapshot, fix document error in node 14
21
+ - 1b3afa0: fix: ssr stream test case
22
+ fix: 修复 ssr stream 测试用例
23
+ - 28721cb: fix(runtime): MODERN_TARGET is not injected when using Rspack
24
+
25
+ fix(runtime): 修复 Rspack 模式未注入 MODERN_TARGET 的问题
26
+
27
+ - 60a81d0: feat: add ssr.inlineScript for use inline json instead inline script when ssr
28
+ feat: 添加 ssr.inlineScript 用于在 ssr 模式下使用内联 json 而不是内联脚本
29
+ - Updated dependencies [4779152]
30
+ - Updated dependencies [9321bef]
31
+ - Updated dependencies [9b45c58]
32
+ - Updated dependencies [52d0cb1]
33
+ - Updated dependencies [60a81d0]
34
+ - Updated dependencies [dacef96]
35
+ - Updated dependencies [16399fd]
36
+ - @modern-js/utils@2.14.0
37
+ - @modern-js/types@2.14.0
38
+ - @modern-js/plugin@2.14.0
39
+
3
40
  ## 2.13.4
4
41
 
5
42
  ### Patch Changes
@@ -0,0 +1,37 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var Comment_exports = {};
19
+ __export(Comment_exports, {
20
+ Comment: () => Comment
21
+ });
22
+ module.exports = __toCommonJS(Comment_exports);
23
+ var import_jsx_runtime = require("react/jsx-runtime");
24
+ var import_constants = require("./constants");
25
+ function Comment(props) {
26
+ const { comment, children } = props;
27
+ const commentStr = encodeURIComponent(children || comment || "");
28
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
29
+ `${import_constants.DOCUMENT_COMMENT_PLACEHOLDER_START}`,
30
+ `${commentStr}`,
31
+ `${import_constants.DOCUMENT_COMMENT_PLACEHOLDER_END}`
32
+ ] });
33
+ }
34
+ // Annotate the CommonJS export names for ESM import in node:
35
+ 0 && (module.exports = {
36
+ Comment
37
+ });
@@ -163,7 +163,7 @@ var cli_default = () => ({
163
163
  ).join("")
164
164
  ].join("");
165
165
  if (html.includes(import_constants.DOCUMENT_SCRIPT_PLACEHOLDER_START) && html.includes(import_constants.DOCUMENT_SCRIPT_PLACEHOLDER_END)) {
166
- html = html.replaceAll(
166
+ html = html.replace(
167
167
  new RegExp(
168
168
  `${import_constants.DOCUMENT_SCRIPT_PLACEHOLDER_START}(.*?)${import_constants.DOCUMENT_SCRIPT_PLACEHOLDER_END}`,
169
169
  "g"
@@ -171,6 +171,15 @@ var cli_default = () => ({
171
171
  (_scriptStr, $1) => `<script>${decodeURIComponent($1)}</script>`
172
172
  );
173
173
  }
174
+ if (html.includes(import_constants.DOCUMENT_COMMENT_PLACEHOLDER_START) && html.includes(import_constants.DOCUMENT_COMMENT_PLACEHOLDER_END)) {
175
+ html = html.replace(
176
+ new RegExp(
177
+ `${import_constants.DOCUMENT_COMMENT_PLACEHOLDER_START}(.*?)${import_constants.DOCUMENT_COMMENT_PLACEHOLDER_END}`,
178
+ "g"
179
+ ),
180
+ (_scriptStr, $1) => `${decodeURIComponent($1)}`
181
+ );
182
+ }
174
183
  const finalHtml = `<!DOCTYPE html>${html}`.replace(import_constants.DOCUMENT_META_PLACEHOLDER, metas).replace(import_constants.DOCUMENT_SSR_PLACEHOLDER, import_constants.HTML_SEPARATOR).replace(import_constants.DOCUMENT_SCRIPTS_PLACEHOLDER, scripts).replace(import_constants.DOCUMENT_LINKS_PLACEHOLDER, links).replace(
175
184
  import_constants.DOCUMENT_CHUNKSMAP_PLACEHOLDER,
176
185
  import_constants.PLACEHOLDER_REPLACER_MAP[import_constants.DOCUMENT_CHUNKSMAP_PLACEHOLDER]
@@ -18,6 +18,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
18
18
  var constants_exports = {};
19
19
  __export(constants_exports, {
20
20
  DOCUMENT_CHUNKSMAP_PLACEHOLDER: () => DOCUMENT_CHUNKSMAP_PLACEHOLDER,
21
+ DOCUMENT_COMMENT_PLACEHOLDER_END: () => DOCUMENT_COMMENT_PLACEHOLDER_END,
22
+ DOCUMENT_COMMENT_PLACEHOLDER_START: () => DOCUMENT_COMMENT_PLACEHOLDER_START,
21
23
  DOCUMENT_FILE_NAME: () => DOCUMENT_FILE_NAME,
22
24
  DOCUMENT_LINKS_PLACEHOLDER: () => DOCUMENT_LINKS_PLACEHOLDER,
23
25
  DOCUMENT_META_PLACEHOLDER: () => DOCUMENT_META_PLACEHOLDER,
@@ -60,6 +62,12 @@ const DOCUMENT_SCRIPT_PLACEHOLDER_START = encodeURIComponent(
60
62
  const DOCUMENT_SCRIPT_PLACEHOLDER_END = encodeURIComponent(
61
63
  "<!-- script-end -->"
62
64
  );
65
+ const DOCUMENT_COMMENT_PLACEHOLDER_START = encodeURIComponent(
66
+ "<!-- comment-start -->"
67
+ );
68
+ const DOCUMENT_COMMENT_PLACEHOLDER_END = encodeURIComponent(
69
+ "<!-- comment-end -->"
70
+ );
63
71
  const PLACEHOLDER_REPLACER_MAP = {
64
72
  [DOCUMENT_NO_SCRIPTE_PLACEHOLDER]: `We're sorry but react app doesn't work properly without JavaScript enabled. Please enable it to continue.`,
65
73
  [DOCUMENT_SSR_PLACEHOLDER]: HTML_SEPARATOR,
@@ -69,6 +77,8 @@ const PLACEHOLDER_REPLACER_MAP = {
69
77
  // Annotate the CommonJS export names for ESM import in node:
70
78
  0 && (module.exports = {
71
79
  DOCUMENT_CHUNKSMAP_PLACEHOLDER,
80
+ DOCUMENT_COMMENT_PLACEHOLDER_END,
81
+ DOCUMENT_COMMENT_PLACEHOLDER_START,
72
82
  DOCUMENT_FILE_NAME,
73
83
  DOCUMENT_LINKS_PLACEHOLDER,
74
84
  DOCUMENT_META_PLACEHOLDER,
@@ -21,6 +21,7 @@ __reExport(document_exports, require("./Head"), module.exports);
21
21
  __reExport(document_exports, require("./Body"), module.exports);
22
22
  __reExport(document_exports, require("./Root"), module.exports);
23
23
  __reExport(document_exports, require("./Links"), module.exports);
24
+ __reExport(document_exports, require("./Comment"), module.exports);
24
25
  __reExport(document_exports, require("./Scripts"), module.exports);
25
26
  __reExport(document_exports, require("./Script"), module.exports);
26
27
  __reExport(document_exports, require("./constants"), module.exports);
@@ -0,0 +1,28 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var hooks_exports = {};
19
+ __export(hooks_exports, {
20
+ modifyRoutes: () => modifyRoutes
21
+ });
22
+ module.exports = __toCommonJS(hooks_exports);
23
+ var import_plugin = require("@modern-js/plugin");
24
+ const modifyRoutes = (0, import_plugin.createWaterfall)();
25
+ // Annotate the CommonJS export names for ESM import in node:
26
+ 0 && (module.exports = {
27
+ modifyRoutes
28
+ });
@@ -35,6 +35,7 @@ __export(runtime_exports, {
35
35
  createBrowserRouter: () => import_react_router_dom.createBrowserRouter,
36
36
  createHashRouter: () => import_react_router_dom.createHashRouter,
37
37
  createMemoryRouter: () => import_react_router_dom.createMemoryRouter,
38
+ createPath: () => import_react_router_dom.createPath,
38
39
  createRoutesFromChildren: () => import_react_router_dom.createRoutesFromChildren,
39
40
  createRoutesFromElements: () => import_react_router_dom.createRoutesFromElements,
40
41
  createSearchParams: () => import_react_router_dom.createSearchParams,
@@ -104,6 +105,7 @@ var runtime_default = import_plugin.routerPlugin;
104
105
  createBrowserRouter,
105
106
  createHashRouter,
106
107
  createMemoryRouter,
108
+ createPath,
107
109
  createRoutesFromChildren,
108
110
  createRoutesFromElements,
109
111
  createSearchParams,
@@ -36,6 +36,8 @@ module.exports = __toCommonJS(plugin_exports);
36
36
  var import_jsx_runtime = require("react/jsx-runtime");
37
37
  var import_react_router_dom = require("react-router-dom");
38
38
  var import_hoist_non_react_statics = __toESM(require("hoist-non-react-statics"));
39
+ var import_runtime = require("@modern-js/utils/runtime");
40
+ var import_hooks = require("./hooks");
39
41
  var import_utils = require("./utils");
40
42
  let finalRouteConfig = {
41
43
  routes: []
@@ -62,9 +64,13 @@ const routerPlugin = ({
62
64
  const select = (pathname) => serverBase.find((baseUrl) => pathname.search(baseUrl) === 0) || "/";
63
65
  let routes = [];
64
66
  finalRouteConfig = routesConfig;
67
+ window._SERVER_DATA = (0, import_runtime.parsedJSONFromElement)("__MODERN_SERVER_DATA__");
65
68
  return {
66
69
  name: "@modern-js/plugin-router",
67
- setup: () => {
70
+ registerHook: {
71
+ modifyRoutes: import_hooks.modifyRoutes
72
+ },
73
+ setup: (api) => {
68
74
  return {
69
75
  init({ context }, next) {
70
76
  context.router = {
@@ -92,6 +98,8 @@ const routerPlugin = ({
92
98
  props
93
99
  })
94
100
  );
101
+ const runner = api.useHookRunners();
102
+ routes = runner.modifyRoutes(routes);
95
103
  const baseUrl = ((_a = window._SERVER_DATA) == null ? void 0 : _a.router.baseUrl) || select(location.pathname);
96
104
  const _basename = baseUrl === "/" ? (0, import_utils.urlJoin)(baseUrl, basename) : baseUrl;
97
105
  let hydrationData = window._ROUTER_DATA;
@@ -111,7 +119,10 @@ const routerPlugin = ({
111
119
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(App, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_router_dom.RouterProvider, { router }) });
112
120
  };
113
121
  };
114
- const RouteApp = getRouteApp();
122
+ let RouteApp = getRouteApp();
123
+ if (App) {
124
+ RouteApp = (0, import_hoist_non_react_statics.default)(RouteApp, App);
125
+ }
115
126
  if (routesConfig == null ? void 0 : routesConfig.globalApp) {
116
127
  return next({
117
128
  App: (0, import_hoist_non_react_statics.default)(RouteApp, routesConfig.globalApp)
@@ -41,6 +41,7 @@ var import_react_router_dom = require("react-router-dom");
41
41
  var import_core = require("../../core");
42
42
  var import_utils = require("./utils");
43
43
  var import_fetch = require("./fetch");
44
+ var import_hooks = require("./hooks");
44
45
  (0, import_fetch.installGlobals)();
45
46
  function createFetchRequest(req) {
46
47
  const origin = `${req.protocol}://${req.host}`;
@@ -75,7 +76,10 @@ const routerPlugin = ({
75
76
  }) => {
76
77
  return {
77
78
  name: "@modern-js/plugin-router",
78
- setup: () => {
79
+ registerHook: {
80
+ modifyRoutes: import_hooks.modifyRoutes
81
+ },
82
+ setup: (api) => {
79
83
  return {
80
84
  async init({ context }, next) {
81
85
  if (!routesConfig && !createRoutes) {
@@ -103,6 +107,8 @@ const routerPlugin = ({
103
107
  context.routerContext = routerContext;
104
108
  context.routes = routes;
105
109
  context.routeManifest = context.ssrContext.routeManifest;
110
+ const runner = api.useHookRunners();
111
+ runner.modifyRoutes(routes);
106
112
  return next({ context });
107
113
  },
108
114
  hoc: ({ App }, next) => {
@@ -80,6 +80,9 @@ var cli_default = () => ({
80
80
  // ensure that all packages use the same storage in @modern-js/utils/ssr
81
81
  "@modern-js/utils/ssr": require.resolve("@modern-js/utils/ssr"),
82
82
  "@modern-js/runtime/plugins": pluginsExportsUtils.getPath()
83
+ },
84
+ globalVars: (values, { target }) => {
85
+ values["process.env.MODERN_TARGET"] = target === "node" || target === "service-worker" ? "node" : "browser";
83
86
  }
84
87
  },
85
88
  tools: {
@@ -91,21 +94,6 @@ var cli_default = () => ({
91
94
  { filename: import_utils.LOADABLE_STATS_FILE }
92
95
  ]);
93
96
  }
94
- const modernVars = {
95
- [`process.env.MODERN_TARGET`]: JSON.stringify(
96
- isServer || isServiceWorker ? "node" : "browser"
97
- )
98
- };
99
- chain.plugin(CHAIN_ID.PLUGIN.DEFINE).tap((args) => {
100
- const [vars, ...rest] = args;
101
- return [
102
- {
103
- ...vars,
104
- ...modernVars
105
- },
106
- ...rest
107
- ];
108
- });
109
97
  },
110
98
  babel: babelConfig
111
99
  }
@@ -35,14 +35,20 @@ module.exports = __toCommonJS(ssr_exports);
35
35
  var import_jsx_runtime = require("react/jsx-runtime");
36
36
  var import_component = require("@loadable/component");
37
37
  var import_hoist_non_react_statics = __toESM(require("hoist-non-react-statics"));
38
+ var import_runtime = require("@modern-js/utils/runtime");
38
39
  var import_types = require("./serverRender/types");
39
40
  var import_withCallback = require("./react/withCallback");
40
41
  var import_utils = require("./utils");
42
+ var import_utils2 = require("./serverRender/utils");
41
43
  __reExport(ssr_exports, require("./react"), module.exports);
42
44
  const ssr = (config) => ({
43
45
  name: "@modern-js/plugin-ssr",
44
46
  setup: () => {
45
47
  const mockResp = (0, import_utils.mockResponse)();
48
+ if (config.inlineScript === false) {
49
+ window._SSR_DATA = (0, import_runtime.parsedJSONFromElement)(import_utils2.SSR_DATA_JSON_ID);
50
+ window._ROUTER_DATA = (0, import_runtime.parsedJSONFromElement)(import_utils2.ROUTER_DATA_JSON_ID);
51
+ }
46
52
  return {
47
53
  client: async ({ App, context, ModernRender, ModernHydrate }) => {
48
54
  var _a;
@@ -73,7 +73,7 @@ function getHeadTemplate(beforeEntryTemplate, context) {
73
73
  if (routeManifest2) {
74
74
  const { referenceCssAssets = [] } = routeManifest2;
75
75
  const _cssChunks = referenceCssAssets.filter(
76
- (asset) => asset == null ? void 0 : asset.endsWith(".css")
76
+ (asset) => (asset == null ? void 0 : asset.endsWith(".css")) && !headTemplate2.includes(asset)
77
77
  );
78
78
  cssChunks.push(..._cssChunks);
79
79
  }
@@ -39,6 +39,7 @@ var import_helmet = __toESM(require("../helmet"));
39
39
  var import_types = require("../types");
40
40
  var import_time = require("../time");
41
41
  var import_prefetch = __toESM(require("../../prefetch"));
42
+ var import_utils2 = require("../utils");
42
43
  var import_template = require("./template");
43
44
  var import_reduce = require("./reduce");
44
45
  var loadableRenderer = __toESM(require("./loadable"));
@@ -172,14 +173,14 @@ class Entry {
172
173
  return html;
173
174
  }
174
175
  getSSRDataScript(templateData, routerData) {
175
- let ssrDataScripts = `<script>window._SSR_DATA = ${(0, import_serialize.serializeJson)(
176
- templateData
177
- )}</script>`;
176
+ const useInlineScript = this.pluginConfig.inlineScript !== false;
177
+ const ssrData = (0, import_serialize.serializeJson)(templateData);
178
+ let ssrDataScripts = useInlineScript ? `<script>window._SSR_DATA = ${ssrData}</script>` : `<script type="application/json" id="${import_utils2.SSR_DATA_JSON_ID}">${ssrData}</script>`;
178
179
  if (routerData) {
179
- ssrDataScripts += `
180
- <script>window._ROUTER_DATA = ${(0, import_serialize.serializeJson)(
181
- routerData
182
- )}</script>`;
180
+ const serializedRouterData = (0, import_serialize.serializeJson)(routerData);
181
+ ssrDataScripts += useInlineScript ? `
182
+ <script>window._ROUTER_DATA = ${serializedRouterData}</script>` : `
183
+ <script type="application/json" id="${import_utils2.ROUTER_DATA_JSON_ID}">${serializedRouterData}</script>`;
183
184
  }
184
185
  return {
185
186
  SSRDataScript: ssrDataScripts
@@ -18,10 +18,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
18
18
  var utils_exports = {};
19
19
  __export(utils_exports, {
20
20
  CSS_CHUNKS_PLACEHOLDER: () => CSS_CHUNKS_PLACEHOLDER,
21
+ ROUTER_DATA_JSON_ID: () => ROUTER_DATA_JSON_ID,
22
+ SSR_DATA_JSON_ID: () => SSR_DATA_JSON_ID,
21
23
  getLoadableScripts: () => getLoadableScripts
22
24
  });
23
25
  module.exports = __toCommonJS(utils_exports);
24
26
  const CSS_CHUNKS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
27
+ const SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
28
+ const ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
25
29
  function getLoadableScripts(extractor) {
26
30
  const check = (scripts2) => (scripts2 || "").includes("__LOADABLE_REQUIRED_CHUNKS___ext");
27
31
  const scripts = extractor.getScriptTags();
@@ -33,5 +37,7 @@ function getLoadableScripts(extractor) {
33
37
  // Annotate the CommonJS export names for ESM import in node:
34
38
  0 && (module.exports = {
35
39
  CSS_CHUNKS_PLACEHOLDER,
40
+ ROUTER_DATA_JSON_ID,
41
+ SSR_DATA_JSON_ID,
36
42
  getLoadableScripts
37
43
  });
@@ -0,0 +1,14 @@
1
+ import { Fragment, jsxs } from "react/jsx-runtime";
2
+ import { DOCUMENT_COMMENT_PLACEHOLDER_START, DOCUMENT_COMMENT_PLACEHOLDER_END } from "./constants";
3
+ function Comment(props) {
4
+ var comment = props.comment, children = props.children;
5
+ var commentStr = encodeURIComponent(children || comment || "");
6
+ return /* @__PURE__ */ jsxs(Fragment, {
7
+ children: [
8
+ "".concat(DOCUMENT_COMMENT_PLACEHOLDER_START),
9
+ "".concat(commentStr),
10
+ "".concat(DOCUMENT_COMMENT_PLACEHOLDER_END)
11
+ ]
12
+ });
13
+ }
14
+ export { Comment };
@@ -181,7 +181,7 @@ import ReactDomServer from "react-dom/server";
181
181
  import { build } from "esbuild";
182
182
  import { createDebugger, findExists, fs } from "@modern-js/utils";
183
183
  import { DocumentContext } from "../DocumentContext";
184
- 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 } from "../constants";
184
+ 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";
185
185
  var debug = createDebugger("html_genarate");
186
186
  var getDocumenByEntryName = function getDocumenByEntryName(entrypoints, entryName, fallbackDir) {
187
187
  var _entrypoints_find;
@@ -346,10 +346,15 @@ var cli_default = function() {
346
346
  }).join("")
347
347
  ].join("");
348
348
  if (html.includes(DOCUMENT_SCRIPT_PLACEHOLDER_START) && html.includes(DOCUMENT_SCRIPT_PLACEHOLDER_END)) {
349
- html = html.replaceAll(new RegExp("".concat(DOCUMENT_SCRIPT_PLACEHOLDER_START, "(.*?)").concat(DOCUMENT_SCRIPT_PLACEHOLDER_END), "g"), function(_scriptStr, $1) {
349
+ html = html.replace(new RegExp("".concat(DOCUMENT_SCRIPT_PLACEHOLDER_START, "(.*?)").concat(DOCUMENT_SCRIPT_PLACEHOLDER_END), "g"), function(_scriptStr, $1) {
350
350
  return "<script>".concat(decodeURIComponent($1), "</script>");
351
351
  });
352
352
  }
353
+ if (html.includes(DOCUMENT_COMMENT_PLACEHOLDER_START) && html.includes(DOCUMENT_COMMENT_PLACEHOLDER_END)) {
354
+ html = html.replace(new RegExp("".concat(DOCUMENT_COMMENT_PLACEHOLDER_START, "(.*?)").concat(DOCUMENT_COMMENT_PLACEHOLDER_END), "g"), function(_scriptStr, $1) {
355
+ return "".concat(decodeURIComponent($1));
356
+ });
357
+ }
353
358
  finalHtml = "<!DOCTYPE html>".concat(html).replace(DOCUMENT_META_PLACEHOLDER, metas).replace(DOCUMENT_SSR_PLACEHOLDER, HTML_SEPARATOR).replace(DOCUMENT_SCRIPTS_PLACEHOLDER, scripts).replace(DOCUMENT_LINKS_PLACEHOLDER, links).replace(DOCUMENT_CHUNKSMAP_PLACEHOLDER, PLACEHOLDER_REPLACER_MAP[DOCUMENT_CHUNKSMAP_PLACEHOLDER]).replace(DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, PLACEHOLDER_REPLACER_MAP[DOCUMENT_SSRDATASCRIPT_PLACEHOLDER]);
354
359
  return [
355
360
  2,
@@ -30,6 +30,8 @@ var DOCUMENT_LINKS_PLACEHOLDER = encodeURIComponent("<!-- chunk links placeholde
30
30
  var DOCUMENT_NO_SCRIPTE_PLACEHOLDER = encodeURIComponent("<!-- no-script -->");
31
31
  var DOCUMENT_SCRIPT_PLACEHOLDER_START = encodeURIComponent("<!-- script-start -->");
32
32
  var DOCUMENT_SCRIPT_PLACEHOLDER_END = encodeURIComponent("<!-- script-end -->");
33
+ var DOCUMENT_COMMENT_PLACEHOLDER_START = encodeURIComponent("<!-- comment-start -->");
34
+ var DOCUMENT_COMMENT_PLACEHOLDER_END = encodeURIComponent("<!-- comment-end -->");
33
35
  var _obj;
34
36
  var PLACEHOLDER_REPLACER_MAP = (_obj = {}, _defineProperty(_obj, DOCUMENT_NO_SCRIPTE_PLACEHOLDER, "We're sorry but react app doesn't work properly without JavaScript enabled. Please enable it to continue."), _defineProperty(_obj, DOCUMENT_SSR_PLACEHOLDER, HTML_SEPARATOR), _defineProperty(_obj, DOCUMENT_CHUNKSMAP_PLACEHOLDER, HTML_CHUNKSMAP_SEPARATOR), _defineProperty(_obj, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, HTML_SSRDATASCRIPT_SEPARATOR), _obj);
35
- export { DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_FILE_NAME, DOCUMENT_LINKS_PLACEHOLDER, DOCUMENT_META_PLACEHOLDER, DOCUMENT_NO_SCRIPTE_PLACEHOLDER, DOCUMENT_SCRIPTS_PLACEHOLDER, DOCUMENT_SCRIPT_PLACEHOLDER_END, DOCUMENT_SCRIPT_PLACEHOLDER_START, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, DOCUMENT_SSR_PLACEHOLDER, DOC_EXT, HTML_CHUNKSMAP_SEPARATOR, HTML_SEPARATOR, HTML_SSRDATASCRIPT_SEPARATOR, PLACEHOLDER_REPLACER_MAP };
37
+ export { DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_COMMENT_PLACEHOLDER_END, DOCUMENT_COMMENT_PLACEHOLDER_START, DOCUMENT_FILE_NAME, DOCUMENT_LINKS_PLACEHOLDER, DOCUMENT_META_PLACEHOLDER, DOCUMENT_NO_SCRIPTE_PLACEHOLDER, DOCUMENT_SCRIPTS_PLACEHOLDER, DOCUMENT_SCRIPT_PLACEHOLDER_END, DOCUMENT_SCRIPT_PLACEHOLDER_START, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, DOCUMENT_SSR_PLACEHOLDER, DOC_EXT, HTML_CHUNKSMAP_SEPARATOR, HTML_SEPARATOR, HTML_SSRDATASCRIPT_SEPARATOR, PLACEHOLDER_REPLACER_MAP };
@@ -5,6 +5,7 @@ export * from "./Head";
5
5
  export * from "./Body";
6
6
  export * from "./Root";
7
7
  export * from "./Links";
8
+ export * from "./Comment";
8
9
  export * from "./Scripts";
9
10
  export * from "./Script";
10
11
  export * from "./constants";
@@ -0,0 +1,3 @@
1
+ import { createWaterfall } from "@modern-js/plugin";
2
+ var modifyRoutes = createWaterfall();
3
+ export { modifyRoutes };
@@ -3,6 +3,6 @@ var runtime_default = routerPlugin;
3
3
  import { modifyRoutes } from "./plugin";
4
4
  export * from "./withRouter";
5
5
  import { Link, NavLink } from "./PrefetchLink";
6
- import { createBrowserRouter, createHashRouter, createMemoryRouter, RouterProvider, BrowserRouter, HashRouter, MemoryRouter, Router, Await, Form, Navigate, Outlet, Route, Routes, ScrollRestoration, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit, createRoutesFromChildren, createRoutesFromElements, createSearchParams, generatePath, isRouteErrorResponse, matchPath, matchRoutes, renderMatches, resolvePath } from "react-router-dom";
6
+ import { createBrowserRouter, createHashRouter, createMemoryRouter, RouterProvider, BrowserRouter, HashRouter, MemoryRouter, Router, Await, Form, Navigate, Outlet, Route, Routes, ScrollRestoration, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit, createRoutesFromChildren, createRoutesFromElements, createSearchParams, generatePath, isRouteErrorResponse, matchPath, matchRoutes, renderMatches, resolvePath, createPath } from "react-router-dom";
7
7
  import { defer, json, redirect } from "@modern-js/utils/universal/remix-router";
8
- export { Await, BrowserRouter, Form, HashRouter, Link, MemoryRouter, NavLink, Navigate, Outlet, Route, Router, RouterProvider, Routes, ScrollRestoration, createBrowserRouter, createHashRouter, createMemoryRouter, createRoutesFromChildren, createRoutesFromElements, createSearchParams, runtime_default as default, defer, generatePath, isRouteErrorResponse, json, matchPath, matchRoutes, modifyRoutes, redirect, renderMatches, resolvePath, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit };
8
+ export { Await, BrowserRouter, Form, HashRouter, Link, MemoryRouter, NavLink, Navigate, Outlet, Route, Router, RouterProvider, Routes, ScrollRestoration, createBrowserRouter, createHashRouter, createMemoryRouter, createPath, createRoutesFromChildren, createRoutesFromElements, createSearchParams, runtime_default as default, defer, generatePath, isRouteErrorResponse, json, matchPath, matchRoutes, modifyRoutes, redirect, renderMatches, resolvePath, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit };
@@ -53,6 +53,8 @@ function _objectSpreadProps(target, source) {
53
53
  import { jsx } from "react/jsx-runtime";
54
54
  import { createBrowserRouter, createHashRouter, RouterProvider, createRoutesFromElements, useMatches, useLocation } from "react-router-dom";
55
55
  import hoistNonReactStatics from "hoist-non-react-statics";
56
+ import { parsedJSONFromElement } from "@modern-js/utils/runtime";
57
+ import { modifyRoutes as modifyRoutesHook } from "./hooks";
56
58
  import { deserializeErrors, renderRoutes, urlJoin } from "./utils";
57
59
  var finalRouteConfig = {
58
60
  routes: []
@@ -76,9 +78,13 @@ var routerPlugin = function(param) {
76
78
  };
77
79
  var routes = [];
78
80
  finalRouteConfig = routesConfig;
81
+ window._SERVER_DATA = parsedJSONFromElement("__MODERN_SERVER_DATA__");
79
82
  return {
80
83
  name: "@modern-js/plugin-router",
81
- setup: function() {
84
+ registerHook: {
85
+ modifyRoutes: modifyRoutesHook
86
+ },
87
+ setup: function(api) {
82
88
  return {
83
89
  init: function init(param, next) {
84
90
  var context = param.context;
@@ -110,6 +116,8 @@ var routerPlugin = function(param) {
110
116
  routesConfig: finalRouteConfig,
111
117
  props: props
112
118
  }));
119
+ var runner = api.useHookRunners();
120
+ routes = runner.modifyRoutes(routes);
113
121
  var baseUrl = ((_window__SERVER_DATA = window._SERVER_DATA) === null || _window__SERVER_DATA === void 0 ? void 0 : _window__SERVER_DATA.router.baseUrl) || select(location.pathname);
114
122
  var _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
115
123
  var hydrationData = window._ROUTER_DATA;
@@ -133,6 +141,9 @@ var routerPlugin = function(param) {
133
141
  };
134
142
  };
135
143
  var RouteApp = getRouteApp();
144
+ if (App) {
145
+ RouteApp = hoistNonReactStatics(RouteApp, App);
146
+ }
136
147
  if (routesConfig === null || routesConfig === void 0 ? void 0 : routesConfig.globalApp) {
137
148
  return next({
138
149
  App: hoistNonReactStatics(RouteApp, routesConfig.globalApp)
@@ -236,6 +236,7 @@ import { createRoutesFromElements } from "react-router-dom";
236
236
  import { RuntimeReactContext } from "../../core";
237
237
  import { renderRoutes, urlJoin } from "./utils";
238
238
  import { installGlobals } from "./fetch";
239
+ import { modifyRoutes as modifyRoutesHook } from "./hooks";
239
240
  installGlobals();
240
241
  function createFetchRequest(req) {
241
242
  var origin = "".concat(req.protocol, "://").concat(req.host);
@@ -301,12 +302,15 @@ var routerPlugin = function(param) {
301
302
  var _param_basename = param.basename, basename = _param_basename === void 0 ? "" : _param_basename, routesConfig = param.routesConfig, createRoutes = param.createRoutes;
302
303
  return {
303
304
  name: "@modern-js/plugin-router",
304
- setup: function() {
305
+ registerHook: {
306
+ modifyRoutes: modifyRoutesHook
307
+ },
308
+ setup: function(api) {
305
309
  return {
306
310
  init: function init(param, next) {
307
311
  var context = param.context;
308
312
  return _asyncToGenerator(function() {
309
- var _context_ssrContext, request, ssrMode, baseUrl, _basename, routes, query, remixRequest, routerContext, router;
313
+ var _context_ssrContext, request, ssrMode, baseUrl, _basename, routes, query, remixRequest, routerContext, router, runner;
310
314
  return __generator(this, function(_state) {
311
315
  switch(_state.label){
312
316
  case 0:
@@ -346,6 +350,8 @@ var routerPlugin = function(param) {
346
350
  context.routerContext = routerContext;
347
351
  context.routes = routes;
348
352
  context.routeManifest = context.ssrContext.routeManifest;
353
+ runner = api.useHookRunners();
354
+ runner.modifyRoutes(routes);
349
355
  return [
350
356
  2,
351
357
  next({
@@ -1,65 +1,3 @@
1
- function _arrayLikeToArray(arr, len) {
2
- if (len == null || len > arr.length) len = arr.length;
3
- for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
4
- return arr2;
5
- }
6
- function _arrayWithHoles(arr) {
7
- if (Array.isArray(arr)) return arr;
8
- }
9
- function _arrayWithoutHoles(arr) {
10
- if (Array.isArray(arr)) return _arrayLikeToArray(arr);
11
- }
12
- function _defineProperty(obj, key, value) {
13
- if (key in obj) {
14
- Object.defineProperty(obj, key, {
15
- value: value,
16
- enumerable: true,
17
- configurable: true,
18
- writable: true
19
- });
20
- } else {
21
- obj[key] = value;
22
- }
23
- return obj;
24
- }
25
- function _iterableToArray(iter) {
26
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
27
- }
28
- function _nonIterableRest() {
29
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
30
- }
31
- function _nonIterableSpread() {
32
- throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
33
- }
34
- function _objectSpread(target) {
35
- for(var i = 1; i < arguments.length; i++){
36
- var source = arguments[i] != null ? arguments[i] : {};
37
- var ownKeys = Object.keys(source);
38
- if (typeof Object.getOwnPropertySymbols === "function") {
39
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
40
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
41
- }));
42
- }
43
- ownKeys.forEach(function(key) {
44
- _defineProperty(target, key, source[key]);
45
- });
46
- }
47
- return target;
48
- }
49
- function _toArray(arr) {
50
- return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();
51
- }
52
- function _toConsumableArray(arr) {
53
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
54
- }
55
- function _unsupportedIterableToArray(o, minLen) {
56
- if (!o) return;
57
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
58
- var n = Object.prototype.toString.call(o).slice(8, -1);
59
- if (n === "Object" && o.constructor) n = o.constructor.name;
60
- if (n === "Map" || n === "Set") return Array.from(n);
61
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
62
- }
63
1
  import path from "path";
64
2
  import { getEntryOptions, SERVER_RENDER_FUNCTION_NAME, LOADABLE_STATS_FILE, isUseSSRBundle, createRuntimeExportsUtils, isSSGEntry } from "@modern-js/utils";
65
3
  var PLUGIN_IDENTIFIER = "ssr";
@@ -126,6 +64,10 @@ var cli_default = function() {
126
64
  // ensure that all packages use the same storage in @modern-js/utils/ssr
127
65
  "@modern-js/utils/ssr": require.resolve("@modern-js/utils/ssr"),
128
66
  "@modern-js/runtime/plugins": pluginsExportsUtils.getPath()
67
+ },
68
+ globalVars: function(values, param) {
69
+ var target = param.target;
70
+ values["process.env.MODERN_TARGET"] = target === "node" || target === "service-worker" ? "node" : "browser";
129
71
  }
130
72
  },
131
73
  tools: {
@@ -140,13 +82,6 @@ var cli_default = function() {
140
82
  }
141
83
  ]);
142
84
  }
143
- var modernVars = _defineProperty({}, "process.env.MODERN_TARGET", JSON.stringify(isServer || isServiceWorker ? "node" : "browser"));
144
- chain.plugin(CHAIN_ID.PLUGIN.DEFINE).tap(function(args) {
145
- var _args = _toArray(args), vars = _args[0], rest = _args.slice(1);
146
- return [
147
- _objectSpread({}, vars, modernVars)
148
- ].concat(_toConsumableArray(rest));
149
- });
150
85
  },
151
86
  babel: babelConfig
152
87
  }
@@ -177,14 +177,20 @@ var __generator = this && this.__generator || function(thisArg, body) {
177
177
  import { jsx } from "react/jsx-runtime";
178
178
  import { loadableReady } from "@loadable/component";
179
179
  import hoistNonReactStatics from "hoist-non-react-statics";
180
+ import { parsedJSONFromElement } from "@modern-js/utils/runtime";
180
181
  import { RenderLevel } from "./serverRender/types";
181
182
  import { WithCallback } from "./react/withCallback";
182
183
  import { formatClient, mockResponse, isReact18 } from "./utils";
184
+ import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "./serverRender/utils";
183
185
  var ssr = function(config) {
184
186
  return {
185
187
  name: "@modern-js/plugin-ssr",
186
188
  setup: function() {
187
189
  var mockResp = mockResponse();
190
+ if (config.inlineScript === false) {
191
+ window._SSR_DATA = parsedJSONFromElement(SSR_DATA_JSON_ID);
192
+ window._ROUTER_DATA = parsedJSONFromElement(ROUTER_DATA_JSON_ID);
193
+ }
188
194
  return {
189
195
  client: function() {
190
196
  var _ref = _asyncToGenerator(function(param) {
@@ -83,7 +83,7 @@ function getHeadTemplate(beforeEntryTemplate, context) {
83
83
  var _cssChunks;
84
84
  var _routeManifest2_referenceCssAssets = routeManifest2.referenceCssAssets, referenceCssAssets = _routeManifest2_referenceCssAssets === void 0 ? [] : _routeManifest2_referenceCssAssets;
85
85
  var _cssChunks1 = referenceCssAssets.filter(function(asset) {
86
- return asset === null || asset === void 0 ? void 0 : asset.endsWith(".css");
86
+ return (asset === null || asset === void 0 ? void 0 : asset.endsWith(".css")) && !headTemplate2.includes(asset);
87
87
  });
88
88
  (_cssChunks = cssChunks).push.apply(_cssChunks, _toConsumableArray(_cssChunks1));
89
89
  }
@@ -178,6 +178,7 @@ import helmetReplace from "../helmet";
178
178
  import { RenderLevel } from "../types";
179
179
  import { time } from "../time";
180
180
  import prefetch from "../../prefetch";
181
+ import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../utils";
181
182
  import { toFragments } from "./template";
182
183
  import { reduce } from "./reduce";
183
184
  import * as loadableRenderer from "./loadable";
@@ -402,9 +403,12 @@ var Entry = /*#__PURE__*/ function() {
402
403
  {
403
404
  key: "getSSRDataScript",
404
405
  value: function getSSRDataScript(templateData, routerData) {
405
- var ssrDataScripts = "<script>window._SSR_DATA = ".concat(serializeJson(templateData), "</script>");
406
+ var useInlineScript = this.pluginConfig.inlineScript !== false;
407
+ var ssrData = serializeJson(templateData);
408
+ var ssrDataScripts = useInlineScript ? "<script>window._SSR_DATA = ".concat(ssrData, "</script>") : '<script type="application/json" id="'.concat(SSR_DATA_JSON_ID, '">').concat(ssrData, "</script>");
406
409
  if (routerData) {
407
- ssrDataScripts += "\n<script>window._ROUTER_DATA = ".concat(serializeJson(routerData), "</script>");
410
+ var serializedRouterData = serializeJson(routerData);
411
+ ssrDataScripts += useInlineScript ? "\n<script>window._ROUTER_DATA = ".concat(serializedRouterData, "</script>") : '\n<script type="application/json" id="'.concat(ROUTER_DATA_JSON_ID, '">').concat(serializedRouterData, "</script>");
408
412
  }
409
413
  return {
410
414
  SSRDataScript: ssrDataScripts
@@ -1,4 +1,6 @@
1
1
  var CSS_CHUNKS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
2
+ var SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
3
+ var ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
2
4
  function getLoadableScripts(extractor) {
3
5
  var check = function(scripts2) {
4
6
  return (scripts2 || "").includes("__LOADABLE_REQUIRED_CHUNKS___ext");
@@ -11,4 +13,4 @@ function getLoadableScripts(extractor) {
11
13
  return "".concat(i, "</script>");
12
14
  }).join("");
13
15
  }
14
- export { CSS_CHUNKS_PLACEHOLDER, getLoadableScripts };
16
+ export { CSS_CHUNKS_PLACEHOLDER, ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID, getLoadableScripts };
@@ -0,0 +1,17 @@
1
+ import { Fragment, jsxs } from "react/jsx-runtime";
2
+ import {
3
+ DOCUMENT_COMMENT_PLACEHOLDER_START,
4
+ DOCUMENT_COMMENT_PLACEHOLDER_END
5
+ } from "./constants";
6
+ function Comment(props) {
7
+ const { comment, children } = props;
8
+ const commentStr = encodeURIComponent(children || comment || "");
9
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
10
+ `${DOCUMENT_COMMENT_PLACEHOLDER_START}`,
11
+ `${commentStr}`,
12
+ `${DOCUMENT_COMMENT_PLACEHOLDER_END}`
13
+ ] });
14
+ }
15
+ export {
16
+ Comment
17
+ };
@@ -16,7 +16,9 @@ import {
16
16
  DOCUMENT_SSRDATASCRIPT_PLACEHOLDER,
17
17
  DOCUMENT_SCRIPT_PLACEHOLDER_START,
18
18
  DOCUMENT_SCRIPT_PLACEHOLDER_END,
19
- HTML_SEPARATOR
19
+ HTML_SEPARATOR,
20
+ DOCUMENT_COMMENT_PLACEHOLDER_START,
21
+ DOCUMENT_COMMENT_PLACEHOLDER_END
20
22
  } from "../constants";
21
23
  const debug = createDebugger("html_genarate");
22
24
  const getDocumenByEntryName = function(entrypoints, entryName, fallbackDir) {
@@ -143,7 +145,7 @@ var cli_default = () => ({
143
145
  ).join("")
144
146
  ].join("");
145
147
  if (html.includes(DOCUMENT_SCRIPT_PLACEHOLDER_START) && html.includes(DOCUMENT_SCRIPT_PLACEHOLDER_END)) {
146
- html = html.replaceAll(
148
+ html = html.replace(
147
149
  new RegExp(
148
150
  `${DOCUMENT_SCRIPT_PLACEHOLDER_START}(.*?)${DOCUMENT_SCRIPT_PLACEHOLDER_END}`,
149
151
  "g"
@@ -151,6 +153,15 @@ var cli_default = () => ({
151
153
  (_scriptStr, $1) => `<script>${decodeURIComponent($1)}</script>`
152
154
  );
153
155
  }
156
+ if (html.includes(DOCUMENT_COMMENT_PLACEHOLDER_START) && html.includes(DOCUMENT_COMMENT_PLACEHOLDER_END)) {
157
+ html = html.replace(
158
+ new RegExp(
159
+ `${DOCUMENT_COMMENT_PLACEHOLDER_START}(.*?)${DOCUMENT_COMMENT_PLACEHOLDER_END}`,
160
+ "g"
161
+ ),
162
+ (_scriptStr, $1) => `${decodeURIComponent($1)}`
163
+ );
164
+ }
154
165
  const finalHtml = `<!DOCTYPE html>${html}`.replace(DOCUMENT_META_PLACEHOLDER, metas).replace(DOCUMENT_SSR_PLACEHOLDER, HTML_SEPARATOR).replace(DOCUMENT_SCRIPTS_PLACEHOLDER, scripts).replace(DOCUMENT_LINKS_PLACEHOLDER, links).replace(
155
166
  DOCUMENT_CHUNKSMAP_PLACEHOLDER,
156
167
  PLACEHOLDER_REPLACER_MAP[DOCUMENT_CHUNKSMAP_PLACEHOLDER]
@@ -24,6 +24,12 @@ const DOCUMENT_SCRIPT_PLACEHOLDER_START = encodeURIComponent(
24
24
  const DOCUMENT_SCRIPT_PLACEHOLDER_END = encodeURIComponent(
25
25
  "<!-- script-end -->"
26
26
  );
27
+ const DOCUMENT_COMMENT_PLACEHOLDER_START = encodeURIComponent(
28
+ "<!-- comment-start -->"
29
+ );
30
+ const DOCUMENT_COMMENT_PLACEHOLDER_END = encodeURIComponent(
31
+ "<!-- comment-end -->"
32
+ );
27
33
  const PLACEHOLDER_REPLACER_MAP = {
28
34
  [DOCUMENT_NO_SCRIPTE_PLACEHOLDER]: `We're sorry but react app doesn't work properly without JavaScript enabled. Please enable it to continue.`,
29
35
  [DOCUMENT_SSR_PLACEHOLDER]: HTML_SEPARATOR,
@@ -32,6 +38,8 @@ const PLACEHOLDER_REPLACER_MAP = {
32
38
  };
33
39
  export {
34
40
  DOCUMENT_CHUNKSMAP_PLACEHOLDER,
41
+ DOCUMENT_COMMENT_PLACEHOLDER_END,
42
+ DOCUMENT_COMMENT_PLACEHOLDER_START,
35
43
  DOCUMENT_FILE_NAME,
36
44
  DOCUMENT_LINKS_PLACEHOLDER,
37
45
  DOCUMENT_META_PLACEHOLDER,
@@ -5,6 +5,7 @@ export * from "./Head";
5
5
  export * from "./Body";
6
6
  export * from "./Root";
7
7
  export * from "./Links";
8
+ export * from "./Comment";
8
9
  export * from "./Scripts";
9
10
  export * from "./Script";
10
11
  export * from "./constants";
@@ -0,0 +1,5 @@
1
+ import { createWaterfall } from "@modern-js/plugin";
2
+ const modifyRoutes = createWaterfall();
3
+ export {
4
+ modifyRoutes
5
+ };
@@ -54,7 +54,8 @@ import {
54
54
  matchPath,
55
55
  matchRoutes,
56
56
  renderMatches,
57
- resolvePath
57
+ resolvePath,
58
+ createPath
58
59
  } from "react-router-dom";
59
60
  import { defer, json, redirect } from "@modern-js/utils/universal/remix-router";
60
61
  export {
@@ -75,6 +76,7 @@ export {
75
76
  createBrowserRouter,
76
77
  createHashRouter,
77
78
  createMemoryRouter,
79
+ createPath,
78
80
  createRoutesFromChildren,
79
81
  createRoutesFromElements,
80
82
  createSearchParams,
@@ -8,6 +8,8 @@ import {
8
8
  useLocation
9
9
  } from "react-router-dom";
10
10
  import hoistNonReactStatics from "hoist-non-react-statics";
11
+ import { parsedJSONFromElement } from "@modern-js/utils/runtime";
12
+ import { modifyRoutes as modifyRoutesHook } from "./hooks";
11
13
  import { deserializeErrors, renderRoutes, urlJoin } from "./utils";
12
14
  let finalRouteConfig = {
13
15
  routes: []
@@ -34,9 +36,13 @@ const routerPlugin = ({
34
36
  const select = (pathname) => serverBase.find((baseUrl) => pathname.search(baseUrl) === 0) || "/";
35
37
  let routes = [];
36
38
  finalRouteConfig = routesConfig;
39
+ window._SERVER_DATA = parsedJSONFromElement("__MODERN_SERVER_DATA__");
37
40
  return {
38
41
  name: "@modern-js/plugin-router",
39
- setup: () => {
42
+ registerHook: {
43
+ modifyRoutes: modifyRoutesHook
44
+ },
45
+ setup: (api) => {
40
46
  return {
41
47
  init({ context }, next) {
42
48
  context.router = {
@@ -64,6 +70,8 @@ const routerPlugin = ({
64
70
  props
65
71
  })
66
72
  );
73
+ const runner = api.useHookRunners();
74
+ routes = runner.modifyRoutes(routes);
67
75
  const baseUrl = ((_a = window._SERVER_DATA) == null ? void 0 : _a.router.baseUrl) || select(location.pathname);
68
76
  const _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
69
77
  let hydrationData = window._ROUTER_DATA;
@@ -83,7 +91,10 @@ const routerPlugin = ({
83
91
  return /* @__PURE__ */ jsx(App, { ...props, children: /* @__PURE__ */ jsx(RouterProvider, { router }) });
84
92
  };
85
93
  };
86
- const RouteApp = getRouteApp();
94
+ let RouteApp = getRouteApp();
95
+ if (App) {
96
+ RouteApp = hoistNonReactStatics(RouteApp, App);
97
+ }
87
98
  if (routesConfig == null ? void 0 : routesConfig.globalApp) {
88
99
  return next({
89
100
  App: hoistNonReactStatics(RouteApp, routesConfig.globalApp)
@@ -10,6 +10,7 @@ import { createRoutesFromElements } from "react-router-dom";
10
10
  import { RuntimeReactContext } from "../../core";
11
11
  import { renderRoutes, urlJoin } from "./utils";
12
12
  import { installGlobals } from "./fetch";
13
+ import { modifyRoutes as modifyRoutesHook } from "./hooks";
13
14
  installGlobals();
14
15
  function createFetchRequest(req) {
15
16
  const origin = `${req.protocol}://${req.host}`;
@@ -44,7 +45,10 @@ const routerPlugin = ({
44
45
  }) => {
45
46
  return {
46
47
  name: "@modern-js/plugin-router",
47
- setup: () => {
48
+ registerHook: {
49
+ modifyRoutes: modifyRoutesHook
50
+ },
51
+ setup: (api) => {
48
52
  return {
49
53
  async init({ context }, next) {
50
54
  if (!routesConfig && !createRoutes) {
@@ -72,6 +76,8 @@ const routerPlugin = ({
72
76
  context.routerContext = routerContext;
73
77
  context.routes = routes;
74
78
  context.routeManifest = context.ssrContext.routeManifest;
79
+ const runner = api.useHookRunners();
80
+ runner.modifyRoutes(routes);
75
81
  return next({ context });
76
82
  },
77
83
  hoc: ({ App }, next) => {
@@ -55,6 +55,9 @@ var cli_default = () => ({
55
55
  // ensure that all packages use the same storage in @modern-js/utils/ssr
56
56
  "@modern-js/utils/ssr": require.resolve("@modern-js/utils/ssr"),
57
57
  "@modern-js/runtime/plugins": pluginsExportsUtils.getPath()
58
+ },
59
+ globalVars: (values, { target }) => {
60
+ values["process.env.MODERN_TARGET"] = target === "node" || target === "service-worker" ? "node" : "browser";
58
61
  }
59
62
  },
60
63
  tools: {
@@ -66,21 +69,6 @@ var cli_default = () => ({
66
69
  { filename: LOADABLE_STATS_FILE }
67
70
  ]);
68
71
  }
69
- const modernVars = {
70
- [`process.env.MODERN_TARGET`]: JSON.stringify(
71
- isServer || isServiceWorker ? "node" : "browser"
72
- )
73
- };
74
- chain.plugin(CHAIN_ID.PLUGIN.DEFINE).tap((args) => {
75
- const [vars, ...rest] = args;
76
- return [
77
- {
78
- ...vars,
79
- ...modernVars
80
- },
81
- ...rest
82
- ];
83
- });
84
72
  },
85
73
  babel: babelConfig
86
74
  }
@@ -1,15 +1,21 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { loadableReady } from "@loadable/component";
3
3
  import hoistNonReactStatics from "hoist-non-react-statics";
4
+ import { parsedJSONFromElement } from "@modern-js/utils/runtime";
4
5
  import {
5
6
  RenderLevel
6
7
  } from "./serverRender/types";
7
8
  import { WithCallback } from "./react/withCallback";
8
9
  import { formatClient, mockResponse, isReact18 } from "./utils";
10
+ import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "./serverRender/utils";
9
11
  const ssr = (config) => ({
10
12
  name: "@modern-js/plugin-ssr",
11
13
  setup: () => {
12
14
  const mockResp = mockResponse();
15
+ if (config.inlineScript === false) {
16
+ window._SSR_DATA = parsedJSONFromElement(SSR_DATA_JSON_ID);
17
+ window._ROUTER_DATA = parsedJSONFromElement(ROUTER_DATA_JSON_ID);
18
+ }
13
19
  return {
14
20
  client: async ({ App, context, ModernRender, ModernHydrate }) => {
15
21
  var _a;
@@ -44,7 +44,7 @@ function getHeadTemplate(beforeEntryTemplate, context) {
44
44
  if (routeManifest2) {
45
45
  const { referenceCssAssets = [] } = routeManifest2;
46
46
  const _cssChunks = referenceCssAssets.filter(
47
- (asset) => asset == null ? void 0 : asset.endsWith(".css")
47
+ (asset) => (asset == null ? void 0 : asset.endsWith(".css")) && !headTemplate2.includes(asset)
48
48
  );
49
49
  cssChunks.push(..._cssChunks);
50
50
  }
@@ -9,6 +9,7 @@ import {
9
9
  } from "../types";
10
10
  import { time } from "../time";
11
11
  import prefetch from "../../prefetch";
12
+ import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../utils";
12
13
  import { toFragments } from "./template";
13
14
  import { reduce } from "./reduce";
14
15
  import * as loadableRenderer from "./loadable";
@@ -142,14 +143,14 @@ class Entry {
142
143
  return html;
143
144
  }
144
145
  getSSRDataScript(templateData, routerData) {
145
- let ssrDataScripts = `<script>window._SSR_DATA = ${serializeJson(
146
- templateData
147
- )}</script>`;
146
+ const useInlineScript = this.pluginConfig.inlineScript !== false;
147
+ const ssrData = serializeJson(templateData);
148
+ let ssrDataScripts = useInlineScript ? `<script>window._SSR_DATA = ${ssrData}</script>` : `<script type="application/json" id="${SSR_DATA_JSON_ID}">${ssrData}</script>`;
148
149
  if (routerData) {
149
- ssrDataScripts += `
150
- <script>window._ROUTER_DATA = ${serializeJson(
151
- routerData
152
- )}</script>`;
150
+ const serializedRouterData = serializeJson(routerData);
151
+ ssrDataScripts += useInlineScript ? `
152
+ <script>window._ROUTER_DATA = ${serializedRouterData}</script>` : `
153
+ <script type="application/json" id="${ROUTER_DATA_JSON_ID}">${serializedRouterData}</script>`;
153
154
  }
154
155
  return {
155
156
  SSRDataScript: ssrDataScripts
@@ -1,4 +1,6 @@
1
1
  const CSS_CHUNKS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
2
+ const SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
3
+ const ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
2
4
  function getLoadableScripts(extractor) {
3
5
  const check = (scripts2) => (scripts2 || "").includes("__LOADABLE_REQUIRED_CHUNKS___ext");
4
6
  const scripts = extractor.getScriptTags();
@@ -9,5 +11,7 @@ function getLoadableScripts(extractor) {
9
11
  }
10
12
  export {
11
13
  CSS_CHUNKS_PLACEHOLDER,
14
+ ROUTER_DATA_JSON_ID,
15
+ SSR_DATA_JSON_ID,
12
16
  getLoadableScripts
13
17
  };
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ export declare function Comment(props: {
3
+ comment?: string;
4
+ children?: 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_COMMENT_PLACEHOLDER_START: string;
16
+ export declare const DOCUMENT_COMMENT_PLACEHOLDER_END: string;
15
17
  export declare const PLACEHOLDER_REPLACER_MAP: {
16
18
  [x: string]: string;
17
19
  };
@@ -5,6 +5,7 @@ export * from './Head';
5
5
  export * from './Body';
6
6
  export * from './Root';
7
7
  export * from './Links';
8
+ export * from './Comment';
8
9
  export * from './Scripts';
9
10
  export * from './Script';
10
11
  export * from './constants';
@@ -0,0 +1,3 @@
1
+ import { RouteObject } from 'react-router-dom';
2
+ declare const modifyRoutes: import("@modern-js/plugin").Waterfall<RouteObject[]>;
3
+ export { modifyRoutes };
@@ -7,5 +7,5 @@ export * from './withRouter';
7
7
  export { Link, NavLink } from './PrefetchLink';
8
8
  export type { LinkProps, NavLinkProps } from './PrefetchLink';
9
9
  export type { FormEncType, FormMethod, GetScrollRestorationKeyFunction, ParamKeyValuePair, SubmitOptions, URLSearchParamsInit, FetcherWithComponents, BrowserRouterProps, HashRouterProps, HistoryRouterProps, FormProps, ScrollRestorationProps, SubmitFunction, ActionFunction, ActionFunctionArgs, AwaitProps, unstable_Blocker, unstable_BlockerFunction, DataRouteMatch, DataRouteObject, Fetcher, Hash, IndexRouteObject, IndexRouteProps, JsonFunction, LayoutRouteProps, LoaderFunction, LoaderFunctionArgs, Location, MemoryRouterProps, NavigateFunction, NavigateOptions, NavigateProps, Navigation, Navigator, NonIndexRouteObject, OutletProps, Params, ParamParseKey, Path, PathMatch, Pathname, PathPattern, PathRouteProps, RedirectFunction, RelativeRoutingType, RouteMatch, RouteObject, RouteProps, RouterProps, RouterProviderProps, RoutesProps, Search, ShouldRevalidateFunction, To } from 'react-router-dom';
10
- export { createBrowserRouter, createHashRouter, createMemoryRouter, RouterProvider, BrowserRouter, HashRouter, MemoryRouter, Router, Await, Form, Navigate, Outlet, Route, Routes, ScrollRestoration, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit, createRoutesFromChildren, createRoutesFromElements, createSearchParams, generatePath, isRouteErrorResponse, matchPath, matchRoutes, renderMatches, resolvePath } from 'react-router-dom';
10
+ export { createBrowserRouter, createHashRouter, createMemoryRouter, RouterProvider, BrowserRouter, HashRouter, MemoryRouter, Router, Await, Form, Navigate, Outlet, Route, Routes, ScrollRestoration, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit, createRoutesFromChildren, createRoutesFromElements, createSearchParams, generatePath, isRouteErrorResponse, matchPath, matchRoutes, renderMatches, resolvePath, createPath } from 'react-router-dom';
11
11
  export { defer, json, redirect } from '@modern-js/utils/universal/remix-router';
@@ -1,3 +1,5 @@
1
1
  import type { ChunkExtractor } from '@loadable/server';
2
2
  export declare const CSS_CHUNKS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
3
+ export declare const SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
4
+ export declare const ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
3
5
  export declare function getLoadableScripts(extractor: ChunkExtractor): string;
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "modern",
12
12
  "modern.js"
13
13
  ],
14
- "version": "2.13.4",
14
+ "version": "2.14.0",
15
15
  "engines": {
16
16
  "node": ">=14.17.6"
17
17
  },
@@ -158,9 +158,9 @@
158
158
  "react-side-effect": "^2.1.1",
159
159
  "redux-logger": "^3.0.6",
160
160
  "styled-components": "^5.3.1",
161
- "@modern-js/plugin": "2.13.4",
162
- "@modern-js/types": "2.13.4",
163
- "@modern-js/utils": "2.13.4"
161
+ "@modern-js/plugin": "2.14.0",
162
+ "@modern-js/types": "2.14.0",
163
+ "@modern-js/utils": "2.14.0"
164
164
  },
165
165
  "peerDependencies": {
166
166
  "react": ">=17",
@@ -181,11 +181,11 @@
181
181
  "react-dom": "^18",
182
182
  "ts-jest": "^29.0.5",
183
183
  "typescript": "^4",
184
- "@modern-js/app-tools": "2.13.4",
185
- "@modern-js/core": "2.13.4",
186
- "@modern-js/server-core": "2.13.4",
187
- "@scripts/build": "2.13.4",
188
- "@scripts/jest-config": "2.13.4"
184
+ "@modern-js/app-tools": "2.14.0",
185
+ "@modern-js/core": "2.14.0",
186
+ "@modern-js/server-core": "2.14.0",
187
+ "@scripts/build": "2.14.0",
188
+ "@scripts/jest-config": "2.14.0"
189
189
  },
190
190
  "sideEffects": false,
191
191
  "modernConfig": {},