@modern-js/runtime 2.42.1 → 2.43.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 (57) hide show
  1. package/dist/cjs/cli/index.js +2 -3
  2. package/dist/cjs/ssr/cli/index.js +6 -4
  3. package/dist/cjs/ssr/index.js +11 -3
  4. package/dist/cjs/ssr/react/prerender/index.js +1 -0
  5. package/dist/cjs/ssr/serverRender/{renderToString/type.js → constants.js} +21 -11
  6. package/dist/cjs/ssr/serverRender/helmet.js +5 -4
  7. package/dist/cjs/ssr/serverRender/index.js +2 -2
  8. package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +2 -1
  9. package/dist/cjs/ssr/serverRender/renderToStream/bulidTemplate.before.js +2 -1
  10. package/dist/cjs/ssr/serverRender/renderToStream/index.js +0 -5
  11. package/dist/cjs/ssr/serverRender/renderToString/buildHtml.js +6 -8
  12. package/dist/cjs/ssr/serverRender/renderToString/entry.js +15 -13
  13. package/dist/cjs/ssr/serverRender/renderToString/index.js +0 -5
  14. package/dist/cjs/ssr/serverRender/types.js +7 -2
  15. package/dist/cjs/ssr/serverRender/utils.js +7 -11
  16. package/dist/esm/cli/index.js +2 -3
  17. package/dist/esm/ssr/cli/index.js +6 -4
  18. package/dist/esm/ssr/index.js +10 -2
  19. package/dist/esm/ssr/react/prerender/index.js +1 -0
  20. package/dist/esm/ssr/serverRender/constants.js +14 -0
  21. package/dist/esm/ssr/serverRender/helmet.js +5 -4
  22. package/dist/esm/ssr/serverRender/index.js +2 -2
  23. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.js +3 -2
  24. package/dist/esm/ssr/serverRender/renderToStream/bulidTemplate.before.js +3 -2
  25. package/dist/esm/ssr/serverRender/renderToStream/index.js +0 -5
  26. package/dist/esm/ssr/serverRender/renderToString/buildHtml.js +6 -8
  27. package/dist/esm/ssr/serverRender/renderToString/entry.js +21 -15
  28. package/dist/esm/ssr/serverRender/renderToString/index.js +1 -6
  29. package/dist/esm/ssr/serverRender/types.js +6 -1
  30. package/dist/esm/ssr/serverRender/utils.js +7 -7
  31. package/dist/esm-node/cli/index.js +2 -3
  32. package/dist/esm-node/ssr/cli/index.js +6 -4
  33. package/dist/esm-node/ssr/index.js +9 -1
  34. package/dist/esm-node/ssr/react/prerender/index.js +1 -0
  35. package/dist/esm-node/ssr/serverRender/constants.js +14 -0
  36. package/dist/esm-node/ssr/serverRender/helmet.js +5 -4
  37. package/dist/esm-node/ssr/serverRender/index.js +2 -2
  38. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.js +3 -2
  39. package/dist/esm-node/ssr/serverRender/renderToStream/bulidTemplate.before.js +3 -2
  40. package/dist/esm-node/ssr/serverRender/renderToStream/index.js +0 -5
  41. package/dist/esm-node/ssr/serverRender/renderToString/buildHtml.js +6 -8
  42. package/dist/esm-node/ssr/serverRender/renderToString/entry.js +14 -12
  43. package/dist/esm-node/ssr/serverRender/renderToString/index.js +0 -5
  44. package/dist/esm-node/ssr/serverRender/types.js +6 -1
  45. package/dist/esm-node/ssr/serverRender/utils.js +5 -7
  46. package/dist/types/exports/server.d.ts +1 -0
  47. package/dist/types/ssr/react/prerender/index.d.ts +4 -0
  48. package/dist/types/ssr/serverRender/constants.d.ts +6 -0
  49. package/dist/types/ssr/serverRender/renderToString/entry.d.ts +1 -2
  50. package/dist/types/ssr/serverRender/renderToString/loadable.d.ts +1 -2
  51. package/dist/types/ssr/serverRender/renderToString/styledComponent.d.ts +1 -1
  52. package/dist/types/ssr/serverRender/types.d.ts +15 -2
  53. package/dist/types/ssr/serverRender/utils.d.ts +7 -3
  54. package/package.json +12 -12
  55. package/dist/esm/ssr/serverRender/renderToString/type.js +0 -9
  56. package/dist/esm-node/ssr/serverRender/renderToString/type.js +0 -9
  57. package/dist/types/ssr/serverRender/renderToString/type.d.ts +0 -13
@@ -3,7 +3,8 @@ import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
3
3
  import ReactHelmet from "react-helmet";
4
4
  import { matchRoutes } from "@modern-js/runtime-utils/router";
5
5
  import helmetReplace from "../helmet";
6
- import { CSS_CHUNKS_PLACEHOLDER } from "../utils";
6
+ import { CHUNK_CSS_PLACEHOLDER } from "../constants";
7
+ import { safeReplace } from "../utils";
7
8
  import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
8
9
  function getHeadTemplate(beforeEntryTemplate, context) {
9
10
  var callbacks = [
@@ -20,7 +21,7 @@ function getHeadTemplate(beforeEntryTemplate, context) {
20
21
  }
21
22
  return buildTemplate(headTemplate, callbacks);
22
23
  function injectCss(headTemplate2) {
23
- return headTemplate2.replace(CSS_CHUNKS_PLACEHOLDER, getCssChunks());
24
+ return safeReplace(headTemplate2, CHUNK_CSS_PLACEHOLDER, getCssChunks());
24
25
  function getCssChunks() {
25
26
  var routeManifest = context.routeManifest, routerContext = context.routerContext, routes = context.routes;
26
27
  if (!routeManifest || !routerContext || !routes) {
@@ -3,7 +3,6 @@ import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
3
3
  import { createElement } from "react";
4
4
  import { run } from "@modern-js/runtime-utils/node";
5
5
  import { time } from "@modern-js/runtime-utils/time";
6
- import { PreRender } from "../../react/prerender";
7
6
  import { SSRErrors, SSRTimings } from "../tracker";
8
7
  import renderToPipe from "./renderToPipe";
9
8
  var render = function(param) {
@@ -24,10 +23,6 @@ var render = function(param) {
24
23
  tracker = ssrContext.tracker;
25
24
  pipe = renderToPipe(rootElement, context, {
26
25
  onShellReady: function onShellReady() {
27
- var cacheConfig = PreRender.config();
28
- if (cacheConfig) {
29
- ssrContext.cacheConfig = cacheConfig;
30
- }
31
26
  var cost = end();
32
27
  tracker.trackTiming(SSRTimings.RENDER_SHELL, cost);
33
28
  },
@@ -1,30 +1,28 @@
1
+ import { safeReplace } from "../utils";
2
+ import { HTML_PLACEHOLDER, SSR_DATA_PLACEHOLDER, CHUNK_JS_PLACEHOLDER, CHUNK_CSS_PLACEHOLDER } from "../constants";
1
3
  function buildHtml(template, callbacks) {
2
4
  return callbacks.reduce(function(tmp, cb) {
3
5
  return cb(tmp);
4
6
  }, template);
5
7
  }
6
8
  function createReplaceHtml(html) {
7
- var HTML_REG = /<!--<\?-\s*html\s*\?>-->/;
8
9
  return function(template) {
9
- return template.replace(HTML_REG, html);
10
+ return safeReplace(template, HTML_PLACEHOLDER, html);
10
11
  };
11
12
  }
12
13
  function createReplaceSSRDataScript(data) {
13
- var SSR_DATA_REG = /<!--<\?-\s*SSRDataScript\s*\?>-->/;
14
14
  return function(template) {
15
- return template.replace(SSR_DATA_REG, data);
15
+ return safeReplace(template, SSR_DATA_PLACEHOLDER, data);
16
16
  };
17
17
  }
18
18
  function createReplaceChunkJs(js) {
19
- var CHUNK_JS_REG = /<!--<\?-\s*chunksMap\.js\s*\?>-->/;
20
19
  return function(template) {
21
- return template.replace(CHUNK_JS_REG, js);
20
+ return safeReplace(template, CHUNK_JS_PLACEHOLDER, js);
22
21
  };
23
22
  }
24
23
  function createReplaceChunkCss(css) {
25
- var CHUNK_CSS_REG = /<!--<\?-\s*chunksMap\.css\s*\?>-->/;
26
24
  return function(template) {
27
- return template.replace(CHUNK_CSS_REG, css);
25
+ return safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
28
26
  };
29
27
  }
30
28
  export {
@@ -2,7 +2,7 @@ import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
2
  import { _ as _class_call_check } from "@swc/helpers/_/_class_call_check";
3
3
  import { _ as _create_class } from "@swc/helpers/_/_create_class";
4
4
  import { _ as _define_property } from "@swc/helpers/_/_define_property";
5
- import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
5
+ import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
6
6
  import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
7
7
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
8
8
  import React from "react";
@@ -13,27 +13,34 @@ import { serializeErrors } from "../../../router/runtime/utils";
13
13
  import helmetReplace from "../helmet";
14
14
  import { RenderLevel } from "../types";
15
15
  import prefetch from "../../prefetch";
16
- import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID, attributesToString } from "../utils";
16
+ import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../constants";
17
+ import { attributesToString } from "../utils";
17
18
  import { SSRErrors, SSRTimings } from "../tracker";
18
19
  import { createLoadableCollector } from "./loadable";
19
20
  import { createRender } from "./render";
20
21
  import { createStyledCollector } from "./styledComponent";
21
22
  import { buildHtml, createReplaceChunkCss, createReplaceChunkJs, createReplaceHtml, createReplaceSSRDataScript } from "./buildHtml";
22
- var buildTemplateData = function(context, data, renderLevel, tracker) {
23
- var request = context.request, enableUnsafeCtx = context.enableUnsafeCtx;
24
- var unsafeContext = {
25
- headers: request.headers
26
- };
23
+ var buildTemplateData = function(context, data, renderLevel, tracker, config) {
24
+ var request = context.request;
25
+ var unsafeHeaders = config.unsafeHeaders;
26
+ var headers = unsafeHeaders ? Object.fromEntries(Object.entries(request.headers).filter(function(param) {
27
+ var _param = _sliced_to_array(param, 2), key = _param[0], _ = _param[1];
28
+ var _unsafeHeaders_map;
29
+ return unsafeHeaders === null || unsafeHeaders === void 0 ? void 0 : (_unsafeHeaders_map = unsafeHeaders.map(function(header) {
30
+ return header.toLowerCase();
31
+ })) === null || _unsafeHeaders_map === void 0 ? void 0 : _unsafeHeaders_map.includes(key.toLowerCase());
32
+ })) : void 0;
27
33
  return {
28
34
  data,
29
35
  context: {
30
- request: _object_spread({
36
+ request: {
31
37
  params: request.params,
32
38
  query: request.query,
33
39
  pathname: request.pathname,
34
40
  host: request.host,
35
- url: request.url
36
- }, enableUnsafeCtx ? unsafeContext : {}),
41
+ url: request.url,
42
+ headers
43
+ },
37
44
  reporter: {
38
45
  sessionId: tracker.sessionId
39
46
  }
@@ -41,8 +48,7 @@ var buildTemplateData = function(context, data, renderLevel, tracker) {
41
48
  renderLevel
42
49
  };
43
50
  };
44
- var Entry;
45
- Entry = /* @__PURE__ */ function() {
51
+ var Entry = /* @__PURE__ */ function() {
46
52
  "use strict";
47
53
  function Entry2(options) {
48
54
  _class_call_check(this, Entry2);
@@ -130,13 +136,13 @@ Entry = /* @__PURE__ */ function() {
130
136
  loaderData: routerContext.loaderData,
131
137
  errors: serializeErrors(routerContext.errors)
132
138
  } : void 0;
133
- templateData = buildTemplateData(ssrContext, prefetchData, _this.result.renderLevel, _this.tracker);
139
+ templateData = buildTemplateData(ssrContext, prefetchData, _this.result.renderLevel, _this.tracker, _this.pluginConfig);
134
140
  ssrDataScripts = _this.getSSRDataScript(templateData, routerData);
135
141
  html = buildHtml(_this.template, [
136
142
  createReplaceChunkCss(_this.result.chunksMap.css),
137
143
  createReplaceChunkJs(_this.result.chunksMap.js),
138
- createReplaceHtml(_this.result.html || ""),
139
- createReplaceSSRDataScript(ssrDataScripts)
144
+ createReplaceSSRDataScript(ssrDataScripts),
145
+ createReplaceHtml(_this.result.html || "")
140
146
  ].concat(_to_consumable_array(_this.htmlModifiers)));
141
147
  helmetData = ReactHelmet.renderStatic();
142
148
  return [
@@ -1,13 +1,12 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
2
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
3
3
  import { run } from "@modern-js/runtime-utils/node";
4
- import { PreRender } from "../../react/prerender";
5
4
  import SSREntry from "./entry";
6
5
  var render = function(param) {
7
6
  var App = param.App, context = param.context, config = param.config;
8
7
  var ssrContext = context.ssrContext;
9
8
  return run(ssrContext.request.headers, /* @__PURE__ */ _async_to_generator(function() {
10
- var entry, html, cacheConfig;
9
+ var entry, html;
11
10
  return _ts_generator(this, function(_state) {
12
11
  switch (_state.label) {
13
12
  case 0:
@@ -23,10 +22,6 @@ var render = function(param) {
23
22
  ];
24
23
  case 1:
25
24
  html = _state.sent();
26
- cacheConfig = PreRender.config();
27
- if (cacheConfig) {
28
- context.ssrContext.cacheConfig = cacheConfig;
29
- }
30
25
  return [
31
26
  2,
32
27
  html
@@ -1,4 +1,9 @@
1
- import { RenderLevel } from "./renderToString/type";
1
+ var RenderLevel;
2
+ (function(RenderLevel2) {
3
+ RenderLevel2[RenderLevel2["CLIENT_RENDER"] = 0] = "CLIENT_RENDER";
4
+ RenderLevel2[RenderLevel2["SERVER_PREFETCH"] = 1] = "SERVER_PREFETCH";
5
+ RenderLevel2[RenderLevel2["SERVER_RENDER"] = 2] = "SERVER_RENDER";
6
+ })(RenderLevel || (RenderLevel = {}));
2
7
  export {
3
8
  RenderLevel
4
9
  };
@@ -1,16 +1,16 @@
1
1
  import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
2
- var CSS_CHUNKS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
3
- var SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
4
- var ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
5
2
  function attributesToString(attributes) {
6
3
  return Object.entries(attributes).reduce(function(str, param) {
7
4
  var _param = _sliced_to_array(param, 2), key = _param[0], value = _param[1];
8
5
  return value === void 0 ? str : "".concat(str, " ").concat(key, '="').concat(value, '"');
9
6
  }, "");
10
7
  }
8
+ function safeReplace(source, searchValue, replaceValue) {
9
+ return source.replace(searchValue, function() {
10
+ return replaceValue;
11
+ });
12
+ }
11
13
  export {
12
- CSS_CHUNKS_PLACEHOLDER,
13
- ROUTER_DATA_JSON_ID,
14
- SSR_DATA_JSON_ID,
15
- attributesToString
14
+ attributesToString,
15
+ safeReplace
16
16
  };
@@ -1,4 +1,3 @@
1
- import path from "path";
2
1
  import { isReact18, cleanRequireCache } from "@modern-js/utils";
3
2
  import { statePlugin } from "../state/cli";
4
3
  import { ssrPlugin } from "../ssr/cli";
@@ -23,8 +22,8 @@ const runtimePlugin = () => ({
23
22
  setup: (api) => {
24
23
  return {
25
24
  config() {
26
- const dir = api.useAppContext().internalDirectory || "";
27
- process.env.IS_REACT18 = isReact18(path.join(dir, "../../")).toString();
25
+ const appDir = api.useAppContext().appDirectory;
26
+ process.env.IS_REACT18 = isReact18(appDir).toString();
28
27
  return {
29
28
  runtime: {},
30
29
  runtimeByEntries: {},
@@ -70,11 +70,11 @@ const ssrPlugin = () => ({
70
70
  }
71
71
  },
72
72
  tools: {
73
- bundlerChain(chain, { isServer, isServiceWorker, CHAIN_ID }) {
73
+ bundlerChain(chain, { isServer, isServiceWorker }) {
74
74
  const userConfig = api.useResolvedConfigContext();
75
75
  if (isUseSSRBundle(userConfig) && !isServer && !isServiceWorker && checkUseStringSSR(userConfig)) {
76
76
  const LoadableBundlerPlugin = require("./loadable-bundler-plugin.js");
77
- chain.plugin(CHAIN_ID.PLUGIN.LOADABLE).use(LoadableBundlerPlugin, [
77
+ chain.plugin("loadable").use(LoadableBundlerPlugin, [
78
78
  {
79
79
  filename: LOADABLE_STATS_FILE
80
80
  }
@@ -120,12 +120,13 @@ const ssrPlugin = () => ({
120
120
  },
121
121
  modifyEntryRuntimePlugins({ entrypoint, plugins, bundlerConfigs }) {
122
122
  if (ssrConfigMap.get(entrypoint.entryName)) {
123
- var _bundlerConfigs_find_output, _bundlerConfigs_find, _config_server;
123
+ var _bundlerConfigs_find_output, _bundlerConfigs_find, _config_server, _config_server1;
124
124
  const chunkLoadingGlobal = bundlerConfigs === null || bundlerConfigs === void 0 ? void 0 : (_bundlerConfigs_find = bundlerConfigs.find((config2) => config2.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;
125
125
  const config = api.useResolvedConfigContext();
126
126
  const { enableInlineScripts, enableInlineStyles } = config.output;
127
127
  const { crossorigin, scriptLoading } = config.html;
128
128
  const disablePrerender = typeof ((_config_server = config.server) === null || _config_server === void 0 ? void 0 : _config_server.ssr) === "object" ? Boolean(config.server.ssr.disablePrerender) : false;
129
+ const unsafeHeaders = typeof ((_config_server1 = config.server) === null || _config_server1 === void 0 ? void 0 : _config_server1.ssr) === "object" ? config.server.ssr.unsafeHeaders : void 0;
129
130
  plugins.push({
130
131
  name: PLUGIN_IDENTIFIER,
131
132
  options: JSON.stringify({
@@ -135,7 +136,8 @@ const ssrPlugin = () => ({
135
136
  chunkLoadingGlobal,
136
137
  disablePrerender,
137
138
  enableInlineScripts: typeof enableInlineScripts === "function" ? void 0 : enableInlineScripts,
138
- enableInlineStyles: typeof enableInlineStyles === "function" ? void 0 : enableInlineStyles
139
+ enableInlineStyles: typeof enableInlineStyles === "function" ? void 0 : enableInlineStyles,
140
+ unsafeHeaders
139
141
  })
140
142
  });
141
143
  }
@@ -5,7 +5,7 @@ import { parsedJSONFromElement } from "@modern-js/runtime-utils/parsed";
5
5
  import { RenderLevel } from "./serverRender/types";
6
6
  import { WithCallback } from "./react/withCallback";
7
7
  import { formatClient, mockResponse, isReact18 } from "./utils";
8
- import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "./serverRender/utils";
8
+ import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "./serverRender/constants";
9
9
  const ssr = (config) => ({
10
10
  name: "@modern-js/plugin-ssr",
11
11
  setup: () => {
@@ -24,6 +24,14 @@ const ssr = (config) => ({
24
24
  },
25
25
  _hydration: true
26
26
  };
27
+ const { ssrContext } = hydrateContext;
28
+ const { pathname: initialPathname } = ssrContext.request;
29
+ const currentPathname = window.location.pathname;
30
+ if (initialPathname !== currentPathname) {
31
+ const errorMsg = `The initial URL ${initialPathname} and the URL ${currentPathname} to be hydrated do not match, reload.`;
32
+ console.error(errorMsg);
33
+ window.location.reload();
34
+ }
27
35
  const callback = () => {
28
36
  delete hydrateContext._hydration;
29
37
  };
@@ -68,6 +68,7 @@ function factory(Component) {
68
68
  if (!validate) {
69
69
  throw new Error("invalid props, check usage");
70
70
  }
71
+ console.error("[Warn] PreRender has been deprecated, please use SSR Cache instead. reference to docs: https://modernjs.dev/guides/advanced-features/ssr.html");
71
72
  return createElement(Component, {
72
73
  ...newProps
73
74
  });
@@ -0,0 +1,14 @@
1
+ const HTML_PLACEHOLDER = "<!--<?- html ?>-->";
2
+ const SSR_DATA_PLACEHOLDER = "<!--<?- SSRDataScript ?>-->";
3
+ const CHUNK_JS_PLACEHOLDER = "<!--<?- chunksMap.js ?>-->";
4
+ const CHUNK_CSS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
5
+ const SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
6
+ const ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
7
+ export {
8
+ CHUNK_CSS_PLACEHOLDER,
9
+ CHUNK_JS_PLACEHOLDER,
10
+ HTML_PLACEHOLDER,
11
+ ROUTER_DATA_JSON_ID,
12
+ SSR_DATA_JSON_ID,
13
+ SSR_DATA_PLACEHOLDER
14
+ };
@@ -1,4 +1,5 @@
1
1
  import { EOL } from "os";
2
+ import { safeReplace } from "./utils";
2
3
  const RE_HTML_ATTR = /<html[^>]*>/;
3
4
  const RE_BODY_ATTR = /<body[^>]*>/;
4
5
  const RE_LAST_IN_HEAD = /<\/head>/;
@@ -8,11 +9,11 @@ function helmet(content, helmetData) {
8
9
  let result = content;
9
10
  const bodyAttributes = helmetData.bodyAttributes.toString();
10
11
  if (bodyAttributes) {
11
- result = result.replace(RE_BODY_ATTR, `<body ${bodyAttributes}>`);
12
+ result = safeReplace(result, RE_BODY_ATTR, `<body ${bodyAttributes}>`);
12
13
  }
13
14
  const htmlAttributes = helmetData.htmlAttributes.toString();
14
15
  if (htmlAttributes) {
15
- result = result.replace(RE_HTML_ATTR, `<html ${htmlAttributes}>`);
16
+ result = safeReplace(result, RE_HTML_ATTR, `<html ${htmlAttributes}>`);
16
17
  }
17
18
  const base = helmetData.base.toString();
18
19
  const link = helmetData.link.toString();
@@ -24,7 +25,7 @@ function helmet(content, helmetData) {
24
25
  const existTitleTag = RE_TITLE.test(content);
25
26
  const shouldReplaceTitle = existTitleTag && TEST_TITLE_CONTENT.test(title.trim());
26
27
  if (shouldReplaceTitle) {
27
- result = result.replace(RE_TITLE, title);
28
+ result = safeReplace(result, RE_TITLE, title);
28
29
  }
29
30
  const helmetStr = [
30
31
  base,
@@ -37,7 +38,7 @@ function helmet(content, helmetData) {
37
38
  ].reduce((pre, cur) => {
38
39
  return pre + (cur.length > 0 ? ` ${cur}${EOL}` : "");
39
40
  }, "");
40
- return result.replace(RE_LAST_IN_HEAD, `${helmetStr}</head>`);
41
+ return safeReplace(result, RE_LAST_IN_HEAD, `${helmetStr}</head>`);
41
42
  }
42
43
  export {
43
44
  helmet as default
@@ -1,10 +1,10 @@
1
1
  import { isReact18 } from "../utils";
2
- import { CSS_CHUNKS_PLACEHOLDER } from "./utils";
2
+ import { CHUNK_CSS_PLACEHOLDER } from "./constants";
3
3
  async function serverRender(options) {
4
4
  var _options_context_ssrContext;
5
5
  if ((_options_context_ssrContext = options.context.ssrContext) === null || _options_context_ssrContext === void 0 ? void 0 : _options_context_ssrContext.template) {
6
6
  var _options_context_ssrContext1;
7
- options.context.ssrContext.template = (_options_context_ssrContext1 = options.context.ssrContext) === null || _options_context_ssrContext1 === void 0 ? void 0 : _options_context_ssrContext1.template.replace("</head>", `${CSS_CHUNKS_PLACEHOLDER}</head>`);
7
+ options.context.ssrContext.template = (_options_context_ssrContext1 = options.context.ssrContext) === null || _options_context_ssrContext1 === void 0 ? void 0 : _options_context_ssrContext1.template.replace("</head>", `${CHUNK_CSS_PLACEHOLDER}</head>`);
8
8
  }
9
9
  if (isReact18() && options.config.mode === "stream") {
10
10
  const pipe = await require("./renderToStream").render(options);
@@ -1,5 +1,6 @@
1
1
  import { serializeJson } from "@modern-js/runtime-utils/node";
2
- import { attributesToString } from "../utils";
2
+ import { attributesToString, safeReplace } from "../utils";
3
+ import { SSR_DATA_PLACEHOLDER } from "../constants";
3
4
  import { buildTemplate } from "./buildTemplate.share";
4
5
  function buildShellAfterTemplate(afterAppTemplate, options) {
5
6
  const callbacks = [
@@ -8,7 +9,7 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
8
9
  return buildTemplate(afterAppTemplate, callbacks);
9
10
  function injectSSRDataScript(template) {
10
11
  const ssrDataScript = buildSSRDataScript();
11
- return template.replace("<!--<?- SSRDataScript ?>-->", ssrDataScript);
12
+ return safeReplace(template, SSR_DATA_PLACEHOLDER, ssrDataScript);
12
13
  function buildSSRDataScript() {
13
14
  const { context: { ssrContext, initialData, __i18nData__ }, renderLevel } = options;
14
15
  const { request, enableUnsafeCtx, nonce, tracker } = ssrContext;
@@ -1,7 +1,8 @@
1
1
  import ReactHelmet from "react-helmet";
2
2
  import { matchRoutes } from "@modern-js/runtime-utils/router";
3
3
  import helmetReplace from "../helmet";
4
- import { CSS_CHUNKS_PLACEHOLDER } from "../utils";
4
+ import { CHUNK_CSS_PLACEHOLDER } from "../constants";
5
+ import { safeReplace } from "../utils";
5
6
  import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
6
7
  function getHeadTemplate(beforeEntryTemplate, context) {
7
8
  const callbacks = [
@@ -18,7 +19,7 @@ function getHeadTemplate(beforeEntryTemplate, context) {
18
19
  }
19
20
  return buildTemplate(headTemplate, callbacks);
20
21
  function injectCss(headTemplate2) {
21
- return headTemplate2.replace(CSS_CHUNKS_PLACEHOLDER, getCssChunks());
22
+ return safeReplace(headTemplate2, CHUNK_CSS_PLACEHOLDER, getCssChunks());
22
23
  function getCssChunks() {
23
24
  const { routeManifest, routerContext, routes } = context;
24
25
  if (!routeManifest || !routerContext || !routes) {
@@ -1,7 +1,6 @@
1
1
  import { createElement } from "react";
2
2
  import { run } from "@modern-js/runtime-utils/node";
3
3
  import { time } from "@modern-js/runtime-utils/time";
4
- import { PreRender } from "../../react/prerender";
5
4
  import { SSRErrors, SSRTimings } from "../tracker";
6
5
  import renderToPipe from "./renderToPipe";
7
6
  const render = ({ App, context }) => {
@@ -19,10 +18,6 @@ const render = ({ App, context }) => {
19
18
  const { tracker } = ssrContext;
20
19
  const pipe = renderToPipe(rootElement, context, {
21
20
  onShellReady() {
22
- const cacheConfig = PreRender.config();
23
- if (cacheConfig) {
24
- ssrContext.cacheConfig = cacheConfig;
25
- }
26
21
  const cost = end();
27
22
  tracker.trackTiming(SSRTimings.RENDER_SHELL, cost);
28
23
  },
@@ -1,21 +1,19 @@
1
+ import { safeReplace } from "../utils";
2
+ import { HTML_PLACEHOLDER, SSR_DATA_PLACEHOLDER, CHUNK_JS_PLACEHOLDER, CHUNK_CSS_PLACEHOLDER } from "../constants";
1
3
  function buildHtml(template, callbacks) {
2
4
  return callbacks.reduce((tmp, cb) => cb(tmp), template);
3
5
  }
4
6
  function createReplaceHtml(html) {
5
- const HTML_REG = /<!--<\?-\s*html\s*\?>-->/;
6
- return (template) => template.replace(HTML_REG, html);
7
+ return (template) => safeReplace(template, HTML_PLACEHOLDER, html);
7
8
  }
8
9
  function createReplaceSSRDataScript(data) {
9
- const SSR_DATA_REG = /<!--<\?-\s*SSRDataScript\s*\?>-->/;
10
- return (template) => template.replace(SSR_DATA_REG, data);
10
+ return (template) => safeReplace(template, SSR_DATA_PLACEHOLDER, data);
11
11
  }
12
12
  function createReplaceChunkJs(js) {
13
- const CHUNK_JS_REG = /<!--<\?-\s*chunksMap\.js\s*\?>-->/;
14
- return (template) => template.replace(CHUNK_JS_REG, js);
13
+ return (template) => safeReplace(template, CHUNK_JS_PLACEHOLDER, js);
15
14
  }
16
15
  function createReplaceChunkCss(css) {
17
- const CHUNK_CSS_REG = /<!--<\?-\s*chunksMap\.css\s*\?>-->/;
18
- return (template) => template.replace(CHUNK_CSS_REG, css);
16
+ return (template) => safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
19
17
  }
20
18
  export {
21
19
  buildHtml,
@@ -7,17 +7,20 @@ import { serializeErrors } from "../../../router/runtime/utils";
7
7
  import helmetReplace from "../helmet";
8
8
  import { RenderLevel } from "../types";
9
9
  import prefetch from "../../prefetch";
10
- import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID, attributesToString } from "../utils";
10
+ import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../constants";
11
+ import { attributesToString } from "../utils";
11
12
  import { SSRErrors, SSRTimings } from "../tracker";
12
13
  import { createLoadableCollector } from "./loadable";
13
14
  import { createRender } from "./render";
14
15
  import { createStyledCollector } from "./styledComponent";
15
16
  import { buildHtml, createReplaceChunkCss, createReplaceChunkJs, createReplaceHtml, createReplaceSSRDataScript } from "./buildHtml";
16
- const buildTemplateData = (context, data, renderLevel, tracker) => {
17
- const { request, enableUnsafeCtx } = context;
18
- const unsafeContext = {
19
- headers: request.headers
20
- };
17
+ const buildTemplateData = (context, data, renderLevel, tracker, config) => {
18
+ const { request } = context;
19
+ const { unsafeHeaders } = config;
20
+ const headers = unsafeHeaders ? Object.fromEntries(Object.entries(request.headers).filter(([key, _]) => {
21
+ var _unsafeHeaders_map;
22
+ return unsafeHeaders === null || unsafeHeaders === void 0 ? void 0 : (_unsafeHeaders_map = unsafeHeaders.map((header) => header.toLowerCase())) === null || _unsafeHeaders_map === void 0 ? void 0 : _unsafeHeaders_map.includes(key.toLowerCase());
23
+ })) : void 0;
21
24
  return {
22
25
  data,
23
26
  context: {
@@ -27,7 +30,7 @@ const buildTemplateData = (context, data, renderLevel, tracker) => {
27
30
  pathname: request.pathname,
28
31
  host: request.host,
29
32
  url: request.url,
30
- ...enableUnsafeCtx ? unsafeContext : {}
33
+ headers
31
34
  },
32
35
  reporter: {
33
36
  sessionId: tracker.sessionId
@@ -36,8 +39,7 @@ const buildTemplateData = (context, data, renderLevel, tracker) => {
36
39
  renderLevel
37
40
  };
38
41
  };
39
- var Entry;
40
- Entry = class Entry2 {
42
+ class Entry {
41
43
  async renderToHtml(context) {
42
44
  var _ssrContext_redirection, _ssrContext_redirection1, _ssrContext_redirection2;
43
45
  const ssrContext = context.ssrContext;
@@ -59,13 +61,13 @@ Entry = class Entry2 {
59
61
  loaderData: routerContext.loaderData,
60
62
  errors: serializeErrors(routerContext.errors)
61
63
  } : void 0;
62
- const templateData = buildTemplateData(ssrContext, prefetchData, this.result.renderLevel, this.tracker);
64
+ const templateData = buildTemplateData(ssrContext, prefetchData, this.result.renderLevel, this.tracker, this.pluginConfig);
63
65
  const ssrDataScripts = this.getSSRDataScript(templateData, routerData);
64
66
  const html = buildHtml(this.template, [
65
67
  createReplaceChunkCss(this.result.chunksMap.css),
66
68
  createReplaceChunkJs(this.result.chunksMap.js),
67
- createReplaceHtml(this.result.html || ""),
68
69
  createReplaceSSRDataScript(ssrDataScripts),
70
+ createReplaceHtml(this.result.html || ""),
69
71
  ...this.htmlModifiers
70
72
  ]);
71
73
  const helmetData = ReactHelmet.renderStatic();
@@ -154,7 +156,7 @@ Entry = class Entry2 {
154
156
  }
155
157
  };
156
158
  }
157
- };
159
+ }
158
160
  export {
159
161
  Entry as default
160
162
  };
@@ -1,5 +1,4 @@
1
1
  import { run } from "@modern-js/runtime-utils/node";
2
- import { PreRender } from "../../react/prerender";
3
2
  import SSREntry from "./entry";
4
3
  const render = ({ App, context, config }) => {
5
4
  const ssrContext = context.ssrContext;
@@ -11,10 +10,6 @@ const render = ({ App, context, config }) => {
11
10
  });
12
11
  entry.metrics.emitCounter("app.visit.count", 1);
13
12
  const html = await entry.renderToHtml(context);
14
- const cacheConfig = PreRender.config();
15
- if (cacheConfig) {
16
- context.ssrContext.cacheConfig = cacheConfig;
17
- }
18
13
  return html;
19
14
  });
20
15
  };
@@ -1,4 +1,9 @@
1
- import { RenderLevel } from "./renderToString/type";
1
+ var RenderLevel;
2
+ (function(RenderLevel2) {
3
+ RenderLevel2[RenderLevel2["CLIENT_RENDER"] = 0] = "CLIENT_RENDER";
4
+ RenderLevel2[RenderLevel2["SERVER_PREFETCH"] = 1] = "SERVER_PREFETCH";
5
+ RenderLevel2[RenderLevel2["SERVER_RENDER"] = 2] = "SERVER_RENDER";
6
+ })(RenderLevel || (RenderLevel = {}));
2
7
  export {
3
8
  RenderLevel
4
9
  };
@@ -1,14 +1,12 @@
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__";
4
1
  function attributesToString(attributes) {
5
2
  return Object.entries(attributes).reduce((str, [key, value]) => {
6
3
  return value === void 0 ? str : `${str} ${key}="${value}"`;
7
4
  }, "");
8
5
  }
6
+ function safeReplace(source, searchValue, replaceValue) {
7
+ return source.replace(searchValue, () => replaceValue);
8
+ }
9
9
  export {
10
- CSS_CHUNKS_PLACEHOLDER,
11
- ROUTER_DATA_JSON_ID,
12
- SSR_DATA_JSON_ID,
13
- attributesToString
10
+ attributesToString,
11
+ safeReplace
14
12
  };
@@ -1,4 +1,5 @@
1
1
  import { AfterMatchContext, AfterRenderContext, MiddlewareContext, NextFunction } from '@modern-js/types';
2
+ export type { Container, CacheControl, CacheOptionProvider, CacheOption, } from '@modern-js/types';
2
3
  export declare const hook: (attacher: ({ addMiddleware, afterMatch, afterRender, }: {
3
4
  addMiddleware: (mid: Middleware) => void;
4
5
  afterRender: (hook: AfterRenderHook) => void;
@@ -1 +1,5 @@
1
+ /**
2
+ * @deprecated
3
+ * The Prerender already has been deprecated, please use [SSR Cache](https://modernjs.dev/guides/advanced-features/ssr.html) instead.
4
+ */
1
5
  export declare const PreRender: any;
@@ -0,0 +1,6 @@
1
+ export declare const HTML_PLACEHOLDER = "<!--<?- html ?>-->";
2
+ export declare const SSR_DATA_PLACEHOLDER = "<!--<?- SSRDataScript ?>-->";
3
+ export declare const CHUNK_JS_PLACEHOLDER = "<!--<?- chunksMap.js ?>-->";
4
+ export declare const CHUNK_CSS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
5
+ export declare const SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
6
+ export declare const ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
@@ -1,6 +1,5 @@
1
- import { RuntimeContext, ModernSSRReactComponent, SSRPluginConfig, SSRServerContext } from '../types';
1
+ import { RuntimeContext, ModernSSRReactComponent, SSRPluginConfig, SSRServerContext, RenderResult } from '../types';
2
2
  import { SSRTracker } from '../tracker';
3
- import { RenderResult } from './type';
4
3
  type EntryOptions = {
5
4
  ctx: SSRServerContext;
6
5
  App: ModernSSRReactComponent;
@@ -1,6 +1,5 @@
1
1
  import { ReactElement } from 'react';
2
- import { SSRPluginConfig } from '../types';
3
- import { RenderResult } from './type';
2
+ import { SSRPluginConfig, RenderResult } from '../types';
4
3
  import type { Collector } from './render';
5
4
  declare class LoadableCollector implements Collector {
6
5
  private options;
@@ -1,6 +1,6 @@
1
1
  import { ServerStyleSheet } from 'styled-components';
2
2
  import { ReactElement } from 'react';
3
- import type { RenderResult } from './type';
3
+ import type { RenderResult } from '../types';
4
4
  import type { Collector } from './render';
5
5
  declare class StyledCollector implements Collector {
6
6
  sheet: ServerStyleSheet;