@depup/tanstack__react-router 1.166.4-depup.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/LICENSE +21 -0
- package/README.md +32 -0
- package/dist/cjs/Asset.cjs +177 -0
- package/dist/cjs/Asset.cjs.map +1 -0
- package/dist/cjs/Asset.d.cts +5 -0
- package/dist/cjs/CatchBoundary.cjs +114 -0
- package/dist/cjs/CatchBoundary.cjs.map +1 -0
- package/dist/cjs/CatchBoundary.d.cts +12 -0
- package/dist/cjs/ClientOnly.cjs +21 -0
- package/dist/cjs/ClientOnly.cjs.map +1 -0
- package/dist/cjs/ClientOnly.d.cts +49 -0
- package/dist/cjs/HeadContent.cjs +15 -0
- package/dist/cjs/HeadContent.cjs.map +1 -0
- package/dist/cjs/HeadContent.d.cts +6 -0
- package/dist/cjs/HeadContent.dev.cjs +41 -0
- package/dist/cjs/HeadContent.dev.cjs.map +1 -0
- package/dist/cjs/HeadContent.dev.d.cts +10 -0
- package/dist/cjs/Match.cjs +255 -0
- package/dist/cjs/Match.cjs.map +1 -0
- package/dist/cjs/Match.d.cts +14 -0
- package/dist/cjs/Matches.cjs +138 -0
- package/dist/cjs/Matches.cjs.map +1 -0
- package/dist/cjs/Matches.d.cts +68 -0
- package/dist/cjs/RouterProvider.cjs +32 -0
- package/dist/cjs/RouterProvider.cjs.map +1 -0
- package/dist/cjs/RouterProvider.d.cts +23 -0
- package/dist/cjs/SafeFragment.cjs +8 -0
- package/dist/cjs/SafeFragment.cjs.map +1 -0
- package/dist/cjs/SafeFragment.d.cts +1 -0
- package/dist/cjs/ScriptOnce.cjs +22 -0
- package/dist/cjs/ScriptOnce.cjs.map +1 -0
- package/dist/cjs/ScriptOnce.d.cts +6 -0
- package/dist/cjs/Scripts.cjs +56 -0
- package/dist/cjs/Scripts.cjs.map +1 -0
- package/dist/cjs/Scripts.d.cts +5 -0
- package/dist/cjs/ScrollRestoration.cjs +38 -0
- package/dist/cjs/ScrollRestoration.cjs.map +1 -0
- package/dist/cjs/ScrollRestoration.d.cts +14 -0
- package/dist/cjs/Transitioner.cjs +119 -0
- package/dist/cjs/Transitioner.cjs.map +1 -0
- package/dist/cjs/Transitioner.d.cts +1 -0
- package/dist/cjs/awaited.cjs +51 -0
- package/dist/cjs/awaited.cjs.map +1 -0
- package/dist/cjs/awaited.d.cts +14 -0
- package/dist/cjs/fileRoute.cjs +109 -0
- package/dist/cjs/fileRoute.cjs.map +1 -0
- package/dist/cjs/fileRoute.d.cts +87 -0
- package/dist/cjs/headContentUtils.cjs +185 -0
- package/dist/cjs/headContentUtils.cjs.map +1 -0
- package/dist/cjs/headContentUtils.d.cts +7 -0
- package/dist/cjs/history.d.cts +8 -0
- package/dist/cjs/index.cjs +241 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/index.d.cts +51 -0
- package/dist/cjs/index.dev.cjs +241 -0
- package/dist/cjs/index.dev.cjs.map +1 -0
- package/dist/cjs/index.dev.d.cts +2 -0
- package/dist/cjs/lazyRouteComponent.cjs +70 -0
- package/dist/cjs/lazyRouteComponent.cjs.map +1 -0
- package/dist/cjs/lazyRouteComponent.d.cts +11 -0
- package/dist/cjs/link.cjs +573 -0
- package/dist/cjs/link.cjs.map +1 -0
- package/dist/cjs/link.d.cts +98 -0
- package/dist/cjs/matchContext.cjs +27 -0
- package/dist/cjs/matchContext.cjs.map +1 -0
- package/dist/cjs/matchContext.d.cts +3 -0
- package/dist/cjs/not-found.cjs +38 -0
- package/dist/cjs/not-found.cjs.map +1 -0
- package/dist/cjs/not-found.d.cts +9 -0
- package/dist/cjs/renderRouteNotFound.cjs +22 -0
- package/dist/cjs/renderRouteNotFound.cjs.map +1 -0
- package/dist/cjs/renderRouteNotFound.d.cts +10 -0
- package/dist/cjs/route.cjs +198 -0
- package/dist/cjs/route.cjs.map +1 -0
- package/dist/cjs/route.d.cts +142 -0
- package/dist/cjs/router.cjs +22 -0
- package/dist/cjs/router.cjs.map +1 -0
- package/dist/cjs/router.d.cts +83 -0
- package/dist/cjs/routerContext.cjs +23 -0
- package/dist/cjs/routerContext.cjs.map +1 -0
- package/dist/cjs/routerContext.d.cts +3 -0
- package/dist/cjs/scroll-restoration.cjs +39 -0
- package/dist/cjs/scroll-restoration.cjs.map +1 -0
- package/dist/cjs/scroll-restoration.d.cts +1 -0
- package/dist/cjs/ssr/RouterClient.cjs +25 -0
- package/dist/cjs/ssr/RouterClient.cjs.map +1 -0
- package/dist/cjs/ssr/RouterClient.d.cts +4 -0
- package/dist/cjs/ssr/RouterServer.cjs +9 -0
- package/dist/cjs/ssr/RouterServer.cjs.map +1 -0
- package/dist/cjs/ssr/RouterServer.d.cts +4 -0
- package/dist/cjs/ssr/client.cjs +12 -0
- package/dist/cjs/ssr/client.cjs.map +1 -0
- package/dist/cjs/ssr/client.d.cts +2 -0
- package/dist/cjs/ssr/defaultRenderHandler.cjs +15 -0
- package/dist/cjs/ssr/defaultRenderHandler.cjs.map +1 -0
- package/dist/cjs/ssr/defaultRenderHandler.d.cts +1 -0
- package/dist/cjs/ssr/defaultStreamHandler.cjs +16 -0
- package/dist/cjs/ssr/defaultStreamHandler.cjs.map +1 -0
- package/dist/cjs/ssr/defaultStreamHandler.d.cts +1 -0
- package/dist/cjs/ssr/renderRouterToStream.cjs +73 -0
- package/dist/cjs/ssr/renderRouterToStream.cjs.map +1 -0
- package/dist/cjs/ssr/renderRouterToStream.d.cts +8 -0
- package/dist/cjs/ssr/renderRouterToString.cjs +31 -0
- package/dist/cjs/ssr/renderRouterToString.cjs.map +1 -0
- package/dist/cjs/ssr/renderRouterToString.d.cts +7 -0
- package/dist/cjs/ssr/serializer.d.cts +6 -0
- package/dist/cjs/ssr/server.cjs +20 -0
- package/dist/cjs/ssr/server.cjs.map +1 -0
- package/dist/cjs/ssr/server.d.cts +6 -0
- package/dist/cjs/structuralSharing.d.cts +8 -0
- package/dist/cjs/typePrimitives.d.cts +16 -0
- package/dist/cjs/useBlocker.cjs +171 -0
- package/dist/cjs/useBlocker.cjs.map +1 -0
- package/dist/cjs/useBlocker.d.cts +66 -0
- package/dist/cjs/useCanGoBack.cjs +8 -0
- package/dist/cjs/useCanGoBack.cjs.map +1 -0
- package/dist/cjs/useCanGoBack.d.cts +1 -0
- package/dist/cjs/useLoaderData.cjs +15 -0
- package/dist/cjs/useLoaderData.cjs.map +1 -0
- package/dist/cjs/useLoaderData.d.cts +19 -0
- package/dist/cjs/useLoaderDeps.cjs +14 -0
- package/dist/cjs/useLoaderDeps.cjs.map +1 -0
- package/dist/cjs/useLoaderDeps.d.cts +19 -0
- package/dist/cjs/useLocation.cjs +10 -0
- package/dist/cjs/useLocation.cjs.map +1 -0
- package/dist/cjs/useLocation.d.cts +18 -0
- package/dist/cjs/useMatch.cjs +47 -0
- package/dist/cjs/useMatch.cjs.map +1 -0
- package/dist/cjs/useMatch.d.cts +14 -0
- package/dist/cjs/useNavigate.cjs +49 -0
- package/dist/cjs/useNavigate.cjs.map +1 -0
- package/dist/cjs/useNavigate.d.cts +28 -0
- package/dist/cjs/useParams.cjs +17 -0
- package/dist/cjs/useParams.cjs.map +1 -0
- package/dist/cjs/useParams.d.cts +21 -0
- package/dist/cjs/useRouteContext.cjs +11 -0
- package/dist/cjs/useRouteContext.cjs.map +1 -0
- package/dist/cjs/useRouteContext.d.cts +3 -0
- package/dist/cjs/useRouter.cjs +32 -0
- package/dist/cjs/useRouter.cjs.map +1 -0
- package/dist/cjs/useRouter.d.cts +14 -0
- package/dist/cjs/useRouterState.cjs +38 -0
- package/dist/cjs/useRouterState.cjs.map +1 -0
- package/dist/cjs/useRouterState.d.cts +20 -0
- package/dist/cjs/useSearch.cjs +16 -0
- package/dist/cjs/useSearch.cjs.map +1 -0
- package/dist/cjs/useSearch.d.cts +21 -0
- package/dist/cjs/utils.cjs +62 -0
- package/dist/cjs/utils.cjs.map +1 -0
- package/dist/cjs/utils.d.cts +54 -0
- package/dist/esm/Asset.d.ts +5 -0
- package/dist/esm/Asset.js +160 -0
- package/dist/esm/Asset.js.map +1 -0
- package/dist/esm/CatchBoundary.d.ts +12 -0
- package/dist/esm/CatchBoundary.js +97 -0
- package/dist/esm/CatchBoundary.js.map +1 -0
- package/dist/esm/ClientOnly.d.ts +49 -0
- package/dist/esm/ClientOnly.js +21 -0
- package/dist/esm/ClientOnly.js.map +1 -0
- package/dist/esm/HeadContent.d.ts +6 -0
- package/dist/esm/HeadContent.dev.d.ts +10 -0
- package/dist/esm/HeadContent.dev.js +25 -0
- package/dist/esm/HeadContent.dev.js.map +1 -0
- package/dist/esm/HeadContent.js +15 -0
- package/dist/esm/HeadContent.js.map +1 -0
- package/dist/esm/Match.d.ts +14 -0
- package/dist/esm/Match.js +238 -0
- package/dist/esm/Match.js.map +1 -0
- package/dist/esm/Matches.d.ts +68 -0
- package/dist/esm/Matches.js +121 -0
- package/dist/esm/Matches.js.map +1 -0
- package/dist/esm/RouterProvider.d.ts +23 -0
- package/dist/esm/RouterProvider.js +32 -0
- package/dist/esm/RouterProvider.js.map +1 -0
- package/dist/esm/SafeFragment.d.ts +1 -0
- package/dist/esm/SafeFragment.js +8 -0
- package/dist/esm/SafeFragment.js.map +1 -0
- package/dist/esm/ScriptOnce.d.ts +6 -0
- package/dist/esm/ScriptOnce.js +22 -0
- package/dist/esm/ScriptOnce.js.map +1 -0
- package/dist/esm/Scripts.d.ts +5 -0
- package/dist/esm/Scripts.js +56 -0
- package/dist/esm/Scripts.js.map +1 -0
- package/dist/esm/ScrollRestoration.d.ts +14 -0
- package/dist/esm/ScrollRestoration.js +38 -0
- package/dist/esm/ScrollRestoration.js.map +1 -0
- package/dist/esm/Transitioner.d.ts +1 -0
- package/dist/esm/Transitioner.js +102 -0
- package/dist/esm/Transitioner.js.map +1 -0
- package/dist/esm/awaited.d.ts +14 -0
- package/dist/esm/awaited.js +34 -0
- package/dist/esm/awaited.js.map +1 -0
- package/dist/esm/fileRoute.d.ts +87 -0
- package/dist/esm/fileRoute.js +109 -0
- package/dist/esm/fileRoute.js.map +1 -0
- package/dist/esm/headContentUtils.d.ts +7 -0
- package/dist/esm/headContentUtils.js +168 -0
- package/dist/esm/headContentUtils.js.map +1 -0
- package/dist/esm/history.d.ts +8 -0
- package/dist/esm/index.d.ts +51 -0
- package/dist/esm/index.dev.d.ts +2 -0
- package/dist/esm/index.dev.js +133 -0
- package/dist/esm/index.dev.js.map +1 -0
- package/dist/esm/index.js +133 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lazyRouteComponent.d.ts +11 -0
- package/dist/esm/lazyRouteComponent.js +53 -0
- package/dist/esm/lazyRouteComponent.js.map +1 -0
- package/dist/esm/link.d.ts +98 -0
- package/dist/esm/link.js +556 -0
- package/dist/esm/link.js.map +1 -0
- package/dist/esm/matchContext.d.ts +3 -0
- package/dist/esm/matchContext.js +10 -0
- package/dist/esm/matchContext.js.map +1 -0
- package/dist/esm/not-found.d.ts +9 -0
- package/dist/esm/not-found.js +38 -0
- package/dist/esm/not-found.js.map +1 -0
- package/dist/esm/renderRouteNotFound.d.ts +10 -0
- package/dist/esm/renderRouteNotFound.js +22 -0
- package/dist/esm/renderRouteNotFound.js.map +1 -0
- package/dist/esm/route.d.ts +142 -0
- package/dist/esm/route.js +198 -0
- package/dist/esm/route.js.map +1 -0
- package/dist/esm/router.d.ts +83 -0
- package/dist/esm/router.js +22 -0
- package/dist/esm/router.js.map +1 -0
- package/dist/esm/routerContext.d.ts +3 -0
- package/dist/esm/routerContext.js +6 -0
- package/dist/esm/routerContext.js.map +1 -0
- package/dist/esm/scroll-restoration.d.ts +1 -0
- package/dist/esm/scroll-restoration.js +39 -0
- package/dist/esm/scroll-restoration.js.map +1 -0
- package/dist/esm/ssr/RouterClient.d.ts +4 -0
- package/dist/esm/ssr/RouterClient.js +25 -0
- package/dist/esm/ssr/RouterClient.js.map +1 -0
- package/dist/esm/ssr/RouterServer.d.ts +4 -0
- package/dist/esm/ssr/RouterServer.js +9 -0
- package/dist/esm/ssr/RouterServer.js.map +1 -0
- package/dist/esm/ssr/client.d.ts +2 -0
- package/dist/esm/ssr/client.js +6 -0
- package/dist/esm/ssr/client.js.map +1 -0
- package/dist/esm/ssr/defaultRenderHandler.d.ts +1 -0
- package/dist/esm/ssr/defaultRenderHandler.js +15 -0
- package/dist/esm/ssr/defaultRenderHandler.js.map +1 -0
- package/dist/esm/ssr/defaultStreamHandler.d.ts +1 -0
- package/dist/esm/ssr/defaultStreamHandler.js +16 -0
- package/dist/esm/ssr/defaultStreamHandler.js.map +1 -0
- package/dist/esm/ssr/renderRouterToStream.d.ts +8 -0
- package/dist/esm/ssr/renderRouterToStream.js +73 -0
- package/dist/esm/ssr/renderRouterToStream.js.map +1 -0
- package/dist/esm/ssr/renderRouterToString.d.ts +7 -0
- package/dist/esm/ssr/renderRouterToString.js +31 -0
- package/dist/esm/ssr/renderRouterToString.js.map +1 -0
- package/dist/esm/ssr/serializer.d.ts +6 -0
- package/dist/esm/ssr/server.d.ts +6 -0
- package/dist/esm/ssr/server.js +14 -0
- package/dist/esm/ssr/server.js.map +1 -0
- package/dist/esm/structuralSharing.d.ts +8 -0
- package/dist/esm/typePrimitives.d.ts +16 -0
- package/dist/esm/useBlocker.d.ts +66 -0
- package/dist/esm/useBlocker.js +154 -0
- package/dist/esm/useBlocker.js.map +1 -0
- package/dist/esm/useCanGoBack.d.ts +1 -0
- package/dist/esm/useCanGoBack.js +8 -0
- package/dist/esm/useCanGoBack.js.map +1 -0
- package/dist/esm/useLoaderData.d.ts +19 -0
- package/dist/esm/useLoaderData.js +15 -0
- package/dist/esm/useLoaderData.js.map +1 -0
- package/dist/esm/useLoaderDeps.d.ts +19 -0
- package/dist/esm/useLoaderDeps.js +14 -0
- package/dist/esm/useLoaderDeps.js.map +1 -0
- package/dist/esm/useLocation.d.ts +18 -0
- package/dist/esm/useLocation.js +10 -0
- package/dist/esm/useLocation.js.map +1 -0
- package/dist/esm/useMatch.d.ts +14 -0
- package/dist/esm/useMatch.js +30 -0
- package/dist/esm/useMatch.js.map +1 -0
- package/dist/esm/useNavigate.d.ts +28 -0
- package/dist/esm/useNavigate.js +32 -0
- package/dist/esm/useNavigate.js.map +1 -0
- package/dist/esm/useParams.d.ts +21 -0
- package/dist/esm/useParams.js +17 -0
- package/dist/esm/useParams.js.map +1 -0
- package/dist/esm/useRouteContext.d.ts +3 -0
- package/dist/esm/useRouteContext.js +11 -0
- package/dist/esm/useRouteContext.js.map +1 -0
- package/dist/esm/useRouter.d.ts +14 -0
- package/dist/esm/useRouter.js +15 -0
- package/dist/esm/useRouter.js.map +1 -0
- package/dist/esm/useRouterState.d.ts +20 -0
- package/dist/esm/useRouterState.js +38 -0
- package/dist/esm/useRouterState.js.map +1 -0
- package/dist/esm/useSearch.d.ts +21 -0
- package/dist/esm/useSearch.js +16 -0
- package/dist/esm/useSearch.js.map +1 -0
- package/dist/esm/utils.d.ts +54 -0
- package/dist/esm/utils.js +45 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/llms/index.d.ts +3 -0
- package/dist/llms/index.js +43 -0
- package/dist/llms/rules/api.d.ts +2 -0
- package/dist/llms/rules/api.js +4612 -0
- package/dist/llms/rules/guide.d.ts +2 -0
- package/dist/llms/rules/guide.js +10690 -0
- package/dist/llms/rules/installation.d.ts +2 -0
- package/dist/llms/rules/installation.js +1285 -0
- package/dist/llms/rules/routing.d.ts +2 -0
- package/dist/llms/rules/routing.js +1984 -0
- package/dist/llms/rules/setup-and-architecture.d.ts +2 -0
- package/dist/llms/rules/setup-and-architecture.js +920 -0
- package/package.json +142 -0
- package/src/Asset.tsx +219 -0
- package/src/CatchBoundary.tsx +120 -0
- package/src/ClientOnly.tsx +68 -0
- package/src/HeadContent.dev.tsx +46 -0
- package/src/HeadContent.tsx +22 -0
- package/src/Match.tsx +360 -0
- package/src/Matches.tsx +313 -0
- package/src/RouterProvider.tsx +92 -0
- package/src/SafeFragment.tsx +5 -0
- package/src/ScriptOnce.tsx +21 -0
- package/src/Scripts.tsx +80 -0
- package/src/ScrollRestoration.tsx +69 -0
- package/src/Transitioner.tsx +134 -0
- package/src/awaited.tsx +55 -0
- package/src/fileRoute.ts +313 -0
- package/src/headContentUtils.tsx +217 -0
- package/src/history.ts +9 -0
- package/src/index.dev.tsx +6 -0
- package/src/index.tsx +341 -0
- package/src/lazyRouteComponent.tsx +96 -0
- package/src/link.tsx +984 -0
- package/src/matchContext.tsx +8 -0
- package/src/not-found.tsx +43 -0
- package/src/renderRouteNotFound.tsx +35 -0
- package/src/route.tsx +740 -0
- package/src/router.ts +127 -0
- package/src/routerContext.tsx +4 -0
- package/src/scroll-restoration.tsx +45 -0
- package/src/ssr/RouterClient.tsx +22 -0
- package/src/ssr/RouterServer.tsx +9 -0
- package/src/ssr/client.ts +2 -0
- package/src/ssr/defaultRenderHandler.tsx +12 -0
- package/src/ssr/defaultStreamHandler.tsx +13 -0
- package/src/ssr/renderRouterToStream.tsx +90 -0
- package/src/ssr/renderRouterToString.tsx +36 -0
- package/src/ssr/serializer.ts +7 -0
- package/src/ssr/server.ts +6 -0
- package/src/structuralSharing.ts +47 -0
- package/src/typePrimitives.ts +84 -0
- package/src/useBlocker.tsx +320 -0
- package/src/useCanGoBack.ts +5 -0
- package/src/useLoaderData.tsx +91 -0
- package/src/useLoaderDeps.tsx +69 -0
- package/src/useLocation.tsx +52 -0
- package/src/useMatch.tsx +123 -0
- package/src/useNavigate.tsx +78 -0
- package/src/useParams.tsx +107 -0
- package/src/useRouteContext.ts +30 -0
- package/src/useRouter.tsx +25 -0
- package/src/useRouterState.tsx +86 -0
- package/src/useSearch.tsx +105 -0
- package/src/utils.ts +125 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { defaultGetScrollRestorationKey, restoreScroll, escapeHtml, storageKey } from "@tanstack/router-core";
|
|
3
|
+
import { isServer } from "@tanstack/router-core/isServer";
|
|
4
|
+
import { useRouter } from "./useRouter.js";
|
|
5
|
+
import { ScriptOnce } from "./ScriptOnce.js";
|
|
6
|
+
function ScrollRestoration() {
|
|
7
|
+
const router = useRouter();
|
|
8
|
+
if (!router.isScrollRestoring || !(isServer ?? router.isServer)) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
if (typeof router.options.scrollRestoration === "function") {
|
|
12
|
+
const shouldRestore = router.options.scrollRestoration({
|
|
13
|
+
location: router.latestLocation
|
|
14
|
+
});
|
|
15
|
+
if (!shouldRestore) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const getKey = router.options.getScrollRestorationKey || defaultGetScrollRestorationKey;
|
|
20
|
+
const userKey = getKey(router.latestLocation);
|
|
21
|
+
const resolvedKey = userKey !== defaultGetScrollRestorationKey(router.latestLocation) ? userKey : void 0;
|
|
22
|
+
const restoreScrollOptions = {
|
|
23
|
+
storageKey,
|
|
24
|
+
shouldScrollRestoration: true
|
|
25
|
+
};
|
|
26
|
+
if (resolvedKey) {
|
|
27
|
+
restoreScrollOptions.key = resolvedKey;
|
|
28
|
+
}
|
|
29
|
+
return /* @__PURE__ */ jsx(
|
|
30
|
+
ScriptOnce,
|
|
31
|
+
{
|
|
32
|
+
children: `(${restoreScroll.toString()})(${escapeHtml(JSON.stringify(restoreScrollOptions))})`
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
ScrollRestoration
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=scroll-restoration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-restoration.js","sources":["../../src/scroll-restoration.tsx"],"sourcesContent":["import {\n defaultGetScrollRestorationKey,\n escapeHtml,\n restoreScroll,\n storageKey,\n} from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport { ScriptOnce } from './ScriptOnce'\n\nexport function ScrollRestoration() {\n const router = useRouter()\n if (!router.isScrollRestoring || !(isServer ?? router.isServer)) {\n return null\n }\n if (typeof router.options.scrollRestoration === 'function') {\n const shouldRestore = router.options.scrollRestoration({\n location: router.latestLocation,\n })\n if (!shouldRestore) {\n return null\n }\n }\n const getKey =\n router.options.getScrollRestorationKey || defaultGetScrollRestorationKey\n const userKey = getKey(router.latestLocation)\n const resolvedKey =\n userKey !== defaultGetScrollRestorationKey(router.latestLocation)\n ? userKey\n : undefined\n\n const restoreScrollOptions: Parameters<typeof restoreScroll>[0] = {\n storageKey,\n shouldScrollRestoration: true,\n }\n if (resolvedKey) {\n restoreScrollOptions.key = resolvedKey\n }\n\n return (\n <ScriptOnce\n children={`(${restoreScroll.toString()})(${escapeHtml(JSON.stringify(restoreScrollOptions))})`}\n />\n )\n}\n"],"names":[],"mappings":";;;;;AAUO,SAAS,oBAAoB;AAClC,QAAM,SAAS,UAAA;AACf,MAAI,CAAC,OAAO,qBAAqB,EAAE,YAAY,OAAO,WAAW;AAC/D,WAAO;AAAA,EACT;AACA,MAAI,OAAO,OAAO,QAAQ,sBAAsB,YAAY;AAC1D,UAAM,gBAAgB,OAAO,QAAQ,kBAAkB;AAAA,MACrD,UAAU,OAAO;AAAA,IAAA,CAClB;AACD,QAAI,CAAC,eAAe;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,SACJ,OAAO,QAAQ,2BAA2B;AAC5C,QAAM,UAAU,OAAO,OAAO,cAAc;AAC5C,QAAM,cACJ,YAAY,+BAA+B,OAAO,cAAc,IAC5D,UACA;AAEN,QAAM,uBAA4D;AAAA,IAChE;AAAA,IACA,yBAAyB;AAAA,EAAA;AAE3B,MAAI,aAAa;AACf,yBAAqB,MAAM;AAAA,EAC7B;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAU,IAAI,cAAc,SAAA,CAAU,KAAK,WAAW,KAAK,UAAU,oBAAoB,CAAC,CAAC;AAAA,IAAA;AAAA,EAAA;AAGjG;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { hydrate } from "@tanstack/router-core/ssr/client";
|
|
3
|
+
import { Await } from "../awaited.js";
|
|
4
|
+
import { RouterProvider } from "../RouterProvider.js";
|
|
5
|
+
let hydrationPromise;
|
|
6
|
+
function RouterClient(props) {
|
|
7
|
+
if (!hydrationPromise) {
|
|
8
|
+
if (!props.router.state.matches.length) {
|
|
9
|
+
hydrationPromise = hydrate(props.router);
|
|
10
|
+
} else {
|
|
11
|
+
hydrationPromise = Promise.resolve();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return /* @__PURE__ */ jsx(
|
|
15
|
+
Await,
|
|
16
|
+
{
|
|
17
|
+
promise: hydrationPromise,
|
|
18
|
+
children: () => /* @__PURE__ */ jsx(RouterProvider, { router: props.router })
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
RouterClient
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=RouterClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouterClient.js","sources":["../../../src/ssr/RouterClient.tsx"],"sourcesContent":["import { hydrate } from '@tanstack/router-core/ssr/client'\nimport { Await } from '../awaited'\nimport { RouterProvider } from '../RouterProvider'\nimport type { AnyRouter } from '@tanstack/router-core'\n\nlet hydrationPromise: Promise<void | Array<Array<void>>> | undefined\n\nexport function RouterClient(props: { router: AnyRouter }) {\n if (!hydrationPromise) {\n if (!props.router.state.matches.length) {\n hydrationPromise = hydrate(props.router)\n } else {\n hydrationPromise = Promise.resolve()\n }\n }\n return (\n <Await\n promise={hydrationPromise}\n children={() => <RouterProvider router={props.router} />}\n />\n )\n}\n"],"names":[],"mappings":";;;;AAKA,IAAI;AAEG,SAAS,aAAa,OAA8B;AACzD,MAAI,CAAC,kBAAkB;AACrB,QAAI,CAAC,MAAM,OAAO,MAAM,QAAQ,QAAQ;AACtC,yBAAmB,QAAQ,MAAM,MAAM;AAAA,IACzC,OAAO;AACL,yBAAmB,QAAQ,QAAA;AAAA,IAC7B;AAAA,EACF;AACA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAAS;AAAA,MACT,UAAU,MAAM,oBAAC,gBAAA,EAAe,QAAQ,MAAM,OAAA,CAAQ;AAAA,IAAA;AAAA,EAAA;AAG5D;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { RouterProvider } from "../RouterProvider.js";
|
|
3
|
+
function RouterServer(props) {
|
|
4
|
+
return /* @__PURE__ */ jsx(RouterProvider, { router: props.router });
|
|
5
|
+
}
|
|
6
|
+
export {
|
|
7
|
+
RouterServer
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=RouterServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouterServer.js","sources":["../../../src/ssr/RouterServer.tsx"],"sourcesContent":["import * as React from 'react'\nimport { RouterProvider } from '../RouterProvider'\nimport type { AnyRouter } from '@tanstack/router-core'\n\nexport function RouterServer<TRouter extends AnyRouter>(props: {\n router: TRouter\n}) {\n return <RouterProvider router={props.router} />\n}\n"],"names":[],"mappings":";;AAIO,SAAS,aAAwC,OAErD;AACD,SAAO,oBAAC,gBAAA,EAAe,QAAQ,MAAM,OAAA,CAAQ;AAC/C;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const defaultRenderHandler: import('@tanstack/router-core/ssr/server').HandlerCallback<import('@tanstack/router-core').AnyRouter>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { defineHandlerCallback } from "@tanstack/router-core/ssr/server";
|
|
3
|
+
import { renderRouterToString } from "./renderRouterToString.js";
|
|
4
|
+
import { RouterServer } from "./RouterServer.js";
|
|
5
|
+
const defaultRenderHandler = defineHandlerCallback(
|
|
6
|
+
({ router, responseHeaders }) => renderRouterToString({
|
|
7
|
+
router,
|
|
8
|
+
responseHeaders,
|
|
9
|
+
children: /* @__PURE__ */ jsx(RouterServer, { router })
|
|
10
|
+
})
|
|
11
|
+
);
|
|
12
|
+
export {
|
|
13
|
+
defaultRenderHandler
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=defaultRenderHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultRenderHandler.js","sources":["../../../src/ssr/defaultRenderHandler.tsx"],"sourcesContent":["import { defineHandlerCallback } from '@tanstack/router-core/ssr/server'\nimport { renderRouterToString } from './renderRouterToString'\nimport { RouterServer } from './RouterServer'\n\nexport const defaultRenderHandler = defineHandlerCallback(\n ({ router, responseHeaders }) =>\n renderRouterToString({\n router,\n responseHeaders,\n children: <RouterServer router={router} />,\n }),\n)\n"],"names":[],"mappings":";;;;AAIO,MAAM,uBAAuB;AAAA,EAClC,CAAC,EAAE,QAAQ,gBAAA,MACT,qBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA,UAAU,oBAAC,cAAA,EAAa,OAAA,CAAgB;AAAA,EAAA,CACzC;AACL;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const defaultStreamHandler: import('@tanstack/router-core/ssr/server').HandlerCallback<import('@tanstack/router-core').AnyRouter>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { defineHandlerCallback } from "@tanstack/router-core/ssr/server";
|
|
3
|
+
import { RouterServer } from "./RouterServer.js";
|
|
4
|
+
import { renderRouterToStream } from "./renderRouterToStream.js";
|
|
5
|
+
const defaultStreamHandler = defineHandlerCallback(
|
|
6
|
+
({ request, router, responseHeaders }) => renderRouterToStream({
|
|
7
|
+
request,
|
|
8
|
+
router,
|
|
9
|
+
responseHeaders,
|
|
10
|
+
children: /* @__PURE__ */ jsx(RouterServer, { router })
|
|
11
|
+
})
|
|
12
|
+
);
|
|
13
|
+
export {
|
|
14
|
+
defaultStreamHandler
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=defaultStreamHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultStreamHandler.js","sources":["../../../src/ssr/defaultStreamHandler.tsx"],"sourcesContent":["import { defineHandlerCallback } from '@tanstack/router-core/ssr/server'\nimport { RouterServer } from './RouterServer'\nimport { renderRouterToStream } from './renderRouterToStream'\n\nexport const defaultStreamHandler = defineHandlerCallback(\n ({ request, router, responseHeaders }) =>\n renderRouterToStream({\n request,\n router,\n responseHeaders,\n children: <RouterServer router={router} />,\n }),\n)\n"],"names":[],"mappings":";;;;AAIO,MAAM,uBAAuB;AAAA,EAClC,CAAC,EAAE,SAAS,QAAQ,gBAAA,MAClB,qBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,oBAAC,cAAA,EAAa,OAAA,CAAgB;AAAA,EAAA,CACzC;AACL;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AnyRouter } from '@tanstack/router-core';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
export declare const renderRouterToStream: ({ request, router, responseHeaders, children, }: {
|
|
4
|
+
request: Request;
|
|
5
|
+
router: AnyRouter;
|
|
6
|
+
responseHeaders: Headers;
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}) => Promise<Response>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { PassThrough } from "node:stream";
|
|
2
|
+
import ReactDOMServer from "react-dom/server";
|
|
3
|
+
import { isbot } from "isbot";
|
|
4
|
+
import { transformReadableStreamWithRouter, transformPipeableStreamWithRouter } from "@tanstack/router-core/ssr/server";
|
|
5
|
+
const renderRouterToStream = async ({
|
|
6
|
+
request,
|
|
7
|
+
router,
|
|
8
|
+
responseHeaders,
|
|
9
|
+
children
|
|
10
|
+
}) => {
|
|
11
|
+
if (typeof ReactDOMServer.renderToReadableStream === "function") {
|
|
12
|
+
const stream = await ReactDOMServer.renderToReadableStream(children, {
|
|
13
|
+
signal: request.signal,
|
|
14
|
+
nonce: router.options.ssr?.nonce,
|
|
15
|
+
progressiveChunkSize: Number.POSITIVE_INFINITY
|
|
16
|
+
});
|
|
17
|
+
if (isbot(request.headers.get("User-Agent"))) {
|
|
18
|
+
await stream.allReady;
|
|
19
|
+
}
|
|
20
|
+
const responseStream = transformReadableStreamWithRouter(
|
|
21
|
+
router,
|
|
22
|
+
stream
|
|
23
|
+
);
|
|
24
|
+
return new Response(responseStream, {
|
|
25
|
+
status: router.state.statusCode,
|
|
26
|
+
headers: responseHeaders
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (typeof ReactDOMServer.renderToPipeableStream === "function") {
|
|
30
|
+
const reactAppPassthrough = new PassThrough();
|
|
31
|
+
try {
|
|
32
|
+
const pipeable = ReactDOMServer.renderToPipeableStream(children, {
|
|
33
|
+
nonce: router.options.ssr?.nonce,
|
|
34
|
+
progressiveChunkSize: Number.POSITIVE_INFINITY,
|
|
35
|
+
...isbot(request.headers.get("User-Agent")) ? {
|
|
36
|
+
onAllReady() {
|
|
37
|
+
pipeable.pipe(reactAppPassthrough);
|
|
38
|
+
}
|
|
39
|
+
} : {
|
|
40
|
+
onShellReady() {
|
|
41
|
+
pipeable.pipe(reactAppPassthrough);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
onError: (error, info) => {
|
|
45
|
+
console.error("Error in renderToPipeableStream:", error, info);
|
|
46
|
+
if (!reactAppPassthrough.destroyed) {
|
|
47
|
+
reactAppPassthrough.destroy(
|
|
48
|
+
error instanceof Error ? error : new Error(String(error))
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
} catch (e) {
|
|
54
|
+
console.error("Error in renderToPipeableStream:", e);
|
|
55
|
+
reactAppPassthrough.destroy(e instanceof Error ? e : new Error(String(e)));
|
|
56
|
+
}
|
|
57
|
+
const responseStream = transformPipeableStreamWithRouter(
|
|
58
|
+
router,
|
|
59
|
+
reactAppPassthrough
|
|
60
|
+
);
|
|
61
|
+
return new Response(responseStream, {
|
|
62
|
+
status: router.state.statusCode,
|
|
63
|
+
headers: responseHeaders
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
throw new Error(
|
|
67
|
+
"No renderToReadableStream or renderToPipeableStream found in react-dom/server. Ensure you are using a version of react-dom that supports streaming."
|
|
68
|
+
);
|
|
69
|
+
};
|
|
70
|
+
export {
|
|
71
|
+
renderRouterToStream
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=renderRouterToStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderRouterToStream.js","sources":["../../../src/ssr/renderRouterToStream.tsx"],"sourcesContent":["import { PassThrough } from 'node:stream'\nimport ReactDOMServer from 'react-dom/server'\nimport { isbot } from 'isbot'\nimport {\n transformPipeableStreamWithRouter,\n transformReadableStreamWithRouter,\n} from '@tanstack/router-core/ssr/server'\nimport type { AnyRouter } from '@tanstack/router-core'\nimport type { ReadableStream } from 'node:stream/web'\nimport type { ReactNode } from 'react'\n\nexport const renderRouterToStream = async ({\n request,\n router,\n responseHeaders,\n children,\n}: {\n request: Request\n router: AnyRouter\n responseHeaders: Headers\n children: ReactNode\n}) => {\n if (typeof ReactDOMServer.renderToReadableStream === 'function') {\n const stream = await ReactDOMServer.renderToReadableStream(children, {\n signal: request.signal,\n nonce: router.options.ssr?.nonce,\n progressiveChunkSize: Number.POSITIVE_INFINITY,\n })\n\n if (isbot(request.headers.get('User-Agent'))) {\n await stream.allReady\n }\n\n const responseStream = transformReadableStreamWithRouter(\n router,\n stream as unknown as ReadableStream,\n )\n return new Response(responseStream as any, {\n status: router.state.statusCode,\n headers: responseHeaders,\n })\n }\n\n if (typeof ReactDOMServer.renderToPipeableStream === 'function') {\n const reactAppPassthrough = new PassThrough()\n\n try {\n const pipeable = ReactDOMServer.renderToPipeableStream(children, {\n nonce: router.options.ssr?.nonce,\n progressiveChunkSize: Number.POSITIVE_INFINITY,\n ...(isbot(request.headers.get('User-Agent'))\n ? {\n onAllReady() {\n pipeable.pipe(reactAppPassthrough)\n },\n }\n : {\n onShellReady() {\n pipeable.pipe(reactAppPassthrough)\n },\n }),\n onError: (error, info) => {\n console.error('Error in renderToPipeableStream:', error, info)\n // Destroy the passthrough stream on error\n if (!reactAppPassthrough.destroyed) {\n reactAppPassthrough.destroy(\n error instanceof Error ? error : new Error(String(error)),\n )\n }\n },\n })\n } catch (e) {\n console.error('Error in renderToPipeableStream:', e)\n reactAppPassthrough.destroy(e instanceof Error ? e : new Error(String(e)))\n }\n\n const responseStream = transformPipeableStreamWithRouter(\n router,\n reactAppPassthrough,\n )\n return new Response(responseStream as any, {\n status: router.state.statusCode,\n headers: responseHeaders,\n })\n }\n\n throw new Error(\n 'No renderToReadableStream or renderToPipeableStream found in react-dom/server. Ensure you are using a version of react-dom that supports streaming.',\n )\n}\n"],"names":[],"mappings":";;;;AAWO,MAAM,uBAAuB,OAAO;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAKM;AACJ,MAAI,OAAO,eAAe,2BAA2B,YAAY;AAC/D,UAAM,SAAS,MAAM,eAAe,uBAAuB,UAAU;AAAA,MACnE,QAAQ,QAAQ;AAAA,MAChB,OAAO,OAAO,QAAQ,KAAK;AAAA,MAC3B,sBAAsB,OAAO;AAAA,IAAA,CAC9B;AAED,QAAI,MAAM,QAAQ,QAAQ,IAAI,YAAY,CAAC,GAAG;AAC5C,YAAM,OAAO;AAAA,IACf;AAEA,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,IAAA;AAEF,WAAO,IAAI,SAAS,gBAAuB;AAAA,MACzC,QAAQ,OAAO,MAAM;AAAA,MACrB,SAAS;AAAA,IAAA,CACV;AAAA,EACH;AAEA,MAAI,OAAO,eAAe,2BAA2B,YAAY;AAC/D,UAAM,sBAAsB,IAAI,YAAA;AAEhC,QAAI;AACF,YAAM,WAAW,eAAe,uBAAuB,UAAU;AAAA,QAC/D,OAAO,OAAO,QAAQ,KAAK;AAAA,QAC3B,sBAAsB,OAAO;AAAA,QAC7B,GAAI,MAAM,QAAQ,QAAQ,IAAI,YAAY,CAAC,IACvC;AAAA,UACE,aAAa;AACX,qBAAS,KAAK,mBAAmB;AAAA,UACnC;AAAA,QAAA,IAEF;AAAA,UACE,eAAe;AACb,qBAAS,KAAK,mBAAmB;AAAA,UACnC;AAAA,QAAA;AAAA,QAEN,SAAS,CAAC,OAAO,SAAS;AACxB,kBAAQ,MAAM,oCAAoC,OAAO,IAAI;AAE7D,cAAI,CAAC,oBAAoB,WAAW;AAClC,gCAAoB;AAAA,cAClB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,YAAA;AAAA,UAE5D;AAAA,QACF;AAAA,MAAA,CACD;AAAA,IACH,SAAS,GAAG;AACV,cAAQ,MAAM,oCAAoC,CAAC;AACnD,0BAAoB,QAAQ,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC;AAAA,IAC3E;AAEA,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,IAAA;AAEF,WAAO,IAAI,SAAS,gBAAuB;AAAA,MACzC,QAAQ,OAAO,MAAM;AAAA,MACrB,SAAS;AAAA,IAAA,CACV;AAAA,EACH;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EAAA;AAEJ;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { AnyRouter } from '@tanstack/router-core';
|
|
3
|
+
export declare const renderRouterToString: ({ router, responseHeaders, children, }: {
|
|
4
|
+
router: AnyRouter;
|
|
5
|
+
responseHeaders: Headers;
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
}) => Promise<Response>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import ReactDOMServer from "react-dom/server";
|
|
2
|
+
const renderRouterToString = async ({
|
|
3
|
+
router,
|
|
4
|
+
responseHeaders,
|
|
5
|
+
children
|
|
6
|
+
}) => {
|
|
7
|
+
try {
|
|
8
|
+
let html = ReactDOMServer.renderToString(children);
|
|
9
|
+
router.serverSsr.setRenderFinished();
|
|
10
|
+
const injectedHtml = router.serverSsr.takeBufferedHtml();
|
|
11
|
+
if (injectedHtml) {
|
|
12
|
+
html = html.replace(`</body>`, () => `${injectedHtml}</body>`);
|
|
13
|
+
}
|
|
14
|
+
return new Response(`<!DOCTYPE html>${html}`, {
|
|
15
|
+
status: router.state.statusCode,
|
|
16
|
+
headers: responseHeaders
|
|
17
|
+
});
|
|
18
|
+
} catch (error) {
|
|
19
|
+
console.error("Render to string error:", error);
|
|
20
|
+
return new Response("Internal Server Error", {
|
|
21
|
+
status: 500,
|
|
22
|
+
headers: responseHeaders
|
|
23
|
+
});
|
|
24
|
+
} finally {
|
|
25
|
+
router.serverSsr?.cleanup();
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
export {
|
|
29
|
+
renderRouterToString
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=renderRouterToString.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderRouterToString.js","sources":["../../../src/ssr/renderRouterToString.tsx"],"sourcesContent":["import ReactDOMServer from 'react-dom/server'\nimport type { ReactNode } from 'react'\nimport type { AnyRouter } from '@tanstack/router-core'\n\nexport const renderRouterToString = async ({\n router,\n responseHeaders,\n children,\n}: {\n router: AnyRouter\n responseHeaders: Headers\n children: ReactNode\n}) => {\n try {\n let html = ReactDOMServer.renderToString(children)\n router.serverSsr!.setRenderFinished()\n\n const injectedHtml = router.serverSsr!.takeBufferedHtml()\n if (injectedHtml) {\n html = html.replace(`</body>`, () => `${injectedHtml}</body>`)\n }\n\n return new Response(`<!DOCTYPE html>${html}`, {\n status: router.state.statusCode,\n headers: responseHeaders,\n })\n } catch (error) {\n console.error('Render to string error:', error)\n return new Response('Internal Server Error', {\n status: 500,\n headers: responseHeaders,\n })\n } finally {\n router.serverSsr?.cleanup()\n }\n}\n"],"names":[],"mappings":";AAIO,MAAM,uBAAuB,OAAO;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF,MAIM;AACJ,MAAI;AACF,QAAI,OAAO,eAAe,eAAe,QAAQ;AACjD,WAAO,UAAW,kBAAA;AAElB,UAAM,eAAe,OAAO,UAAW,iBAAA;AACvC,QAAI,cAAc;AAChB,aAAO,KAAK,QAAQ,WAAW,MAAM,GAAG,YAAY,SAAS;AAAA,IAC/D;AAEA,WAAO,IAAI,SAAS,kBAAkB,IAAI,IAAI;AAAA,MAC5C,QAAQ,OAAO,MAAM;AAAA,MACrB,SAAS;AAAA,IAAA,CACV;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK;AAC9C,WAAO,IAAI,SAAS,yBAAyB;AAAA,MAC3C,QAAQ;AAAA,MACR,SAAS;AAAA,IAAA,CACV;AAAA,EACH,UAAA;AACE,WAAO,WAAW,QAAA;AAAA,EACpB;AACF;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { RouterServer } from './RouterServer.js';
|
|
2
|
+
export { defaultRenderHandler } from './defaultRenderHandler.js';
|
|
3
|
+
export { defaultStreamHandler } from './defaultStreamHandler.js';
|
|
4
|
+
export { renderRouterToStream } from './renderRouterToStream.js';
|
|
5
|
+
export { renderRouterToString } from './renderRouterToString.js';
|
|
6
|
+
export * from '@tanstack/router-core/ssr/server';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { RouterServer } from "./RouterServer.js";
|
|
2
|
+
import { defaultRenderHandler } from "./defaultRenderHandler.js";
|
|
3
|
+
import { defaultStreamHandler } from "./defaultStreamHandler.js";
|
|
4
|
+
import { renderRouterToStream } from "./renderRouterToStream.js";
|
|
5
|
+
import { renderRouterToString } from "./renderRouterToString.js";
|
|
6
|
+
export * from "@tanstack/router-core/ssr/server";
|
|
7
|
+
export {
|
|
8
|
+
RouterServer,
|
|
9
|
+
defaultRenderHandler,
|
|
10
|
+
defaultStreamHandler,
|
|
11
|
+
renderRouterToStream,
|
|
12
|
+
renderRouterToString
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AnyRouter, Constrain, OptionalStructuralSharing, ValidateJSON } from '@tanstack/router-core';
|
|
2
|
+
export type DefaultStructuralSharingEnabled<TRouter extends AnyRouter> = boolean extends TRouter['options']['defaultStructuralSharing'] ? false : NonNullable<TRouter['options']['defaultStructuralSharing']>;
|
|
3
|
+
export interface RequiredStructuralSharing<TStructuralSharing, TConstraint> {
|
|
4
|
+
readonly structuralSharing: Constrain<TStructuralSharing, TConstraint>;
|
|
5
|
+
}
|
|
6
|
+
export type StructuralSharingOption<TRouter extends AnyRouter, TSelected, TStructuralSharing> = unknown extends TSelected ? OptionalStructuralSharing<TStructuralSharing, boolean> : unknown extends TRouter['routeTree'] ? OptionalStructuralSharing<TStructuralSharing, boolean> : TSelected extends ValidateJSON<TSelected> ? OptionalStructuralSharing<TStructuralSharing, boolean> : DefaultStructuralSharingEnabled<TRouter> extends true ? RequiredStructuralSharing<TStructuralSharing, false> : OptionalStructuralSharing<TStructuralSharing, false>;
|
|
7
|
+
export type StructuralSharingEnabled<TRouter extends AnyRouter, TStructuralSharing> = boolean extends TStructuralSharing ? DefaultStructuralSharingEnabled<TRouter> : TStructuralSharing;
|
|
8
|
+
export type ValidateSelected<TRouter extends AnyRouter, TSelected, TStructuralSharing> = StructuralSharingEnabled<TRouter, TStructuralSharing> extends true ? ValidateJSON<TSelected> : TSelected;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AnyRouter, Constrain, InferFrom, InferMaskFrom, InferMaskTo, InferSelected, InferShouldThrow, InferStrict, InferTo, RegisteredRouter } from '@tanstack/router-core';
|
|
2
|
+
import { LinkComponentProps } from './link.js';
|
|
3
|
+
import { UseParamsOptions } from './useParams.js';
|
|
4
|
+
import { UseSearchOptions } from './useSearch.js';
|
|
5
|
+
export type ValidateLinkOptions<TRouter extends AnyRouter = RegisteredRouter, TOptions = unknown, TDefaultFrom extends string = string, TComp = 'a'> = Constrain<TOptions, LinkComponentProps<TComp, TRouter, InferFrom<TOptions, TDefaultFrom>, InferTo<TOptions>, InferMaskFrom<TOptions>, InferMaskTo<TOptions>>>;
|
|
6
|
+
/**
|
|
7
|
+
* @private
|
|
8
|
+
*/
|
|
9
|
+
export type InferStructuralSharing<TOptions> = TOptions extends {
|
|
10
|
+
structuralSharing: infer TStructuralSharing;
|
|
11
|
+
} ? TStructuralSharing : unknown;
|
|
12
|
+
export type ValidateUseSearchOptions<TOptions, TRouter extends AnyRouter = RegisteredRouter> = Constrain<TOptions, UseSearchOptions<TRouter, InferFrom<TOptions>, InferStrict<TOptions>, InferShouldThrow<TOptions>, InferSelected<TOptions>, InferStructuralSharing<TOptions>>>;
|
|
13
|
+
export type ValidateUseParamsOptions<TOptions, TRouter extends AnyRouter = RegisteredRouter> = Constrain<TOptions, UseParamsOptions<TRouter, InferFrom<TOptions>, InferStrict<TOptions>, InferShouldThrow<TOptions>, InferSelected<TOptions>, InferSelected<TOptions>>>;
|
|
14
|
+
export type ValidateLinkOptionsArray<TRouter extends AnyRouter = RegisteredRouter, TOptions extends ReadonlyArray<any> = ReadonlyArray<unknown>, TDefaultFrom extends string = string, TComp = 'a'> = {
|
|
15
|
+
[K in keyof TOptions]: ValidateLinkOptions<TRouter, TOptions[K], TDefaultFrom, TComp>;
|
|
16
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { HistoryAction } from '@tanstack/history';
|
|
2
|
+
import { AnyRoute, AnyRouter, ParseRoute, RegisteredRouter } from '@tanstack/router-core';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
interface ShouldBlockFnLocation<out TRouteId, out TFullPath, out TAllParams, out TFullSearchSchema> {
|
|
5
|
+
routeId: TRouteId;
|
|
6
|
+
fullPath: TFullPath;
|
|
7
|
+
pathname: string;
|
|
8
|
+
params: TAllParams;
|
|
9
|
+
search: TFullSearchSchema;
|
|
10
|
+
}
|
|
11
|
+
type MakeShouldBlockFnLocationUnion<TRouter extends AnyRouter = RegisteredRouter, TRoute extends AnyRoute = ParseRoute<TRouter['routeTree']>> = TRoute extends any ? ShouldBlockFnLocation<TRoute['id'], TRoute['fullPath'], TRoute['types']['allParams'], TRoute['types']['fullSearchSchema']> : never;
|
|
12
|
+
type BlockerResolver<TRouter extends AnyRouter = RegisteredRouter> = {
|
|
13
|
+
status: 'blocked';
|
|
14
|
+
current: MakeShouldBlockFnLocationUnion<TRouter>;
|
|
15
|
+
next: MakeShouldBlockFnLocationUnion<TRouter>;
|
|
16
|
+
action: HistoryAction;
|
|
17
|
+
proceed: () => void;
|
|
18
|
+
reset: () => void;
|
|
19
|
+
} | {
|
|
20
|
+
status: 'idle';
|
|
21
|
+
current: undefined;
|
|
22
|
+
next: undefined;
|
|
23
|
+
action: undefined;
|
|
24
|
+
proceed: undefined;
|
|
25
|
+
reset: undefined;
|
|
26
|
+
};
|
|
27
|
+
type ShouldBlockFnArgs<TRouter extends AnyRouter = RegisteredRouter> = {
|
|
28
|
+
current: MakeShouldBlockFnLocationUnion<TRouter>;
|
|
29
|
+
next: MakeShouldBlockFnLocationUnion<TRouter>;
|
|
30
|
+
action: HistoryAction;
|
|
31
|
+
};
|
|
32
|
+
export type ShouldBlockFn<TRouter extends AnyRouter = RegisteredRouter> = (args: ShouldBlockFnArgs<TRouter>) => boolean | Promise<boolean>;
|
|
33
|
+
export type UseBlockerOpts<TRouter extends AnyRouter = RegisteredRouter, TWithResolver extends boolean = boolean> = {
|
|
34
|
+
shouldBlockFn: ShouldBlockFn<TRouter>;
|
|
35
|
+
enableBeforeUnload?: boolean | (() => boolean);
|
|
36
|
+
disabled?: boolean;
|
|
37
|
+
withResolver?: TWithResolver;
|
|
38
|
+
};
|
|
39
|
+
type LegacyBlockerFn = () => Promise<any> | any;
|
|
40
|
+
type LegacyBlockerOpts = {
|
|
41
|
+
blockerFn?: LegacyBlockerFn;
|
|
42
|
+
condition?: boolean | any;
|
|
43
|
+
};
|
|
44
|
+
export declare function useBlocker<TRouter extends AnyRouter = RegisteredRouter, TWithResolver extends boolean = false>(opts: UseBlockerOpts<TRouter, TWithResolver>): TWithResolver extends true ? BlockerResolver<TRouter> : void;
|
|
45
|
+
/**
|
|
46
|
+
* @deprecated Use the shouldBlockFn property instead
|
|
47
|
+
*/
|
|
48
|
+
export declare function useBlocker(blockerFnOrOpts?: LegacyBlockerOpts): BlockerResolver;
|
|
49
|
+
/**
|
|
50
|
+
* @deprecated Use the UseBlockerOpts object syntax instead
|
|
51
|
+
*/
|
|
52
|
+
export declare function useBlocker(blockerFn?: LegacyBlockerFn, condition?: boolean | any): BlockerResolver;
|
|
53
|
+
export declare function Block<TRouter extends AnyRouter = RegisteredRouter, TWithResolver extends boolean = boolean>(opts: PromptProps<TRouter, TWithResolver>): React.ReactNode;
|
|
54
|
+
/**
|
|
55
|
+
* @deprecated Use the UseBlockerOpts property instead
|
|
56
|
+
*/
|
|
57
|
+
export declare function Block(opts: LegacyPromptProps): React.ReactNode;
|
|
58
|
+
type LegacyPromptProps = {
|
|
59
|
+
blockerFn?: LegacyBlockerFn;
|
|
60
|
+
condition?: boolean | any;
|
|
61
|
+
children?: React.ReactNode | ((params: BlockerResolver) => React.ReactNode);
|
|
62
|
+
};
|
|
63
|
+
type PromptProps<TRouter extends AnyRouter = RegisteredRouter, TWithResolver extends boolean = boolean, TParams = TWithResolver extends true ? BlockerResolver<TRouter> : void> = UseBlockerOpts<TRouter, TWithResolver> & {
|
|
64
|
+
children?: React.ReactNode | ((params: TParams) => React.ReactNode);
|
|
65
|
+
};
|
|
66
|
+
export {};
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { useRouter } from "./useRouter.js";
|
|
3
|
+
function _resolveBlockerOpts(opts, condition) {
|
|
4
|
+
if (opts === void 0) {
|
|
5
|
+
return {
|
|
6
|
+
shouldBlockFn: () => true,
|
|
7
|
+
withResolver: false
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
if ("shouldBlockFn" in opts) {
|
|
11
|
+
return opts;
|
|
12
|
+
}
|
|
13
|
+
if (typeof opts === "function") {
|
|
14
|
+
const shouldBlock2 = Boolean(condition ?? true);
|
|
15
|
+
const _customBlockerFn2 = async () => {
|
|
16
|
+
if (shouldBlock2) return await opts();
|
|
17
|
+
return false;
|
|
18
|
+
};
|
|
19
|
+
return {
|
|
20
|
+
shouldBlockFn: _customBlockerFn2,
|
|
21
|
+
enableBeforeUnload: shouldBlock2,
|
|
22
|
+
withResolver: false
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const shouldBlock = Boolean(opts.condition ?? true);
|
|
26
|
+
const fn = opts.blockerFn;
|
|
27
|
+
const _customBlockerFn = async () => {
|
|
28
|
+
if (shouldBlock && fn !== void 0) {
|
|
29
|
+
return await fn();
|
|
30
|
+
}
|
|
31
|
+
return shouldBlock;
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
shouldBlockFn: _customBlockerFn,
|
|
35
|
+
enableBeforeUnload: shouldBlock,
|
|
36
|
+
withResolver: fn === void 0
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function useBlocker(opts, condition) {
|
|
40
|
+
const {
|
|
41
|
+
shouldBlockFn,
|
|
42
|
+
enableBeforeUnload = true,
|
|
43
|
+
disabled = false,
|
|
44
|
+
withResolver = false
|
|
45
|
+
} = _resolveBlockerOpts(opts, condition);
|
|
46
|
+
const router = useRouter();
|
|
47
|
+
const { history } = router;
|
|
48
|
+
const [resolver, setResolver] = React.useState({
|
|
49
|
+
status: "idle",
|
|
50
|
+
current: void 0,
|
|
51
|
+
next: void 0,
|
|
52
|
+
action: void 0,
|
|
53
|
+
proceed: void 0,
|
|
54
|
+
reset: void 0
|
|
55
|
+
});
|
|
56
|
+
React.useEffect(() => {
|
|
57
|
+
const blockerFnComposed = async (blockerFnArgs) => {
|
|
58
|
+
function getLocation(location) {
|
|
59
|
+
const parsedLocation = router.parseLocation(location);
|
|
60
|
+
const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname);
|
|
61
|
+
if (matchedRoutes.foundRoute === void 0) {
|
|
62
|
+
return {
|
|
63
|
+
routeId: "__notFound__",
|
|
64
|
+
fullPath: parsedLocation.pathname,
|
|
65
|
+
pathname: parsedLocation.pathname,
|
|
66
|
+
params: matchedRoutes.routeParams,
|
|
67
|
+
search: router.options.parseSearch(location.search)
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
routeId: matchedRoutes.foundRoute.id,
|
|
72
|
+
fullPath: matchedRoutes.foundRoute.fullPath,
|
|
73
|
+
pathname: parsedLocation.pathname,
|
|
74
|
+
params: matchedRoutes.routeParams,
|
|
75
|
+
search: router.options.parseSearch(location.search)
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const current = getLocation(blockerFnArgs.currentLocation);
|
|
79
|
+
const next = getLocation(blockerFnArgs.nextLocation);
|
|
80
|
+
if (current.routeId === "__notFound__" && next.routeId !== "__notFound__") {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
const shouldBlock = await shouldBlockFn({
|
|
84
|
+
action: blockerFnArgs.action,
|
|
85
|
+
current,
|
|
86
|
+
next
|
|
87
|
+
});
|
|
88
|
+
if (!withResolver) {
|
|
89
|
+
return shouldBlock;
|
|
90
|
+
}
|
|
91
|
+
if (!shouldBlock) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
const promise = new Promise((resolve) => {
|
|
95
|
+
setResolver({
|
|
96
|
+
status: "blocked",
|
|
97
|
+
current,
|
|
98
|
+
next,
|
|
99
|
+
action: blockerFnArgs.action,
|
|
100
|
+
proceed: () => resolve(false),
|
|
101
|
+
reset: () => resolve(true)
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
const canNavigateAsync = await promise;
|
|
105
|
+
setResolver({
|
|
106
|
+
status: "idle",
|
|
107
|
+
current: void 0,
|
|
108
|
+
next: void 0,
|
|
109
|
+
action: void 0,
|
|
110
|
+
proceed: void 0,
|
|
111
|
+
reset: void 0
|
|
112
|
+
});
|
|
113
|
+
return canNavigateAsync;
|
|
114
|
+
};
|
|
115
|
+
return disabled ? void 0 : history.block({ blockerFn: blockerFnComposed, enableBeforeUnload });
|
|
116
|
+
}, [
|
|
117
|
+
shouldBlockFn,
|
|
118
|
+
enableBeforeUnload,
|
|
119
|
+
disabled,
|
|
120
|
+
withResolver,
|
|
121
|
+
history,
|
|
122
|
+
router
|
|
123
|
+
]);
|
|
124
|
+
return resolver;
|
|
125
|
+
}
|
|
126
|
+
const _resolvePromptBlockerArgs = (props) => {
|
|
127
|
+
if ("shouldBlockFn" in props) {
|
|
128
|
+
return { ...props };
|
|
129
|
+
}
|
|
130
|
+
const shouldBlock = Boolean(props.condition ?? true);
|
|
131
|
+
const fn = props.blockerFn;
|
|
132
|
+
const _customBlockerFn = async () => {
|
|
133
|
+
if (shouldBlock && fn !== void 0) {
|
|
134
|
+
return await fn();
|
|
135
|
+
}
|
|
136
|
+
return shouldBlock;
|
|
137
|
+
};
|
|
138
|
+
return {
|
|
139
|
+
shouldBlockFn: _customBlockerFn,
|
|
140
|
+
enableBeforeUnload: shouldBlock,
|
|
141
|
+
withResolver: fn === void 0
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
function Block(opts) {
|
|
145
|
+
const { children, ...rest } = opts;
|
|
146
|
+
const args = _resolvePromptBlockerArgs(rest);
|
|
147
|
+
const resolver = useBlocker(args);
|
|
148
|
+
return children ? typeof children === "function" ? children(resolver) : children : null;
|
|
149
|
+
}
|
|
150
|
+
export {
|
|
151
|
+
Block,
|
|
152
|
+
useBlocker
|
|
153
|
+
};
|
|
154
|
+
//# sourceMappingURL=useBlocker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBlocker.js","sources":["../../src/useBlocker.tsx"],"sourcesContent":["import * as React from 'react'\nimport { useRouter } from './useRouter'\nimport type {\n BlockerFnArgs,\n HistoryAction,\n HistoryLocation,\n} from '@tanstack/history'\nimport type {\n AnyRoute,\n AnyRouter,\n ParseRoute,\n RegisteredRouter,\n} from '@tanstack/router-core'\n\ninterface ShouldBlockFnLocation<\n out TRouteId,\n out TFullPath,\n out TAllParams,\n out TFullSearchSchema,\n> {\n routeId: TRouteId\n fullPath: TFullPath\n pathname: string\n params: TAllParams\n search: TFullSearchSchema\n}\n\ntype AnyShouldBlockFnLocation = ShouldBlockFnLocation<any, any, any, any>\ntype MakeShouldBlockFnLocationUnion<\n TRouter extends AnyRouter = RegisteredRouter,\n TRoute extends AnyRoute = ParseRoute<TRouter['routeTree']>,\n> = TRoute extends any\n ? ShouldBlockFnLocation<\n TRoute['id'],\n TRoute['fullPath'],\n TRoute['types']['allParams'],\n TRoute['types']['fullSearchSchema']\n >\n : never\n\ntype BlockerResolver<TRouter extends AnyRouter = RegisteredRouter> =\n | {\n status: 'blocked'\n current: MakeShouldBlockFnLocationUnion<TRouter>\n next: MakeShouldBlockFnLocationUnion<TRouter>\n action: HistoryAction\n proceed: () => void\n reset: () => void\n }\n | {\n status: 'idle'\n current: undefined\n next: undefined\n action: undefined\n proceed: undefined\n reset: undefined\n }\n\ntype ShouldBlockFnArgs<TRouter extends AnyRouter = RegisteredRouter> = {\n current: MakeShouldBlockFnLocationUnion<TRouter>\n next: MakeShouldBlockFnLocationUnion<TRouter>\n action: HistoryAction\n}\n\nexport type ShouldBlockFn<TRouter extends AnyRouter = RegisteredRouter> = (\n args: ShouldBlockFnArgs<TRouter>,\n) => boolean | Promise<boolean>\nexport type UseBlockerOpts<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n> = {\n shouldBlockFn: ShouldBlockFn<TRouter>\n enableBeforeUnload?: boolean | (() => boolean)\n disabled?: boolean\n withResolver?: TWithResolver\n}\n\ntype LegacyBlockerFn = () => Promise<any> | any\ntype LegacyBlockerOpts = {\n blockerFn?: LegacyBlockerFn\n condition?: boolean | any\n}\n\nfunction _resolveBlockerOpts(\n opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,\n condition?: boolean | any,\n): UseBlockerOpts {\n if (opts === undefined) {\n return {\n shouldBlockFn: () => true,\n withResolver: false,\n }\n }\n\n if ('shouldBlockFn' in opts) {\n return opts\n }\n\n if (typeof opts === 'function') {\n const shouldBlock = Boolean(condition ?? true)\n\n const _customBlockerFn = async () => {\n if (shouldBlock) return await opts()\n return false\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: false,\n }\n }\n\n const shouldBlock = Boolean(opts.condition ?? true)\n const fn = opts.blockerFn\n\n const _customBlockerFn = async () => {\n if (shouldBlock && fn !== undefined) {\n return await fn()\n }\n return shouldBlock\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: fn === undefined,\n }\n}\n\nexport function useBlocker<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = false,\n>(\n opts: UseBlockerOpts<TRouter, TWithResolver>,\n): TWithResolver extends true ? BlockerResolver<TRouter> : void\n\n/**\n * @deprecated Use the shouldBlockFn property instead\n */\nexport function useBlocker(blockerFnOrOpts?: LegacyBlockerOpts): BlockerResolver\n\n/**\n * @deprecated Use the UseBlockerOpts object syntax instead\n */\nexport function useBlocker(\n blockerFn?: LegacyBlockerFn,\n condition?: boolean | any,\n): BlockerResolver\n\nexport function useBlocker(\n opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,\n condition?: boolean | any,\n): BlockerResolver | void {\n const {\n shouldBlockFn,\n enableBeforeUnload = true,\n disabled = false,\n withResolver = false,\n } = _resolveBlockerOpts(opts, condition)\n\n const router = useRouter()\n const { history } = router\n\n const [resolver, setResolver] = React.useState<BlockerResolver>({\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n })\n\n React.useEffect(() => {\n const blockerFnComposed = async (blockerFnArgs: BlockerFnArgs) => {\n function getLocation(\n location: HistoryLocation,\n ): AnyShouldBlockFnLocation {\n const parsedLocation = router.parseLocation(location)\n const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname)\n if (matchedRoutes.foundRoute === undefined) {\n return {\n routeId: '__notFound__',\n fullPath: parsedLocation.pathname,\n pathname: parsedLocation.pathname,\n params: matchedRoutes.routeParams,\n search: router.options.parseSearch(location.search),\n }\n }\n\n return {\n routeId: matchedRoutes.foundRoute.id,\n fullPath: matchedRoutes.foundRoute.fullPath,\n pathname: parsedLocation.pathname,\n params: matchedRoutes.routeParams,\n search: router.options.parseSearch(location.search),\n }\n }\n\n const current = getLocation(blockerFnArgs.currentLocation)\n const next = getLocation(blockerFnArgs.nextLocation)\n\n if (\n current.routeId === '__notFound__' &&\n next.routeId !== '__notFound__'\n ) {\n return false\n }\n\n const shouldBlock = await shouldBlockFn({\n action: blockerFnArgs.action,\n current,\n next,\n })\n if (!withResolver) {\n return shouldBlock\n }\n\n if (!shouldBlock) {\n return false\n }\n\n const promise = new Promise<boolean>((resolve) => {\n setResolver({\n status: 'blocked',\n current,\n next,\n action: blockerFnArgs.action,\n proceed: () => resolve(false),\n reset: () => resolve(true),\n })\n })\n\n const canNavigateAsync = await promise\n setResolver({\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n })\n\n return canNavigateAsync\n }\n\n return disabled\n ? undefined\n : history.block({ blockerFn: blockerFnComposed, enableBeforeUnload })\n }, [\n shouldBlockFn,\n enableBeforeUnload,\n disabled,\n withResolver,\n history,\n router,\n ])\n\n return resolver\n}\n\nconst _resolvePromptBlockerArgs = (\n props: PromptProps | LegacyPromptProps,\n): UseBlockerOpts => {\n if ('shouldBlockFn' in props) {\n return { ...props }\n }\n\n const shouldBlock = Boolean(props.condition ?? true)\n const fn = props.blockerFn\n\n const _customBlockerFn = async () => {\n if (shouldBlock && fn !== undefined) {\n return await fn()\n }\n return shouldBlock\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: fn === undefined,\n }\n}\n\nexport function Block<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n>(opts: PromptProps<TRouter, TWithResolver>): React.ReactNode\n\n/**\n * @deprecated Use the UseBlockerOpts property instead\n */\nexport function Block(opts: LegacyPromptProps): React.ReactNode\n\nexport function Block(opts: PromptProps | LegacyPromptProps): React.ReactNode {\n const { children, ...rest } = opts\n const args = _resolvePromptBlockerArgs(rest)\n\n const resolver = useBlocker(args)\n return children\n ? typeof children === 'function'\n ? children(resolver as any)\n : children\n : null\n}\n\ntype LegacyPromptProps = {\n blockerFn?: LegacyBlockerFn\n condition?: boolean | any\n children?: React.ReactNode | ((params: BlockerResolver) => React.ReactNode)\n}\n\ntype PromptProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n TParams = TWithResolver extends true ? BlockerResolver<TRouter> : void,\n> = UseBlockerOpts<TRouter, TWithResolver> & {\n children?: React.ReactNode | ((params: TParams) => React.ReactNode)\n}\n"],"names":["shouldBlock","_customBlockerFn"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useCanGoBack(): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCanGoBack.js","sources":["../../src/useCanGoBack.ts"],"sourcesContent":["import { useRouterState } from './useRouterState'\n\nexport function useCanGoBack() {\n return useRouterState({ select: (s) => s.location.state.__TSR_index !== 0 })\n}\n"],"names":[],"mappings":";AAEO,SAAS,eAAe;AAC7B,SAAO,eAAe,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,gBAAgB,GAAG;AAC7E;"}
|