@modern-js/runtime 2.5.0-alpha.0 → 2.6.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 (135) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/cjs/cli/index.js +9 -0
  3. package/dist/cjs/common.js +0 -6
  4. package/dist/cjs/core/app-config.js +5 -1
  5. package/dist/cjs/core/compatible.js +8 -7
  6. package/dist/cjs/core/loader/index.js +4 -0
  7. package/dist/cjs/core/loader/loaderManager.js +6 -0
  8. package/dist/cjs/core/loader/useLoader.js +4 -0
  9. package/dist/cjs/document/Body.js +6 -8
  10. package/dist/cjs/document/DocumentContext.js +4 -0
  11. package/dist/cjs/document/DocumentStructureContext.js +4 -0
  12. package/dist/cjs/document/Head.js +7 -11
  13. package/dist/cjs/document/Html.js +24 -22
  14. package/dist/cjs/document/Links.js +1 -3
  15. package/dist/cjs/document/Root.js +8 -14
  16. package/dist/cjs/document/Script.js +5 -7
  17. package/dist/cjs/document/Scripts.js +1 -3
  18. package/dist/cjs/document/cli/index.js +7 -1
  19. package/dist/cjs/exports/head.js +4 -0
  20. package/dist/cjs/exports/loadable.js +4 -0
  21. package/dist/cjs/exports/styled.js +4 -0
  22. package/dist/cjs/router/cli/index.js +3 -7
  23. package/dist/cjs/router/index.js +4 -0
  24. package/dist/cjs/router/runtime/DefaultNotFound.js +13 -10
  25. package/dist/cjs/router/runtime/index.js +3 -52
  26. package/dist/cjs/router/runtime/plugin.js +6 -14
  27. package/dist/cjs/router/runtime/plugin.node.js +54 -10
  28. package/dist/cjs/router/runtime/utils.js +80 -28
  29. package/dist/cjs/router/runtime/withRouter.js +9 -6
  30. package/dist/cjs/ssr/cli/babel-plugin-ssr-loader-id.js +4 -0
  31. package/dist/cjs/ssr/cli/index.js +4 -0
  32. package/dist/cjs/ssr/index.js +10 -24
  33. package/dist/cjs/ssr/index.node.js +4 -0
  34. package/dist/cjs/ssr/prefetch.js +3 -6
  35. package/dist/cjs/ssr/react/nossr/index.js +4 -0
  36. package/dist/cjs/ssr/react/prerender/index.js +4 -0
  37. package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +19 -5
  38. package/dist/cjs/ssr/serverRender/renderToStream/bulidTemplate.before.js +5 -0
  39. package/dist/cjs/ssr/serverRender/renderToStream/index.js +4 -0
  40. package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.js +7 -22
  41. package/dist/cjs/ssr/serverRender/renderToStream/template.js +1 -2
  42. package/dist/cjs/ssr/serverRender/renderToString/entry.js +14 -12
  43. package/dist/cjs/ssr/serverRender/renderToString/index.js +4 -0
  44. package/dist/cjs/ssr/serverRender/renderToString/loadable.js +1 -1
  45. package/dist/cjs/ssr/serverRender/time.worker.js +1 -1
  46. package/dist/cjs/ssr/serverRender/utils.js +1 -1
  47. package/dist/cjs/ssr/utils.js +16 -4
  48. package/dist/cjs/state/index.js +4 -0
  49. package/dist/cjs/state/plugins.js +4 -0
  50. package/dist/cjs/state/runtime/index.js +4 -0
  51. package/dist/cjs/state/runtime/plugin.js +5 -7
  52. package/dist/esm/cli/index.js +5 -1
  53. package/dist/esm/common.js +1 -3
  54. package/dist/esm/core/app-config.js +3 -1
  55. package/dist/esm/core/compatible.js +3 -1
  56. package/dist/esm/core/loader/loaderManager.js +3 -1
  57. package/dist/esm/document/cli/index.js +3 -1
  58. package/dist/esm/router/cli/index.js +1 -5
  59. package/dist/esm/router/runtime/index.js +2 -3
  60. package/dist/esm/router/runtime/plugin.js +2 -5
  61. package/dist/esm/router/runtime/plugin.node.js +65 -8
  62. package/dist/esm/router/runtime/utils.js +106 -5
  63. package/dist/esm/ssr/prefetch.js +1 -0
  64. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.js +39 -8
  65. package/dist/esm/ssr/serverRender/renderToStream/bulidTemplate.before.js +1 -0
  66. package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.js +8 -19
  67. package/dist/esm/ssr/serverRender/renderToStream/template.js +1 -2
  68. package/dist/esm/ssr/serverRender/renderToString/entry.js +29 -16
  69. package/dist/esm/ssr/serverRender/time.worker.js +1 -1
  70. package/dist/esm/ssr/utils.js +6 -4
  71. package/dist/esm-node/cli/index.js +5 -0
  72. package/dist/esm-node/common.js +0 -4
  73. package/dist/esm-node/core/app-config.js +5 -1
  74. package/dist/esm-node/core/compatible.js +4 -7
  75. package/dist/esm-node/core/loader/loaderManager.js +2 -0
  76. package/dist/esm-node/document/Body.js +6 -8
  77. package/dist/esm-node/document/Head.js +7 -11
  78. package/dist/esm-node/document/Html.js +24 -22
  79. package/dist/esm-node/document/Links.js +1 -3
  80. package/dist/esm-node/document/Root.js +8 -14
  81. package/dist/esm-node/document/Script.js +5 -7
  82. package/dist/esm-node/document/Scripts.js +1 -3
  83. package/dist/esm-node/document/cli/index.js +3 -1
  84. package/dist/esm-node/router/cli/index.js +2 -5
  85. package/dist/esm-node/router/runtime/DefaultNotFound.js +13 -10
  86. package/dist/esm-node/router/runtime/index.js +2 -51
  87. package/dist/esm-node/router/runtime/plugin.js +2 -14
  88. package/dist/esm-node/router/runtime/plugin.node.js +53 -10
  89. package/dist/esm-node/router/runtime/utils.js +80 -22
  90. package/dist/esm-node/router/runtime/withRouter.js +9 -6
  91. package/dist/esm-node/ssr/index.js +6 -24
  92. package/dist/esm-node/ssr/prefetch.js +3 -6
  93. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.js +9 -5
  94. package/dist/esm-node/ssr/serverRender/renderToStream/bulidTemplate.before.js +1 -0
  95. package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.js +7 -22
  96. package/dist/esm-node/ssr/serverRender/renderToStream/template.js +1 -2
  97. package/dist/esm-node/ssr/serverRender/renderToString/entry.js +10 -12
  98. package/dist/esm-node/ssr/serverRender/renderToString/loadable.js +1 -1
  99. package/dist/esm-node/ssr/serverRender/time.worker.js +1 -1
  100. package/dist/esm-node/ssr/serverRender/utils.js +1 -1
  101. package/dist/esm-node/ssr/utils.js +6 -4
  102. package/dist/esm-node/state/runtime/plugin.js +1 -7
  103. package/dist/types/common.d.ts +1 -3
  104. package/dist/types/core/index.d.ts +0 -1
  105. package/dist/types/core/loader/index.d.ts +2 -1
  106. package/dist/types/core/loader/useLoader.d.ts +15 -1
  107. package/dist/types/router/runtime/index.d.ts +2 -4
  108. package/dist/types/runtime-context.d.ts +0 -2
  109. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +0 -2
  110. package/dist/types/ssr/serverRender/renderToString/type.d.ts +1 -0
  111. package/package.json +17 -12
  112. package/dist/cjs/core/types.js +0 -15
  113. package/dist/cjs/router/index.node.js +0 -31
  114. package/dist/cjs/router/runtime/DeferredDataScripts.js +0 -148
  115. package/dist/cjs/ssr/prefetch.worker.js +0 -67
  116. package/dist/cjs/ssr/serverRender/renderToStream/index.worker.js +0 -64
  117. package/dist/cjs/ssr/serverRender/renderToString/index.worker.js +0 -58
  118. package/dist/esm/core/types.js +0 -1
  119. package/dist/esm/router/index.node.js +0 -4
  120. package/dist/esm/router/runtime/DeferredDataScripts.js +0 -158
  121. package/dist/esm/ssr/prefetch.worker.js +0 -191
  122. package/dist/esm/ssr/serverRender/renderToStream/index.worker.js +0 -32
  123. package/dist/esm/ssr/serverRender/renderToString/index.worker.js +0 -167
  124. package/dist/esm-node/core/types.js +0 -0
  125. package/dist/esm-node/router/index.node.js +0 -7
  126. package/dist/esm-node/router/runtime/DeferredDataScripts.js +0 -131
  127. package/dist/esm-node/ssr/prefetch.worker.js +0 -46
  128. package/dist/esm-node/ssr/serverRender/renderToStream/index.worker.js +0 -35
  129. package/dist/esm-node/ssr/serverRender/renderToString/index.worker.js +0 -29
  130. package/dist/types/core/types.d.ts +0 -21
  131. package/dist/types/router/index.node.d.ts +0 -3
  132. package/dist/types/router/runtime/DeferredDataScripts.d.ts +0 -8
  133. package/dist/types/ssr/prefetch.worker.d.ts +0 -13
  134. package/dist/types/ssr/serverRender/renderToStream/index.worker.d.ts +0 -6
  135. package/dist/types/ssr/serverRender/renderToString/index.worker.d.ts +0 -6
@@ -1,58 +1,9 @@
1
1
  import { routerPlugin } from "./plugin";
2
2
  var runtime_default = routerPlugin;
3
3
  import { modifyRoutes } from "./plugin";
4
+ export * from "react-router-dom";
4
5
  export * from "./withRouter";
5
- import {
6
- Form,
7
- Outlet,
8
- useAsyncError,
9
- useAsyncValue,
10
- isRouteErrorResponse,
11
- useBeforeUnload,
12
- useFormAction,
13
- useHref,
14
- useLocation,
15
- useNavigate,
16
- useNavigation,
17
- useNavigationType,
18
- useOutlet,
19
- useOutletContext,
20
- useParams,
21
- useResolvedPath,
22
- useRevalidator,
23
- useRouteError,
24
- useRouteLoaderData,
25
- useSearchParams,
26
- useSubmit,
27
- unstable_useBlocker,
28
- unstable_usePrompt
29
- } from "react-router-dom";
30
- import { defer } from "@modern-js/utils/remix-router";
31
6
  export {
32
- Form,
33
- Outlet,
34
7
  runtime_default as default,
35
- defer,
36
- isRouteErrorResponse,
37
- modifyRoutes,
38
- unstable_useBlocker,
39
- unstable_usePrompt,
40
- useAsyncError,
41
- useAsyncValue,
42
- useBeforeUnload,
43
- useFormAction,
44
- useHref,
45
- useLocation,
46
- useNavigate,
47
- useNavigation,
48
- useNavigationType,
49
- useOutlet,
50
- useOutletContext,
51
- useParams,
52
- useResolvedPath,
53
- useRevalidator,
54
- useRouteError,
55
- useRouteLoaderData,
56
- useSearchParams,
57
- useSubmit
8
+ modifyRoutes
58
9
  };
@@ -55,20 +55,8 @@ const routerPlugin = ({
55
55
  const routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes(finalRouteConfig));
56
56
  const baseUrl = ((_a = window._SERVER_DATA) == null ? void 0 : _a.router.baseUrl) || select(location.pathname);
57
57
  const _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
58
- const hydrationData = window._ROUTER_DATA;
59
- const router = supportHtml5History ? createBrowserRouter(routes, {
60
- basename: _basename,
61
- hydrationData
62
- }) : createHashRouter(routes, {
63
- basename: _basename,
64
- hydrationData
65
- });
66
- return /* @__PURE__ */ jsx(App, {
67
- ...props,
68
- children: /* @__PURE__ */ jsx(RouterProvider, {
69
- router
70
- })
71
- });
58
+ const router = supportHtml5History ? createBrowserRouter(routes, { basename: _basename }) : createHashRouter(routes, { basename: _basename });
59
+ return /* @__PURE__ */ jsx(App, { ...props, children: /* @__PURE__ */ jsx(RouterProvider, { router }) });
72
60
  };
73
61
  };
74
62
  const RouteApp = getRouteApp();
@@ -1,6 +1,10 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useContext } from "react";
3
- import { createStaticHandler } from "@modern-js/utils/remix-router";
3
+ import serialize from "serialize-javascript";
4
+ import {
5
+ createStaticHandler,
6
+ isRouteErrorResponse
7
+ } from "@remix-run/router";
4
8
  import {
5
9
  createStaticRouter,
6
10
  StaticRouterProvider
@@ -37,6 +41,26 @@ function createFetchHeaders(requestHeaders) {
37
41
  }
38
42
  return headers;
39
43
  }
44
+ function serializeErrors(errors) {
45
+ if (!errors) {
46
+ return null;
47
+ }
48
+ const entries = Object.entries(errors);
49
+ const serialized = {};
50
+ for (const [key, val] of entries) {
51
+ if (isRouteErrorResponse(val)) {
52
+ serialized[key] = { ...val, __type: "RouteErrorResponse" };
53
+ } else if (val instanceof Error) {
54
+ serialized[key] = {
55
+ message: val.message,
56
+ __type: "Error"
57
+ };
58
+ } else {
59
+ serialized[key] = val;
60
+ }
61
+ }
62
+ return serialized;
63
+ }
40
64
  const routerPlugin = ({
41
65
  basename = "",
42
66
  routesConfig,
@@ -76,14 +100,33 @@ const routerPlugin = ({
76
100
  const getRouteApp = () => {
77
101
  return (props) => {
78
102
  const { router, routerContext } = useContext(RuntimeReactContext);
79
- return /* @__PURE__ */ jsx(App, {
80
- ...props,
81
- children: /* @__PURE__ */ jsx(StaticRouterProvider, {
82
- router,
83
- context: routerContext,
84
- hydrate: false
85
- })
86
- });
103
+ const data = {
104
+ loaderData: routerContext.loaderData,
105
+ actionData: routerContext.actionData,
106
+ errors: serializeErrors(routerContext.errors)
107
+ };
108
+ const hydrateScript = `window.__staticRouterHydrationData = ${serialize(
109
+ data,
110
+ { isJSON: true }
111
+ )};`;
112
+ return /* @__PURE__ */ jsxs(App, { ...props, children: [
113
+ /* @__PURE__ */ jsx(
114
+ StaticRouterProvider,
115
+ {
116
+ router,
117
+ context: routerContext,
118
+ hydrate: false
119
+ }
120
+ ),
121
+ /* @__PURE__ */ jsx(
122
+ "script",
123
+ {
124
+ suppressHydrationWarning: true,
125
+ id: "the-nonce",
126
+ dangerouslySetInnerHTML: { __html: hydrateScript }
127
+ }
128
+ )
129
+ ] });
87
130
  };
88
131
  };
89
132
  const RouteApp = getRouteApp();
@@ -1,42 +1,79 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
+ import { Suspense } from "react";
2
3
  import { Route } from "react-router-dom";
3
- import { renderNestedRoute } from "@modern-js/utils/nestedRoutes";
4
4
  import { DefaultNotFound } from "./DefaultNotFound";
5
- import DeferredDataScripts from "./DeferredDataScripts";
5
+ const renderNestedRoute = (nestedRoute, parent) => {
6
+ const { children, index, id, component, isRoot } = nestedRoute;
7
+ const Component = component;
8
+ const routeProps = {
9
+ caseSensitive: nestedRoute.caseSensitive,
10
+ path: nestedRoute.path,
11
+ id: nestedRoute.id,
12
+ loader: createLoader(nestedRoute),
13
+ action: nestedRoute.action,
14
+ hasErrorBoundary: nestedRoute.hasErrorBoundary,
15
+ shouldRevalidate: nestedRoute.shouldRevalidate,
16
+ handle: nestedRoute.handle,
17
+ index: nestedRoute.index,
18
+ element: nestedRoute.element,
19
+ errorElement: nestedRoute.errorElement
20
+ };
21
+ if (nestedRoute.error) {
22
+ const errorElement = /* @__PURE__ */ jsx(nestedRoute.error, {});
23
+ routeProps.errorElement = errorElement;
24
+ }
25
+ let element;
26
+ if (Component) {
27
+ if (parent == null ? void 0 : parent.loading) {
28
+ const Loading = parent.loading;
29
+ if (isLoadableComponent(Component)) {
30
+ element = /* @__PURE__ */ jsx(Component, { fallback: /* @__PURE__ */ jsx(Loading, {}) });
31
+ } else {
32
+ element = /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(Loading, {}), children: /* @__PURE__ */ jsx(Component, {}) });
33
+ }
34
+ } else if (isLoadableComponent(Component) || isRoot) {
35
+ element = /* @__PURE__ */ jsx(Component, {});
36
+ } else {
37
+ element = /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(Component, {}) });
38
+ }
39
+ } else {
40
+ nestedRoute.loading = parent == null ? void 0 : parent.loading;
41
+ }
42
+ if (element) {
43
+ routeProps.element = element;
44
+ }
45
+ const childElements = children == null ? void 0 : children.map((childRoute) => {
46
+ return renderNestedRoute(childRoute, nestedRoute);
47
+ });
48
+ const routeElement = index ? /* @__PURE__ */ jsx(Route, { ...routeProps, index: true }, id) : /* @__PURE__ */ jsx(Route, { ...routeProps, index: false, children: childElements }, id);
49
+ return routeElement;
50
+ };
6
51
  function getRouteComponents(routes, globalApp) {
7
52
  const Layout = ({ Component, ...props }) => {
8
53
  const GlobalLayout = globalApp;
9
54
  if (!GlobalLayout) {
10
- return /* @__PURE__ */ jsx(Component, {
11
- ...props
12
- });
55
+ return /* @__PURE__ */ jsx(Component, { ...props });
13
56
  }
14
- return /* @__PURE__ */ jsx(GlobalLayout, {
15
- Component,
16
- ...props
17
- });
57
+ return /* @__PURE__ */ jsx(GlobalLayout, { Component, ...props });
18
58
  };
19
59
  const routeElements = [];
20
60
  for (const route of routes) {
21
61
  if (route.type === "nested") {
22
- const routeElement = renderNestedRoute(route, {
23
- DeferredDataComponent: DeferredDataScripts
24
- });
62
+ const routeElement = renderNestedRoute(route);
25
63
  routeElements.push(routeElement);
26
64
  } else {
27
- const routeElement = /* @__PURE__ */ jsx(Route, {
28
- path: route.path,
29
- element: /* @__PURE__ */ jsx(Layout, {
30
- Component: route.component
31
- })
32
- }, route.path);
65
+ const routeElement = /* @__PURE__ */ jsx(
66
+ Route,
67
+ {
68
+ path: route.path,
69
+ element: /* @__PURE__ */ jsx(Layout, { Component: route.component })
70
+ },
71
+ route.path
72
+ );
33
73
  routeElements.push(routeElement);
34
74
  }
35
75
  }
36
- routeElements.push(/* @__PURE__ */ jsx(Route, {
37
- path: "*",
38
- element: /* @__PURE__ */ jsx(DefaultNotFound, {})
39
- }, "*"));
76
+ routeElements.push(/* @__PURE__ */ jsx(Route, { path: "*", element: /* @__PURE__ */ jsx(DefaultNotFound, {}) }, "*"));
40
77
  return routeElements;
41
78
  }
42
79
  function renderRoutes(routesConfig) {
@@ -81,6 +118,27 @@ function standardSlash(str) {
81
118
  }
82
119
  return addr;
83
120
  }
121
+ function createLoader(route) {
122
+ const { loader } = route;
123
+ if (loader) {
124
+ return (args) => {
125
+ if (typeof route.lazyImport === "function") {
126
+ route.lazyImport();
127
+ }
128
+ return loader(args);
129
+ };
130
+ } else {
131
+ return () => {
132
+ if (typeof route.lazyImport === "function") {
133
+ route.lazyImport();
134
+ }
135
+ return null;
136
+ };
137
+ }
138
+ }
139
+ function isLoadableComponent(component) {
140
+ return component && component.displayName === "Loadable" && component.preload && typeof component.preload === "function";
141
+ }
84
142
  export {
85
143
  getLocation,
86
144
  getRouteComponents,
@@ -5,12 +5,15 @@ const withRouter = (Component) => {
5
5
  const location = useLocation();
6
6
  const params = useParams();
7
7
  const navigate = useNavigate();
8
- return /* @__PURE__ */ jsx(Component, {
9
- ...props,
10
- location,
11
- params,
12
- navigate
13
- });
8
+ return /* @__PURE__ */ jsx(
9
+ Component,
10
+ {
11
+ ...props,
12
+ location,
13
+ params,
14
+ navigate
15
+ }
16
+ );
14
17
  };
15
18
  };
16
19
  export {
@@ -27,51 +27,33 @@ const ssr = (config) => ({
27
27
  return stringSSRHydrate();
28
28
  function stringSSRHydrate() {
29
29
  if (renderLevel === RenderLevel.CLIENT_RENDER || renderLevel === RenderLevel.SERVER_PREFETCH) {
30
- ModernRender(/* @__PURE__ */ jsx(App, {
31
- context
32
- }));
30
+ ModernRender(/* @__PURE__ */ jsx(App, { context }));
33
31
  } else if (renderLevel === RenderLevel.SERVER_RENDER) {
34
32
  if (isReact18()) {
35
33
  loadableReady(() => {
36
- let SSRApp = () => /* @__PURE__ */ jsx(WithCallback, {
37
- callback,
38
- children: /* @__PURE__ */ jsx(App, {
39
- context: hydrateContext
40
- })
41
- });
34
+ let SSRApp = () => /* @__PURE__ */ jsx(WithCallback, { callback, children: /* @__PURE__ */ jsx(App, { context: hydrateContext }) });
42
35
  SSRApp = hoistNonReactStatics(SSRApp, App);
43
36
  ModernHydrate(/* @__PURE__ */ jsx(SSRApp, {}));
44
37
  });
45
38
  } else {
46
39
  loadableReady(() => {
47
- ModernHydrate(/* @__PURE__ */ jsx(App, {
48
- context: hydrateContext
49
- }), callback);
40
+ ModernHydrate(/* @__PURE__ */ jsx(App, { context: hydrateContext }), callback);
50
41
  });
51
42
  }
52
43
  } else {
53
44
  console.warn(
54
45
  `unknow render level: ${renderLevel}, execute render()`
55
46
  );
56
- ModernRender(/* @__PURE__ */ jsx(App, {
57
- context
58
- }));
47
+ ModernRender(/* @__PURE__ */ jsx(App, { context }));
59
48
  }
60
49
  }
61
50
  function streamSSRHydrate() {
62
51
  if (renderLevel === RenderLevel.SERVER_RENDER) {
63
- let SSRApp = () => /* @__PURE__ */ jsx(WithCallback, {
64
- callback,
65
- children: /* @__PURE__ */ jsx(App, {
66
- context: hydrateContext
67
- })
68
- });
52
+ let SSRApp = () => /* @__PURE__ */ jsx(WithCallback, { callback, children: /* @__PURE__ */ jsx(App, { context: hydrateContext }) });
69
53
  SSRApp = hoistNonReactStatics(SSRApp, App);
70
54
  ModernHydrate(/* @__PURE__ */ jsx(SSRApp, {}));
71
55
  } else {
72
- ModernRender(/* @__PURE__ */ jsx(App, {
73
- context
74
- }));
56
+ ModernRender(/* @__PURE__ */ jsx(App, { context }));
75
57
  }
76
58
  }
77
59
  },
@@ -11,13 +11,9 @@ const prefetch = async (App, context) => run(context.ssrContext.request.headers,
11
11
  stats: loadableStats,
12
12
  entrypoints: [ssrContext.entryName].filter(Boolean)
13
13
  });
14
- renderToStaticMarkup(extractor.collectChunks(/* @__PURE__ */ jsx(App, {
15
- context
16
- })));
14
+ renderToStaticMarkup(extractor.collectChunks(/* @__PURE__ */ jsx(App, { context })));
17
15
  } else {
18
- renderToStaticMarkup(/* @__PURE__ */ jsx(App, {
19
- context
20
- }));
16
+ renderToStaticMarkup(/* @__PURE__ */ jsx(App, { context }));
21
17
  }
22
18
  if (!context.loaderManager.hasPendingLoaders()) {
23
19
  return {
@@ -38,6 +34,7 @@ const prefetch = async (App, context) => run(context.ssrContext.request.headers,
38
34
  loadersData,
39
35
  initialData: context.initialData,
40
36
  i18nData: context.__i18nData__,
37
+ // todo: move to plugin state
41
38
  storeState: (_a = context == null ? void 0 : context.store) == null ? void 0 : _a.getState()
42
39
  };
43
40
  });
@@ -1,4 +1,4 @@
1
- import { serializeJson } from "@modern-js/utils/serialize";
1
+ import serialize from "serialize-javascript";
2
2
  import { buildTemplate } from "./buildTemplate.share";
3
3
  function buildShellAfterTemplate(afterAppTemplate, options) {
4
4
  const callbacks = [injectSSRDataScript];
@@ -8,7 +8,10 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
8
8
  return template.replace("<!--<?- SSRDataScript ?>-->", ssrDataScript);
9
9
  function buildSSRDataScript() {
10
10
  const { ssrContext, renderLevel } = options;
11
- const { request } = ssrContext;
11
+ const { request, enableUnsafeCtx } = ssrContext;
12
+ const unsafeContext = {
13
+ headers: request.headers
14
+ };
12
15
  const SSRData = {
13
16
  context: {
14
17
  request: {
@@ -17,14 +20,15 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
17
20
  pathname: request.pathname,
18
21
  host: request.host,
19
22
  url: request.url,
20
- headers: request.headers,
21
- cookieMap: request.cookieMap
23
+ ...enableUnsafeCtx ? unsafeContext : {}
22
24
  }
23
25
  },
24
26
  renderLevel
25
27
  };
26
28
  return `
27
- <script>window._SSR_DATA = ${serializeJson(SSRData)}<\/script>
29
+ <script>window._SSR_DATA = ${serialize(SSRData, {
30
+ isJSON: true
31
+ })}</script>
28
32
  `;
29
33
  }
30
34
  }
@@ -12,6 +12,7 @@ function getHeadTemplate(beforeEntryTemplate, context) {
12
12
  const helmetData = ReactHelmet.renderStatic();
13
13
  return helmetData ? helmetReplace(headTemplate2, helmetData) : headTemplate2;
14
14
  },
15
+ // @TODO: prefetch scripts of lazy component
15
16
  injectCss
16
17
  ];
17
18
  const [headTemplate = ""] = beforeEntryTemplate.match(HEAD_REG_EXP) || [];
@@ -1,15 +1,8 @@
1
1
  import { Transform } from "stream";
2
2
  import { RenderLevel } from "../types";
3
- import { ESCAPED_SHELL_STREAM_END_MARK } from "../../../common";
4
3
  import { getTemplates } from "./template";
5
- var ShellChunkStatus = /* @__PURE__ */ ((ShellChunkStatus2) => {
6
- ShellChunkStatus2[ShellChunkStatus2["IDLE"] = 0] = "IDLE";
7
- ShellChunkStatus2[ShellChunkStatus2["START"] = 1] = "START";
8
- ShellChunkStatus2[ShellChunkStatus2["FINIESH"] = 2] = "FINIESH";
9
- return ShellChunkStatus2;
10
- })(ShellChunkStatus || {});
11
4
  function renderToPipe(rootElement, context, options) {
12
- let shellChunkStatus = 0 /* IDLE */;
5
+ let isShellStream = true;
13
6
  const { ssrContext } = context;
14
7
  const forUserPipe = (stream) => {
15
8
  return new Promise((resolve) => {
@@ -30,20 +23,9 @@ function renderToPipe(rootElement, context, options) {
30
23
  const injectableTransform = new Transform({
31
24
  transform(chunk, _encoding, callback) {
32
25
  try {
33
- if (shellChunkStatus !== 2 /* FINIESH */) {
34
- let concatedChunk = chunk.toString();
35
- if (shellChunkStatus === 0 /* IDLE */) {
36
- concatedChunk = `${shellBefore}${concatedChunk}`;
37
- shellChunkStatus = 1 /* START */;
38
- }
39
- if (shellChunkStatus === 1 /* START */ && concatedChunk.endsWith(ESCAPED_SHELL_STREAM_END_MARK)) {
40
- concatedChunk = concatedChunk.replace(
41
- ESCAPED_SHELL_STREAM_END_MARK,
42
- shellAfter
43
- );
44
- shellChunkStatus = 2 /* FINIESH */;
45
- }
46
- this.push(concatedChunk);
26
+ if (isShellStream) {
27
+ this.push(joinChunk(shellBefore, chunk, shellAfter));
28
+ isShellStream = false;
47
29
  } else {
48
30
  this.push(chunk);
49
31
  }
@@ -86,6 +68,9 @@ function renderToPipe(rootElement, context, options) {
86
68
  });
87
69
  };
88
70
  return forUserPipe;
71
+ function joinChunk(before = "", chunk, after = "") {
72
+ return `${before}${chunk.toString()}${after}`;
73
+ }
89
74
  }
90
75
  var renderToPipe_default = renderToPipe;
91
76
  export {
@@ -2,7 +2,7 @@ import { buildShellAfterTemplate } from "./buildTemplate.after";
2
2
  import { buildShellBeforeTemplate } from "./bulidTemplate.before";
3
3
  const HTML_SEPARATOR = "<!--<?- html ?>-->";
4
4
  const getTemplates = (context, renderLevel) => {
5
- const { ssrContext, routerContext } = context;
5
+ const { ssrContext } = context;
6
6
  const [beforeAppTemplate = "", afterAppHtmlTemplate = ""] = ssrContext.template.split(HTML_SEPARATOR) || [];
7
7
  const builtBeforeTemplate = buildShellBeforeTemplate(
8
8
  beforeAppTemplate,
@@ -10,7 +10,6 @@ const getTemplates = (context, renderLevel) => {
10
10
  );
11
11
  const builtAfterTemplate = buildShellAfterTemplate(afterAppHtmlTemplate, {
12
12
  ssrContext,
13
- routerContext,
14
13
  renderLevel
15
14
  });
16
15
  return {
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import ReactDomServer from "react-dom/server";
3
- import { serializeJson } from "@modern-js/utils/serialize";
3
+ import serialize from "serialize-javascript";
4
4
  import ReactHelmet from "react-helmet";
5
5
  import helmetReplace from "../helmet";
6
6
  import {
@@ -12,11 +12,13 @@ import { toFragments } from "./template";
12
12
  import { reduce } from "./reduce";
13
13
  import * as loadableRenderer from "./loadable";
14
14
  import * as styledComponentRenderer from "./styledComponent";
15
- const buildTemplateData = (context, data, routerData, renderLevel) => {
16
- const { request } = context;
15
+ const buildTemplateData = (context, data, renderLevel) => {
16
+ const { request, enableUnsafeCtx } = context;
17
+ const unsafeContext = {
18
+ headers: request.headers
19
+ };
17
20
  return {
18
21
  data,
19
- routerData,
20
22
  context: {
21
23
  request: {
22
24
  params: request.params,
@@ -24,8 +26,7 @@ const buildTemplateData = (context, data, routerData, renderLevel) => {
24
26
  pathname: request.pathname,
25
27
  host: request.host,
26
28
  url: request.url,
27
- headers: request.headers,
28
- cookieMap: request.cookieMap
29
+ ...enableUnsafeCtx ? unsafeContext : {}
29
30
  }
30
31
  },
31
32
  renderLevel
@@ -71,15 +72,10 @@ class Entry {
71
72
  if ((_c = ssrContext.redirection) == null ? void 0 : _c.url) {
72
73
  return "";
73
74
  }
74
- const { routerContext } = context;
75
- const routerData = routerContext != null ? routerContext : {
76
- loaderData: routerContext.loaderData
77
- };
78
75
  let html = "";
79
76
  const templateData = buildTemplateData(
80
77
  ssrContext,
81
78
  prefetchData,
82
- routerData,
83
79
  this.result.renderLevel
84
80
  );
85
81
  const SSRData = this.getSSRDataScript(templateData);
@@ -142,7 +138,9 @@ class Entry {
142
138
  getSSRDataScript(templateData) {
143
139
  return {
144
140
  SSRDataScript: `
145
- <script>window._SSR_DATA = ${serializeJson(templateData)}<\/script>
141
+ <script>window._SSR_DATA = ${serialize(templateData, {
142
+ isJSON: true
143
+ })}</script>
146
144
  `
147
145
  };
148
146
  }
@@ -36,7 +36,7 @@ const toHtml = (jsx, renderer, next) => {
36
36
  }
37
37
  chunksMap[fileType] += `<script src="${v.url}" ${props.join(
38
38
  " "
39
- )}><\/script>`;
39
+ )}></script>`;
40
40
  } else if (fileType === "css") {
41
41
  chunksMap[fileType] += `<link href="${v.url}" rel="stylesheet" />`;
42
42
  }
@@ -1,5 +1,5 @@
1
1
  function processHrtime(previousTimestamp) {
2
- const now = new Date().getTime();
2
+ const now = (/* @__PURE__ */ new Date()).getTime();
3
3
  const clocktime = now * 1e-3;
4
4
  let seconds = Math.floor(clocktime);
5
5
  let nanoseconds = Math.floor(clocktime % 1 * 1e9);
@@ -4,7 +4,7 @@ function getLoadableScripts(extractor) {
4
4
  if (!check(scripts)) {
5
5
  return "";
6
6
  }
7
- return scripts.split("<\/script>").slice(0, 2).map((i) => `${i}<\/script>`).join("");
7
+ return scripts.split("</script>").slice(0, 2).map((i) => `${i}</script>`).join("");
8
8
  }
9
9
  export {
10
10
  getLoadableScripts
@@ -1,3 +1,4 @@
1
+ import cookieTool from "cookie";
1
2
  const isReact18 = () => process.env.IS_REACT18 === "true";
2
3
  const formatServer = (request) => {
3
4
  const {
@@ -7,6 +8,7 @@ const formatServer = (request) => {
7
8
  } = request.headers || {};
8
9
  return {
9
10
  cookie,
11
+ cookieMap: cookieTool.parse(cookie || "") || {},
10
12
  userAgent,
11
13
  referer,
12
14
  ...request
@@ -20,15 +22,15 @@ const getQuery = () => window.location.search.substring(1).split("&").reduce((re
20
22
  return res;
21
23
  }, {});
22
24
  const formatClient = (request) => {
23
- var _a, _b;
25
+ var _a;
24
26
  return {
25
27
  params: request.params || {},
26
28
  host: request.host || location.host,
27
29
  pathname: request.pathname || location.pathname,
28
30
  headers: request.headers || {},
29
- cookieMap: request.cookieMap || {},
30
- cookie: ((_a = request.headers) == null ? void 0 : _a.cookie) || document.cookie,
31
- userAgent: ((_b = request.headers) == null ? void 0 : _b["user-agent"]) || navigator.userAgent,
31
+ cookieMap: cookieTool.parse(document.cookie || "") || {},
32
+ cookie: document.cookie || "",
33
+ userAgent: ((_a = request.headers) == null ? void 0 : _a["user-agent"]) || navigator.userAgent,
32
34
  referer: request.referer || document.referrer,
33
35
  query: request.query || getQuery(),
34
36
  url: location.href
@@ -42,13 +42,7 @@ const state = (config) => ({
42
42
  hoc({ App }, next) {
43
43
  const getStateApp = (props) => {
44
44
  const context = useContext(RuntimeReactContext);
45
- return /* @__PURE__ */ jsx(Provider, {
46
- store: context.store,
47
- config: storeConfig,
48
- children: /* @__PURE__ */ jsx(App, {
49
- ...props
50
- })
51
- });
45
+ return /* @__PURE__ */ jsx(Provider, { store: context.store, config: storeConfig, children: /* @__PURE__ */ jsx(App, { ...props }) });
52
46
  };
53
47
  return next({
54
48
  App: hoistNonReactStatics(getStateApp, App)
@@ -3,6 +3,4 @@ export declare const isBrowser: () => boolean;
3
3
  export interface AppConfig {
4
4
  state?: StateConfig | boolean;
5
5
  [key: string]: any;
6
- }
7
- export declare const JSX_SHELL_STREAM_END_MARK = "<!--<?- SHELL_STREAM_END ?>-->";
8
- export declare const ESCAPED_SHELL_STREAM_END_MARK = "&lt;!--&lt;?- SHELL_STREAM_END ?&gt;--&gt;";
6
+ }
@@ -5,5 +5,4 @@ export * from './compatible';
5
5
  export type { TRuntimeContext, RuntimeContext } from '../runtime-context';
6
6
  export { RuntimeReactContext, ServerRouterContext } from '../runtime-context';
7
7
  export * from './loader';
8
- export type { SSRData, SSRContainer } from './types';
9
8
  export * from '@modern-js/plugin';