@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,320 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import { useRouter } from './useRouter'
|
|
3
|
+
import type {
|
|
4
|
+
BlockerFnArgs,
|
|
5
|
+
HistoryAction,
|
|
6
|
+
HistoryLocation,
|
|
7
|
+
} from '@tanstack/history'
|
|
8
|
+
import type {
|
|
9
|
+
AnyRoute,
|
|
10
|
+
AnyRouter,
|
|
11
|
+
ParseRoute,
|
|
12
|
+
RegisteredRouter,
|
|
13
|
+
} from '@tanstack/router-core'
|
|
14
|
+
|
|
15
|
+
interface ShouldBlockFnLocation<
|
|
16
|
+
out TRouteId,
|
|
17
|
+
out TFullPath,
|
|
18
|
+
out TAllParams,
|
|
19
|
+
out TFullSearchSchema,
|
|
20
|
+
> {
|
|
21
|
+
routeId: TRouteId
|
|
22
|
+
fullPath: TFullPath
|
|
23
|
+
pathname: string
|
|
24
|
+
params: TAllParams
|
|
25
|
+
search: TFullSearchSchema
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
type AnyShouldBlockFnLocation = ShouldBlockFnLocation<any, any, any, any>
|
|
29
|
+
type MakeShouldBlockFnLocationUnion<
|
|
30
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
31
|
+
TRoute extends AnyRoute = ParseRoute<TRouter['routeTree']>,
|
|
32
|
+
> = TRoute extends any
|
|
33
|
+
? ShouldBlockFnLocation<
|
|
34
|
+
TRoute['id'],
|
|
35
|
+
TRoute['fullPath'],
|
|
36
|
+
TRoute['types']['allParams'],
|
|
37
|
+
TRoute['types']['fullSearchSchema']
|
|
38
|
+
>
|
|
39
|
+
: never
|
|
40
|
+
|
|
41
|
+
type BlockerResolver<TRouter extends AnyRouter = RegisteredRouter> =
|
|
42
|
+
| {
|
|
43
|
+
status: 'blocked'
|
|
44
|
+
current: MakeShouldBlockFnLocationUnion<TRouter>
|
|
45
|
+
next: MakeShouldBlockFnLocationUnion<TRouter>
|
|
46
|
+
action: HistoryAction
|
|
47
|
+
proceed: () => void
|
|
48
|
+
reset: () => void
|
|
49
|
+
}
|
|
50
|
+
| {
|
|
51
|
+
status: 'idle'
|
|
52
|
+
current: undefined
|
|
53
|
+
next: undefined
|
|
54
|
+
action: undefined
|
|
55
|
+
proceed: undefined
|
|
56
|
+
reset: undefined
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
type ShouldBlockFnArgs<TRouter extends AnyRouter = RegisteredRouter> = {
|
|
60
|
+
current: MakeShouldBlockFnLocationUnion<TRouter>
|
|
61
|
+
next: MakeShouldBlockFnLocationUnion<TRouter>
|
|
62
|
+
action: HistoryAction
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export type ShouldBlockFn<TRouter extends AnyRouter = RegisteredRouter> = (
|
|
66
|
+
args: ShouldBlockFnArgs<TRouter>,
|
|
67
|
+
) => boolean | Promise<boolean>
|
|
68
|
+
export type UseBlockerOpts<
|
|
69
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
70
|
+
TWithResolver extends boolean = boolean,
|
|
71
|
+
> = {
|
|
72
|
+
shouldBlockFn: ShouldBlockFn<TRouter>
|
|
73
|
+
enableBeforeUnload?: boolean | (() => boolean)
|
|
74
|
+
disabled?: boolean
|
|
75
|
+
withResolver?: TWithResolver
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
type LegacyBlockerFn = () => Promise<any> | any
|
|
79
|
+
type LegacyBlockerOpts = {
|
|
80
|
+
blockerFn?: LegacyBlockerFn
|
|
81
|
+
condition?: boolean | any
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function _resolveBlockerOpts(
|
|
85
|
+
opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,
|
|
86
|
+
condition?: boolean | any,
|
|
87
|
+
): UseBlockerOpts {
|
|
88
|
+
if (opts === undefined) {
|
|
89
|
+
return {
|
|
90
|
+
shouldBlockFn: () => true,
|
|
91
|
+
withResolver: false,
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if ('shouldBlockFn' in opts) {
|
|
96
|
+
return opts
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (typeof opts === 'function') {
|
|
100
|
+
const shouldBlock = Boolean(condition ?? true)
|
|
101
|
+
|
|
102
|
+
const _customBlockerFn = async () => {
|
|
103
|
+
if (shouldBlock) return await opts()
|
|
104
|
+
return false
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
shouldBlockFn: _customBlockerFn,
|
|
109
|
+
enableBeforeUnload: shouldBlock,
|
|
110
|
+
withResolver: false,
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const shouldBlock = Boolean(opts.condition ?? true)
|
|
115
|
+
const fn = opts.blockerFn
|
|
116
|
+
|
|
117
|
+
const _customBlockerFn = async () => {
|
|
118
|
+
if (shouldBlock && fn !== undefined) {
|
|
119
|
+
return await fn()
|
|
120
|
+
}
|
|
121
|
+
return shouldBlock
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
shouldBlockFn: _customBlockerFn,
|
|
126
|
+
enableBeforeUnload: shouldBlock,
|
|
127
|
+
withResolver: fn === undefined,
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function useBlocker<
|
|
132
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
133
|
+
TWithResolver extends boolean = false,
|
|
134
|
+
>(
|
|
135
|
+
opts: UseBlockerOpts<TRouter, TWithResolver>,
|
|
136
|
+
): TWithResolver extends true ? BlockerResolver<TRouter> : void
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* @deprecated Use the shouldBlockFn property instead
|
|
140
|
+
*/
|
|
141
|
+
export function useBlocker(blockerFnOrOpts?: LegacyBlockerOpts): BlockerResolver
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* @deprecated Use the UseBlockerOpts object syntax instead
|
|
145
|
+
*/
|
|
146
|
+
export function useBlocker(
|
|
147
|
+
blockerFn?: LegacyBlockerFn,
|
|
148
|
+
condition?: boolean | any,
|
|
149
|
+
): BlockerResolver
|
|
150
|
+
|
|
151
|
+
export function useBlocker(
|
|
152
|
+
opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,
|
|
153
|
+
condition?: boolean | any,
|
|
154
|
+
): BlockerResolver | void {
|
|
155
|
+
const {
|
|
156
|
+
shouldBlockFn,
|
|
157
|
+
enableBeforeUnload = true,
|
|
158
|
+
disabled = false,
|
|
159
|
+
withResolver = false,
|
|
160
|
+
} = _resolveBlockerOpts(opts, condition)
|
|
161
|
+
|
|
162
|
+
const router = useRouter()
|
|
163
|
+
const { history } = router
|
|
164
|
+
|
|
165
|
+
const [resolver, setResolver] = React.useState<BlockerResolver>({
|
|
166
|
+
status: 'idle',
|
|
167
|
+
current: undefined,
|
|
168
|
+
next: undefined,
|
|
169
|
+
action: undefined,
|
|
170
|
+
proceed: undefined,
|
|
171
|
+
reset: undefined,
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
React.useEffect(() => {
|
|
175
|
+
const blockerFnComposed = async (blockerFnArgs: BlockerFnArgs) => {
|
|
176
|
+
function getLocation(
|
|
177
|
+
location: HistoryLocation,
|
|
178
|
+
): AnyShouldBlockFnLocation {
|
|
179
|
+
const parsedLocation = router.parseLocation(location)
|
|
180
|
+
const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname)
|
|
181
|
+
if (matchedRoutes.foundRoute === undefined) {
|
|
182
|
+
return {
|
|
183
|
+
routeId: '__notFound__',
|
|
184
|
+
fullPath: parsedLocation.pathname,
|
|
185
|
+
pathname: parsedLocation.pathname,
|
|
186
|
+
params: matchedRoutes.routeParams,
|
|
187
|
+
search: router.options.parseSearch(location.search),
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
routeId: matchedRoutes.foundRoute.id,
|
|
193
|
+
fullPath: matchedRoutes.foundRoute.fullPath,
|
|
194
|
+
pathname: parsedLocation.pathname,
|
|
195
|
+
params: matchedRoutes.routeParams,
|
|
196
|
+
search: router.options.parseSearch(location.search),
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const current = getLocation(blockerFnArgs.currentLocation)
|
|
201
|
+
const next = getLocation(blockerFnArgs.nextLocation)
|
|
202
|
+
|
|
203
|
+
if (
|
|
204
|
+
current.routeId === '__notFound__' &&
|
|
205
|
+
next.routeId !== '__notFound__'
|
|
206
|
+
) {
|
|
207
|
+
return false
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const shouldBlock = await shouldBlockFn({
|
|
211
|
+
action: blockerFnArgs.action,
|
|
212
|
+
current,
|
|
213
|
+
next,
|
|
214
|
+
})
|
|
215
|
+
if (!withResolver) {
|
|
216
|
+
return shouldBlock
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (!shouldBlock) {
|
|
220
|
+
return false
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const promise = new Promise<boolean>((resolve) => {
|
|
224
|
+
setResolver({
|
|
225
|
+
status: 'blocked',
|
|
226
|
+
current,
|
|
227
|
+
next,
|
|
228
|
+
action: blockerFnArgs.action,
|
|
229
|
+
proceed: () => resolve(false),
|
|
230
|
+
reset: () => resolve(true),
|
|
231
|
+
})
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
const canNavigateAsync = await promise
|
|
235
|
+
setResolver({
|
|
236
|
+
status: 'idle',
|
|
237
|
+
current: undefined,
|
|
238
|
+
next: undefined,
|
|
239
|
+
action: undefined,
|
|
240
|
+
proceed: undefined,
|
|
241
|
+
reset: undefined,
|
|
242
|
+
})
|
|
243
|
+
|
|
244
|
+
return canNavigateAsync
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return disabled
|
|
248
|
+
? undefined
|
|
249
|
+
: history.block({ blockerFn: blockerFnComposed, enableBeforeUnload })
|
|
250
|
+
}, [
|
|
251
|
+
shouldBlockFn,
|
|
252
|
+
enableBeforeUnload,
|
|
253
|
+
disabled,
|
|
254
|
+
withResolver,
|
|
255
|
+
history,
|
|
256
|
+
router,
|
|
257
|
+
])
|
|
258
|
+
|
|
259
|
+
return resolver
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
const _resolvePromptBlockerArgs = (
|
|
263
|
+
props: PromptProps | LegacyPromptProps,
|
|
264
|
+
): UseBlockerOpts => {
|
|
265
|
+
if ('shouldBlockFn' in props) {
|
|
266
|
+
return { ...props }
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const shouldBlock = Boolean(props.condition ?? true)
|
|
270
|
+
const fn = props.blockerFn
|
|
271
|
+
|
|
272
|
+
const _customBlockerFn = async () => {
|
|
273
|
+
if (shouldBlock && fn !== undefined) {
|
|
274
|
+
return await fn()
|
|
275
|
+
}
|
|
276
|
+
return shouldBlock
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return {
|
|
280
|
+
shouldBlockFn: _customBlockerFn,
|
|
281
|
+
enableBeforeUnload: shouldBlock,
|
|
282
|
+
withResolver: fn === undefined,
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export function Block<
|
|
287
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
288
|
+
TWithResolver extends boolean = boolean,
|
|
289
|
+
>(opts: PromptProps<TRouter, TWithResolver>): React.ReactNode
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* @deprecated Use the UseBlockerOpts property instead
|
|
293
|
+
*/
|
|
294
|
+
export function Block(opts: LegacyPromptProps): React.ReactNode
|
|
295
|
+
|
|
296
|
+
export function Block(opts: PromptProps | LegacyPromptProps): React.ReactNode {
|
|
297
|
+
const { children, ...rest } = opts
|
|
298
|
+
const args = _resolvePromptBlockerArgs(rest)
|
|
299
|
+
|
|
300
|
+
const resolver = useBlocker(args)
|
|
301
|
+
return children
|
|
302
|
+
? typeof children === 'function'
|
|
303
|
+
? children(resolver as any)
|
|
304
|
+
: children
|
|
305
|
+
: null
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
type LegacyPromptProps = {
|
|
309
|
+
blockerFn?: LegacyBlockerFn
|
|
310
|
+
condition?: boolean | any
|
|
311
|
+
children?: React.ReactNode | ((params: BlockerResolver) => React.ReactNode)
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
type PromptProps<
|
|
315
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
316
|
+
TWithResolver extends boolean = boolean,
|
|
317
|
+
TParams = TWithResolver extends true ? BlockerResolver<TRouter> : void,
|
|
318
|
+
> = UseBlockerOpts<TRouter, TWithResolver> & {
|
|
319
|
+
children?: React.ReactNode | ((params: TParams) => React.ReactNode)
|
|
320
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { useMatch } from './useMatch'
|
|
2
|
+
import type {
|
|
3
|
+
StructuralSharingOption,
|
|
4
|
+
ValidateSelected,
|
|
5
|
+
} from './structuralSharing'
|
|
6
|
+
import type {
|
|
7
|
+
AnyRouter,
|
|
8
|
+
RegisteredRouter,
|
|
9
|
+
ResolveUseLoaderData,
|
|
10
|
+
StrictOrFrom,
|
|
11
|
+
UseLoaderDataResult,
|
|
12
|
+
} from '@tanstack/router-core'
|
|
13
|
+
|
|
14
|
+
export interface UseLoaderDataBaseOptions<
|
|
15
|
+
TRouter extends AnyRouter,
|
|
16
|
+
TFrom,
|
|
17
|
+
TStrict extends boolean,
|
|
18
|
+
TSelected,
|
|
19
|
+
TStructuralSharing,
|
|
20
|
+
> {
|
|
21
|
+
select?: (
|
|
22
|
+
match: ResolveUseLoaderData<TRouter, TFrom, TStrict>,
|
|
23
|
+
) => ValidateSelected<TRouter, TSelected, TStructuralSharing>
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type UseLoaderDataOptions<
|
|
27
|
+
TRouter extends AnyRouter,
|
|
28
|
+
TFrom extends string | undefined,
|
|
29
|
+
TStrict extends boolean,
|
|
30
|
+
TSelected,
|
|
31
|
+
TStructuralSharing,
|
|
32
|
+
> = StrictOrFrom<TRouter, TFrom, TStrict> &
|
|
33
|
+
UseLoaderDataBaseOptions<
|
|
34
|
+
TRouter,
|
|
35
|
+
TFrom,
|
|
36
|
+
TStrict,
|
|
37
|
+
TSelected,
|
|
38
|
+
TStructuralSharing
|
|
39
|
+
> &
|
|
40
|
+
StructuralSharingOption<TRouter, TSelected, TStructuralSharing>
|
|
41
|
+
|
|
42
|
+
export type UseLoaderDataRoute<out TId> = <
|
|
43
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
44
|
+
TSelected = unknown,
|
|
45
|
+
TStructuralSharing extends boolean = boolean,
|
|
46
|
+
>(
|
|
47
|
+
opts?: UseLoaderDataBaseOptions<
|
|
48
|
+
TRouter,
|
|
49
|
+
TId,
|
|
50
|
+
true,
|
|
51
|
+
TSelected,
|
|
52
|
+
TStructuralSharing
|
|
53
|
+
> &
|
|
54
|
+
StructuralSharingOption<TRouter, TSelected, TStructuralSharing>,
|
|
55
|
+
) => UseLoaderDataResult<TRouter, TId, true, TSelected>
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Read and select the current route's loader data with type‑safety.
|
|
59
|
+
*
|
|
60
|
+
* Options:
|
|
61
|
+
* - `from`/`strict`: Choose which route's data to read and strictness
|
|
62
|
+
* - `select`: Map the loader data to a derived value
|
|
63
|
+
* - `structuralSharing`: Enable structural sharing for stable references
|
|
64
|
+
*
|
|
65
|
+
* @returns The loader data (or selected value) for the matched route.
|
|
66
|
+
* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useLoaderDataHook
|
|
67
|
+
*/
|
|
68
|
+
export function useLoaderData<
|
|
69
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
70
|
+
const TFrom extends string | undefined = undefined,
|
|
71
|
+
TStrict extends boolean = true,
|
|
72
|
+
TSelected = unknown,
|
|
73
|
+
TStructuralSharing extends boolean = boolean,
|
|
74
|
+
>(
|
|
75
|
+
opts: UseLoaderDataOptions<
|
|
76
|
+
TRouter,
|
|
77
|
+
TFrom,
|
|
78
|
+
TStrict,
|
|
79
|
+
TSelected,
|
|
80
|
+
TStructuralSharing
|
|
81
|
+
>,
|
|
82
|
+
): UseLoaderDataResult<TRouter, TFrom, TStrict, TSelected> {
|
|
83
|
+
return useMatch({
|
|
84
|
+
from: opts.from!,
|
|
85
|
+
strict: opts.strict,
|
|
86
|
+
structuralSharing: opts.structuralSharing,
|
|
87
|
+
select: (s: any) => {
|
|
88
|
+
return opts.select ? opts.select(s.loaderData) : s.loaderData
|
|
89
|
+
},
|
|
90
|
+
} as any) as UseLoaderDataResult<TRouter, TFrom, TStrict, TSelected>
|
|
91
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { useMatch } from './useMatch'
|
|
2
|
+
import type {
|
|
3
|
+
StructuralSharingOption,
|
|
4
|
+
ValidateSelected,
|
|
5
|
+
} from './structuralSharing'
|
|
6
|
+
import type {
|
|
7
|
+
AnyRouter,
|
|
8
|
+
RegisteredRouter,
|
|
9
|
+
ResolveUseLoaderDeps,
|
|
10
|
+
StrictOrFrom,
|
|
11
|
+
UseLoaderDepsResult,
|
|
12
|
+
} from '@tanstack/router-core'
|
|
13
|
+
|
|
14
|
+
export interface UseLoaderDepsBaseOptions<
|
|
15
|
+
TRouter extends AnyRouter,
|
|
16
|
+
TFrom,
|
|
17
|
+
TSelected,
|
|
18
|
+
TStructuralSharing,
|
|
19
|
+
> {
|
|
20
|
+
select?: (
|
|
21
|
+
deps: ResolveUseLoaderDeps<TRouter, TFrom>,
|
|
22
|
+
) => ValidateSelected<TRouter, TSelected, TStructuralSharing>
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type UseLoaderDepsOptions<
|
|
26
|
+
TRouter extends AnyRouter,
|
|
27
|
+
TFrom extends string | undefined,
|
|
28
|
+
TSelected,
|
|
29
|
+
TStructuralSharing,
|
|
30
|
+
> = StrictOrFrom<TRouter, TFrom> &
|
|
31
|
+
UseLoaderDepsBaseOptions<TRouter, TFrom, TSelected, TStructuralSharing> &
|
|
32
|
+
StructuralSharingOption<TRouter, TSelected, TStructuralSharing>
|
|
33
|
+
|
|
34
|
+
export type UseLoaderDepsRoute<out TId> = <
|
|
35
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
36
|
+
TSelected = unknown,
|
|
37
|
+
TStructuralSharing extends boolean = boolean,
|
|
38
|
+
>(
|
|
39
|
+
opts?: UseLoaderDepsBaseOptions<TRouter, TId, TSelected, TStructuralSharing> &
|
|
40
|
+
StructuralSharingOption<TRouter, TSelected, TStructuralSharing>,
|
|
41
|
+
) => UseLoaderDepsResult<TRouter, TId, TSelected>
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Read and select the current route's loader dependencies object.
|
|
45
|
+
*
|
|
46
|
+
* Options:
|
|
47
|
+
* - `from`: Choose which route's loader deps to read
|
|
48
|
+
* - `select`: Map the deps to a derived value
|
|
49
|
+
* - `structuralSharing`: Enable structural sharing for stable references
|
|
50
|
+
*
|
|
51
|
+
* @returns The loader deps (or selected value) for the matched route.
|
|
52
|
+
* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useLoaderDepsHook
|
|
53
|
+
*/
|
|
54
|
+
export function useLoaderDeps<
|
|
55
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
56
|
+
const TFrom extends string | undefined = undefined,
|
|
57
|
+
TSelected = unknown,
|
|
58
|
+
TStructuralSharing extends boolean = boolean,
|
|
59
|
+
>(
|
|
60
|
+
opts: UseLoaderDepsOptions<TRouter, TFrom, TSelected, TStructuralSharing>,
|
|
61
|
+
): UseLoaderDepsResult<TRouter, TFrom, TSelected> {
|
|
62
|
+
const { select, ...rest } = opts
|
|
63
|
+
return useMatch({
|
|
64
|
+
...rest,
|
|
65
|
+
select: (s) => {
|
|
66
|
+
return select ? select(s.loaderDeps) : s.loaderDeps
|
|
67
|
+
},
|
|
68
|
+
}) as UseLoaderDepsResult<TRouter, TFrom, TSelected>
|
|
69
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { useRouterState } from './useRouterState'
|
|
2
|
+
import type {
|
|
3
|
+
StructuralSharingOption,
|
|
4
|
+
ValidateSelected,
|
|
5
|
+
} from './structuralSharing'
|
|
6
|
+
import type {
|
|
7
|
+
AnyRouter,
|
|
8
|
+
RegisteredRouter,
|
|
9
|
+
RouterState,
|
|
10
|
+
} from '@tanstack/router-core'
|
|
11
|
+
|
|
12
|
+
export interface UseLocationBaseOptions<
|
|
13
|
+
TRouter extends AnyRouter,
|
|
14
|
+
TSelected,
|
|
15
|
+
TStructuralSharing extends boolean = boolean,
|
|
16
|
+
> {
|
|
17
|
+
select?: (
|
|
18
|
+
state: RouterState<TRouter['routeTree']>['location'],
|
|
19
|
+
) => ValidateSelected<TRouter, TSelected, TStructuralSharing>
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type UseLocationResult<
|
|
23
|
+
TRouter extends AnyRouter,
|
|
24
|
+
TSelected,
|
|
25
|
+
> = unknown extends TSelected
|
|
26
|
+
? RouterState<TRouter['routeTree']>['location']
|
|
27
|
+
: TSelected
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Read the current location from the router state with optional selection.
|
|
31
|
+
* Useful for subscribing to just the pieces of location you care about.
|
|
32
|
+
*
|
|
33
|
+
* Options:
|
|
34
|
+
* - `select`: Project the `location` object to a derived value
|
|
35
|
+
* - `structuralSharing`: Enable structural sharing for stable references
|
|
36
|
+
*
|
|
37
|
+
* @returns The current location (or selected value).
|
|
38
|
+
* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useLocationHook
|
|
39
|
+
*/
|
|
40
|
+
export function useLocation<
|
|
41
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
42
|
+
TSelected = unknown,
|
|
43
|
+
TStructuralSharing extends boolean = boolean,
|
|
44
|
+
>(
|
|
45
|
+
opts?: UseLocationBaseOptions<TRouter, TSelected, TStructuralSharing> &
|
|
46
|
+
StructuralSharingOption<TRouter, TSelected, TStructuralSharing>,
|
|
47
|
+
): UseLocationResult<TRouter, TSelected> {
|
|
48
|
+
return useRouterState({
|
|
49
|
+
select: (state: any) =>
|
|
50
|
+
opts?.select ? opts.select(state.location) : state.location,
|
|
51
|
+
} as any) as UseLocationResult<TRouter, TSelected>
|
|
52
|
+
}
|
package/src/useMatch.tsx
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import invariant from 'tiny-invariant'
|
|
3
|
+
import { useRouterState } from './useRouterState'
|
|
4
|
+
import { dummyMatchContext, matchContext } from './matchContext'
|
|
5
|
+
import type {
|
|
6
|
+
StructuralSharingOption,
|
|
7
|
+
ValidateSelected,
|
|
8
|
+
} from './structuralSharing'
|
|
9
|
+
import type {
|
|
10
|
+
AnyRouter,
|
|
11
|
+
MakeRouteMatch,
|
|
12
|
+
MakeRouteMatchUnion,
|
|
13
|
+
RegisteredRouter,
|
|
14
|
+
StrictOrFrom,
|
|
15
|
+
ThrowConstraint,
|
|
16
|
+
ThrowOrOptional,
|
|
17
|
+
} from '@tanstack/router-core'
|
|
18
|
+
|
|
19
|
+
export interface UseMatchBaseOptions<
|
|
20
|
+
TRouter extends AnyRouter,
|
|
21
|
+
TFrom,
|
|
22
|
+
TStrict extends boolean,
|
|
23
|
+
TThrow extends boolean,
|
|
24
|
+
TSelected,
|
|
25
|
+
TStructuralSharing extends boolean,
|
|
26
|
+
> {
|
|
27
|
+
select?: (
|
|
28
|
+
match: MakeRouteMatch<TRouter['routeTree'], TFrom, TStrict>,
|
|
29
|
+
) => ValidateSelected<TRouter, TSelected, TStructuralSharing>
|
|
30
|
+
shouldThrow?: TThrow
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type UseMatchRoute<out TFrom> = <
|
|
34
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
35
|
+
TSelected = unknown,
|
|
36
|
+
TStructuralSharing extends boolean = boolean,
|
|
37
|
+
>(
|
|
38
|
+
opts?: UseMatchBaseOptions<
|
|
39
|
+
TRouter,
|
|
40
|
+
TFrom,
|
|
41
|
+
true,
|
|
42
|
+
true,
|
|
43
|
+
TSelected,
|
|
44
|
+
TStructuralSharing
|
|
45
|
+
> &
|
|
46
|
+
StructuralSharingOption<TRouter, TSelected, TStructuralSharing>,
|
|
47
|
+
) => UseMatchResult<TRouter, TFrom, true, TSelected>
|
|
48
|
+
|
|
49
|
+
export type UseMatchOptions<
|
|
50
|
+
TRouter extends AnyRouter,
|
|
51
|
+
TFrom extends string | undefined,
|
|
52
|
+
TStrict extends boolean,
|
|
53
|
+
TThrow extends boolean,
|
|
54
|
+
TSelected,
|
|
55
|
+
TStructuralSharing extends boolean,
|
|
56
|
+
> = StrictOrFrom<TRouter, TFrom, TStrict> &
|
|
57
|
+
UseMatchBaseOptions<
|
|
58
|
+
TRouter,
|
|
59
|
+
TFrom,
|
|
60
|
+
TStrict,
|
|
61
|
+
TThrow,
|
|
62
|
+
TSelected,
|
|
63
|
+
TStructuralSharing
|
|
64
|
+
> &
|
|
65
|
+
StructuralSharingOption<TRouter, TSelected, TStructuralSharing>
|
|
66
|
+
|
|
67
|
+
export type UseMatchResult<
|
|
68
|
+
TRouter extends AnyRouter,
|
|
69
|
+
TFrom,
|
|
70
|
+
TStrict extends boolean,
|
|
71
|
+
TSelected,
|
|
72
|
+
> = unknown extends TSelected
|
|
73
|
+
? TStrict extends true
|
|
74
|
+
? MakeRouteMatch<TRouter['routeTree'], TFrom, TStrict>
|
|
75
|
+
: MakeRouteMatchUnion<TRouter>
|
|
76
|
+
: TSelected
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Read and select the nearest or targeted route match.
|
|
80
|
+
* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useMatchHook
|
|
81
|
+
*/
|
|
82
|
+
export function useMatch<
|
|
83
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
84
|
+
const TFrom extends string | undefined = undefined,
|
|
85
|
+
TStrict extends boolean = true,
|
|
86
|
+
TThrow extends boolean = true,
|
|
87
|
+
TSelected = unknown,
|
|
88
|
+
TStructuralSharing extends boolean = boolean,
|
|
89
|
+
>(
|
|
90
|
+
opts: UseMatchOptions<
|
|
91
|
+
TRouter,
|
|
92
|
+
TFrom,
|
|
93
|
+
TStrict,
|
|
94
|
+
ThrowConstraint<TStrict, TThrow>,
|
|
95
|
+
TSelected,
|
|
96
|
+
TStructuralSharing
|
|
97
|
+
>,
|
|
98
|
+
): ThrowOrOptional<UseMatchResult<TRouter, TFrom, TStrict, TSelected>, TThrow> {
|
|
99
|
+
const nearestMatchId = React.useContext(
|
|
100
|
+
opts.from ? dummyMatchContext : matchContext,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
const matchSelection = useRouterState({
|
|
104
|
+
select: (state: any) => {
|
|
105
|
+
const match = state.matches.find((d: any) =>
|
|
106
|
+
opts.from ? opts.from === d.routeId : d.id === nearestMatchId,
|
|
107
|
+
)
|
|
108
|
+
invariant(
|
|
109
|
+
!((opts.shouldThrow ?? true) && !match),
|
|
110
|
+
`Could not find ${opts.from ? `an active match from "${opts.from}"` : 'a nearest match!'}`,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
if (match === undefined) {
|
|
114
|
+
return undefined
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return opts.select ? opts.select(match) : match
|
|
118
|
+
},
|
|
119
|
+
structuralSharing: opts.structuralSharing,
|
|
120
|
+
} as any)
|
|
121
|
+
|
|
122
|
+
return matchSelection as any
|
|
123
|
+
}
|