@modern-js/runtime 2.42.2 → 2.44.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 (79) 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/buildTemplate.share.js +1 -1
  10. package/dist/cjs/ssr/serverRender/renderToStream/bulidTemplate.before.js +37 -10
  11. package/dist/cjs/ssr/serverRender/renderToStream/index.js +2 -7
  12. package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.js +32 -30
  13. package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.worker.js +3 -3
  14. package/dist/cjs/ssr/serverRender/renderToStream/template.js +3 -3
  15. package/dist/cjs/ssr/serverRender/renderToString/buildHtml.js +6 -12
  16. package/dist/cjs/ssr/serverRender/renderToString/entry.js +14 -12
  17. package/dist/cjs/ssr/serverRender/renderToString/index.js +0 -5
  18. package/dist/cjs/ssr/serverRender/renderToString/loadable.js +2 -6
  19. package/dist/cjs/ssr/serverRender/types.js +7 -2
  20. package/dist/cjs/ssr/serverRender/utils.js +13 -11
  21. package/dist/esm/cli/index.js +2 -3
  22. package/dist/esm/ssr/cli/index.js +6 -4
  23. package/dist/esm/ssr/index.js +10 -2
  24. package/dist/esm/ssr/react/prerender/index.js +1 -0
  25. package/dist/esm/ssr/serverRender/constants.js +14 -0
  26. package/dist/esm/ssr/serverRender/helmet.js +5 -4
  27. package/dist/esm/ssr/serverRender/index.js +2 -2
  28. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.js +3 -2
  29. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.share.js +5 -3
  30. package/dist/esm/ssr/serverRender/renderToStream/bulidTemplate.before.js +169 -33
  31. package/dist/esm/ssr/serverRender/renderToStream/index.js +2 -7
  32. package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.js +34 -30
  33. package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.worker.js +23 -13
  34. package/dist/esm/ssr/serverRender/renderToStream/template.js +37 -11
  35. package/dist/esm/ssr/serverRender/renderToString/buildHtml.js +6 -13
  36. package/dist/esm/ssr/serverRender/renderToString/entry.js +19 -13
  37. package/dist/esm/ssr/serverRender/renderToString/index.js +1 -6
  38. package/dist/esm/ssr/serverRender/renderToString/loadable.js +3 -7
  39. package/dist/esm/ssr/serverRender/types.js +6 -1
  40. package/dist/esm/ssr/serverRender/utils.js +12 -7
  41. package/dist/esm-node/cli/index.js +2 -3
  42. package/dist/esm-node/ssr/cli/index.js +6 -4
  43. package/dist/esm-node/ssr/index.js +9 -1
  44. package/dist/esm-node/ssr/react/prerender/index.js +1 -0
  45. package/dist/esm-node/ssr/serverRender/constants.js +14 -0
  46. package/dist/esm-node/ssr/serverRender/helmet.js +5 -4
  47. package/dist/esm-node/ssr/serverRender/index.js +2 -2
  48. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.js +3 -2
  49. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.share.js +1 -1
  50. package/dist/esm-node/ssr/serverRender/renderToStream/bulidTemplate.before.js +38 -11
  51. package/dist/esm-node/ssr/serverRender/renderToStream/index.js +2 -7
  52. package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.js +32 -30
  53. package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.worker.js +3 -3
  54. package/dist/esm-node/ssr/serverRender/renderToStream/template.js +3 -3
  55. package/dist/esm-node/ssr/serverRender/renderToString/buildHtml.js +6 -12
  56. package/dist/esm-node/ssr/serverRender/renderToString/entry.js +13 -11
  57. package/dist/esm-node/ssr/serverRender/renderToString/index.js +0 -5
  58. package/dist/esm-node/ssr/serverRender/renderToString/loadable.js +3 -7
  59. package/dist/esm-node/ssr/serverRender/types.js +6 -1
  60. package/dist/esm-node/ssr/serverRender/utils.js +10 -7
  61. package/dist/types/exports/server.d.ts +1 -0
  62. package/dist/types/ssr/react/prerender/index.d.ts +4 -0
  63. package/dist/types/ssr/serverRender/constants.d.ts +6 -0
  64. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +1 -1
  65. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.share.d.ts +2 -2
  66. package/dist/types/ssr/serverRender/renderToStream/bulidTemplate.before.d.ts +2 -2
  67. package/dist/types/ssr/serverRender/renderToStream/index.d.ts +1 -1
  68. package/dist/types/ssr/serverRender/renderToStream/renderToPipe.d.ts +2 -2
  69. package/dist/types/ssr/serverRender/renderToStream/renderToPipe.worker.d.ts +2 -2
  70. package/dist/types/ssr/serverRender/renderToStream/template.d.ts +2 -2
  71. package/dist/types/ssr/serverRender/renderToString/entry.d.ts +1 -2
  72. package/dist/types/ssr/serverRender/renderToString/loadable.d.ts +1 -2
  73. package/dist/types/ssr/serverRender/renderToString/styledComponent.d.ts +1 -1
  74. package/dist/types/ssr/serverRender/types.d.ts +15 -2
  75. package/dist/types/ssr/serverRender/utils.d.ts +8 -3
  76. package/package.json +12 -12
  77. package/dist/esm/ssr/serverRender/renderToString/type.js +0 -9
  78. package/dist/esm-node/ssr/serverRender/renderToString/type.js +0 -9
  79. package/dist/types/ssr/serverRender/renderToString/type.d.ts +0 -13
@@ -11,13 +11,13 @@ var ShellChunkStatus;
11
11
  ShellChunkStatus2[ShellChunkStatus2["START"] = 0] = "START";
12
12
  ShellChunkStatus2[ShellChunkStatus2["FINIESH"] = 1] = "FINIESH";
13
13
  })(ShellChunkStatus || (ShellChunkStatus = {}));
14
- function renderToPipe(rootElement, context, options) {
14
+ function renderToPipe(rootElement, context, pluginConfig, options) {
15
15
  var shellChunkStatus = 0;
16
16
  var chunkVec = [];
17
17
  var ssrContext = context.ssrContext;
18
18
  var forUserPipe = function() {
19
19
  var _ref = _async_to_generator(function() {
20
- var renderToReadableStream, _getTemplates, shellAfter, shellBefore, readableOriginal, reader, injectableStream, err, _getTemplates1, shellAfter1, shellBefore1, fallbackHtml;
20
+ var renderToReadableStream, _ref2, shellAfter, shellBefore, readableOriginal, reader, injectableStream, err, _ref1, shellAfter1, shellBefore1, fallbackHtml;
21
21
  return _ts_generator(this, function(_state) {
22
22
  switch (_state.label) {
23
23
  case 0:
@@ -25,14 +25,19 @@ function renderToPipe(rootElement, context, options) {
25
25
  renderToReadableStream = require("react-dom/server").renderToReadableStream;
26
26
  } catch (e) {
27
27
  }
28
- _getTemplates = getTemplates(context, RenderLevel.SERVER_RENDER), shellAfter = _getTemplates.shellAfter, shellBefore = _getTemplates.shellBefore;
29
- _state.label = 1;
28
+ return [
29
+ 4,
30
+ getTemplates(context, RenderLevel.SERVER_RENDER, pluginConfig)
31
+ ];
30
32
  case 1:
33
+ _ref2 = _state.sent(), shellAfter = _ref2.shellAfter, shellBefore = _ref2.shellBefore;
34
+ _state.label = 2;
35
+ case 2:
31
36
  _state.trys.push([
32
- 1,
33
- 3,
37
+ 2,
38
+ 4,
34
39
  ,
35
- 4
40
+ 6
36
41
  ]);
37
42
  return [
38
43
  4,
@@ -44,7 +49,7 @@ function renderToPipe(rootElement, context, options) {
44
49
  }
45
50
  }))
46
51
  ];
47
- case 2:
52
+ case 3:
48
53
  readableOriginal = _state.sent();
49
54
  reader = readableOriginal.getReader();
50
55
  injectableStream = new ReadableStream({
@@ -54,7 +59,7 @@ function renderToPipe(rootElement, context, options) {
54
59
  }
55
60
  function _push() {
56
61
  _push = _async_to_generator(function() {
57
- var _ref2, done, value, chunk, concatedChunk;
62
+ var _ref3, done, value, chunk, concatedChunk;
58
63
  return _ts_generator(this, function(_state2) {
59
64
  switch (_state2.label) {
60
65
  case 0:
@@ -63,7 +68,7 @@ function renderToPipe(rootElement, context, options) {
63
68
  reader.read()
64
69
  ];
65
70
  case 1:
66
- _ref2 = _state2.sent(), done = _ref2.done, value = _ref2.value;
71
+ _ref3 = _state2.sent(), done = _ref3.done, value = _ref3.value;
67
72
  if (done) {
68
73
  controller.close();
69
74
  return [
@@ -98,16 +103,21 @@ function renderToPipe(rootElement, context, options) {
98
103
  2,
99
104
  injectableStream
100
105
  ];
101
- case 3:
106
+ case 4:
102
107
  err = _state.sent();
103
108
  ssrContext === null || ssrContext === void 0 ? void 0 : ssrContext.tracker.trackError(SSRErrors.RENDER_SHELL, err);
104
- _getTemplates1 = getTemplates(context, RenderLevel.CLIENT_RENDER), shellAfter1 = _getTemplates1.shellAfter, shellBefore1 = _getTemplates1.shellBefore;
109
+ return [
110
+ 4,
111
+ getTemplates(context, RenderLevel.CLIENT_RENDER, pluginConfig)
112
+ ];
113
+ case 5:
114
+ _ref1 = _state.sent(), shellAfter1 = _ref1.shellAfter, shellBefore1 = _ref1.shellBefore;
105
115
  fallbackHtml = "".concat(shellBefore1).concat(shellAfter1);
106
116
  return [
107
117
  2,
108
118
  fallbackHtml
109
119
  ];
110
- case 4:
120
+ case 6:
111
121
  return [
112
122
  2
113
123
  ];
@@ -1,20 +1,46 @@
1
+ import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
1
2
  import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
3
+ import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
2
4
  import { buildShellAfterTemplate } from "./buildTemplate.after";
3
5
  import { buildShellBeforeTemplate } from "./bulidTemplate.before";
4
6
  var HTML_SEPARATOR = "<!--<?- html ?>-->";
5
- var getTemplates = function(context, renderLevel) {
6
- var ssrContext = context.ssrContext;
7
- var _ref = _sliced_to_array(ssrContext.template.split(HTML_SEPARATOR) || [], 2), tmp = _ref[0], beforeAppTemplate = tmp === void 0 ? "" : tmp, tmp1 = _ref[1], afterAppHtmlTemplate = tmp1 === void 0 ? "" : tmp1;
8
- var builtBeforeTemplate = buildShellBeforeTemplate(beforeAppTemplate, context);
9
- var builtAfterTemplate = buildShellAfterTemplate(afterAppHtmlTemplate, {
10
- context,
11
- renderLevel
7
+ var getTemplates = function() {
8
+ var _ref = _async_to_generator(function(context, renderLevel, pluginConfig) {
9
+ var ssrContext, _ref2, tmp, beforeAppTemplate, tmp1, afterAppHtmlTemplate, builtBeforeTemplate, builtAfterTemplate;
10
+ return _ts_generator(this, function(_state) {
11
+ switch (_state.label) {
12
+ case 0:
13
+ ssrContext = context.ssrContext;
14
+ _ref2 = _sliced_to_array(ssrContext.template.split(HTML_SEPARATOR) || [], 2), tmp = _ref2[0], beforeAppTemplate = tmp === void 0 ? "" : tmp, tmp1 = _ref2[1], afterAppHtmlTemplate = tmp1 === void 0 ? "" : tmp1;
15
+ return [
16
+ 4,
17
+ buildShellBeforeTemplate(beforeAppTemplate, context, pluginConfig)
18
+ ];
19
+ case 1:
20
+ builtBeforeTemplate = _state.sent();
21
+ return [
22
+ 4,
23
+ buildShellAfterTemplate(afterAppHtmlTemplate, {
24
+ context,
25
+ renderLevel
26
+ })
27
+ ];
28
+ case 2:
29
+ builtAfterTemplate = _state.sent();
30
+ return [
31
+ 2,
32
+ {
33
+ shellBefore: builtBeforeTemplate,
34
+ shellAfter: builtAfterTemplate
35
+ }
36
+ ];
37
+ }
38
+ });
12
39
  });
13
- return {
14
- shellBefore: builtBeforeTemplate,
15
- shellAfter: builtAfterTemplate
40
+ return function getTemplates2(context, renderLevel, pluginConfig) {
41
+ return _ref.apply(this, arguments);
16
42
  };
17
- };
43
+ }();
18
44
  export {
19
45
  getTemplates
20
46
  };
@@ -1,35 +1,28 @@
1
- import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
2
- function unsafeReplace(source, searchValue, replaceValue) {
3
- var _source_split = _sliced_to_array(source.split(searchValue), 2), s1 = _source_split[0], s2 = _source_split[1];
4
- return s1 + replaceValue + s2;
5
- }
1
+ import { safeReplace } from "../utils";
2
+ import { HTML_PLACEHOLDER, SSR_DATA_PLACEHOLDER, CHUNK_JS_PLACEHOLDER, CHUNK_CSS_PLACEHOLDER } from "../constants";
6
3
  function buildHtml(template, callbacks) {
7
4
  return callbacks.reduce(function(tmp, cb) {
8
5
  return cb(tmp);
9
6
  }, template);
10
7
  }
11
8
  function createReplaceHtml(html) {
12
- var HTML_REMARK = "<!--<?- html ?>-->";
13
9
  return function(template) {
14
- return unsafeReplace(template, HTML_REMARK, html);
10
+ return safeReplace(template, HTML_PLACEHOLDER, html);
15
11
  };
16
12
  }
17
13
  function createReplaceSSRDataScript(data) {
18
- var SSR_DATA_REMARK = "<!--<?- SSRDataScript ?>-->";
19
14
  return function(template) {
20
- return unsafeReplace(template, SSR_DATA_REMARK, data);
15
+ return safeReplace(template, SSR_DATA_PLACEHOLDER, data);
21
16
  };
22
17
  }
23
18
  function createReplaceChunkJs(js) {
24
- var CHUNK_JS_REMARK = "<!--<?- chunksMap.js ?>-->";
25
19
  return function(template) {
26
- return unsafeReplace(template, CHUNK_JS_REMARK, js);
20
+ return safeReplace(template, CHUNK_JS_PLACEHOLDER, js);
27
21
  };
28
22
  }
29
23
  function createReplaceChunkCss(css) {
30
- var CHUNK_CSS_REG = "<!--<?- chunksMap.css ?>-->";
31
24
  return function(template) {
32
- return unsafeReplace(template, CHUNK_CSS_REG, css);
25
+ return safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
33
26
  };
34
27
  }
35
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,7 +136,7 @@ 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),
@@ -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
@@ -6,7 +6,7 @@ import { _ as _instanceof } from "@swc/helpers/_/_instanceof";
6
6
  import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
7
7
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
8
8
  import { ChunkExtractor } from "@loadable/server";
9
- import { attributesToString } from "../utils";
9
+ import { attributesToString, checkIsNode } from "../utils";
10
10
  var extname = function(uri) {
11
11
  if (typeof uri !== "string" || !uri.includes(".")) {
12
12
  return "";
@@ -61,10 +61,6 @@ var readAsset = function() {
61
61
  return _ref.apply(this, arguments);
62
62
  };
63
63
  }();
64
- var checkIsNode = function() {
65
- var _process_release;
66
- return typeof process !== "undefined" && ((_process_release = process.release) === null || _process_release === void 0 ? void 0 : _process_release.name) === "node";
67
- };
68
64
  var LoadableCollector = /* @__PURE__ */ function() {
69
65
  "use strict";
70
66
  function LoadableCollector2(options) {
@@ -184,7 +180,7 @@ var LoadableCollector = /* @__PURE__ */ function() {
184
180
  var script;
185
181
  return _ts_generator(this, function(_state2) {
186
182
  script = "<script".concat(attributes, ' src="').concat(chunk.url, '"></script>');
187
- if (checkIsInline(chunk, enableInlineScripts) && checkIsNode()) {
183
+ if (checkIsNode() && checkIsInline(chunk, enableInlineScripts)) {
188
184
  return [
189
185
  2,
190
186
  readAsset(chunk).then(function(content) {
@@ -244,7 +240,7 @@ var LoadableCollector = /* @__PURE__ */ function() {
244
240
  var link;
245
241
  return _ts_generator(this, function(_state2) {
246
242
  link = "<link".concat(atrributes, ' href="').concat(chunk.url, '" rel="stylesheet" />');
247
- if (checkIsInline(chunk, enableInlineStyles) && checkIsNode()) {
243
+ if (checkIsNode() && checkIsInline(chunk, enableInlineStyles)) {
248
244
  return [
249
245
  2,
250
246
  readAsset(chunk).then(function(content) {
@@ -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,21 @@
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
+ }
13
+ function checkIsNode() {
14
+ var _process_release;
15
+ return typeof process !== "undefined" && ((_process_release = process.release) === null || _process_release === void 0 ? void 0 : _process_release.name) === "node";
16
+ }
11
17
  export {
12
- CSS_CHUNKS_PLACEHOLDER,
13
- ROUTER_DATA_JSON_ID,
14
- SSR_DATA_JSON_ID,
15
- attributesToString
18
+ attributesToString,
19
+ checkIsNode,
20
+ safeReplace
16
21
  };
@@ -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,6 +1,6 @@
1
1
  const HEAD_REG_EXP = /<head(.|\n)*>(.|\n)*<\/head>/;
2
2
  function buildTemplate(template, callbacks) {
3
- return callbacks.reduce((template2, buildTemplateCb) => buildTemplateCb(template2), template);
3
+ return callbacks.reduce((promise, buildTemplateCb) => promise.then((template2) => buildTemplateCb(template2)), Promise.resolve(template));
4
4
  }
5
5
  export {
6
6
  HEAD_REG_EXP,
@@ -1,9 +1,27 @@
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 { checkIsNode, safeReplace } from "../utils";
5
6
  import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
6
- function getHeadTemplate(beforeEntryTemplate, context) {
7
+ const readAsset = async (chunk) => {
8
+ const fs = await import("fs/promises");
9
+ const path = await import("path");
10
+ const filepath = path.join(__dirname, chunk);
11
+ return fs.readFile(filepath, "utf-8");
12
+ };
13
+ const checkIsInline = (chunk, enableInline) => {
14
+ if (process.env.NODE_ENV === "production") {
15
+ if (enableInline instanceof RegExp) {
16
+ return enableInline.test(chunk);
17
+ } else {
18
+ return Boolean(enableInline);
19
+ }
20
+ } else {
21
+ return false;
22
+ }
23
+ };
24
+ function getHeadTemplate(beforeEntryTemplate, context, pluginConfig) {
7
25
  const callbacks = [
8
26
  (headTemplate2) => {
9
27
  const helmetData = ReactHelmet.renderStatic();
@@ -17,9 +35,10 @@ function getHeadTemplate(beforeEntryTemplate, context) {
17
35
  return "";
18
36
  }
19
37
  return buildTemplate(headTemplate, callbacks);
20
- function injectCss(headTemplate2) {
21
- return headTemplate2.replace(CSS_CHUNKS_PLACEHOLDER, getCssChunks());
22
- function getCssChunks() {
38
+ async function injectCss(headTemplate2) {
39
+ const css = await getCssChunks();
40
+ return safeReplace(headTemplate2, CHUNK_CSS_PLACEHOLDER, css);
41
+ async function getCssChunks() {
23
42
  const { routeManifest, routerContext, routes } = context;
24
43
  if (!routeManifest || !routerContext || !routes) {
25
44
  return "";
@@ -41,15 +60,23 @@ function getHeadTemplate(beforeEntryTemplate, context) {
41
60
  }
42
61
  }
43
62
  });
44
- const styleLinks = cssChunks.map((chunk) => {
45
- return `<link href="${chunk}" rel="stylesheet" />`;
46
- });
47
- return `${styleLinks.join("")}`;
63
+ const { enableInlineStyles } = pluginConfig;
64
+ const styles = await Promise.all(cssChunks.map(async (chunk) => {
65
+ const link = `<link href="${chunk}" rel="stylesheet" />`;
66
+ if (checkIsNode() && checkIsInline(chunk, enableInlineStyles)) {
67
+ return readAsset(chunk).then((content) => `<style>${content}</style>`).catch((_) => {
68
+ return link;
69
+ });
70
+ } else {
71
+ return link;
72
+ }
73
+ }));
74
+ return `${styles.join("")}`;
48
75
  }
49
76
  }
50
77
  }
51
- function buildShellBeforeTemplate(beforeAppTemplate, context) {
52
- const headTemplate = getHeadTemplate(beforeAppTemplate, context);
78
+ async function buildShellBeforeTemplate(beforeAppTemplate, context, pluginConfig) {
79
+ const headTemplate = await getHeadTemplate(beforeAppTemplate, context, pluginConfig);
53
80
  return beforeAppTemplate.replace(HEAD_REG_EXP, headTemplate);
54
81
  }
55
82
  export {