@modern-js/runtime 1.21.2 → 2.0.0-beta.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 (148) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/js/modern/cli/index.js +1 -1
  3. package/dist/js/modern/core/index.js +1 -1
  4. package/dist/js/modern/index.js +1 -0
  5. package/dist/js/modern/router/cli/index.js +24 -8
  6. package/dist/js/modern/router/runtime/index.js +1 -1
  7. package/dist/js/modern/router/runtime/plugin.js +26 -44
  8. package/dist/js/modern/router/runtime/plugin.node.js +143 -0
  9. package/dist/js/modern/router/runtime/types.js +1 -0
  10. package/dist/js/modern/router/runtime/utils.js +97 -37
  11. package/dist/js/modern/router/runtime/withRouter.js +22 -0
  12. package/dist/js/modern/runtime-context.js +2 -1
  13. package/dist/js/modern/ssr/cli/index.js +44 -5
  14. package/dist/js/modern/ssr/index.js +67 -43
  15. package/dist/js/modern/ssr/index.node.js +6 -2
  16. package/dist/js/modern/ssr/serverRender/index.js +12 -26
  17. package/dist/js/modern/ssr/serverRender/renderToStream/buildTemplate.after.js +38 -0
  18. package/dist/js/modern/ssr/serverRender/renderToStream/buildTemplate.share.js +5 -0
  19. package/dist/js/modern/ssr/serverRender/renderToStream/bulidTemplate.before.js +24 -0
  20. package/dist/js/modern/ssr/serverRender/renderToStream/index.js +73 -0
  21. package/dist/js/modern/ssr/serverRender/renderToStream/loadable.js +26 -0
  22. package/dist/js/modern/ssr/serverRender/renderToStream/renderToPipe.js +61 -0
  23. package/dist/js/modern/ssr/serverRender/renderToStream/styledComponent.js +11 -0
  24. package/dist/js/modern/ssr/serverRender/renderToStream/template.js +22 -0
  25. package/dist/js/modern/ssr/serverRender/renderToStream/type.js +0 -0
  26. package/dist/js/modern/ssr/serverRender/{entry.js → renderToString/entry.js} +4 -6
  27. package/dist/js/modern/ssr/serverRender/renderToString/index.js +31 -0
  28. package/dist/js/modern/ssr/serverRender/{loadable.js → renderToString/loadable.js} +5 -13
  29. package/dist/js/modern/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -0
  30. package/dist/js/modern/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -0
  31. package/dist/js/modern/ssr/serverRender/{template.js → renderToString/template.js} +0 -0
  32. package/dist/js/modern/ssr/serverRender/{type.js → renderToString/type.js} +0 -1
  33. package/dist/js/modern/ssr/serverRender/types.js +2 -0
  34. package/dist/js/modern/ssr/serverRender/utils.js +24 -0
  35. package/dist/js/modern/ssr/utils.js +9 -3
  36. package/dist/js/node/cli/index.js +1 -1
  37. package/dist/js/node/core/index.js +8 -1
  38. package/dist/js/node/index.js +8 -0
  39. package/dist/js/node/router/cli/index.js +24 -8
  40. package/dist/js/node/router/runtime/index.js +4 -4
  41. package/dist/js/node/router/runtime/plugin.js +24 -49
  42. package/dist/js/node/router/runtime/plugin.node.js +169 -0
  43. package/dist/js/node/router/runtime/types.js +5 -0
  44. package/dist/js/node/router/runtime/utils.js +97 -35
  45. package/dist/js/node/router/runtime/withRouter.js +35 -0
  46. package/dist/js/node/runtime-context.js +4 -2
  47. package/dist/js/node/ssr/cli/index.js +43 -5
  48. package/dist/js/node/ssr/index.js +66 -43
  49. package/dist/js/node/ssr/index.node.js +7 -3
  50. package/dist/js/node/ssr/serverRender/index.js +13 -35
  51. package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.after.js +49 -0
  52. package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.share.js +14 -0
  53. package/dist/js/node/ssr/serverRender/renderToStream/bulidTemplate.before.js +37 -0
  54. package/dist/js/node/ssr/serverRender/renderToStream/index.js +90 -0
  55. package/dist/js/node/ssr/serverRender/renderToStream/loadable.js +34 -0
  56. package/dist/js/node/ssr/serverRender/renderToStream/renderToPipe.js +70 -0
  57. package/dist/js/node/ssr/serverRender/renderToStream/styledComponent.js +19 -0
  58. package/dist/js/node/ssr/serverRender/renderToStream/template.js +32 -0
  59. package/dist/js/node/ssr/serverRender/renderToStream/type.js +0 -0
  60. package/dist/js/node/ssr/serverRender/{entry.js → renderToString/entry.js} +13 -15
  61. package/dist/js/node/ssr/serverRender/renderToString/index.js +47 -0
  62. package/dist/js/node/ssr/serverRender/{loadable.js → renderToString/loadable.js} +7 -14
  63. package/dist/js/node/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -0
  64. package/dist/js/node/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -0
  65. package/dist/js/node/ssr/serverRender/{template.js → renderToString/template.js} +0 -0
  66. package/dist/js/node/ssr/serverRender/{type.js → renderToString/type.js} +0 -1
  67. package/dist/js/node/ssr/serverRender/types.js +13 -0
  68. package/dist/js/node/ssr/serverRender/utils.js +34 -0
  69. package/dist/js/node/ssr/utils.js +13 -4
  70. package/dist/js/treeshaking/cli/index.js +1 -1
  71. package/dist/js/treeshaking/core/index.js +1 -1
  72. package/dist/js/treeshaking/index.js +1 -0
  73. package/dist/js/treeshaking/router/cli/index.js +24 -8
  74. package/dist/js/treeshaking/router/runtime/index.js +1 -1
  75. package/dist/js/treeshaking/router/runtime/plugin.js +25 -43
  76. package/dist/js/treeshaking/router/runtime/plugin.node.js +174 -0
  77. package/dist/js/treeshaking/router/runtime/types.js +1 -0
  78. package/dist/js/treeshaking/router/runtime/utils.js +100 -36
  79. package/dist/js/treeshaking/router/runtime/withRouter.js +17 -0
  80. package/dist/js/treeshaking/runtime-context.js +2 -1
  81. package/dist/js/treeshaking/ssr/cli/index.js +47 -5
  82. package/dist/js/treeshaking/ssr/index.js +74 -45
  83. package/dist/js/treeshaking/ssr/index.node.js +6 -2
  84. package/dist/js/treeshaking/ssr/serverRender/index.js +41 -55
  85. package/dist/js/treeshaking/ssr/serverRender/renderToStream/buildTemplate.after.js +33 -0
  86. package/dist/js/treeshaking/ssr/serverRender/renderToStream/buildTemplate.share.js +7 -0
  87. package/dist/js/treeshaking/ssr/serverRender/renderToStream/bulidTemplate.before.js +29 -0
  88. package/dist/js/treeshaking/ssr/serverRender/renderToStream/index.js +120 -0
  89. package/dist/js/treeshaking/ssr/serverRender/renderToStream/loadable.js +24 -0
  90. package/dist/js/treeshaking/ssr/serverRender/renderToStream/renderToPipe.js +57 -0
  91. package/dist/js/treeshaking/ssr/serverRender/renderToStream/styledComponent.js +10 -0
  92. package/dist/js/treeshaking/ssr/serverRender/renderToStream/template.js +29 -0
  93. package/dist/js/treeshaking/ssr/serverRender/renderToStream/type.js +0 -0
  94. package/dist/js/treeshaking/ssr/serverRender/{entry.js → renderToString/entry.js} +3 -3
  95. package/dist/js/treeshaking/ssr/serverRender/renderToString/index.js +48 -0
  96. package/dist/js/treeshaking/ssr/serverRender/{loadable.js → renderToString/loadable.js} +5 -17
  97. package/dist/js/treeshaking/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -0
  98. package/dist/js/treeshaking/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -0
  99. package/dist/js/treeshaking/ssr/serverRender/{template.js → renderToString/template.js} +0 -0
  100. package/dist/js/treeshaking/ssr/serverRender/{type.js → renderToString/type.js} +0 -1
  101. package/dist/js/treeshaking/ssr/serverRender/types.js +2 -0
  102. package/dist/js/treeshaking/ssr/serverRender/{measure.js → utils.js} +16 -0
  103. package/dist/js/treeshaking/ssr/utils.js +15 -3
  104. package/dist/types/common.d.ts +0 -2
  105. package/dist/types/core/index.d.ts +1 -1
  106. package/dist/types/core/plugin.d.ts +1 -1
  107. package/dist/types/exports/server.d.ts +21 -1
  108. package/dist/types/index.d.ts +1 -0
  109. package/dist/types/router/runtime/DefaultNotFound.d.ts +1 -0
  110. package/dist/types/router/runtime/index.d.ts +3 -3
  111. package/dist/types/router/runtime/plugin.d.ts +2 -45
  112. package/dist/types/router/runtime/plugin.node.d.ts +8 -0
  113. package/dist/types/router/runtime/types.d.ts +38 -0
  114. package/dist/types/router/runtime/utils.d.ts +5 -2
  115. package/dist/types/router/runtime/withRouter.d.ts +8 -0
  116. package/dist/types/runtime-context.d.ts +2 -1
  117. package/dist/types/ssr/index.d.ts +2 -2
  118. package/dist/types/ssr/index.node.d.ts +1 -1
  119. package/dist/types/ssr/react/nossr/index.d.ts +3 -1
  120. package/dist/types/ssr/serverRender/index.d.ts +2 -3
  121. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +6 -0
  122. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.share.d.ts +3 -0
  123. package/dist/types/ssr/serverRender/renderToStream/bulidTemplate.before.d.ts +1 -0
  124. package/dist/types/ssr/serverRender/renderToStream/index.d.ts +6 -0
  125. package/dist/types/ssr/serverRender/renderToStream/loadable.d.ts +16 -0
  126. package/dist/types/ssr/serverRender/renderToStream/renderToPipe.d.ts +8 -0
  127. package/dist/types/ssr/serverRender/renderToStream/styledComponent.d.ts +12 -0
  128. package/dist/types/ssr/serverRender/renderToStream/template.d.ts +3 -0
  129. package/dist/types/ssr/serverRender/renderToStream/type.d.ts +4 -0
  130. package/dist/types/ssr/serverRender/{entry.d.ts → renderToString/entry.d.ts} +2 -2
  131. package/dist/types/ssr/serverRender/renderToString/index.d.ts +6 -0
  132. package/dist/types/ssr/serverRender/{loadable.d.ts → renderToString/loadable.d.ts} +0 -0
  133. package/dist/types/ssr/serverRender/{reduce.d.ts → renderToString/reduce.d.ts} +0 -0
  134. package/dist/types/ssr/serverRender/{styledComponent.d.ts → renderToString/styledComponent.d.ts} +0 -0
  135. package/dist/types/ssr/serverRender/{template.d.ts → renderToString/template.d.ts} +0 -0
  136. package/dist/types/ssr/serverRender/{type.d.ts → renderToString/type.d.ts} +1 -8
  137. package/dist/types/ssr/serverRender/types.d.ts +18 -0
  138. package/dist/types/ssr/serverRender/utils.d.ts +3 -0
  139. package/dist/types/ssr/utils.d.ts +4 -2
  140. package/dist/types/state/runtime/plugin.d.ts +1 -1
  141. package/package.json +57 -73
  142. package/types/index.d.ts +13 -0
  143. package/types/router.d.ts +14 -0
  144. package/dist/js/modern/ssr/serverRender/measure.js +0 -11
  145. package/dist/js/node/ssr/serverRender/measure.js +0 -20
  146. package/dist/types/ssr/serverRender/measure.d.ts +0 -1
  147. package/lib/types.d.ts +0 -10
  148. package/type.d.ts +0 -5
package/CHANGELOG.md CHANGED
@@ -1,5 +1,57 @@
1
1
  # @modern-js/runtime
2
2
 
3
+ ## 2.0.0-beta.0
4
+
5
+ ### Major Changes
6
+
7
+ - dda38c9: chore: v2
8
+
9
+ ### Minor Changes
10
+
11
+ - c9e800d39: feat: support React18 streaming SSR
12
+ feat: 支持 React18 流式 SSR
13
+ - 543be95: feat: compile server loader and support handle loader request
14
+ feat: 编译 server loader 并支持处理 loader 的请求
15
+
16
+ ### Patch Changes
17
+
18
+ - b18fa8f: feat: remove @loadable/component in streaming ssr
19
+ feat: 移除 streaming ssr 中的 @loadable/component 逻辑
20
+ - a2509bf: feat: bump esbuild from 0.14.38 to 0.15.7
21
+
22
+ feat: 将 esbuild 从 0.14.38 版本升级至 0.15.7 版本
23
+
24
+ - 4369648ae: fix: fix html template of streaming ssr
25
+ fix: 修复流式渲染的 html 模版
26
+ - 6bda14ed7: feat: refactor router with react-router@6.4
27
+
28
+ feat: 使用 react-router@6.4 重构路由模块
29
+
30
+ - 60d5378: fix: function extname should not return array
31
+ fix: 函数 extname 不应该返回一个数组
32
+ - 8b8e1bb57: feat: support nested routes
33
+ feat: 支持嵌套路由
34
+ - 3bbea92b2: feat: support Hook、Middleware new API
35
+ feat: 支持 Hook、Middleware 的新 API
36
+ - fcace5b5b: fix: remove overmuch `@modernjs/utils` dependency import in ssr runtime & SSR hydrate error
37
+ fix: 去除 ssr 运行时过多的 `@modernjs/utils` 依赖引入 & SSR hydrate 错误
38
+ - Updated dependencies [edd1cfb1a]
39
+ - Updated dependencies [cc971eabf]
40
+ - Updated dependencies [5b9049f]
41
+ - Updated dependencies [6bda14ed7]
42
+ - Updated dependencies [b8bbe036c]
43
+ - Updated dependencies [d5a31df78]
44
+ - Updated dependencies [dda38c9]
45
+ - Updated dependencies [102d32e4b]
46
+ - Updated dependencies [8b8e1bb57]
47
+ - Updated dependencies [3bbea92b2]
48
+ - Updated dependencies [abf3421]
49
+ - Updated dependencies [543be95]
50
+ - Updated dependencies [14b712d]
51
+ - @modern-js/utils@2.0.0-beta.0
52
+ - @modern-js/types@2.0.0-beta.0
53
+ - @modern-js/plugin@2.0.0-beta.0
54
+
3
55
  ## 1.21.2
4
56
 
5
57
  ### Patch Changes
@@ -6,7 +6,7 @@ import PluginRouter from "../router/cli";
6
6
  export default (() => ({
7
7
  name: '@modern-js/runtime',
8
8
  post: ['@modern-js/plugin-router', '@modern-js/plugin-ssr', '@modern-js/plugin-state', '@modern-js/plugin-design-token'],
9
- usePlugins: [PluginState(), PluginRouter(), PluginSSR()],
9
+ usePlugins: [PluginState(), PluginSSR(), PluginRouter()],
10
10
  setup: api => {
11
11
  return {
12
12
  config() {
@@ -2,6 +2,6 @@ export { createPlugin, createRuntime, runtime, registerInit, registerPrefetch }
2
2
  export { defineConfig, getConfig } from "./app-config"; // compatible
3
3
 
4
4
  export * from "./compatible";
5
- export { RuntimeReactContext } from "../runtime-context";
5
+ export { RuntimeReactContext, ServerRouterContext } from "../runtime-context";
6
6
  export * from "./loader";
7
7
  export * from '@modern-js/plugin';
@@ -1 +1,2 @@
1
+ export { isBrowser } from "./common";
1
2
  export { createApp, createPlugin, useLoader, bootstrap, RuntimeReactContext, registerPrefetch, defineConfig, registerInit, useRuntimeContext } from "./core";
@@ -34,11 +34,14 @@ export default (() => ({
34
34
  entrypoint,
35
35
  imports
36
36
  }) {
37
+ var _userConfig$runtime, _userConfig$runtime$r;
38
+
37
39
  const {
38
40
  entryName,
39
41
  fileSystemRoutes
40
42
  } = entrypoint;
41
43
  const userConfig = api.useResolvedConfigContext();
44
+ const isLegacy = Boolean(userConfig === null || userConfig === void 0 ? void 0 : (_userConfig$runtime = userConfig.runtime) === null || _userConfig$runtime === void 0 ? void 0 : (_userConfig$runtime$r = _userConfig$runtime.router) === null || _userConfig$runtime$r === void 0 ? void 0 : _userConfig$runtime$r.legacy);
42
45
  const {
43
46
  packageName
44
47
  } = api.useAppContext();
@@ -46,12 +49,14 @@ export default (() => ({
46
49
  runtimeConfigMap.set(entryName, runtimeConfig);
47
50
 
48
51
  if (runtimeConfig !== null && runtimeConfig !== void 0 && runtimeConfig.router) {
49
- imports.push({
50
- value: '@modern-js/runtime/plugins',
51
- specifiers: [{
52
- imported: PLUGIN_IDENTIFIER
53
- }]
54
- });
52
+ if (!isLegacy) {
53
+ imports.push({
54
+ value: '@modern-js/runtime/plugins',
55
+ specifiers: [{
56
+ imported: PLUGIN_IDENTIFIER
57
+ }]
58
+ });
59
+ }
55
60
  } else if (fileSystemRoutes) {
56
61
  throw new Error(`should enable runtime.router for entry ${entryName}`);
57
62
  }
@@ -66,6 +71,8 @@ export default (() => ({
66
71
  entrypoint,
67
72
  plugins
68
73
  }) {
74
+ var _userConfig$runtime2, _userConfig$runtime2$;
75
+
69
76
  const {
70
77
  entryName,
71
78
  fileSystemRoutes
@@ -73,9 +80,11 @@ export default (() => ({
73
80
  const {
74
81
  serverRoutes
75
82
  } = api.useAppContext();
83
+ const userConfig = api.useResolvedConfigContext();
84
+ const isLegacy = Boolean(userConfig === null || userConfig === void 0 ? void 0 : (_userConfig$runtime2 = userConfig.runtime) === null || _userConfig$runtime2 === void 0 ? void 0 : (_userConfig$runtime2$ = _userConfig$runtime2.router) === null || _userConfig$runtime2$ === void 0 ? void 0 : _userConfig$runtime2$.legacy);
76
85
  const runtimeConfig = runtimeConfigMap.get(entryName);
77
86
 
78
- if (runtimeConfig.router) {
87
+ if (runtimeConfig.router && !isLegacy) {
79
88
  // Todo: plugin-router best to only handle manage client route.
80
89
  // here support base server route usage, part for compatibility
81
90
  const serverBase = serverRoutes.filter(route => route.entryName === entryName).map(route => route.urlPath).sort((a, b) => a.length - b.length > 0 ? -1 : 1);
@@ -96,7 +105,14 @@ export default (() => ({
96
105
  },
97
106
 
98
107
  addRuntimeExports() {
99
- pluginsExportsUtils.addExport(`export { default as router } from '@modern-js/runtime/router'`);
108
+ var _userConfig$runtime3, _userConfig$runtime3$;
109
+
110
+ const userConfig = api.useResolvedConfigContext();
111
+ const isLegacy = Boolean(userConfig === null || userConfig === void 0 ? void 0 : (_userConfig$runtime3 = userConfig.runtime) === null || _userConfig$runtime3 === void 0 ? void 0 : (_userConfig$runtime3$ = _userConfig$runtime3.router) === null || _userConfig$runtime3$ === void 0 ? void 0 : _userConfig$runtime3$.legacy);
112
+
113
+ if (!isLegacy) {
114
+ pluginsExportsUtils.addExport(`export { default as router } from '@modern-js/runtime/router'`);
115
+ }
100
116
  }
101
117
 
102
118
  };
@@ -1,4 +1,4 @@
1
1
  import { routerPlugin } from "./plugin";
2
2
  export default routerPlugin;
3
3
  export * from 'react-router-dom';
4
- export * from 'history';
4
+ export * from "./withRouter";
@@ -4,23 +4,17 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
4
4
 
5
5
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
6
 
7
- import React, { useContext } from 'react';
8
- import { createBrowserHistory, createHashHistory } from 'history';
9
- import { Router, StaticRouter } from 'react-router-dom';
7
+ import React from 'react';
8
+ import { createBrowserRouter, createHashRouter, RouterProvider, createRoutesFromElements } from 'react-router-dom';
10
9
  import hoistNonReactStatics from 'hoist-non-react-statics';
11
- import { RuntimeReactContext } from "../../core";
12
- import { isBrowser } from "../../common";
13
- import { renderRoutes, getLocation, urlJoin } from "./utils";
10
+ import { renderRoutes } from "./utils";
14
11
  import { jsx as _jsx } from "react/jsx-runtime";
15
12
  export const routerPlugin = ({
16
13
  serverBase: _serverBase = [],
17
- history: customHistory,
18
14
  supportHtml5History: _supportHtml5History = true,
19
15
  routesConfig,
20
- historyOptions: _historyOptions = {}
16
+ createRoutes
21
17
  }) => {
22
- const isBrow = isBrowser();
23
-
24
18
  const select = pathname => _serverBase.find(baseUrl => pathname.search(baseUrl) === 0) || '/';
25
19
 
26
20
  return {
@@ -30,49 +24,37 @@ export const routerPlugin = ({
30
24
  hoc: ({
31
25
  App
32
26
  }, next) => {
27
+ // can not get routes config, skip wrapping React Router.
28
+ // e.g. App.tsx as the entrypoint
29
+ if (!routesConfig) {
30
+ return next({
31
+ App
32
+ });
33
+ }
34
+
33
35
  const getRouteApp = () => {
34
- if (isBrow) {
36
+ return props => {
35
37
  var _window$_SERVER_DATA;
36
38
 
39
+ const routeElements = renderRoutes(routesConfig);
40
+ const routes = createRoutes ? createRoutes() : createRoutesFromElements(routeElements);
37
41
  const baseUrl = ((_window$_SERVER_DATA = window._SERVER_DATA) === null || _window$_SERVER_DATA === void 0 ? void 0 : _window$_SERVER_DATA.router.baseUrl) || select(location.pathname);
38
- _historyOptions.basename = baseUrl === '/' ? urlJoin(baseUrl, _historyOptions.basename) : baseUrl;
39
- const history = customHistory || (_supportHtml5History ? createBrowserHistory(_historyOptions) : createHashHistory(_historyOptions));
40
- return props => /*#__PURE__*/_jsx(Router, {
41
- history: history,
42
- children: /*#__PURE__*/_jsx(App, _objectSpread(_objectSpread({}, props), {}, {
43
- children: routesConfig ? renderRoutes(routesConfig, props) : null
44
- }))
45
- });
46
- }
47
-
48
- return props => {
49
- const runtimeContext = useContext(RuntimeReactContext);
50
- const {
51
- ssrContext
52
- } = runtimeContext;
53
- const location = getLocation(ssrContext);
54
- const routerContext = (ssrContext === null || ssrContext === void 0 ? void 0 : ssrContext.redirection) || {};
55
- const request = ssrContext === null || ssrContext === void 0 ? void 0 : ssrContext.request;
56
- const baseUrl = request === null || request === void 0 ? void 0 : request.baseUrl;
57
- const basename = baseUrl === '/' ? urlJoin(baseUrl, _historyOptions.basename) : baseUrl;
58
- return /*#__PURE__*/_jsx(StaticRouter, {
59
- basename: basename === '/' ? '' : basename,
60
- location: location,
61
- context: routerContext,
62
- children: /*#__PURE__*/_jsx(App, _objectSpread(_objectSpread({}, props), {}, {
63
- children: routesConfig ? renderRoutes(routesConfig, props) : null
64
- }))
42
+ const router = _supportHtml5History ? createBrowserRouter(routes, {
43
+ basename: baseUrl
44
+ }) : createHashRouter(routes, {
45
+ basename: baseUrl
65
46
  });
47
+ return /*#__PURE__*/_jsx(App, _objectSpread(_objectSpread({}, props), {}, {
48
+ children: /*#__PURE__*/_jsx(RouterProvider, {
49
+ router: router
50
+ })
51
+ }));
66
52
  };
67
53
  };
68
54
 
69
- let RouteApp = getRouteApp();
70
-
71
- if (App) {
72
- RouteApp = hoistNonReactStatics(RouteApp, App);
73
- }
55
+ const RouteApp = getRouteApp();
74
56
 
75
- if (routesConfig !== null && routesConfig !== void 0 && routesConfig.globalApp) {
57
+ if (routesConfig.globalApp) {
76
58
  return next({
77
59
  App: hoistNonReactStatics(RouteApp, routesConfig.globalApp)
78
60
  });
@@ -0,0 +1,143 @@
1
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
+
3
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
+
5
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+
7
+ import React, { useContext } from 'react';
8
+ import { unstable_createStaticHandler as createStaticHandler } from '@remix-run/router';
9
+ import { unstable_createStaticRouter as createStaticRouter, unstable_StaticRouterProvider as StaticRouterProvider } from 'react-router-dom/server';
10
+ import hoistNonReactStatics from 'hoist-non-react-statics';
11
+ import { installGlobals } from '@remix-run/node';
12
+ import { createRoutesFromElements } from 'react-router-dom';
13
+ import { RuntimeReactContext } from "../../core";
14
+ import { renderRoutes } from "./utils"; // Polyfill Web Fetch API
15
+
16
+ import { jsx as _jsx } from "react/jsx-runtime";
17
+ installGlobals(); // TODO: polish
18
+
19
+ function createFetchRequest(req) {
20
+ // const origin = `${req.protocol}://${req.get('host')}`;
21
+ const origin = `${req.protocol}://${req.host}`; // Note: This had to take originalUrl into account for presumably vite's proxying
22
+
23
+ const url = new URL(req.originalUrl || req.url, origin);
24
+ const controller = new AbortController(); // req.on('close', () => {
25
+ // controller.abort();
26
+ // });
27
+
28
+ const init = {
29
+ method: req.method,
30
+ headers: createFetchHeaders(req.headers),
31
+ signal: controller.signal
32
+ }; // if (req.method !== 'GET' && req.method !== 'HEAD') {
33
+ // init.body = req.body;
34
+ // }
35
+
36
+ return new Request(url.href, init);
37
+ }
38
+
39
+ export function createFetchHeaders(requestHeaders) {
40
+ const headers = new Headers();
41
+
42
+ for (const [key, values] of Object.entries(requestHeaders)) {
43
+ if (values) {
44
+ if (Array.isArray(values)) {
45
+ for (const value of values) {
46
+ headers.append(key, value);
47
+ }
48
+ } else {
49
+ headers.set(key, values);
50
+ }
51
+ }
52
+ }
53
+
54
+ return headers;
55
+ }
56
+ export const routerPlugin = ({
57
+ routesConfig,
58
+ createRoutes
59
+ }) => {
60
+ return {
61
+ name: '@modern-js/plugin-router',
62
+ setup: () => {
63
+ return {
64
+ async init({
65
+ context
66
+ }, next) {
67
+ // can not get routes config, skip wrapping React Router.
68
+ // e.g. App.tsx as the entrypoint
69
+ if (!routesConfig) {
70
+ return next({
71
+ context
72
+ });
73
+ }
74
+
75
+ const {
76
+ request
77
+ } = context.ssrContext;
78
+ const routeElements = renderRoutes(routesConfig);
79
+ const routes = createRoutes ? createRoutes() : createRoutesFromElements(routeElements);
80
+ const {
81
+ query
82
+ } = createStaticHandler(routes);
83
+ const remixRequest = createFetchRequest(request);
84
+ const routerContext = await query(remixRequest);
85
+
86
+ if (routerContext instanceof Response) {
87
+ // TODO: resolve repsonse ?
88
+ return next({
89
+ context
90
+ });
91
+ }
92
+
93
+ const router = createStaticRouter(routes, routerContext);
94
+ context.router = router;
95
+ context.routerContext = routerContext;
96
+ return next({
97
+ context
98
+ });
99
+ },
100
+
101
+ hoc: ({
102
+ App
103
+ }, next) => {
104
+ // can not get routes config, skip wrapping React Router.
105
+ // e.g. App.tsx as the entrypoint
106
+ if (!routesConfig) {
107
+ return next({
108
+ App
109
+ });
110
+ }
111
+
112
+ const getRouteApp = () => {
113
+ return props => {
114
+ const {
115
+ router,
116
+ routerContext
117
+ } = useContext(RuntimeReactContext);
118
+ return /*#__PURE__*/_jsx(App, _objectSpread(_objectSpread({}, props), {}, {
119
+ children: /*#__PURE__*/_jsx(StaticRouterProvider, {
120
+ router: router,
121
+ context: routerContext,
122
+ nonce: "the-nonce"
123
+ })
124
+ }));
125
+ };
126
+ };
127
+
128
+ const RouteApp = getRouteApp();
129
+
130
+ if (routesConfig.globalApp) {
131
+ return next({
132
+ App: hoistNonReactStatics(RouteApp, routesConfig.globalApp)
133
+ });
134
+ }
135
+
136
+ return next({
137
+ App: RouteApp
138
+ });
139
+ }
140
+ };
141
+ }
142
+ };
143
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,28 +1,80 @@
1
1
  const _excluded = ["Component"];
2
2
 
3
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
4
+
5
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
6
+
3
7
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4
8
 
5
9
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
10
 
7
11
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8
12
 
9
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
10
-
11
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
12
-
13
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
14
- import React from 'react';
15
- import { Route, matchPath } from 'react-router-dom';
13
+ import React, { Suspense } from 'react';
14
+ import { Route } from 'react-router-dom';
16
15
  import { DefaultNotFound } from "./DefaultNotFound";
17
16
  import { jsx as _jsx } from "react/jsx-runtime";
18
- export function renderRoutes(routesConfig, extraProps = {}) {
17
+
18
+ const renderNestedRoute = (nestedRoute, parent) => {
19
+ const {
20
+ children,
21
+ index,
22
+ id,
23
+ component: Component
24
+ } = nestedRoute;
25
+ const childElements = children === null || children === void 0 ? void 0 : children.map(childRoute => {
26
+ return renderNestedRoute(childRoute, nestedRoute);
27
+ });
28
+ const routeProps = {
29
+ caseSensitive: nestedRoute.caseSensitive,
30
+ path: nestedRoute.path,
31
+ id: nestedRoute.id,
32
+ loader: nestedRoute.loader,
33
+ action: nestedRoute.action,
34
+ hasErrorBoundary: nestedRoute.hasErrorBoundary,
35
+ shouldRevalidate: nestedRoute.shouldRevalidate,
36
+ handle: nestedRoute.handle,
37
+ index: nestedRoute.index,
38
+ errorElement: nestedRoute.errorElement
39
+ };
40
+
41
+ if (nestedRoute.error) {
42
+ const errorElement = /*#__PURE__*/_jsx(nestedRoute.error, {});
43
+
44
+ routeProps.errorElement = errorElement;
45
+ }
46
+
47
+ if (Component) {
48
+ if (parent !== null && parent !== void 0 && parent.loading) {
49
+ const Loading = parent.loading;
50
+ routeProps.element = /*#__PURE__*/_jsx(Suspense, {
51
+ fallback: /*#__PURE__*/_jsx(Loading, {}),
52
+ children: /*#__PURE__*/_jsx(Component, {})
53
+ });
54
+ } else {
55
+ routeProps.element = /*#__PURE__*/_jsx(Suspense, {
56
+ children: /*#__PURE__*/_jsx(Component, {})
57
+ });
58
+ }
59
+ }
60
+
61
+ const routeElement = index ? /*#__PURE__*/_jsx(Route, _objectSpread(_objectSpread({}, routeProps), {}, {
62
+ index: true
63
+ }), id) : /*#__PURE__*/_jsx(Route, _objectSpread(_objectSpread({}, routeProps), {}, {
64
+ index: false,
65
+ children: childElements
66
+ }), id);
67
+ return routeElement;
68
+ };
69
+
70
+ export function getRouteComponents(routes, globalApp) {
19
71
  const Layout = _ref => {
20
72
  let {
21
73
  Component
22
74
  } = _ref,
23
75
  props = _objectWithoutProperties(_ref, _excluded);
24
76
 
25
- const GlobalLayout = routesConfig === null || routesConfig === void 0 ? void 0 : routesConfig.globalApp;
77
+ const GlobalLayout = globalApp;
26
78
 
27
79
  if (!GlobalLayout) {
28
80
  return /*#__PURE__*/_jsx(Component, _objectSpread({}, props));
@@ -33,38 +85,46 @@ export function renderRoutes(routesConfig, extraProps = {}) {
33
85
  }, props));
34
86
  };
35
87
 
36
- const findMatchedRoute = pathname => {
37
- var _routesConfig$routes;
88
+ const routeElements = [];
38
89
 
39
- return routesConfig === null || routesConfig === void 0 ? void 0 : (_routesConfig$routes = routesConfig.routes) === null || _routesConfig$routes === void 0 ? void 0 : _routesConfig$routes.find(route => {
40
- const info = matchPath(pathname, {
90
+ for (const route of routes) {
91
+ if (route.type === 'nested') {
92
+ const routeElement = renderNestedRoute(route);
93
+ routeElements.push(routeElement);
94
+ } else {
95
+ const routeElement = /*#__PURE__*/_jsx(Route, {
41
96
  path: route.path,
42
- exact: route.exact,
43
- sensitive: route.sensitive
44
- });
45
- return Boolean(info);
46
- });
47
- };
97
+ element: /*#__PURE__*/_jsx(Layout, {
98
+ Component: route.component
99
+ })
100
+ }, route.path);
48
101
 
49
- return /*#__PURE__*/_jsx(Route, {
50
- path: "/",
51
- render: props => {
52
- const matchedRoute = findMatchedRoute(props.location.pathname);
53
-
54
- if (!matchedRoute) {
55
- return /*#__PURE__*/_jsx(DefaultNotFound, {});
56
- }
57
-
58
- return /*#__PURE__*/_jsx(Route, {
59
- path: matchedRoute.path,
60
- exact: matchedRoute.exact,
61
- sensitive: matchedRoute.sensitive,
62
- render: routeProps => /*#__PURE__*/_jsx(Layout, _objectSpread(_objectSpread({
63
- Component: matchedRoute.component
64
- }, routeProps), extraProps))
65
- });
102
+ routeElements.push(routeElement);
66
103
  }
67
- });
104
+ }
105
+
106
+ routeElements.push( /*#__PURE__*/_jsx(Route, {
107
+ path: "*",
108
+ element: /*#__PURE__*/_jsx(DefaultNotFound, {})
109
+ }, "*"));
110
+ return routeElements;
111
+ }
112
+ export function renderRoutes(routesConfig) {
113
+ if (!routesConfig) {
114
+ return null;
115
+ }
116
+
117
+ const {
118
+ routes,
119
+ globalApp
120
+ } = routesConfig;
121
+
122
+ if (!routes) {
123
+ return null;
124
+ }
125
+
126
+ const routeElements = getRouteComponents(routes, globalApp);
127
+ return routeElements;
68
128
  }
69
129
  export function getLocation(serverContext) {
70
130
  var _url$replace;
@@ -0,0 +1,22 @@
1
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
+
3
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
+
5
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+
7
+ // legacy withRouter
8
+ import React from 'react';
9
+ import { useLocation, useNavigate, useParams } from 'react-router-dom';
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ export const withRouter = Component => {
12
+ return props => {
13
+ const location = useLocation();
14
+ const params = useParams();
15
+ const navigate = useNavigate();
16
+ return /*#__PURE__*/_jsx(Component, _objectSpread(_objectSpread({}, props), {}, {
17
+ location: location,
18
+ params: params,
19
+ navigate: navigate
20
+ }));
21
+ };
22
+ };
@@ -1,2 +1,3 @@
1
1
  import { createContext } from 'react';
2
- export const RuntimeReactContext = /*#__PURE__*/createContext({});
2
+ export const RuntimeReactContext = /*#__PURE__*/createContext({});
3
+ export const ServerRouterContext = /*#__PURE__*/createContext({});