@modern-js/runtime 2.56.2 → 2.57.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 (68) hide show
  1. package/dist/cjs/cli/index.js +5 -1
  2. package/dist/cjs/core/browser/hydrate.js +3 -1
  3. package/dist/cjs/core/browser/index.js +8 -9
  4. package/dist/cjs/core/compatible.js +28 -48
  5. package/dist/cjs/core/plugin/base.js +20 -9
  6. package/dist/cjs/core/plugin/index.js +8 -2
  7. package/dist/cjs/core/react/index.js +11 -18
  8. package/dist/cjs/core/server/requestHandler.js +10 -10
  9. package/dist/cjs/core/server/stream/shared.js +2 -2
  10. package/dist/cjs/core/server/string/index.js +3 -2
  11. package/dist/cjs/core/server/utils.js +2 -5
  12. package/dist/cjs/router/cli/code/index.js +40 -4
  13. package/dist/cjs/router/cli/code/templates.js +13 -8
  14. package/dist/cjs/router/cli/index.js +32 -3
  15. package/dist/cjs/router/runtime/plugin.js +29 -40
  16. package/dist/cjs/router/runtime/plugin.node.js +27 -38
  17. package/dist/cjs/state/runtime/plugin.js +10 -21
  18. package/dist/esm/cli/index.js +10 -11
  19. package/dist/esm/core/browser/hydrate.js +3 -1
  20. package/dist/esm/core/browser/index.js +28 -13
  21. package/dist/esm/core/compatible.js +47 -56
  22. package/dist/esm/core/plugin/base.js +20 -9
  23. package/dist/esm/core/plugin/index.js +12 -3
  24. package/dist/esm/core/react/index.js +12 -20
  25. package/dist/esm/core/server/requestHandler.js +33 -14
  26. package/dist/esm/core/server/stream/shared.js +3 -3
  27. package/dist/esm/core/server/string/index.js +4 -3
  28. package/dist/esm/core/server/utils.js +2 -5
  29. package/dist/esm/router/cli/code/index.js +66 -16
  30. package/dist/esm/router/cli/code/templates.js +13 -8
  31. package/dist/esm/router/cli/index.js +48 -4
  32. package/dist/esm/router/runtime/plugin.js +32 -47
  33. package/dist/esm/router/runtime/plugin.node.js +27 -42
  34. package/dist/esm/state/runtime/plugin.js +11 -24
  35. package/dist/esm-node/cli/index.js +5 -1
  36. package/dist/esm-node/core/browser/hydrate.js +3 -1
  37. package/dist/esm-node/core/browser/index.js +8 -9
  38. package/dist/esm-node/core/compatible.js +28 -48
  39. package/dist/esm-node/core/plugin/base.js +18 -9
  40. package/dist/esm-node/core/plugin/index.js +10 -4
  41. package/dist/esm-node/core/react/index.js +11 -18
  42. package/dist/esm-node/core/server/requestHandler.js +10 -10
  43. package/dist/esm-node/core/server/stream/shared.js +2 -2
  44. package/dist/esm-node/core/server/string/index.js +3 -2
  45. package/dist/esm-node/core/server/utils.js +2 -5
  46. package/dist/esm-node/router/cli/code/index.js +41 -5
  47. package/dist/esm-node/router/cli/code/templates.js +13 -8
  48. package/dist/esm-node/router/cli/index.js +23 -4
  49. package/dist/esm-node/router/runtime/plugin.js +29 -40
  50. package/dist/esm-node/router/runtime/plugin.node.js +27 -38
  51. package/dist/esm-node/state/runtime/plugin.js +10 -21
  52. package/dist/types/core/compatible.d.ts +1 -1
  53. package/dist/types/core/context/index.d.ts +1 -1
  54. package/dist/types/core/context/runtime.d.ts +1 -1
  55. package/dist/types/core/plugin/base.d.ts +26 -36
  56. package/dist/types/core/plugin/index.d.ts +5 -12
  57. package/dist/types/core/plugin/runner.d.ts +4 -11
  58. package/dist/types/core/react/index.d.ts +1 -5
  59. package/dist/types/core/server/utils.d.ts +1 -1
  60. package/dist/types/router/cli/code/templates.d.ts +2 -2
  61. package/dist/types/router/runtime/plugin.d.ts +1 -1
  62. package/dist/types/router/runtime/plugin.node.d.ts +1 -1
  63. package/dist/types/state/runtime/plugin.d.ts +1 -1
  64. package/package.json +10 -10
  65. package/dist/cjs/core/utils/merge.js +0 -53
  66. package/dist/esm/core/utils/merge.js +0 -32
  67. package/dist/esm-node/core/utils/merge.js +0 -29
  68. package/dist/types/core/utils/merge.d.ts +0 -6
@@ -11,6 +11,7 @@ import { createRoutesFromElements } from "@modern-js/runtime-utils/router";
11
11
  import { reporterCtx, createRequestContext } from "@modern-js/runtime-utils/node";
12
12
  import { time } from "@modern-js/runtime-utils/time";
13
13
  import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
14
+ import { merge } from "@modern-js/runtime-utils/merge";
14
15
  import { JSX_SHELL_STREAM_END_MARK } from "../../common";
15
16
  import { RuntimeReactContext } from "../../core";
16
17
  import { getGlobalLayoutApp, getGlobalRoutes } from "../../core/context";
@@ -27,32 +28,31 @@ function createRemixReuqest(request) {
27
28
  signal: controller.signal
28
29
  });
29
30
  }
30
- var routerPlugin = function(param) {
31
- var _param_basename = param.basename, basename = _param_basename === void 0 ? "" : _param_basename, routesConfig = param.routesConfig, createRoutes = param.createRoutes;
31
+ var routerPlugin = function() {
32
+ var userConfig = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
32
33
  return {
33
34
  name: "@modern-js/plugin-router",
34
35
  registerHook: {
35
36
  modifyRoutes: modifyRoutesHook
36
37
  },
37
38
  setup: function(api) {
38
- var finalRouteConfig = _object_spread({
39
- routes: getGlobalRoutes(),
40
- globalApp: getGlobalLayoutApp()
41
- }, routesConfig);
39
+ var finalRouteConfig = {};
42
40
  return {
43
- init: function init(param2, next) {
44
- var context = param2.context;
41
+ beforeRender: function beforeRender(context, interrupt) {
45
42
  return _async_to_generator(function() {
46
- var _context_ssrContext, _context_ssrContext_onTiming, _context_ssrContext1, _context_ssrContext2, request, ssrMode, nonce, _context_ssrContext_loaderFailureMode, loaderFailureMode, baseUrl, _basename, reporter, requestContext, routes, runner, query, remixRequest, end, routerContext, cost, router;
43
+ var _context_ssrContext, _context_ssrContext_onTiming, _context_ssrContext1, pluginConfig, _merge, _merge_basename, basename, routesConfig, createRoutes, _context_ssrContext2, request, ssrMode, nonce, _context_ssrContext_loaderFailureMode, loaderFailureMode, baseUrl, _basename, reporter, requestContext, routes, runner, query, remixRequest, end, routerContext, cost, router;
47
44
  return _ts_generator(this, function(_state) {
48
45
  switch (_state.label) {
49
46
  case 0:
47
+ pluginConfig = api.useRuntimeConfigContext();
48
+ _merge = merge(pluginConfig.router || {}, userConfig), _merge_basename = _merge.basename, basename = _merge_basename === void 0 ? "" : _merge_basename, routesConfig = _merge.routesConfig, createRoutes = _merge.createRoutes;
49
+ finalRouteConfig = _object_spread({
50
+ routes: getGlobalRoutes(),
51
+ globalApp: getGlobalLayoutApp()
52
+ }, routesConfig);
50
53
  if (!finalRouteConfig.routes && !createRoutes) {
51
54
  return [
52
- 2,
53
- next({
54
- context
55
- })
55
+ 2
56
56
  ];
57
57
  }
58
58
  _context_ssrContext2 = context.ssrContext, request = _context_ssrContext2.request, ssrMode = _context_ssrContext2.mode, nonce = _context_ssrContext2.nonce, _context_ssrContext_loaderFailureMode = _context_ssrContext2.loaderFailureMode, loaderFailureMode = _context_ssrContext_loaderFailureMode === void 0 ? "errorBoundary" : _context_ssrContext_loaderFailureMode;
@@ -89,7 +89,7 @@ var routerPlugin = function(param) {
89
89
  if (_instanceof(routerContext, Response)) {
90
90
  return [
91
91
  2,
92
- routerContext
92
+ interrupt(routerContext)
93
93
  ];
94
94
  }
95
95
  if (routerContext.statusCode >= 500 && routerContext.statusCode < 600 && loaderFailureMode === "clientRender") {
@@ -101,26 +101,20 @@ var routerPlugin = function(param) {
101
101
  context.routerContext = routerContext;
102
102
  context.routes = routes;
103
103
  return [
104
- 2,
105
- next({
106
- context
107
- })
104
+ 2
108
105
  ];
109
106
  }
110
107
  });
111
108
  })();
112
109
  },
113
- hoc: function(param2, next) {
114
- var App = param2.App, config = param2.config;
110
+ wrapRoot: function(App) {
115
111
  if (!finalRouteConfig) {
116
- return next({
117
- App,
118
- config
119
- });
112
+ return App;
120
113
  }
121
114
  var getRouteApp = function() {
122
115
  return function() {
123
- var _useContext = useContext(RuntimeReactContext), remixRouter = _useContext.remixRouter, routerContext = _useContext.routerContext, ssrContext = _useContext.ssrContext;
116
+ var context = useContext(RuntimeReactContext);
117
+ var remixRouter = context.remixRouter, routerContext = context.routerContext, ssrContext = context.ssrContext;
124
118
  var nonce = ssrContext.nonce, mode = ssrContext.mode;
125
119
  return /* @__PURE__ */ _jsxs(_Fragment, {
126
120
  children: [
@@ -129,6 +123,8 @@ var routerPlugin = function(param) {
129
123
  context: routerContext,
130
124
  hydrate: false
131
125
  }),
126
+ mode === "stream" && // ROUTER_DATA will inject in `packages/runtime/plugin-runtime/src/core/server/string/ssrData.ts` in string ssr
127
+ // So we can inject it only when streaming ssr
132
128
  /* @__PURE__ */ _jsx(DeferredDataScripts, {
133
129
  nonce,
134
130
  context: routerContext
@@ -138,20 +134,12 @@ var routerPlugin = function(param) {
138
134
  });
139
135
  };
140
136
  };
141
- var RouteApp = getRouteApp();
142
- return next({
143
- App: RouteApp,
144
- config
145
- });
137
+ return getRouteApp();
146
138
  },
147
- pickContext: function(param2, next) {
148
- var context = param2.context, pickedContext = param2.pickedContext;
149
- var remixRouter = context.remixRouter;
139
+ pickContext: function(pickedContext) {
140
+ var remixRouter = pickedContext.remixRouter;
150
141
  if (!remixRouter) {
151
- return next({
152
- context,
153
- pickedContext
154
- });
142
+ return pickedContext;
155
143
  }
156
144
  var router = {
157
145
  navigate: remixRouter.navigate,
@@ -159,11 +147,8 @@ var routerPlugin = function(param) {
159
147
  return remixRouter.state.location;
160
148
  }
161
149
  };
162
- return next({
163
- context,
164
- pickedContext: _object_spread_props(_object_spread({}, pickedContext), {
165
- router
166
- })
150
+ return _object_spread_props(_object_spread({}, pickedContext), {
151
+ router
167
152
  });
168
153
  }
169
154
  };
@@ -1,10 +1,10 @@
1
1
  import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
2
- import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
3
2
  import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
4
3
  import { jsx as _jsx } from "react/jsx-runtime";
5
4
  import { useContext } from "react";
6
5
  import { createStore } from "@modern-js-reduck/store";
7
6
  import { Provider } from "@modern-js-reduck/react";
7
+ import { merge } from "@modern-js/runtime-utils/merge";
8
8
  import { immer, effects, autoActions, devtools } from "../plugins";
9
9
  import { RuntimeReactContext } from "../../core";
10
10
  import { isBrowser } from "../../common";
@@ -53,14 +53,14 @@ var getStoreConfig = function(config) {
53
53
  storeConfig.plugins = plugins;
54
54
  return storeConfig;
55
55
  };
56
- var statePlugin = function(config) {
56
+ var statePlugin = function() {
57
+ var userConfig = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
57
58
  return {
58
59
  name: "@modern-js/plugin-state",
59
- setup: function() {
60
- var storeConfig = getStoreConfig(config);
60
+ setup: function(api) {
61
+ var storeConfig;
61
62
  return {
62
- hoc: function hoc(param, next) {
63
- var App = param.App, _$config = param.config;
63
+ wrapRoot: function wrapRoot(App) {
64
64
  var getStateApp = function(props) {
65
65
  var context = useContext(RuntimeReactContext);
66
66
  return /* @__PURE__ */ _jsx(Provider, {
@@ -69,30 +69,17 @@ var statePlugin = function(config) {
69
69
  children: /* @__PURE__ */ _jsx(App, _object_spread({}, props))
70
70
  });
71
71
  };
72
- return next({
73
- App: getStateApp,
74
- config: _$config
75
- });
72
+ return getStateApp;
76
73
  },
77
- init: function init(param, next) {
78
- var context = param.context;
74
+ beforeRender: function beforeRender(context) {
75
+ var pluginConfig = api.useRuntimeConfigContext();
76
+ var config = merge(pluginConfig.state || {}, userConfig);
77
+ storeConfig = getStoreConfig(config);
79
78
  if (isBrowser()) {
80
79
  var _window__SSR_DATA_data, _window__SSR_DATA, _window;
81
80
  storeConfig.initialState = storeConfig.initialState || ((_window = window) === null || _window === void 0 ? void 0 : (_window__SSR_DATA = _window._SSR_DATA) === null || _window__SSR_DATA === void 0 ? void 0 : (_window__SSR_DATA_data = _window__SSR_DATA.data) === null || _window__SSR_DATA_data === void 0 ? void 0 : _window__SSR_DATA_data.storeState) || {};
82
81
  }
83
82
  context.store = createStore(storeConfig);
84
- return next({
85
- context
86
- });
87
- },
88
- pickContext: function pickContext(param, next) {
89
- var context = param.context, pickedContext = param.pickedContext;
90
- return next({
91
- context,
92
- pickedContext: _object_spread_props(_object_spread({}, pickedContext), {
93
- store: context.store
94
- })
95
- });
96
83
  }
97
84
  };
98
85
  }
@@ -85,7 +85,11 @@ const runtimePlugin = (params) => ({
85
85
  /**
86
86
  * Compatible with the reference path of the old version of the plugin.
87
87
  */
88
- [`@${metaName}/runtime/plugins`]: pluginsExportsUtils.getPath()
88
+ [`@${metaName}/runtime/plugins`]: pluginsExportsUtils.getPath(),
89
+ "@meta/runtime/browser": "@modern-js/runtime/browser",
90
+ "@meta/runtime/react": "@modern-js/runtime/react",
91
+ "@meta/runtime/context": "@modern-js/runtime/context",
92
+ "@meta/runtime": "@modern-js/runtime"
89
93
  },
90
94
  globalVars: {
91
95
  "process.env.IS_REACT18": process.env.IS_REACT18
@@ -63,7 +63,9 @@ function hydrateRoot(App, context, ModernRender, ModernHydrate) {
63
63
  });
64
64
  } else {
65
65
  loadableReady(() => {
66
- ModernHydrate(App, callback).then((root) => {
66
+ ModernHydrate(/* @__PURE__ */ React.cloneElement(App, {
67
+ _internal_context: hydrateContext
68
+ }), callback).then((root) => {
67
69
  resolve(root);
68
70
  });
69
71
  });
@@ -31,14 +31,11 @@ function isClientArgs(id) {
31
31
  async function render(App, id) {
32
32
  const runner = getGlobalRunner();
33
33
  const context = getInitialContext(runner);
34
- const runInit = (_context) => runner.init({
35
- context: _context
36
- }, {
37
- onLast: ({ context: context1 }) => {
38
- const init = getGlobalAppInit();
39
- return init === null || init === void 0 ? void 0 : init(context1);
40
- }
41
- });
34
+ const runBeforeRender = async (context2) => {
35
+ await runner.beforeRender(context2);
36
+ const init = getGlobalAppInit();
37
+ return init === null || init === void 0 ? void 0 : init(context2);
38
+ };
42
39
  if (isClientArgs(id)) {
43
40
  var _ssrData_data, _ssrData_data1;
44
41
  const ssrData = getSSRData();
@@ -55,12 +52,14 @@ async function render(App, id) {
55
52
  loaderManager: createLoaderManager(initialLoadersState, {
56
53
  skipStatic: true
57
54
  }),
55
+ // garfish plugin params
56
+ _internalRouterBaseName: App.props.basename,
58
57
  ...ssrData ? {
59
58
  ssrContext: ssrData === null || ssrData === void 0 ? void 0 : ssrData.context
60
59
  } : {}
61
60
  });
62
61
  context.initialData = ssrData === null || ssrData === void 0 ? void 0 : (_ssrData_data1 = ssrData.data) === null || _ssrData_data1 === void 0 ? void 0 : _ssrData_data1.initialData;
63
- const initialData = await runInit(context);
62
+ const initialData = await runBeforeRender(context);
64
63
  if (initialData) {
65
64
  context.initialData = initialData;
66
65
  }
@@ -30,53 +30,38 @@ const createApp = ({ plugins, runtime, props: globalProps }) => {
30
30
  ...props
31
31
  }) : child));
32
32
  };
33
- const HOCApp = runner.hoc({
34
- App: WrapperComponent,
35
- config: globalProps || {}
36
- }, {
37
- onLast: ({ App: App2 }) => {
38
- const WrapComponent = ({ _internal_context, ...props }) => {
39
- let contextValue = _internal_context;
40
- if (!(contextValue === null || contextValue === void 0 ? void 0 : contextValue.runner)) {
41
- contextValue = getInitialContext(runner);
42
- runner.init({
43
- context: contextValue
44
- }, {
45
- onLast: ({ context: context1 }) => {
46
- var _getGlobalAppInit;
47
- return (_getGlobalAppInit = getGlobalAppInit()) === null || _getGlobalAppInit === void 0 ? void 0 : _getGlobalAppInit(context1);
48
- }
49
- });
50
- }
51
- const mergedProps = {
52
- ...props,
53
- ...globalProps
54
- };
55
- return /* @__PURE__ */ _jsx(RuntimeReactContext.Provider, {
56
- value: contextValue,
57
- children: /* @__PURE__ */ _jsx(App2, {
58
- ...mergedProps
59
- })
60
- });
61
- };
62
- return WrapComponent;
33
+ const WrapperApp = runner.wrapRoot(WrapperComponent);
34
+ const WrapComponent = ({ _internal_context, ...props }) => {
35
+ let contextValue = _internal_context;
36
+ if (!(contextValue === null || contextValue === void 0 ? void 0 : contextValue.runner)) {
37
+ var _getGlobalAppInit;
38
+ contextValue = getInitialContext(runner);
39
+ runner === null || runner === void 0 ? void 0 : runner.beforeRender(contextValue);
40
+ (_getGlobalAppInit = getGlobalAppInit()) === null || _getGlobalAppInit === void 0 ? void 0 : _getGlobalAppInit(contextValue);
63
41
  }
64
- });
65
- return HOCApp;
42
+ const mergedProps = {
43
+ ...props,
44
+ ...globalProps
45
+ };
46
+ return /* @__PURE__ */ _jsx(RuntimeReactContext.Provider, {
47
+ value: contextValue,
48
+ children: /* @__PURE__ */ _jsx(WrapperApp, {
49
+ ...mergedProps
50
+ })
51
+ });
52
+ };
53
+ return WrapComponent;
66
54
  };
67
55
  };
68
56
  const bootstrap = async (BootApp, id, root, ReactDOM) => {
69
57
  const App = BootApp;
70
58
  const runner = getGlobalRunner();
71
59
  const context = getInitialContext(runner);
72
- const runInit = (_context) => runner.init({
73
- context: _context
74
- }, {
75
- onLast: ({ context: context1 }) => {
76
- const init = getGlobalAppInit();
77
- return init === null || init === void 0 ? void 0 : init(context1);
78
- }
79
- });
60
+ const runBeforeRender = async (context2) => {
61
+ await runner.beforeRender(context2);
62
+ const init = getGlobalAppInit();
63
+ return init === null || init === void 0 ? void 0 : init(context2);
64
+ };
80
65
  if (!id) {
81
66
  return /* @__PURE__ */ React.createElement(App, {
82
67
  _internal_context: context
@@ -105,7 +90,7 @@ const bootstrap = async (BootApp, id, root, ReactDOM) => {
105
90
  } : {}
106
91
  });
107
92
  context.initialData = ssrData === null || ssrData === void 0 ? void 0 : (_ssrData_data1 = ssrData.data) === null || _ssrData_data1 === void 0 ? void 0 : _ssrData_data1.initialData;
108
- const initialData = await runInit(context);
93
+ const initialData = await runBeforeRender(context);
109
94
  if (initialData) {
110
95
  context.initialData = initialData;
111
96
  }
@@ -165,16 +150,11 @@ const useRuntimeContext = () => {
165
150
  var _context_ssrContext, _context_ssrContext1;
166
151
  const context = useContext(RuntimeReactContext);
167
152
  const pickedContext = {
168
- initialData: context.initialData,
153
+ ...context,
169
154
  request: (_context_ssrContext = context.ssrContext) === null || _context_ssrContext === void 0 ? void 0 : _context_ssrContext.request,
170
155
  response: (_context_ssrContext1 = context.ssrContext) === null || _context_ssrContext1 === void 0 ? void 0 : _context_ssrContext1.response
171
156
  };
172
- const memoizedContext = useMemo(() => context.runner.pickContext({
173
- context,
174
- pickedContext
175
- }, {
176
- onLast: ({ pickedContext: pickedContext2 }) => pickedContext2
177
- }), [
157
+ const memoizedContext = useMemo(() => context.runner.pickContext(pickedContext), [
178
158
  context
179
159
  ]);
180
160
  return memoizedContext;
@@ -1,15 +1,24 @@
1
- import { createManager, createPipeline, createAsyncPipeline } from "@modern-js/plugin";
2
- const hoc = createPipeline();
3
- const init = createAsyncPipeline();
4
- const pickContext = createPipeline();
1
+ import { createManager, createWaterfall, createAsyncInterruptWorkflow, createSyncParallelWorkflow, createContext } from "@modern-js/plugin";
2
+ const RuntimeConfigContext = createContext({});
3
+ const useRuntimeConfigContext = () => RuntimeConfigContext.use().value;
4
+ const wrapRoot = createWaterfall();
5
+ const beforeRender = createAsyncInterruptWorkflow();
6
+ const pickContext = createWaterfall();
7
+ const modifyRuntimeConfig = createSyncParallelWorkflow();
5
8
  const runtimeHooks = {
6
- hoc,
7
- init,
8
- pickContext
9
+ beforeRender,
10
+ wrapRoot,
11
+ pickContext,
12
+ modifyRuntimeConfig
9
13
  };
10
- const createRuntime = () => createManager(runtimeHooks);
14
+ const runtimePluginAPI = {
15
+ useRuntimeConfigContext
16
+ };
17
+ const createRuntime = () => createManager(runtimeHooks, runtimePluginAPI);
11
18
  const runtime = createRuntime();
12
19
  export {
20
+ RuntimeConfigContext,
13
21
  createRuntime,
14
- runtime
22
+ runtime,
23
+ useRuntimeConfigContext
15
24
  };
@@ -1,16 +1,22 @@
1
- import { merge } from "../utils/merge";
2
- import { runtime } from "./base";
3
- import { setGlobalRunner } from "./runner";
1
+ import { merge } from "@modern-js/runtime-utils/merge";
2
+ import { runtime, RuntimeConfigContext } from "./base";
3
+ import { getGlobalRunner, setGlobalRunner } from "./runner";
4
4
  export * from "./base";
5
+ function setupConfigContext() {
6
+ const runner = getGlobalRunner();
7
+ const configs = runner.modifyRuntimeConfig();
8
+ RuntimeConfigContext.set(merge({}, ...configs));
9
+ }
5
10
  function registerPlugin(internalPlugins, runtimeConfig, customRuntime) {
6
11
  const { plugins = [] } = runtimeConfig || {};
7
12
  (customRuntime || runtime).usePlugin(...internalPlugins, ...plugins);
8
13
  const runner = (customRuntime || runtime).init();
9
14
  setGlobalRunner(runner);
15
+ setupConfigContext();
10
16
  return runner;
11
17
  }
12
18
  function mergeConfig(config, ...otherConfig) {
13
- return merge(config, ...otherConfig);
19
+ return merge({}, config, ...otherConfig);
14
20
  }
15
21
  export {
16
22
  mergeConfig,
@@ -1,26 +1,19 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { RuntimeReactContext, getGlobalApp } from "../context";
3
3
  import { getGlobalRunner } from "../plugin/runner";
4
- function createRoot(UserApp, config) {
4
+ function createRoot(UserApp) {
5
5
  const App = UserApp || getGlobalApp();
6
6
  const runner = getGlobalRunner();
7
- const HOCApp = runner.hoc({
8
- App,
9
- config: config || {}
10
- }, {
11
- onLast: ({ App: App2 }) => {
12
- const WrapComponent = ({ _internal_context, ...props }) => {
13
- return /* @__PURE__ */ _jsx(RuntimeReactContext.Provider, {
14
- value: _internal_context,
15
- children: /* @__PURE__ */ _jsx(App2, {
16
- ...props
17
- })
18
- });
19
- };
20
- return WrapComponent;
21
- }
22
- });
23
- return HOCApp;
7
+ const WrapperApp = runner.wrapRoot(App);
8
+ const WrapComponent = ({ _internal_context, ...props }) => {
9
+ return /* @__PURE__ */ _jsx(RuntimeReactContext.Provider, {
10
+ value: _internal_context,
11
+ children: /* @__PURE__ */ _jsx(WrapperApp, {
12
+ ...props
13
+ })
14
+ });
15
+ };
16
+ return WrapComponent;
24
17
  }
25
18
  export {
26
19
  createRoot
@@ -7,7 +7,7 @@ import { createLoaderManager } from "../loader/loaderManager";
7
7
  import { getSSRConfigByEntry, getSSRMode } from "./utils";
8
8
  import { CHUNK_CSS_PLACEHOLDER } from "./constants";
9
9
  function createSSRContext(request, options) {
10
- const { config, loaderContext, onError, onTiming, locals, resource, params, responseProxy, staticGenerate, logger, metrics, reporter } = options;
10
+ const { config, loaderContext, onError, onTiming, locals, resource, params, responseProxy, logger, metrics, reporter } = options;
11
11
  const { nonce } = config;
12
12
  const { entryName, route } = resource;
13
13
  const cookie = request.headers.get("cookie");
@@ -16,7 +16,7 @@ function createSSRContext(request, options) {
16
16
  const query = parseQuery(request);
17
17
  const headersData = parseHeaders(request);
18
18
  const url = new URL(request.url);
19
- const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries, staticGenerate);
19
+ const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries);
20
20
  const ssrMode = getSSRMode(ssrConfig);
21
21
  const loaderFailureMode = typeof ssrConfig === "object" ? ssrConfig.loaderFailureMode : void 0;
22
22
  return {
@@ -60,14 +60,14 @@ const createRequestHandler = async (handleRequest) => {
60
60
  const runner = getGlobalRunner();
61
61
  const { routeManifest } = options.resource;
62
62
  const context = getInitialContext(runner, false, routeManifest);
63
- const runInit = (_context) => runner.init({
64
- context: _context
65
- }, {
66
- onLast: ({ context: context1 }) => {
67
- const init = getGlobalAppInit();
68
- return init === null || init === void 0 ? void 0 : init(context1);
63
+ const runBeforeRender = async (context2) => {
64
+ const result = await runner.beforeRender(context2);
65
+ if (typeof Response !== "undefined" && result instanceof Response) {
66
+ return result;
69
67
  }
70
- });
68
+ const init = getGlobalAppInit();
69
+ return init === null || init === void 0 ? void 0 : init(context2);
70
+ };
71
71
  const responseProxy = {
72
72
  headers: {},
73
73
  code: -1
@@ -102,7 +102,7 @@ const createRequestHandler = async (handleRequest) => {
102
102
  }
103
103
  return void 0;
104
104
  };
105
- const initialData = await runInit(context);
105
+ const initialData = await runBeforeRender(context);
106
106
  context.initialData = initialData;
107
107
  const redirectResponse = getRedirectResponse(initialData);
108
108
  if (redirectResponse) {
@@ -33,11 +33,11 @@ function createRenderStreaming(createReadableStreamFromElement) {
33
33
  const headersData = parseHeaders(request);
34
34
  return run(headersData, async () => {
35
35
  const end = time();
36
- const { runtimeContext, config, resource, staticGenerate } = options;
36
+ const { runtimeContext, config, resource } = options;
37
37
  const onError = createOnError(options.onError);
38
38
  const onTiming = createOnTiming(options.onTiming);
39
39
  const { htmlTemplate, entryName } = resource;
40
- const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries, staticGenerate);
40
+ const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries);
41
41
  const rootElement = React.cloneElement(serverRoot, {
42
42
  _internal_context: Object.assign(runtimeContext, {
43
43
  ssr: true
@@ -18,14 +18,14 @@ const renderString = async (request, serverRoot, options) => {
18
18
  const headersData = parseHeaders(request);
19
19
  return run(headersData, async () => {
20
20
  var _runtimeContext_ssrContext;
21
- const { resource, runtimeContext, config, onError, onTiming, staticGenerate } = options;
21
+ const { resource, runtimeContext, config, onError, onTiming } = options;
22
22
  const tracer = {
23
23
  onError: createOnError(onError),
24
24
  onTiming: createOnTiming(onTiming)
25
25
  };
26
26
  const routerContext = runtimeContext.routerContext;
27
27
  const { htmlTemplate, entryName, loadableStats, routeManifest } = resource;
28
- const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries, staticGenerate);
28
+ const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries);
29
29
  const chunkSet = {
30
30
  renderLevel: RenderLevel.CLIENT_RENDER,
31
31
  ssrScripts: "",
@@ -38,6 +38,7 @@ const renderString = async (request, serverRoot, options) => {
38
38
  chunkSet.renderLevel = RenderLevel.SERVER_PREFETCH;
39
39
  } catch (e) {
40
40
  chunkSet.renderLevel = RenderLevel.CLIENT_RENDER;
41
+ tracer.onError(SSRErrors.PRERENDER, e);
41
42
  }
42
43
  const collectors = [
43
44
  new StyledCollector(chunkSet),
@@ -35,14 +35,11 @@ function serializeErrors(errors) {
35
35
  }
36
36
  return serialized;
37
37
  }
38
- function getSSRConfigByEntry(entryName, ssr, ssrByEntries, staticGenerate) {
39
- if (staticGenerate) {
40
- return true;
41
- }
38
+ function getSSRConfigByEntry(entryName, ssr, ssrByEntries) {
42
39
  if (ssrByEntries === null || ssrByEntries === void 0 ? void 0 : ssrByEntries[entryName]) {
43
40
  return ssrByEntries[entryName];
44
41
  }
45
- return ssr;
42
+ return ssr || true;
46
43
  }
47
44
  function getSSRMode(ssrConfig) {
48
45
  if (typeof ssrConfig === "boolean") {