@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.
- package/CHANGELOG.md +27 -0
- package/dist/cjs/cli/index.js +9 -0
- package/dist/cjs/common.js +0 -6
- package/dist/cjs/core/app-config.js +5 -1
- package/dist/cjs/core/compatible.js +8 -7
- package/dist/cjs/core/loader/index.js +4 -0
- package/dist/cjs/core/loader/loaderManager.js +6 -0
- package/dist/cjs/core/loader/useLoader.js +4 -0
- package/dist/cjs/document/Body.js +6 -8
- package/dist/cjs/document/DocumentContext.js +4 -0
- package/dist/cjs/document/DocumentStructureContext.js +4 -0
- package/dist/cjs/document/Head.js +7 -11
- package/dist/cjs/document/Html.js +24 -22
- package/dist/cjs/document/Links.js +1 -3
- package/dist/cjs/document/Root.js +8 -14
- package/dist/cjs/document/Script.js +5 -7
- package/dist/cjs/document/Scripts.js +1 -3
- package/dist/cjs/document/cli/index.js +7 -1
- package/dist/cjs/exports/head.js +4 -0
- package/dist/cjs/exports/loadable.js +4 -0
- package/dist/cjs/exports/styled.js +4 -0
- package/dist/cjs/router/cli/index.js +3 -7
- package/dist/cjs/router/index.js +4 -0
- package/dist/cjs/router/runtime/DefaultNotFound.js +13 -10
- package/dist/cjs/router/runtime/index.js +3 -52
- package/dist/cjs/router/runtime/plugin.js +6 -14
- package/dist/cjs/router/runtime/plugin.node.js +54 -10
- package/dist/cjs/router/runtime/utils.js +80 -28
- package/dist/cjs/router/runtime/withRouter.js +9 -6
- package/dist/cjs/ssr/cli/babel-plugin-ssr-loader-id.js +4 -0
- package/dist/cjs/ssr/cli/index.js +4 -0
- package/dist/cjs/ssr/index.js +10 -24
- package/dist/cjs/ssr/index.node.js +4 -0
- package/dist/cjs/ssr/prefetch.js +3 -6
- package/dist/cjs/ssr/react/nossr/index.js +4 -0
- package/dist/cjs/ssr/react/prerender/index.js +4 -0
- package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +19 -5
- package/dist/cjs/ssr/serverRender/renderToStream/bulidTemplate.before.js +5 -0
- package/dist/cjs/ssr/serverRender/renderToStream/index.js +4 -0
- package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.js +7 -22
- package/dist/cjs/ssr/serverRender/renderToStream/template.js +1 -2
- package/dist/cjs/ssr/serverRender/renderToString/entry.js +14 -12
- package/dist/cjs/ssr/serverRender/renderToString/index.js +4 -0
- package/dist/cjs/ssr/serverRender/renderToString/loadable.js +1 -1
- package/dist/cjs/ssr/serverRender/time.worker.js +1 -1
- package/dist/cjs/ssr/serverRender/utils.js +1 -1
- package/dist/cjs/ssr/utils.js +16 -4
- package/dist/cjs/state/index.js +4 -0
- package/dist/cjs/state/plugins.js +4 -0
- package/dist/cjs/state/runtime/index.js +4 -0
- package/dist/cjs/state/runtime/plugin.js +5 -7
- package/dist/esm/cli/index.js +5 -1
- package/dist/esm/common.js +1 -3
- package/dist/esm/core/app-config.js +3 -1
- package/dist/esm/core/compatible.js +3 -1
- package/dist/esm/core/loader/loaderManager.js +3 -1
- package/dist/esm/document/cli/index.js +3 -1
- package/dist/esm/router/cli/index.js +1 -5
- package/dist/esm/router/runtime/index.js +2 -3
- package/dist/esm/router/runtime/plugin.js +2 -5
- package/dist/esm/router/runtime/plugin.node.js +65 -8
- package/dist/esm/router/runtime/utils.js +106 -5
- package/dist/esm/ssr/prefetch.js +1 -0
- package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.js +39 -8
- package/dist/esm/ssr/serverRender/renderToStream/bulidTemplate.before.js +1 -0
- package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.js +8 -19
- package/dist/esm/ssr/serverRender/renderToStream/template.js +1 -2
- package/dist/esm/ssr/serverRender/renderToString/entry.js +29 -16
- package/dist/esm/ssr/serverRender/time.worker.js +1 -1
- package/dist/esm/ssr/utils.js +6 -4
- package/dist/esm-node/cli/index.js +5 -0
- package/dist/esm-node/common.js +0 -4
- package/dist/esm-node/core/app-config.js +5 -1
- package/dist/esm-node/core/compatible.js +4 -7
- package/dist/esm-node/core/loader/loaderManager.js +2 -0
- package/dist/esm-node/document/Body.js +6 -8
- package/dist/esm-node/document/Head.js +7 -11
- package/dist/esm-node/document/Html.js +24 -22
- package/dist/esm-node/document/Links.js +1 -3
- package/dist/esm-node/document/Root.js +8 -14
- package/dist/esm-node/document/Script.js +5 -7
- package/dist/esm-node/document/Scripts.js +1 -3
- package/dist/esm-node/document/cli/index.js +3 -1
- package/dist/esm-node/router/cli/index.js +2 -5
- package/dist/esm-node/router/runtime/DefaultNotFound.js +13 -10
- package/dist/esm-node/router/runtime/index.js +2 -51
- package/dist/esm-node/router/runtime/plugin.js +2 -14
- package/dist/esm-node/router/runtime/plugin.node.js +53 -10
- package/dist/esm-node/router/runtime/utils.js +80 -22
- package/dist/esm-node/router/runtime/withRouter.js +9 -6
- package/dist/esm-node/ssr/index.js +6 -24
- package/dist/esm-node/ssr/prefetch.js +3 -6
- package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.js +9 -5
- package/dist/esm-node/ssr/serverRender/renderToStream/bulidTemplate.before.js +1 -0
- package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.js +7 -22
- package/dist/esm-node/ssr/serverRender/renderToStream/template.js +1 -2
- package/dist/esm-node/ssr/serverRender/renderToString/entry.js +10 -12
- package/dist/esm-node/ssr/serverRender/renderToString/loadable.js +1 -1
- package/dist/esm-node/ssr/serverRender/time.worker.js +1 -1
- package/dist/esm-node/ssr/serverRender/utils.js +1 -1
- package/dist/esm-node/ssr/utils.js +6 -4
- package/dist/esm-node/state/runtime/plugin.js +1 -7
- package/dist/types/common.d.ts +1 -3
- package/dist/types/core/index.d.ts +0 -1
- package/dist/types/core/loader/index.d.ts +2 -1
- package/dist/types/core/loader/useLoader.d.ts +15 -1
- package/dist/types/router/runtime/index.d.ts +2 -4
- package/dist/types/runtime-context.d.ts +0 -2
- package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +0 -2
- package/dist/types/ssr/serverRender/renderToString/type.d.ts +1 -0
- package/package.json +17 -12
- package/dist/cjs/core/types.js +0 -15
- package/dist/cjs/router/index.node.js +0 -31
- package/dist/cjs/router/runtime/DeferredDataScripts.js +0 -148
- package/dist/cjs/ssr/prefetch.worker.js +0 -67
- package/dist/cjs/ssr/serverRender/renderToStream/index.worker.js +0 -64
- package/dist/cjs/ssr/serverRender/renderToString/index.worker.js +0 -58
- package/dist/esm/core/types.js +0 -1
- package/dist/esm/router/index.node.js +0 -4
- package/dist/esm/router/runtime/DeferredDataScripts.js +0 -158
- package/dist/esm/ssr/prefetch.worker.js +0 -191
- package/dist/esm/ssr/serverRender/renderToStream/index.worker.js +0 -32
- package/dist/esm/ssr/serverRender/renderToString/index.worker.js +0 -167
- package/dist/esm-node/core/types.js +0 -0
- package/dist/esm-node/router/index.node.js +0 -7
- package/dist/esm-node/router/runtime/DeferredDataScripts.js +0 -131
- package/dist/esm-node/ssr/prefetch.worker.js +0 -46
- package/dist/esm-node/ssr/serverRender/renderToStream/index.worker.js +0 -35
- package/dist/esm-node/ssr/serverRender/renderToString/index.worker.js +0 -29
- package/dist/types/core/types.d.ts +0 -21
- package/dist/types/router/index.node.d.ts +0 -3
- package/dist/types/router/runtime/DeferredDataScripts.d.ts +0 -8
- package/dist/types/ssr/prefetch.worker.d.ts +0 -13
- package/dist/types/ssr/serverRender/renderToStream/index.worker.d.ts +0 -6
- 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
|
-
|
|
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
|
|
59
|
-
|
|
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
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
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(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
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
|
-
|
|
21
|
-
cookieMap: request.cookieMap
|
|
23
|
+
...enableUnsafeCtx ? unsafeContext : {}
|
|
22
24
|
}
|
|
23
25
|
},
|
|
24
26
|
renderLevel
|
|
25
27
|
};
|
|
26
28
|
return `
|
|
27
|
-
<script>window._SSR_DATA = ${
|
|
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
|
|
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 (
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
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
|
|
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,
|
|
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
|
-
|
|
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 = ${
|
|
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
|
-
)}
|
|
39
|
+
)}></script>`;
|
|
40
40
|
} else if (fileType === "css") {
|
|
41
41
|
chunksMap[fileType] += `<link href="${v.url}" rel="stylesheet" />`;
|
|
42
42
|
}
|
|
@@ -4,7 +4,7 @@ function getLoadableScripts(extractor) {
|
|
|
4
4
|
if (!check(scripts)) {
|
|
5
5
|
return "";
|
|
6
6
|
}
|
|
7
|
-
return scripts.split("
|
|
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
|
|
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:
|
|
30
|
-
cookie:
|
|
31
|
-
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)
|
package/dist/types/common.d.ts
CHANGED
|
@@ -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 = "<!--<?- SHELL_STREAM_END ?>-->";
|
|
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';
|