@modern-js/runtime 2.44.0 → 2.45.1-alpha.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 (31) hide show
  1. package/dist/cjs/router/runtime/plugin.node.js +3 -0
  2. package/dist/cjs/ssr/cli/index.js +3 -7
  3. package/dist/cjs/ssr/prefetch.js +1 -2
  4. package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.js +3 -1
  5. package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.worker.js +4 -0
  6. package/dist/cjs/ssr/serverRender/renderToString/entry.js +0 -2
  7. package/dist/cjs/ssr/serverRender/renderToString/index.js +0 -1
  8. package/dist/cjs/ssr/serverRender/renderToString/loadable.js +2 -1
  9. package/dist/cjs/ssr/serverRender/tracker.js +8 -20
  10. package/dist/esm/router/runtime/plugin.node.js +3 -0
  11. package/dist/esm/ssr/cli/index.js +5 -8
  12. package/dist/esm/ssr/prefetch.js +1 -2
  13. package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.js +42 -40
  14. package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.worker.js +19 -6
  15. package/dist/esm/ssr/serverRender/renderToString/entry.js +0 -2
  16. package/dist/esm/ssr/serverRender/renderToString/index.js +0 -1
  17. package/dist/esm/ssr/serverRender/renderToString/loadable.js +2 -1
  18. package/dist/esm/ssr/serverRender/tracker.js +8 -20
  19. package/dist/esm-node/router/runtime/plugin.node.js +3 -0
  20. package/dist/esm-node/ssr/cli/index.js +3 -7
  21. package/dist/esm-node/ssr/prefetch.js +1 -2
  22. package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.js +3 -1
  23. package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.worker.js +4 -0
  24. package/dist/esm-node/ssr/serverRender/renderToString/entry.js +0 -2
  25. package/dist/esm-node/ssr/serverRender/renderToString/index.js +0 -1
  26. package/dist/esm-node/ssr/serverRender/renderToString/loadable.js +2 -1
  27. package/dist/esm-node/ssr/serverRender/tracker.js +8 -20
  28. package/dist/types/ssr/serverRender/renderToString/entry.d.ts +0 -1
  29. package/dist/types/ssr/serverRender/tracker.d.ts +1 -1
  30. package/dist/types/ssr/serverRender/types.d.ts +1 -1
  31. package/package.json +10 -10
@@ -111,6 +111,9 @@ const routerPlugin = ({ basename = "", routesConfig, createRoutes }) => {
111
111
  const routerContext = await query(remixRequest, {
112
112
  requestContext
113
113
  });
114
+ if ("errors" in routerContext && routerContext.errors && Object.keys(routerContext.errors).length > 0) {
115
+ throw new Error(Object.values(routerContext.errors)[0]);
116
+ }
114
117
  const cost = end();
115
118
  reporter.reportTiming(import_constants.LOADER_REPORTER_NAME, cost);
116
119
  serverTiming.addServeTiming(import_constants.LOADER_REPORTER_NAME, cost);
@@ -154,24 +154,20 @@ const ssrPlugin = () => ({
154
154
  },
155
155
  modifyEntryRuntimePlugins({ entrypoint, plugins, bundlerConfigs }) {
156
156
  if (ssrConfigMap.get(entrypoint.entryName)) {
157
- var _bundlerConfigs_find_output, _bundlerConfigs_find, _config_server, _config_server1;
157
+ var _bundlerConfigs_find_output, _bundlerConfigs_find;
158
158
  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;
159
159
  const config = api.useResolvedConfigContext();
160
160
  const { enableInlineScripts, enableInlineStyles } = config.output;
161
161
  const { crossorigin, scriptLoading } = config.html;
162
- const disablePrerender = typeof ((_config_server = config.server) === null || _config_server === void 0 ? void 0 : _config_server.ssr) === "object" ? Boolean(config.server.ssr.disablePrerender) : false;
163
- const unsafeHeaders = typeof ((_config_server1 = config.server) === null || _config_server1 === void 0 ? void 0 : _config_server1.ssr) === "object" ? config.server.ssr.unsafeHeaders : void 0;
164
162
  plugins.push({
165
163
  name: PLUGIN_IDENTIFIER,
166
164
  options: JSON.stringify({
165
+ scriptLoading,
167
166
  ...ssrConfigMap.get(entrypoint.entryName) || {},
168
167
  crossorigin,
169
- scriptLoading,
170
168
  chunkLoadingGlobal,
171
- disablePrerender,
172
169
  enableInlineScripts: typeof enableInlineScripts === "function" ? void 0 : enableInlineScripts,
173
- enableInlineStyles: typeof enableInlineStyles === "function" ? void 0 : enableInlineStyles,
174
- unsafeHeaders
170
+ enableInlineStyles: typeof enableInlineStyles === "function" ? void 0 : enableInlineStyles
175
171
  })
176
172
  });
177
173
  }
@@ -77,8 +77,7 @@ const prefetch = async (App, context, config, tracker) => (0, import_node.run)(c
77
77
  Object.keys(loadersData).forEach((id) => {
78
78
  const data = loadersData[id];
79
79
  if (data._error) {
80
- ssrContext.logger.error("App Prefetch Loader", data._error);
81
- ssrContext.metrics.emitCounter("app.prefetch.loader.error", 1);
80
+ ssrContext.logger.error("App Load use-loader", data._error);
82
81
  delete data._error;
83
82
  }
84
83
  });
@@ -31,7 +31,9 @@ var ShellChunkStatus;
31
31
  ShellChunkStatus2[ShellChunkStatus2["FINIESH"] = 1] = "FINIESH";
32
32
  })(ShellChunkStatus || (ShellChunkStatus = {}));
33
33
  function renderToPipe(rootElement, context, pluginConfig, options) {
34
+ var _context_ssrContext;
34
35
  let shellChunkStatus = 0;
36
+ const onReady = ((_context_ssrContext = context.ssrContext) === null || _context_ssrContext === void 0 ? void 0 : _context_ssrContext.isSpider) ? "onAllReady" : "onShellReady";
35
37
  const { ssrContext } = context;
36
38
  const chunkVec = [];
37
39
  const forUserPipe = (stream) => {
@@ -44,7 +46,7 @@ function renderToPipe(rootElement, context, pluginConfig, options) {
44
46
  const { pipe } = renderToPipeableStream(rootElement, {
45
47
  ...options,
46
48
  nonce: ssrContext === null || ssrContext === void 0 ? void 0 : ssrContext.nonce,
47
- onShellReady() {
49
+ [onReady]() {
48
50
  (0, import_template.getTemplates)(context, import_types.RenderLevel.SERVER_RENDER, pluginConfig).then(({ shellAfter, shellBefore }) => {
49
51
  var _options_onShellReady;
50
52
  options === null || options === void 0 ? void 0 : (_options_onShellReady = options.onShellReady) === null || _options_onShellReady === void 0 ? void 0 : _options_onShellReady.call(options);
@@ -42,6 +42,7 @@ function renderToPipe(rootElement, context, pluginConfig, options) {
42
42
  }
43
43
  const { shellAfter, shellBefore } = await (0, import_template.getTemplates)(context, import_types.RenderLevel.SERVER_RENDER, pluginConfig);
44
44
  try {
45
+ var _context_ssrContext;
45
46
  const readableOriginal = await renderToReadableStream(rootElement, {
46
47
  ...options,
47
48
  nonce: ssrContext === null || ssrContext === void 0 ? void 0 : ssrContext.nonce,
@@ -50,6 +51,9 @@ function renderToPipe(rootElement, context, pluginConfig, options) {
50
51
  options === null || options === void 0 ? void 0 : (_options_onError = options.onError) === null || _options_onError === void 0 ? void 0 : _options_onError.call(options, error);
51
52
  }
52
53
  });
54
+ if ((_context_ssrContext = context.ssrContext) === null || _context_ssrContext === void 0 ? void 0 : _context_ssrContext.isSpider) {
55
+ await readableOriginal.allReady;
56
+ }
53
57
  const reader = readableOriginal.getReader();
54
58
  const injectableStream = new ReadableStream({
55
59
  start(controller) {
@@ -161,7 +161,6 @@ class Entry {
161
161
  constructor(options) {
162
162
  (0, import_define_property._)(this, "entryName", void 0);
163
163
  (0, import_define_property._)(this, "result", void 0);
164
- (0, import_define_property._)(this, "metrics", void 0);
165
164
  (0, import_define_property._)(this, "tracker", void 0);
166
165
  (0, import_define_property._)(this, "template", void 0);
167
166
  (0, import_define_property._)(this, "App", void 0);
@@ -177,7 +176,6 @@ class Entry {
177
176
  this.pluginConfig = config;
178
177
  this.routeManifest = ctx.routeManifest;
179
178
  this.tracker = ctx.tracker;
180
- this.metrics = ctx.metrics;
181
179
  this.htmlModifiers = ctx.htmlModifiers;
182
180
  this.nonce = nonce;
183
181
  this.result = {
@@ -41,7 +41,6 @@ const render = ({ App, context, config }) => {
41
41
  App,
42
42
  config
43
43
  });
44
- entry.metrics.emitCounter("app.visit.count", 1);
45
44
  const html = await entry.renderToHtml(context);
46
45
  return html;
47
46
  });
@@ -105,7 +105,8 @@ class LoadableCollector {
105
105
  const { scriptLoading = "defer", enableInlineScripts } = config;
106
106
  const scriptLoadingAtr = {
107
107
  defer: scriptLoading === "defer" ? true : void 0,
108
- type: scriptLoading === "module" ? "module" : void 0
108
+ type: scriptLoading === "module" ? "module" : void 0,
109
+ async: scriptLoading === "async" ? true : void 0
109
110
  };
110
111
  const attributes = (0, import_utils.attributesToString)(this.generateAttributes({
111
112
  nonce,
@@ -41,69 +41,57 @@ var SSRErrors;
41
41
  const errors = {
42
42
  [0]: {
43
43
  reporter: "App Prerender",
44
- logger: "App Prerender",
45
- metrics: "app.prerender.error"
44
+ logger: "App Prerender"
46
45
  },
47
46
  [1]: {
48
47
  reporter: "App run useLoader",
49
- logger: "App run useLoader",
50
- metrics: "app.useloader.error"
48
+ logger: "App run useLoader"
51
49
  },
52
50
  [2]: {
53
51
  reporter: "App Render To HTML",
54
- logger: "App Render To HTML",
55
- metrics: "app.render.html.error"
52
+ logger: "App Render To HTML"
56
53
  },
57
54
  [3]: {
58
55
  reporter: "App Render To Streaming",
59
- logger: "An error occurs during streaming SSR",
60
- metrics: "app.render.streaming.error"
56
+ logger: "An error occurs during streaming SSR"
61
57
  },
62
- [4]: {
63
- metrics: "app.render.streaming.shell.error"
64
- }
58
+ [4]: {}
65
59
  };
66
60
  const timings = {
67
61
  [0]: {
68
62
  reporter: "ssr-prerender",
69
63
  serverTiming: "ssr-prerender",
70
- metrics: "app.prerender.cost",
71
64
  logger: "App Prerender cost = %d ms"
72
65
  },
73
66
  [1]: {
74
67
  reporter: "ssr-render-html",
75
68
  serverTiming: "ssr-render-html",
76
- metrics: "app.render.html.cost",
77
69
  logger: "App Render To HTML cost = %d ms"
78
70
  },
79
71
  [2]: {
80
72
  reporter: "ssr-render-shell",
81
- metrics: "app.render.shell.cost",
82
73
  logger: "App Render To Shell cost = %d ms"
83
74
  },
84
75
  [3]: {
85
76
  reporter: "use-loader",
86
77
  serverTiming: "use-loader",
87
- metrics: "app.useloader.cost",
88
78
  logger: "App run useLoader cost = %d ms"
89
79
  }
90
80
  };
91
- function createSSRTracker({ reporter, serverTiming, metrics, logger }) {
81
+ function createSSRTracker({ reporter, serverTiming, logger }) {
92
82
  const tracker = {
93
83
  get sessionId() {
94
84
  return reporter.sessionId;
95
85
  },
96
86
  trackError(key, e) {
97
- const { reporter: reporterContent, metrics: metricsContent, logger: loggerContent } = errors[key];
87
+ const { reporter: reporterContent, logger: loggerContent } = errors[key];
98
88
  reporterContent && reporter.reportError(`SSR Error - ${reporterContent}`, e);
99
- metricsContent && metrics.emitCounter(metricsContent, 1);
100
89
  loggerContent && logger.error(loggerContent, e);
101
90
  },
102
91
  trackTiming(key, cost) {
103
- const { reporter: reporterName, serverTiming: serverTimingName, logger: loggerName, metrics: metricsName } = timings[key];
92
+ const { reporter: reporterName, serverTiming: serverTimingName, logger: loggerName } = timings[key];
104
93
  reporterName && reporter.reportTiming(reporterName, cost);
105
94
  serverTimingName && serverTiming.addServeTiming(serverTimingName, cost);
106
- metricsName && metrics.emitTimer(metricsName, cost);
107
95
  loggerName && logger.debug(loggerName, cost);
108
96
  }
109
97
  };
@@ -131,6 +131,9 @@ var routerPlugin = function(param) {
131
131
  ];
132
132
  case 1:
133
133
  routerContext = _state.sent();
134
+ if ("errors" in routerContext && routerContext.errors && Object.keys(routerContext.errors).length > 0) {
135
+ throw new Error(Object.values(routerContext.errors)[0]);
136
+ }
134
137
  cost = end();
135
138
  reporter.reportTiming(LOADER_REPORTER_NAME, cost);
136
139
  serverTiming.addServeTiming(LOADER_REPORTER_NAME, cost);
@@ -146,25 +146,22 @@ var ssrPlugin = function() {
146
146
  modifyEntryRuntimePlugins: function modifyEntryRuntimePlugins(param) {
147
147
  var entrypoint = param.entrypoint, plugins = param.plugins, bundlerConfigs = param.bundlerConfigs;
148
148
  if (ssrConfigMap.get(entrypoint.entryName)) {
149
- var _bundlerConfigs_find_output, _bundlerConfigs_find, _config_server, _config_server1;
149
+ var _bundlerConfigs_find_output, _bundlerConfigs_find;
150
150
  var chunkLoadingGlobal = bundlerConfigs === null || bundlerConfigs === void 0 ? void 0 : (_bundlerConfigs_find = bundlerConfigs.find(function(config2) {
151
151
  return config2.name === "client";
152
152
  })) === 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;
153
153
  var config = api.useResolvedConfigContext();
154
154
  var _config_output = config.output, enableInlineScripts = _config_output.enableInlineScripts, enableInlineStyles = _config_output.enableInlineStyles;
155
155
  var _config_html = config.html, crossorigin = _config_html.crossorigin, scriptLoading = _config_html.scriptLoading;
156
- var disablePrerender = typeof ((_config_server = config.server) === null || _config_server === void 0 ? void 0 : _config_server.ssr) === "object" ? Boolean(config.server.ssr.disablePrerender) : false;
157
- var unsafeHeaders = typeof ((_config_server1 = config.server) === null || _config_server1 === void 0 ? void 0 : _config_server1.ssr) === "object" ? config.server.ssr.unsafeHeaders : void 0;
158
156
  plugins.push({
159
157
  name: PLUGIN_IDENTIFIER,
160
- options: JSON.stringify(_object_spread_props(_object_spread({}, ssrConfigMap.get(entrypoint.entryName) || {}), {
158
+ options: JSON.stringify(_object_spread_props(_object_spread({
159
+ scriptLoading
160
+ }, ssrConfigMap.get(entrypoint.entryName) || {}), {
161
161
  crossorigin,
162
- scriptLoading,
163
162
  chunkLoadingGlobal,
164
- disablePrerender,
165
163
  enableInlineScripts: typeof enableInlineScripts === "function" ? void 0 : enableInlineScripts,
166
- enableInlineStyles: typeof enableInlineStyles === "function" ? void 0 : enableInlineStyles,
167
- unsafeHeaders
164
+ enableInlineStyles: typeof enableInlineStyles === "function" ? void 0 : enableInlineStyles
168
165
  }))
169
166
  });
170
167
  }
@@ -84,8 +84,7 @@ var prefetch = function() {
84
84
  Object.keys(loadersData).forEach(function(id) {
85
85
  var data = loadersData[id];
86
86
  if (data._error) {
87
- ssrContext.logger.error("App Prefetch Loader", data._error);
88
- ssrContext.metrics.emitCounter("app.prefetch.loader.error", 1);
87
+ ssrContext.logger.error("App Load use-loader", data._error);
89
88
  delete data._error;
90
89
  }
91
90
  });
@@ -1,3 +1,4 @@
1
+ import { _ as _define_property } from "@swc/helpers/_/_define_property";
1
2
  import { _ as _instanceof } from "@swc/helpers/_/_instanceof";
2
3
  import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
3
4
  import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
@@ -11,7 +12,9 @@ var ShellChunkStatus;
11
12
  ShellChunkStatus2[ShellChunkStatus2["FINIESH"] = 1] = "FINIESH";
12
13
  })(ShellChunkStatus || (ShellChunkStatus = {}));
13
14
  function renderToPipe(rootElement, context, pluginConfig, options) {
15
+ var _context_ssrContext;
14
16
  var shellChunkStatus = 0;
17
+ var onReady = ((_context_ssrContext = context.ssrContext) === null || _context_ssrContext === void 0 ? void 0 : _context_ssrContext.isSpider) ? "onAllReady" : "onShellReady";
15
18
  var ssrContext = context.ssrContext;
16
19
  var chunkVec = [];
17
20
  var forUserPipe = function(stream) {
@@ -21,50 +24,49 @@ function renderToPipe(rootElement, context, pluginConfig, options) {
21
24
  renderToPipeableStream = require("react-dom/server").renderToPipeableStream;
22
25
  } catch (e) {
23
26
  }
24
- var pipe = renderToPipeableStream(rootElement, _object_spread_props(_object_spread({}, options), {
25
- nonce: ssrContext === null || ssrContext === void 0 ? void 0 : ssrContext.nonce,
26
- onShellReady: function onShellReady() {
27
- getTemplates(context, RenderLevel.SERVER_RENDER, pluginConfig).then(function(param) {
28
- var shellAfter = param.shellAfter, shellBefore = param.shellBefore;
29
- var _options_onShellReady;
30
- options === null || options === void 0 ? void 0 : (_options_onShellReady = options.onShellReady) === null || _options_onShellReady === void 0 ? void 0 : _options_onShellReady.call(options);
31
- var injectableTransform = new Transform({
32
- transform: function transform(chunk, _encoding, callback) {
33
- try {
34
- if (shellChunkStatus !== 1) {
35
- chunkVec.push(chunk.toString());
36
- var concatedChunk = chunkVec.join("");
37
- if (concatedChunk.endsWith(ESCAPED_SHELL_STREAM_END_MARK)) {
38
- concatedChunk = concatedChunk.replace(ESCAPED_SHELL_STREAM_END_MARK, "");
39
- shellChunkStatus = 1;
40
- this.push("".concat(shellBefore).concat(concatedChunk).concat(shellAfter));
41
- }
42
- } else {
43
- this.push(chunk);
44
- }
45
- callback();
46
- } catch (e) {
47
- if (_instanceof(e, Error)) {
48
- callback(e);
49
- } else {
50
- callback(new Error("Received unkown error when streaming"));
27
+ var _obj;
28
+ var pipe = renderToPipeableStream(rootElement, _object_spread_props(_object_spread({}, options), (_obj = {
29
+ nonce: ssrContext === null || ssrContext === void 0 ? void 0 : ssrContext.nonce
30
+ }, _define_property(_obj, onReady, function() {
31
+ getTemplates(context, RenderLevel.SERVER_RENDER, pluginConfig).then(function(param) {
32
+ var shellAfter = param.shellAfter, shellBefore = param.shellBefore;
33
+ var _options_onShellReady;
34
+ options === null || options === void 0 ? void 0 : (_options_onShellReady = options.onShellReady) === null || _options_onShellReady === void 0 ? void 0 : _options_onShellReady.call(options);
35
+ var injectableTransform = new Transform({
36
+ transform: function transform(chunk, _encoding, callback) {
37
+ try {
38
+ if (shellChunkStatus !== 1) {
39
+ chunkVec.push(chunk.toString());
40
+ var concatedChunk = chunkVec.join("");
41
+ if (concatedChunk.endsWith(ESCAPED_SHELL_STREAM_END_MARK)) {
42
+ concatedChunk = concatedChunk.replace(ESCAPED_SHELL_STREAM_END_MARK, "");
43
+ shellChunkStatus = 1;
44
+ this.push("".concat(shellBefore).concat(concatedChunk).concat(shellAfter));
51
45
  }
46
+ } else {
47
+ this.push(chunk);
48
+ }
49
+ callback();
50
+ } catch (e) {
51
+ if (_instanceof(e, Error)) {
52
+ callback(e);
53
+ } else {
54
+ callback(new Error("Received unkown error when streaming"));
52
55
  }
53
56
  }
54
- });
55
- resolve(pipe(injectableTransform).pipe(stream));
56
- });
57
- },
58
- onShellError: function onShellError(error) {
59
- getTemplates(context, RenderLevel.CLIENT_RENDER, pluginConfig).then(function(param) {
60
- var shellAfter = param.shellAfter, shellBefore = param.shellBefore;
61
- var _options_onShellError;
62
- var fallbackHtml = "".concat(shellBefore).concat(shellAfter);
63
- resolve(fallbackHtml);
64
- options === null || options === void 0 ? void 0 : (_options_onShellError = options.onShellError) === null || _options_onShellError === void 0 ? void 0 : _options_onShellError.call(options, error);
57
+ }
65
58
  });
66
- }
67
- })).pipe;
59
+ resolve(pipe(injectableTransform).pipe(stream));
60
+ });
61
+ }), _define_property(_obj, "onShellError", function onShellError(error) {
62
+ getTemplates(context, RenderLevel.CLIENT_RENDER, pluginConfig).then(function(param) {
63
+ var shellAfter = param.shellAfter, shellBefore = param.shellBefore;
64
+ var _options_onShellError;
65
+ var fallbackHtml = "".concat(shellBefore).concat(shellAfter);
66
+ resolve(fallbackHtml);
67
+ options === null || options === void 0 ? void 0 : (_options_onShellError = options.onShellError) === null || _options_onShellError === void 0 ? void 0 : _options_onShellError.call(options, error);
68
+ });
69
+ }), _obj))).pipe;
68
70
  });
69
71
  };
70
72
  return forUserPipe;
@@ -17,7 +17,7 @@ function renderToPipe(rootElement, context, pluginConfig, options) {
17
17
  var ssrContext = context.ssrContext;
18
18
  var forUserPipe = function() {
19
19
  var _ref = _async_to_generator(function() {
20
- var renderToReadableStream, _ref2, shellAfter, shellBefore, readableOriginal, reader, injectableStream, err, _ref1, shellAfter1, shellBefore1, fallbackHtml;
20
+ var renderToReadableStream, _ref2, shellAfter, shellBefore, _context_ssrContext, 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:
@@ -35,9 +35,9 @@ function renderToPipe(rootElement, context, pluginConfig, options) {
35
35
  case 2:
36
36
  _state.trys.push([
37
37
  2,
38
- 4,
38
+ 6,
39
39
  ,
40
- 6
40
+ 8
41
41
  ]);
42
42
  return [
43
43
  4,
@@ -51,6 +51,19 @@ function renderToPipe(rootElement, context, pluginConfig, options) {
51
51
  ];
52
52
  case 3:
53
53
  readableOriginal = _state.sent();
54
+ if (!((_context_ssrContext = context.ssrContext) === null || _context_ssrContext === void 0 ? void 0 : _context_ssrContext.isSpider))
55
+ return [
56
+ 3,
57
+ 5
58
+ ];
59
+ return [
60
+ 4,
61
+ readableOriginal.allReady
62
+ ];
63
+ case 4:
64
+ _state.sent();
65
+ _state.label = 5;
66
+ case 5:
54
67
  reader = readableOriginal.getReader();
55
68
  injectableStream = new ReadableStream({
56
69
  start: function start(controller) {
@@ -103,21 +116,21 @@ function renderToPipe(rootElement, context, pluginConfig, options) {
103
116
  2,
104
117
  injectableStream
105
118
  ];
106
- case 4:
119
+ case 6:
107
120
  err = _state.sent();
108
121
  ssrContext === null || ssrContext === void 0 ? void 0 : ssrContext.tracker.trackError(SSRErrors.RENDER_SHELL, err);
109
122
  return [
110
123
  4,
111
124
  getTemplates(context, RenderLevel.CLIENT_RENDER, pluginConfig)
112
125
  ];
113
- case 5:
126
+ case 7:
114
127
  _ref1 = _state.sent(), shellAfter1 = _ref1.shellAfter, shellBefore1 = _ref1.shellBefore;
115
128
  fallbackHtml = "".concat(shellBefore1).concat(shellAfter1);
116
129
  return [
117
130
  2,
118
131
  fallbackHtml
119
132
  ];
120
- case 6:
133
+ case 8:
121
134
  return [
122
135
  2
123
136
  ];
@@ -54,7 +54,6 @@ var Entry = /* @__PURE__ */ function() {
54
54
  _class_call_check(this, Entry2);
55
55
  _define_property(this, "entryName", void 0);
56
56
  _define_property(this, "result", void 0);
57
- _define_property(this, "metrics", void 0);
58
57
  _define_property(this, "tracker", void 0);
59
58
  _define_property(this, "template", void 0);
60
59
  _define_property(this, "App", void 0);
@@ -70,7 +69,6 @@ var Entry = /* @__PURE__ */ function() {
70
69
  this.pluginConfig = config;
71
70
  this.routeManifest = ctx.routeManifest;
72
71
  this.tracker = ctx.tracker;
73
- this.metrics = ctx.metrics;
74
72
  this.htmlModifiers = ctx.htmlModifiers;
75
73
  this.nonce = nonce;
76
74
  this.result = {
@@ -15,7 +15,6 @@ var render = function(param) {
15
15
  App,
16
16
  config
17
17
  });
18
- entry.metrics.emitCounter("app.visit.count", 1);
19
18
  return [
20
19
  4,
21
20
  entry.renderToHtml(context)
@@ -164,7 +164,8 @@ var LoadableCollector = /* @__PURE__ */ function() {
164
164
  _config_scriptLoading = config.scriptLoading, scriptLoading = _config_scriptLoading === void 0 ? "defer" : _config_scriptLoading, enableInlineScripts = config.enableInlineScripts;
165
165
  scriptLoadingAtr = {
166
166
  defer: scriptLoading === "defer" ? true : void 0,
167
- type: scriptLoading === "module" ? "module" : void 0
167
+ type: scriptLoading === "module" ? "module" : void 0,
168
+ async: scriptLoading === "async" ? true : void 0
168
169
  };
169
170
  attributes = attributesToString(_this.generateAttributes(_object_spread({
170
171
  nonce
@@ -17,61 +17,49 @@ var SSRErrors;
17
17
  var _obj;
18
18
  var errors = (_obj = {}, _define_property(_obj, 0, {
19
19
  reporter: "App Prerender",
20
- logger: "App Prerender",
21
- metrics: "app.prerender.error"
20
+ logger: "App Prerender"
22
21
  }), _define_property(_obj, 1, {
23
22
  reporter: "App run useLoader",
24
- logger: "App run useLoader",
25
- metrics: "app.useloader.error"
23
+ logger: "App run useLoader"
26
24
  }), _define_property(_obj, 2, {
27
25
  reporter: "App Render To HTML",
28
- logger: "App Render To HTML",
29
- metrics: "app.render.html.error"
26
+ logger: "App Render To HTML"
30
27
  }), _define_property(_obj, 3, {
31
28
  reporter: "App Render To Streaming",
32
- logger: "An error occurs during streaming SSR",
33
- metrics: "app.render.streaming.error"
34
- }), _define_property(_obj, 4, {
35
- metrics: "app.render.streaming.shell.error"
36
- }), _obj);
29
+ logger: "An error occurs during streaming SSR"
30
+ }), _define_property(_obj, 4, {}), _obj);
37
31
  var _obj1;
38
32
  var timings = (_obj1 = {}, _define_property(_obj1, 0, {
39
33
  reporter: "ssr-prerender",
40
34
  serverTiming: "ssr-prerender",
41
- metrics: "app.prerender.cost",
42
35
  logger: "App Prerender cost = %d ms"
43
36
  }), _define_property(_obj1, 1, {
44
37
  reporter: "ssr-render-html",
45
38
  serverTiming: "ssr-render-html",
46
- metrics: "app.render.html.cost",
47
39
  logger: "App Render To HTML cost = %d ms"
48
40
  }), _define_property(_obj1, 2, {
49
41
  reporter: "ssr-render-shell",
50
- metrics: "app.render.shell.cost",
51
42
  logger: "App Render To Shell cost = %d ms"
52
43
  }), _define_property(_obj1, 3, {
53
44
  reporter: "use-loader",
54
45
  serverTiming: "use-loader",
55
- metrics: "app.useloader.cost",
56
46
  logger: "App run useLoader cost = %d ms"
57
47
  }), _obj1);
58
48
  function createSSRTracker(param) {
59
- var reporter = param.reporter, serverTiming = param.serverTiming, metrics = param.metrics, logger = param.logger;
49
+ var reporter = param.reporter, serverTiming = param.serverTiming, logger = param.logger;
60
50
  var tracker = {
61
51
  get sessionId() {
62
52
  return reporter.sessionId;
63
53
  },
64
54
  trackError: function trackError(key, e) {
65
- var _errors_key = errors[key], reporterContent = _errors_key.reporter, metricsContent = _errors_key.metrics, loggerContent = _errors_key.logger;
55
+ var _errors_key = errors[key], reporterContent = _errors_key.reporter, loggerContent = _errors_key.logger;
66
56
  reporterContent && reporter.reportError("SSR Error - ".concat(reporterContent), e);
67
- metricsContent && metrics.emitCounter(metricsContent, 1);
68
57
  loggerContent && logger.error(loggerContent, e);
69
58
  },
70
59
  trackTiming: function trackTiming(key, cost) {
71
- var _timings_key = timings[key], reporterName = _timings_key.reporter, serverTimingName = _timings_key.serverTiming, loggerName = _timings_key.logger, metricsName = _timings_key.metrics;
60
+ var _timings_key = timings[key], reporterName = _timings_key.reporter, serverTimingName = _timings_key.serverTiming, loggerName = _timings_key.logger;
72
61
  reporterName && reporter.reportTiming(reporterName, cost);
73
62
  serverTimingName && serverTiming.addServeTiming(serverTimingName, cost);
74
- metricsName && metrics.emitTimer(metricsName, cost);
75
63
  loggerName && logger.debug(loggerName, cost);
76
64
  }
77
65
  };
@@ -76,6 +76,9 @@ const routerPlugin = ({ basename = "", routesConfig, createRoutes }) => {
76
76
  const routerContext = await query(remixRequest, {
77
77
  requestContext
78
78
  });
79
+ if ("errors" in routerContext && routerContext.errors && Object.keys(routerContext.errors).length > 0) {
80
+ throw new Error(Object.values(routerContext.errors)[0]);
81
+ }
79
82
  const cost = end();
80
83
  reporter.reportTiming(LOADER_REPORTER_NAME, cost);
81
84
  serverTiming.addServeTiming(LOADER_REPORTER_NAME, cost);
@@ -120,24 +120,20 @@ 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, _config_server1;
123
+ var _bundlerConfigs_find_output, _bundlerConfigs_find;
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
- 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;
130
128
  plugins.push({
131
129
  name: PLUGIN_IDENTIFIER,
132
130
  options: JSON.stringify({
131
+ scriptLoading,
133
132
  ...ssrConfigMap.get(entrypoint.entryName) || {},
134
133
  crossorigin,
135
- scriptLoading,
136
134
  chunkLoadingGlobal,
137
- disablePrerender,
138
135
  enableInlineScripts: typeof enableInlineScripts === "function" ? void 0 : enableInlineScripts,
139
- enableInlineStyles: typeof enableInlineStyles === "function" ? void 0 : enableInlineStyles,
140
- unsafeHeaders
136
+ enableInlineStyles: typeof enableInlineStyles === "function" ? void 0 : enableInlineStyles
141
137
  })
142
138
  });
143
139
  }
@@ -54,8 +54,7 @@ const prefetch = async (App, context, config, tracker) => run(context.ssrContext
54
54
  Object.keys(loadersData).forEach((id) => {
55
55
  const data = loadersData[id];
56
56
  if (data._error) {
57
- ssrContext.logger.error("App Prefetch Loader", data._error);
58
- ssrContext.metrics.emitCounter("app.prefetch.loader.error", 1);
57
+ ssrContext.logger.error("App Load use-loader", data._error);
59
58
  delete data._error;
60
59
  }
61
60
  });
@@ -8,7 +8,9 @@ var ShellChunkStatus;
8
8
  ShellChunkStatus2[ShellChunkStatus2["FINIESH"] = 1] = "FINIESH";
9
9
  })(ShellChunkStatus || (ShellChunkStatus = {}));
10
10
  function renderToPipe(rootElement, context, pluginConfig, options) {
11
+ var _context_ssrContext;
11
12
  let shellChunkStatus = 0;
13
+ const onReady = ((_context_ssrContext = context.ssrContext) === null || _context_ssrContext === void 0 ? void 0 : _context_ssrContext.isSpider) ? "onAllReady" : "onShellReady";
12
14
  const { ssrContext } = context;
13
15
  const chunkVec = [];
14
16
  const forUserPipe = (stream) => {
@@ -21,7 +23,7 @@ function renderToPipe(rootElement, context, pluginConfig, options) {
21
23
  const { pipe } = renderToPipeableStream(rootElement, {
22
24
  ...options,
23
25
  nonce: ssrContext === null || ssrContext === void 0 ? void 0 : ssrContext.nonce,
24
- onShellReady() {
26
+ [onReady]() {
25
27
  getTemplates(context, RenderLevel.SERVER_RENDER, pluginConfig).then(({ shellAfter, shellBefore }) => {
26
28
  var _options_onShellReady;
27
29
  options === null || options === void 0 ? void 0 : (_options_onShellReady = options.onShellReady) === null || _options_onShellReady === void 0 ? void 0 : _options_onShellReady.call(options);
@@ -19,6 +19,7 @@ function renderToPipe(rootElement, context, pluginConfig, options) {
19
19
  }
20
20
  const { shellAfter, shellBefore } = await getTemplates(context, RenderLevel.SERVER_RENDER, pluginConfig);
21
21
  try {
22
+ var _context_ssrContext;
22
23
  const readableOriginal = await renderToReadableStream(rootElement, {
23
24
  ...options,
24
25
  nonce: ssrContext === null || ssrContext === void 0 ? void 0 : ssrContext.nonce,
@@ -27,6 +28,9 @@ function renderToPipe(rootElement, context, pluginConfig, options) {
27
28
  options === null || options === void 0 ? void 0 : (_options_onError = options.onError) === null || _options_onError === void 0 ? void 0 : _options_onError.call(options, error);
28
29
  }
29
30
  });
31
+ if ((_context_ssrContext = context.ssrContext) === null || _context_ssrContext === void 0 ? void 0 : _context_ssrContext.isSpider) {
32
+ await readableOriginal.allReady;
33
+ }
30
34
  const reader = readableOriginal.getReader();
31
35
  const injectableStream = new ReadableStream({
32
36
  start(controller) {
@@ -128,7 +128,6 @@ class Entry {
128
128
  constructor(options) {
129
129
  _define_property(this, "entryName", void 0);
130
130
  _define_property(this, "result", void 0);
131
- _define_property(this, "metrics", void 0);
132
131
  _define_property(this, "tracker", void 0);
133
132
  _define_property(this, "template", void 0);
134
133
  _define_property(this, "App", void 0);
@@ -144,7 +143,6 @@ class Entry {
144
143
  this.pluginConfig = config;
145
144
  this.routeManifest = ctx.routeManifest;
146
145
  this.tracker = ctx.tracker;
147
- this.metrics = ctx.metrics;
148
146
  this.htmlModifiers = ctx.htmlModifiers;
149
147
  this.nonce = nonce;
150
148
  this.result = {
@@ -8,7 +8,6 @@ const render = ({ App, context, config }) => {
8
8
  App,
9
9
  config
10
10
  });
11
- entry.metrics.emitCounter("app.visit.count", 1);
12
11
  const html = await entry.renderToHtml(context);
13
12
  return html;
14
13
  });
@@ -72,7 +72,8 @@ class LoadableCollector {
72
72
  const { scriptLoading = "defer", enableInlineScripts } = config;
73
73
  const scriptLoadingAtr = {
74
74
  defer: scriptLoading === "defer" ? true : void 0,
75
- type: scriptLoading === "module" ? "module" : void 0
75
+ type: scriptLoading === "module" ? "module" : void 0,
76
+ async: scriptLoading === "async" ? true : void 0
76
77
  };
77
78
  const attributes = attributesToString(this.generateAttributes({
78
79
  nonce,
@@ -16,69 +16,57 @@ var SSRErrors;
16
16
  const errors = {
17
17
  [0]: {
18
18
  reporter: "App Prerender",
19
- logger: "App Prerender",
20
- metrics: "app.prerender.error"
19
+ logger: "App Prerender"
21
20
  },
22
21
  [1]: {
23
22
  reporter: "App run useLoader",
24
- logger: "App run useLoader",
25
- metrics: "app.useloader.error"
23
+ logger: "App run useLoader"
26
24
  },
27
25
  [2]: {
28
26
  reporter: "App Render To HTML",
29
- logger: "App Render To HTML",
30
- metrics: "app.render.html.error"
27
+ logger: "App Render To HTML"
31
28
  },
32
29
  [3]: {
33
30
  reporter: "App Render To Streaming",
34
- logger: "An error occurs during streaming SSR",
35
- metrics: "app.render.streaming.error"
31
+ logger: "An error occurs during streaming SSR"
36
32
  },
37
- [4]: {
38
- metrics: "app.render.streaming.shell.error"
39
- }
33
+ [4]: {}
40
34
  };
41
35
  const timings = {
42
36
  [0]: {
43
37
  reporter: "ssr-prerender",
44
38
  serverTiming: "ssr-prerender",
45
- metrics: "app.prerender.cost",
46
39
  logger: "App Prerender cost = %d ms"
47
40
  },
48
41
  [1]: {
49
42
  reporter: "ssr-render-html",
50
43
  serverTiming: "ssr-render-html",
51
- metrics: "app.render.html.cost",
52
44
  logger: "App Render To HTML cost = %d ms"
53
45
  },
54
46
  [2]: {
55
47
  reporter: "ssr-render-shell",
56
- metrics: "app.render.shell.cost",
57
48
  logger: "App Render To Shell cost = %d ms"
58
49
  },
59
50
  [3]: {
60
51
  reporter: "use-loader",
61
52
  serverTiming: "use-loader",
62
- metrics: "app.useloader.cost",
63
53
  logger: "App run useLoader cost = %d ms"
64
54
  }
65
55
  };
66
- function createSSRTracker({ reporter, serverTiming, metrics, logger }) {
56
+ function createSSRTracker({ reporter, serverTiming, logger }) {
67
57
  const tracker = {
68
58
  get sessionId() {
69
59
  return reporter.sessionId;
70
60
  },
71
61
  trackError(key, e) {
72
- const { reporter: reporterContent, metrics: metricsContent, logger: loggerContent } = errors[key];
62
+ const { reporter: reporterContent, logger: loggerContent } = errors[key];
73
63
  reporterContent && reporter.reportError(`SSR Error - ${reporterContent}`, e);
74
- metricsContent && metrics.emitCounter(metricsContent, 1);
75
64
  loggerContent && logger.error(loggerContent, e);
76
65
  },
77
66
  trackTiming(key, cost) {
78
- const { reporter: reporterName, serverTiming: serverTimingName, logger: loggerName, metrics: metricsName } = timings[key];
67
+ const { reporter: reporterName, serverTiming: serverTimingName, logger: loggerName } = timings[key];
79
68
  reporterName && reporter.reportTiming(reporterName, cost);
80
69
  serverTimingName && serverTiming.addServeTiming(serverTimingName, cost);
81
- metricsName && metrics.emitTimer(metricsName, cost);
82
70
  loggerName && logger.debug(loggerName, cost);
83
71
  }
84
72
  };
@@ -8,7 +8,6 @@ type EntryOptions = {
8
8
  export default class Entry {
9
9
  entryName: string;
10
10
  result: RenderResult;
11
- metrics: SSRServerContext['metrics'];
12
11
  tracker: SSRTracker;
13
12
  private readonly template;
14
13
  private readonly App;
@@ -13,7 +13,7 @@ export declare enum SSRErrors {
13
13
  RENDER_STREAM = 3,
14
14
  RENDER_SHELL = 4
15
15
  }
16
- export declare function createSSRTracker({ reporter, serverTiming, metrics, logger, }: BaseSSRServerContext): {
16
+ export declare function createSSRTracker({ reporter, serverTiming, logger, }: BaseSSRServerContext): {
17
17
  readonly sessionId: string | undefined;
18
18
  trackError(key: SSRErrors, e: Error): void;
19
19
  trackTiming(key: SSRTimings, cost: number): void;
@@ -30,7 +30,7 @@ export type ModernSSRReactComponent = React.ComponentType<any>;
30
30
  export { RuntimeContext };
31
31
  export type SSRPluginConfig = {
32
32
  crossorigin?: boolean | 'anonymous' | 'use-credentials';
33
- scriptLoading?: 'defer' | 'blocking' | 'module';
33
+ scriptLoading?: 'defer' | 'blocking' | 'module' | 'async';
34
34
  enableInlineStyles?: boolean | RegExp;
35
35
  enableInlineScripts?: boolean | RegExp;
36
36
  disablePrerender?: boolean;
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "modern",
16
16
  "modern.js"
17
17
  ],
18
- "version": "2.44.0",
18
+ "version": "2.45.1-alpha.0",
19
19
  "engines": {
20
20
  "node": ">=14.17.6"
21
21
  },
@@ -171,10 +171,10 @@
171
171
  "react-side-effect": "^2.1.1",
172
172
  "styled-components": "^5.3.1",
173
173
  "@swc/helpers": "0.5.3",
174
- "@modern-js/types": "2.44.0",
175
- "@modern-js/utils": "2.44.0",
176
- "@modern-js/runtime-utils": "2.44.0",
177
- "@modern-js/plugin": "2.44.0"
174
+ "@modern-js/types": "2.45.0",
175
+ "@modern-js/plugin": "2.45.0",
176
+ "@modern-js/utils": "2.45.0",
177
+ "@modern-js/runtime-utils": "2.45.0"
178
178
  },
179
179
  "peerDependencies": {
180
180
  "react": ">=17",
@@ -195,11 +195,11 @@
195
195
  "ts-jest": "^29.1.0",
196
196
  "typescript": "^5",
197
197
  "webpack": "^5.89.0",
198
- "@modern-js/app-tools": "2.44.0",
199
- "@modern-js/core": "2.44.0",
200
- "@modern-js/server-core": "2.44.0",
201
- "@scripts/build": "2.44.0",
202
- "@scripts/jest-config": "2.44.0"
198
+ "@scripts/build": "2.45.0",
199
+ "@modern-js/core": "2.45.0",
200
+ "@modern-js/server-core": "2.45.0",
201
+ "@modern-js/app-tools": "2.45.0",
202
+ "@scripts/jest-config": "2.45.0"
203
203
  },
204
204
  "sideEffects": false,
205
205
  "publishConfig": {