@tanstack/react-router 1.20.1 → 1.20.3-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/README.md +31 -0
  2. package/dist/cjs/Asset.cjs +41 -0
  3. package/dist/cjs/Asset.cjs.map +1 -0
  4. package/dist/cjs/Asset.d.cts +2 -0
  5. package/dist/cjs/CatchBoundary.cjs +16 -12
  6. package/dist/cjs/CatchBoundary.cjs.map +1 -1
  7. package/dist/cjs/CatchBoundary.d.cts +8 -32
  8. package/dist/cjs/ClientOnly.cjs +20 -0
  9. package/dist/cjs/ClientOnly.cjs.map +1 -0
  10. package/dist/cjs/ClientOnly.d.cts +29 -0
  11. package/dist/cjs/HeadContent.cjs +155 -0
  12. package/dist/cjs/HeadContent.cjs.map +1 -0
  13. package/dist/cjs/HeadContent.d.cts +7 -0
  14. package/dist/cjs/Match.cjs +252 -0
  15. package/dist/cjs/Match.cjs.map +1 -0
  16. package/dist/cjs/Match.d.cts +8 -0
  17. package/dist/cjs/Matches.cjs +39 -287
  18. package/dist/cjs/Matches.cjs.map +1 -1
  19. package/dist/cjs/Matches.d.cts +23 -83
  20. package/dist/cjs/RouterProvider.cjs +17 -140
  21. package/dist/cjs/RouterProvider.cjs.map +1 -1
  22. package/dist/cjs/RouterProvider.d.cts +8 -27
  23. package/dist/cjs/SafeFragment.cjs +8 -0
  24. package/dist/cjs/SafeFragment.cjs.map +1 -0
  25. package/dist/cjs/SafeFragment.d.cts +1 -0
  26. package/dist/cjs/ScriptOnce.cjs +28 -0
  27. package/dist/cjs/ScriptOnce.cjs.map +1 -0
  28. package/dist/cjs/ScriptOnce.d.cts +5 -0
  29. package/dist/cjs/Scripts.cjs +51 -0
  30. package/dist/cjs/Scripts.cjs.map +1 -0
  31. package/dist/cjs/Scripts.d.cts +1 -0
  32. package/dist/cjs/ScrollRestoration.cjs +39 -0
  33. package/dist/cjs/ScrollRestoration.cjs.map +1 -0
  34. package/dist/cjs/ScrollRestoration.d.cts +14 -0
  35. package/dist/cjs/Transitioner.cjs +115 -0
  36. package/dist/cjs/Transitioner.cjs.map +1 -0
  37. package/dist/cjs/Transitioner.d.cts +1 -0
  38. package/dist/cjs/awaited.cjs +12 -65
  39. package/dist/cjs/awaited.cjs.map +1 -1
  40. package/dist/cjs/awaited.d.cts +4 -4
  41. package/dist/cjs/fileRoute.cjs +41 -15
  42. package/dist/cjs/fileRoute.cjs.map +1 -1
  43. package/dist/cjs/fileRoute.d.cts +33 -108
  44. package/dist/cjs/history.d.cts +1 -0
  45. package/dist/cjs/index.cjs +216 -73
  46. package/dist/cjs/index.cjs.map +1 -1
  47. package/dist/cjs/index.d.cts +52 -29
  48. package/dist/cjs/lazyRouteComponent.cjs +40 -29
  49. package/dist/cjs/lazyRouteComponent.cjs.map +1 -1
  50. package/dist/cjs/lazyRouteComponent.d.cts +1 -1
  51. package/dist/cjs/link.cjs +212 -106
  52. package/dist/cjs/link.cjs.map +1 -1
  53. package/dist/cjs/link.d.cts +41 -86
  54. package/dist/cjs/matchContext.cjs +27 -0
  55. package/dist/cjs/matchContext.cjs.map +1 -0
  56. package/dist/cjs/matchContext.d.cts +3 -0
  57. package/dist/cjs/not-found.cjs +9 -15
  58. package/dist/cjs/not-found.cjs.map +1 -1
  59. package/dist/cjs/not-found.d.cts +5 -22
  60. package/dist/cjs/renderRouteNotFound.cjs +22 -0
  61. package/dist/cjs/renderRouteNotFound.cjs.map +1 -0
  62. package/dist/cjs/renderRouteNotFound.d.cts +2 -0
  63. package/dist/cjs/route.cjs +110 -79
  64. package/dist/cjs/route.cjs.map +1 -1
  65. package/dist/cjs/route.d.cts +64 -361
  66. package/dist/cjs/router.cjs +12 -1237
  67. package/dist/cjs/router.cjs.map +1 -1
  68. package/dist/cjs/router.d.cts +69 -237
  69. package/dist/cjs/routerContext.cjs +1 -1
  70. package/dist/cjs/routerContext.cjs.map +1 -1
  71. package/dist/cjs/routerContext.d.cts +7 -2
  72. package/dist/cjs/scroll-restoration.cjs +16 -177
  73. package/dist/cjs/scroll-restoration.cjs.map +1 -1
  74. package/dist/cjs/scroll-restoration.d.cts +1 -18
  75. package/dist/cjs/serializer.d.cts +6 -0
  76. package/dist/cjs/structuralSharing.d.cts +8 -0
  77. package/dist/cjs/typePrimitives.d.cts +16 -0
  78. package/dist/cjs/useBlocker.cjs +138 -9
  79. package/dist/cjs/useBlocker.cjs.map +1 -1
  80. package/dist/cjs/useBlocker.d.cts +64 -7
  81. package/dist/cjs/useCanGoBack.cjs +8 -0
  82. package/dist/cjs/useCanGoBack.cjs.map +1 -0
  83. package/dist/cjs/useCanGoBack.d.cts +1 -0
  84. package/dist/cjs/useLoaderData.cjs +15 -0
  85. package/dist/cjs/useLoaderData.cjs.map +1 -0
  86. package/dist/cjs/useLoaderData.d.cts +8 -0
  87. package/dist/cjs/useLoaderDeps.cjs +14 -0
  88. package/dist/cjs/useLoaderDeps.cjs.map +1 -0
  89. package/dist/cjs/useLoaderDeps.d.cts +8 -0
  90. package/dist/cjs/useLocation.cjs +10 -0
  91. package/dist/cjs/useLocation.cjs.map +1 -0
  92. package/dist/cjs/useLocation.d.cts +7 -0
  93. package/dist/cjs/useMatch.cjs +47 -0
  94. package/dist/cjs/useMatch.cjs.map +1 -0
  95. package/dist/cjs/useMatch.d.cts +10 -0
  96. package/dist/cjs/useNavigate.cjs +18 -19
  97. package/dist/cjs/useNavigate.cjs.map +1 -1
  98. package/dist/cjs/useNavigate.d.cts +4 -8
  99. package/dist/cjs/useParams.cjs +8 -8
  100. package/dist/cjs/useParams.cjs.map +1 -1
  101. package/dist/cjs/useParams.d.cts +9 -8
  102. package/dist/cjs/useRouteContext.cjs +3 -3
  103. package/dist/cjs/useRouteContext.cjs.map +1 -1
  104. package/dist/cjs/useRouteContext.d.cts +3 -7
  105. package/dist/cjs/useRouter.cjs.map +1 -1
  106. package/dist/cjs/useRouter.d.cts +3 -4
  107. package/dist/cjs/useRouterState.cjs +18 -1
  108. package/dist/cjs/useRouterState.cjs.map +1 -1
  109. package/dist/cjs/useRouterState.d.cts +8 -6
  110. package/dist/cjs/useSearch.cjs +7 -4
  111. package/dist/cjs/useSearch.cjs.map +1 -1
  112. package/dist/cjs/useSearch.d.cts +9 -7
  113. package/dist/cjs/utils.cjs +40 -122
  114. package/dist/cjs/utils.cjs.map +1 -1
  115. package/dist/cjs/utils.d.cts +46 -50
  116. package/dist/esm/Asset.d.ts +2 -0
  117. package/dist/esm/Asset.js +41 -0
  118. package/dist/esm/Asset.js.map +1 -0
  119. package/dist/esm/CatchBoundary.d.ts +8 -32
  120. package/dist/esm/CatchBoundary.js +16 -12
  121. package/dist/esm/CatchBoundary.js.map +1 -1
  122. package/dist/esm/ClientOnly.d.ts +29 -0
  123. package/dist/esm/ClientOnly.js +20 -0
  124. package/dist/esm/ClientOnly.js.map +1 -0
  125. package/dist/esm/HeadContent.d.ts +7 -0
  126. package/dist/esm/HeadContent.js +139 -0
  127. package/dist/esm/HeadContent.js.map +1 -0
  128. package/dist/esm/Match.d.ts +8 -0
  129. package/dist/esm/Match.js +235 -0
  130. package/dist/esm/Match.js.map +1 -0
  131. package/dist/esm/Matches.d.ts +23 -83
  132. package/dist/esm/Matches.js +36 -284
  133. package/dist/esm/Matches.js.map +1 -1
  134. package/dist/esm/RouterProvider.d.ts +8 -27
  135. package/dist/esm/RouterProvider.js +20 -126
  136. package/dist/esm/RouterProvider.js.map +1 -1
  137. package/dist/esm/SafeFragment.d.ts +1 -0
  138. package/dist/esm/SafeFragment.js +8 -0
  139. package/dist/esm/SafeFragment.js.map +1 -0
  140. package/dist/esm/ScriptOnce.d.ts +5 -0
  141. package/dist/esm/ScriptOnce.js +28 -0
  142. package/dist/esm/ScriptOnce.js.map +1 -0
  143. package/dist/esm/Scripts.d.ts +1 -0
  144. package/dist/esm/Scripts.js +51 -0
  145. package/dist/esm/Scripts.js.map +1 -0
  146. package/dist/esm/ScrollRestoration.d.ts +14 -0
  147. package/dist/esm/ScrollRestoration.js +39 -0
  148. package/dist/esm/ScrollRestoration.js.map +1 -0
  149. package/dist/esm/Transitioner.d.ts +1 -0
  150. package/dist/esm/Transitioner.js +98 -0
  151. package/dist/esm/Transitioner.js.map +1 -0
  152. package/dist/esm/awaited.d.ts +4 -4
  153. package/dist/esm/awaited.js +12 -65
  154. package/dist/esm/awaited.js.map +1 -1
  155. package/dist/esm/fileRoute.d.ts +33 -108
  156. package/dist/esm/fileRoute.js +38 -12
  157. package/dist/esm/fileRoute.js.map +1 -1
  158. package/dist/esm/history.d.ts +1 -0
  159. package/dist/esm/index.d.ts +52 -29
  160. package/dist/esm/index.js +41 -29
  161. package/dist/esm/index.js.map +1 -1
  162. package/dist/esm/lazyRouteComponent.d.ts +1 -1
  163. package/dist/esm/lazyRouteComponent.js +40 -29
  164. package/dist/esm/lazyRouteComponent.js.map +1 -1
  165. package/dist/esm/link.d.ts +41 -86
  166. package/dist/esm/link.js +212 -106
  167. package/dist/esm/link.js.map +1 -1
  168. package/dist/esm/matchContext.d.ts +3 -0
  169. package/dist/esm/matchContext.js +10 -0
  170. package/dist/esm/matchContext.js.map +1 -0
  171. package/dist/esm/not-found.d.ts +5 -22
  172. package/dist/esm/not-found.js +9 -15
  173. package/dist/esm/not-found.js.map +1 -1
  174. package/dist/esm/renderRouteNotFound.d.ts +2 -0
  175. package/dist/esm/renderRouteNotFound.js +22 -0
  176. package/dist/esm/renderRouteNotFound.js.map +1 -0
  177. package/dist/esm/route.d.ts +64 -361
  178. package/dist/esm/route.js +103 -72
  179. package/dist/esm/route.js.map +1 -1
  180. package/dist/esm/router.d.ts +69 -237
  181. package/dist/esm/router.js +13 -1238
  182. package/dist/esm/router.js.map +1 -1
  183. package/dist/esm/routerContext.d.ts +7 -2
  184. package/dist/esm/routerContext.js +1 -1
  185. package/dist/esm/routerContext.js.map +1 -1
  186. package/dist/esm/scroll-restoration.d.ts +1 -18
  187. package/dist/esm/scroll-restoration.js +17 -161
  188. package/dist/esm/scroll-restoration.js.map +1 -1
  189. package/dist/esm/serializer.d.ts +6 -0
  190. package/dist/esm/structuralSharing.d.ts +8 -0
  191. package/dist/esm/typePrimitives.d.ts +16 -0
  192. package/dist/esm/useBlocker.d.ts +64 -7
  193. package/dist/esm/useBlocker.js +138 -9
  194. package/dist/esm/useBlocker.js.map +1 -1
  195. package/dist/esm/useCanGoBack.d.ts +1 -0
  196. package/dist/esm/useCanGoBack.js +8 -0
  197. package/dist/esm/useCanGoBack.js.map +1 -0
  198. package/dist/esm/useLoaderData.d.ts +8 -0
  199. package/dist/esm/useLoaderData.js +15 -0
  200. package/dist/esm/useLoaderData.js.map +1 -0
  201. package/dist/esm/useLoaderDeps.d.ts +8 -0
  202. package/dist/esm/useLoaderDeps.js +14 -0
  203. package/dist/esm/useLoaderDeps.js.map +1 -0
  204. package/dist/esm/useLocation.d.ts +7 -0
  205. package/dist/esm/useLocation.js +10 -0
  206. package/dist/esm/useLocation.js.map +1 -0
  207. package/dist/esm/useMatch.d.ts +10 -0
  208. package/dist/esm/useMatch.js +30 -0
  209. package/dist/esm/useMatch.js.map +1 -0
  210. package/dist/esm/useNavigate.d.ts +4 -8
  211. package/dist/esm/useNavigate.js +18 -19
  212. package/dist/esm/useNavigate.js.map +1 -1
  213. package/dist/esm/useParams.d.ts +9 -8
  214. package/dist/esm/useParams.js +8 -8
  215. package/dist/esm/useParams.js.map +1 -1
  216. package/dist/esm/useRouteContext.d.ts +3 -7
  217. package/dist/esm/useRouteContext.js +2 -2
  218. package/dist/esm/useRouteContext.js.map +1 -1
  219. package/dist/esm/useRouter.d.ts +3 -4
  220. package/dist/esm/useRouter.js.map +1 -1
  221. package/dist/esm/useRouterState.d.ts +8 -6
  222. package/dist/esm/useRouterState.js +18 -1
  223. package/dist/esm/useRouterState.js.map +1 -1
  224. package/dist/esm/useSearch.d.ts +9 -7
  225. package/dist/esm/useSearch.js +6 -3
  226. package/dist/esm/useSearch.js.map +1 -1
  227. package/dist/esm/utils.d.ts +46 -50
  228. package/dist/esm/utils.js +41 -123
  229. package/dist/esm/utils.js.map +1 -1
  230. package/package.json +30 -31
  231. package/src/Asset.tsx +40 -0
  232. package/src/CatchBoundary.tsx +35 -19
  233. package/src/ClientOnly.tsx +68 -0
  234. package/src/HeadContent.tsx +174 -0
  235. package/src/Match.tsx +330 -0
  236. package/src/Matches.tsx +149 -558
  237. package/src/RouterProvider.tsx +58 -212
  238. package/src/SafeFragment.tsx +5 -0
  239. package/src/ScriptOnce.tsx +32 -0
  240. package/src/Scripts.tsx +65 -0
  241. package/src/ScrollRestoration.tsx +69 -0
  242. package/src/Transitioner.tsx +130 -0
  243. package/src/awaited.tsx +16 -87
  244. package/src/fileRoute.ts +145 -248
  245. package/src/history.ts +2 -1
  246. package/src/index.tsx +368 -30
  247. package/src/lazyRouteComponent.tsx +68 -54
  248. package/src/link.tsx +397 -522
  249. package/src/matchContext.tsx +8 -0
  250. package/src/not-found.tsx +13 -34
  251. package/src/renderRouteNotFound.tsx +27 -0
  252. package/src/route.tsx +572 -0
  253. package/src/router.ts +99 -2067
  254. package/src/routerContext.tsx +8 -2
  255. package/src/scroll-restoration.tsx +23 -224
  256. package/src/serializer.ts +7 -0
  257. package/src/structuralSharing.ts +47 -0
  258. package/src/typePrimitives.ts +84 -0
  259. package/src/useBlocker.tsx +297 -15
  260. package/src/useCanGoBack.ts +5 -0
  261. package/src/useLoaderData.tsx +80 -0
  262. package/src/useLoaderDeps.tsx +58 -0
  263. package/src/useLocation.tsx +41 -0
  264. package/src/useMatch.tsx +119 -0
  265. package/src/useNavigate.tsx +41 -61
  266. package/src/useParams.tsx +88 -23
  267. package/src/useRouteContext.ts +24 -18
  268. package/src/useRouter.tsx +4 -5
  269. package/src/useRouterState.tsx +52 -10
  270. package/src/useSearch.tsx +87 -24
  271. package/src/utils.ts +97 -312
  272. package/dist/cjs/createServerFn.cjs +0 -40
  273. package/dist/cjs/createServerFn.cjs.map +0 -1
  274. package/dist/cjs/createServerFn.d.cts +0 -44
  275. package/dist/cjs/defer.cjs +0 -30
  276. package/dist/cjs/defer.cjs.map +0 -1
  277. package/dist/cjs/defer.d.cts +0 -25
  278. package/dist/cjs/location.d.cts +0 -12
  279. package/dist/cjs/path.cjs +0 -213
  280. package/dist/cjs/path.cjs.map +0 -1
  281. package/dist/cjs/path.d.cts +0 -24
  282. package/dist/cjs/qss.cjs +0 -45
  283. package/dist/cjs/qss.cjs.map +0 -1
  284. package/dist/cjs/qss.d.cts +0 -2
  285. package/dist/cjs/redirects.cjs +0 -16
  286. package/dist/cjs/redirects.cjs.map +0 -1
  287. package/dist/cjs/redirects.d.cts +0 -18
  288. package/dist/cjs/routeInfo.d.cts +0 -31
  289. package/dist/cjs/searchParams.cjs +0 -63
  290. package/dist/cjs/searchParams.cjs.map +0 -1
  291. package/dist/cjs/searchParams.d.cts +0 -7
  292. package/dist/esm/createServerFn.d.ts +0 -44
  293. package/dist/esm/createServerFn.js +0 -40
  294. package/dist/esm/createServerFn.js.map +0 -1
  295. package/dist/esm/defer.d.ts +0 -25
  296. package/dist/esm/defer.js +0 -30
  297. package/dist/esm/defer.js.map +0 -1
  298. package/dist/esm/location.d.ts +0 -12
  299. package/dist/esm/path.d.ts +0 -24
  300. package/dist/esm/path.js +0 -213
  301. package/dist/esm/path.js.map +0 -1
  302. package/dist/esm/qss.d.ts +0 -2
  303. package/dist/esm/qss.js +0 -45
  304. package/dist/esm/qss.js.map +0 -1
  305. package/dist/esm/redirects.d.ts +0 -18
  306. package/dist/esm/redirects.js +0 -16
  307. package/dist/esm/redirects.js.map +0 -1
  308. package/dist/esm/routeInfo.d.ts +0 -31
  309. package/dist/esm/searchParams.d.ts +0 -7
  310. package/dist/esm/searchParams.js +0 -63
  311. package/dist/esm/searchParams.js.map +0 -1
  312. package/src/createServerFn.ts +0 -107
  313. package/src/defer.ts +0 -70
  314. package/src/location.ts +0 -13
  315. package/src/path.ts +0 -280
  316. package/src/qss.ts +0 -53
  317. package/src/redirects.ts +0 -56
  318. package/src/route.ts +0 -1356
  319. package/src/routeInfo.ts +0 -63
  320. package/src/searchParams.ts +0 -79
@@ -1,75 +1,55 @@
1
1
  import * as React from 'react'
2
- import { useMatch } from './Matches'
3
2
  import { useRouter } from './useRouter'
4
- import { LinkOptions, NavigateOptions } from './link'
5
- import { AnyRoute } from './route'
6
- import { RoutePaths, RoutePathsAutoComplete } from './routeInfo'
7
- import { RegisteredRouter } from './router'
8
-
9
- export type UseNavigateResult<TDefaultFrom extends string> = <
10
- TTo extends string,
11
- TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
12
- TFrom extends RoutePaths<TRouteTree> | string = TDefaultFrom,
13
- TMaskFrom extends RoutePaths<TRouteTree> | string = TFrom,
14
- TMaskTo extends string = '',
15
- >({
16
- from,
17
- ...rest
18
- }: NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>) => Promise<void>
3
+ import type {
4
+ AnyRouter,
5
+ FromPathOption,
6
+ NavigateOptions,
7
+ RegisteredRouter,
8
+ UseNavigateResult,
9
+ } from '@tanstack/router-core'
19
10
 
20
11
  export function useNavigate<
12
+ TRouter extends AnyRouter = RegisteredRouter,
21
13
  TDefaultFrom extends string = string,
22
14
  >(_defaultOpts?: {
23
- from?: RoutePathsAutoComplete<RegisteredRouter['routeTree'], TDefaultFrom>
24
- }) {
15
+ from?: FromPathOption<TRouter, TDefaultFrom>
16
+ }): UseNavigateResult<TDefaultFrom> {
25
17
  const { navigate } = useRouter()
26
18
 
27
- const matchPathname = useMatch({
28
- strict: false,
29
- select: (s) => s.pathname,
30
- })
31
-
32
- const result: UseNavigateResult<TDefaultFrom> = ({ from, ...rest }) => {
33
- return navigate({
34
- from: rest?.to ? matchPathname : undefined,
35
- ...(rest as any),
36
- })
37
- }
38
-
39
- return React.useCallback(result, [])
19
+ return React.useCallback(
20
+ (options: NavigateOptions) => {
21
+ return navigate({
22
+ from: _defaultOpts?.from,
23
+ ...options,
24
+ })
25
+ },
26
+ [_defaultOpts?.from, navigate],
27
+ ) as UseNavigateResult<TDefaultFrom>
40
28
  }
41
29
 
42
- // NOTE: I don't know of anyone using this. It's undocumented, so let's wait until someone needs it
43
- // export function typedNavigate<
44
- // TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
45
- // TDefaultFrom extends RoutePaths<TRouteTree> = '/',
46
- // >(navigate: (opts: NavigateOptions<any>) => Promise<void>) {
47
- // return navigate as <
48
- // TFrom extends RoutePaths<TRouteTree> = TDefaultFrom,
49
- // TTo extends string = '',
50
- // TMaskFrom extends RoutePaths<TRouteTree> = '/',
51
- // TMaskTo extends string = '',
52
- // >(
53
- // opts?: NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,
54
- // ) => Promise<void>
55
- // } //
56
-
57
30
  export function Navigate<
58
- TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
59
- TFrom extends RoutePaths<TRouteTree> | string = string,
60
- TTo extends string = '',
61
- TMaskFrom extends RoutePaths<TRouteTree> | string = TFrom,
62
- TMaskTo extends string = '',
63
- >(props: NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>): null {
64
- const { navigate } = useRouter()
65
- const match = useMatch({ strict: false })
66
-
31
+ TRouter extends AnyRouter = RegisteredRouter,
32
+ const TFrom extends string = string,
33
+ const TTo extends string | undefined = undefined,
34
+ const TMaskFrom extends string = TFrom,
35
+ const TMaskTo extends string = '',
36
+ >(props: NavigateOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): null {
37
+ const router = useRouter()
38
+
39
+ const previousPropsRef = React.useRef<NavigateOptions<
40
+ TRouter,
41
+ TFrom,
42
+ TTo,
43
+ TMaskFrom,
44
+ TMaskTo
45
+ > | null>(null)
67
46
  React.useEffect(() => {
68
- navigate({
69
- from: props.to ? match.pathname : undefined,
70
- ...props,
71
- } as any)
72
- }, [])
73
-
47
+ if (previousPropsRef.current !== props) {
48
+ router.navigate({
49
+ ...props,
50
+ })
51
+ previousPropsRef.current = props
52
+ }
53
+ }, [router, props])
74
54
  return null
75
55
  }
package/src/useParams.tsx CHANGED
@@ -1,28 +1,93 @@
1
- import { AnyRoute } from './route'
2
- import { RouteIds, RouteById, AllParams } from './routeInfo'
3
- import { RegisteredRouter } from './router'
4
- import { Expand, last } from './utils'
5
- import { useRouterState } from './useRouterState'
6
- import { StrictOrFrom } from './utils'
7
- import { getRenderedMatches } from './Matches'
1
+ import { useMatch } from './useMatch'
2
+ import type {
3
+ StructuralSharingOption,
4
+ ValidateSelected,
5
+ } from './structuralSharing'
6
+ import type {
7
+ AnyRouter,
8
+ RegisteredRouter,
9
+ ResolveUseParams,
10
+ StrictOrFrom,
11
+ ThrowConstraint,
12
+ ThrowOrOptional,
13
+ UseParamsResult,
14
+ } from '@tanstack/router-core'
15
+
16
+ export interface UseParamsBaseOptions<
17
+ TRouter extends AnyRouter,
18
+ TFrom,
19
+ TStrict extends boolean,
20
+ TThrow extends boolean,
21
+ TSelected,
22
+ TStructuralSharing,
23
+ > {
24
+ select?: (
25
+ params: ResolveUseParams<TRouter, TFrom, TStrict>,
26
+ ) => ValidateSelected<TRouter, TSelected, TStructuralSharing>
27
+ shouldThrow?: TThrow
28
+ }
29
+
30
+ export type UseParamsOptions<
31
+ TRouter extends AnyRouter,
32
+ TFrom extends string | undefined,
33
+ TStrict extends boolean,
34
+ TThrow extends boolean,
35
+ TSelected,
36
+ TStructuralSharing,
37
+ > = StrictOrFrom<TRouter, TFrom, TStrict> &
38
+ UseParamsBaseOptions<
39
+ TRouter,
40
+ TFrom,
41
+ TStrict,
42
+ TThrow,
43
+ TSelected,
44
+ TStructuralSharing
45
+ > &
46
+ StructuralSharingOption<TRouter, TSelected, TStructuralSharing>
47
+
48
+ export type UseParamsRoute<out TFrom> = <
49
+ TRouter extends AnyRouter = RegisteredRouter,
50
+ TSelected = unknown,
51
+ TStructuralSharing extends boolean = boolean,
52
+ >(
53
+ opts?: UseParamsBaseOptions<
54
+ TRouter,
55
+ TFrom,
56
+ /* TStrict */ true,
57
+ /* TThrow */ true,
58
+ TSelected,
59
+ TStructuralSharing
60
+ > &
61
+ StructuralSharingOption<TRouter, TSelected, TStructuralSharing>,
62
+ ) => UseParamsResult<TRouter, TFrom, true, TSelected>
8
63
 
9
64
  export function useParams<
10
- TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
11
- TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,
12
- TReturnIntersection extends boolean = false,
13
- TParams = TReturnIntersection extends false
14
- ? RouteById<TRouteTree, TFrom>['types']['allParams']
15
- : Expand<Partial<AllParams<TRouteTree>>>,
16
- TSelected = TParams,
65
+ TRouter extends AnyRouter = RegisteredRouter,
66
+ const TFrom extends string | undefined = undefined,
67
+ TStrict extends boolean = true,
68
+ TThrow extends boolean = true,
69
+ TSelected = unknown,
70
+ TStructuralSharing extends boolean = boolean,
17
71
  >(
18
- opts: StrictOrFrom<TFrom, TReturnIntersection> & {
19
- select?: (params: TParams) => TSelected
20
- },
21
- ): TSelected {
22
- return useRouterState({
23
- select: (state: any) => {
24
- const params = (last(getRenderedMatches(state)) as any)?.params
25
- return opts?.select ? opts.select(params) : params
72
+ opts: UseParamsOptions<
73
+ TRouter,
74
+ TFrom,
75
+ TStrict,
76
+ ThrowConstraint<TStrict, TThrow>,
77
+ TSelected,
78
+ TStructuralSharing
79
+ >,
80
+ ): ThrowOrOptional<
81
+ UseParamsResult<TRouter, TFrom, TStrict, TSelected>,
82
+ TThrow
83
+ > {
84
+ return useMatch({
85
+ from: opts.from!,
86
+ strict: opts.strict,
87
+ shouldThrow: opts.shouldThrow,
88
+ structuralSharing: opts.structuralSharing,
89
+ select: (match: any) => {
90
+ return opts.select ? opts.select(match.params) : match.params
26
91
  },
27
- })
92
+ }) as any
28
93
  }
@@ -1,24 +1,30 @@
1
- import { useMatch, RouteMatch } from './Matches'
2
- import { AnyRoute } from './route'
3
- import { RouteIds, RouteById } from './routeInfo'
4
- import { RegisteredRouter } from './router'
5
- import { StrictOrFrom } from './utils'
1
+ import { useMatch } from './useMatch'
2
+ import type {
3
+ AnyRouter,
4
+ RegisteredRouter,
5
+ UseRouteContextBaseOptions,
6
+ UseRouteContextOptions,
7
+ UseRouteContextResult,
8
+ } from '@tanstack/router-core'
9
+
10
+ export type UseRouteContextRoute<out TFrom> = <
11
+ TRouter extends AnyRouter = RegisteredRouter,
12
+ TSelected = unknown,
13
+ >(
14
+ opts?: UseRouteContextBaseOptions<TRouter, TFrom, true, TSelected>,
15
+ ) => UseRouteContextResult<TRouter, TFrom, true, TSelected>
6
16
 
7
17
  export function useRouteContext<
8
- TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
9
- TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,
10
- TRouteContext = RouteById<TRouteTree, TFrom>['types']['allContext'],
11
- TSelected = TRouteContext,
18
+ TRouter extends AnyRouter = RegisteredRouter,
19
+ const TFrom extends string | undefined = undefined,
20
+ TStrict extends boolean = true,
21
+ TSelected = unknown,
12
22
  >(
13
- opts: StrictOrFrom<TFrom> & {
14
- select?: (search: TRouteContext) => TSelected
15
- },
16
- ): TSelected {
23
+ opts: UseRouteContextOptions<TRouter, TFrom, TStrict, TSelected>,
24
+ ): UseRouteContextResult<TRouter, TFrom, TStrict, TSelected> {
17
25
  return useMatch({
18
26
  ...(opts as any),
19
- select: (match: RouteMatch) =>
20
- opts?.select
21
- ? opts.select(match.context as TRouteContext)
22
- : match.context,
23
- })
27
+ select: (match) =>
28
+ opts.select ? opts.select(match.context) : match.context,
29
+ }) as UseRouteContextResult<TRouter, TFrom, TStrict, TSelected>
24
30
  }
package/src/useRouter.tsx CHANGED
@@ -1,12 +1,11 @@
1
1
  import * as React from 'react'
2
2
  import warning from 'tiny-warning'
3
- import { AnyRoute } from './route'
4
- import { RegisteredRouter, Router } from './router'
5
3
  import { getRouterContext } from './routerContext'
4
+ import type { AnyRouter, RegisteredRouter } from '@tanstack/router-core'
6
5
 
7
- export function useRouter<
8
- TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
9
- >(opts?: { warn?: boolean }): Router<TRouteTree> {
6
+ export function useRouter<TRouter extends AnyRouter = RegisteredRouter>(opts?: {
7
+ warn?: boolean
8
+ }): TRouter {
10
9
  const value = React.useContext(getRouterContext())
11
10
  warning(
12
11
  !((opts?.warn ?? true) && !value),
@@ -1,17 +1,59 @@
1
1
  import { useStore } from '@tanstack/react-store'
2
- import { AnyRoute } from './route'
3
- import { RegisteredRouter, Router, RouterState } from './router'
2
+ import { useRef } from 'react'
3
+ import { replaceEqualDeep } from '@tanstack/router-core'
4
4
  import { useRouter } from './useRouter'
5
+ import type {
6
+ AnyRouter,
7
+ RegisteredRouter,
8
+ RouterState,
9
+ } from '@tanstack/router-core'
10
+ import type {
11
+ StructuralSharingOption,
12
+ ValidateSelected,
13
+ } from './structuralSharing'
14
+
15
+ export type UseRouterStateOptions<
16
+ TRouter extends AnyRouter,
17
+ TSelected,
18
+ TStructuralSharing,
19
+ > = {
20
+ router?: TRouter
21
+ select?: (
22
+ state: RouterState<TRouter['routeTree']>,
23
+ ) => ValidateSelected<TRouter, TSelected, TStructuralSharing>
24
+ } & StructuralSharingOption<TRouter, TSelected, TStructuralSharing>
25
+
26
+ export type UseRouterStateResult<
27
+ TRouter extends AnyRouter,
28
+ TSelected,
29
+ > = unknown extends TSelected ? RouterState<TRouter['routeTree']> : TSelected
5
30
 
6
31
  export function useRouterState<
7
- TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
8
- TSelected = RouterState<TRouteTree>,
9
- >(opts?: {
10
- router?: Router<TRouteTree>
11
- select: (state: RouterState<RegisteredRouter['routeTree']>) => TSelected
12
- }): TSelected {
13
- const contextRouter = useRouter<TRouteTree>({
32
+ TRouter extends AnyRouter = RegisteredRouter,
33
+ TSelected = unknown,
34
+ TStructuralSharing extends boolean = boolean,
35
+ >(
36
+ opts?: UseRouterStateOptions<TRouter, TSelected, TStructuralSharing>,
37
+ ): UseRouterStateResult<TRouter, TSelected> {
38
+ const contextRouter = useRouter<TRouter>({
14
39
  warn: opts?.router === undefined,
15
40
  })
16
- return useStore((opts?.router || contextRouter).__store, opts?.select as any)
41
+ const router = opts?.router || contextRouter
42
+ const previousResult =
43
+ useRef<ValidateSelected<TRouter, TSelected, TStructuralSharing>>(undefined)
44
+
45
+ return useStore(router.__store, (state) => {
46
+ if (opts?.select) {
47
+ if (opts.structuralSharing ?? router.options.defaultStructuralSharing) {
48
+ const newSlice = replaceEqualDeep(
49
+ previousResult.current,
50
+ opts.select(state),
51
+ )
52
+ previousResult.current = newSlice
53
+ return newSlice
54
+ }
55
+ return opts.select(state)
56
+ }
57
+ return state
58
+ }) as UseRouterStateResult<TRouter, TSelected>
17
59
  }
package/src/useSearch.tsx CHANGED
@@ -1,30 +1,93 @@
1
- import { AnyRoute, RootSearchSchema } from './route'
2
- import { RouteIds, RouteById, FullSearchSchema } from './routeInfo'
3
- import { RegisteredRouter } from './router'
4
- import { RouteMatch } from './Matches'
5
- import { useMatch } from './Matches'
6
- import { Expand, StrictOrFrom } from './utils'
1
+ import { useMatch } from './useMatch'
2
+ import type {
3
+ StructuralSharingOption,
4
+ ValidateSelected,
5
+ } from './structuralSharing'
6
+ import type {
7
+ AnyRouter,
8
+ RegisteredRouter,
9
+ ResolveUseSearch,
10
+ StrictOrFrom,
11
+ ThrowConstraint,
12
+ ThrowOrOptional,
13
+ UseSearchResult,
14
+ } from '@tanstack/router-core'
15
+
16
+ export interface UseSearchBaseOptions<
17
+ TRouter extends AnyRouter,
18
+ TFrom,
19
+ TStrict extends boolean,
20
+ TThrow extends boolean,
21
+ TSelected,
22
+ TStructuralSharing,
23
+ > {
24
+ select?: (
25
+ state: ResolveUseSearch<TRouter, TFrom, TStrict>,
26
+ ) => ValidateSelected<TRouter, TSelected, TStructuralSharing>
27
+ shouldThrow?: TThrow
28
+ }
29
+
30
+ export type UseSearchOptions<
31
+ TRouter extends AnyRouter,
32
+ TFrom,
33
+ TStrict extends boolean,
34
+ TThrow extends boolean,
35
+ TSelected,
36
+ TStructuralSharing,
37
+ > = StrictOrFrom<TRouter, TFrom, TStrict> &
38
+ UseSearchBaseOptions<
39
+ TRouter,
40
+ TFrom,
41
+ TStrict,
42
+ TThrow,
43
+ TSelected,
44
+ TStructuralSharing
45
+ > &
46
+ StructuralSharingOption<TRouter, TSelected, TStructuralSharing>
47
+
48
+ export type UseSearchRoute<out TFrom> = <
49
+ TRouter extends AnyRouter = RegisteredRouter,
50
+ TSelected = unknown,
51
+ TStructuralSharing extends boolean = boolean,
52
+ >(
53
+ opts?: UseSearchBaseOptions<
54
+ TRouter,
55
+ TFrom,
56
+ /* TStrict */ true,
57
+ /* TThrow */ true,
58
+ TSelected,
59
+ TStructuralSharing
60
+ > &
61
+ StructuralSharingOption<TRouter, TSelected, TStructuralSharing>,
62
+ ) => UseSearchResult<TRouter, TFrom, true, TSelected>
7
63
 
8
64
  export function useSearch<
9
- TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
10
- TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,
11
- TReturnIntersection extends boolean = false,
12
- TSearch = TReturnIntersection extends false
13
- ? Exclude<
14
- RouteById<TRouteTree, TFrom>['types']['fullSearchSchema'],
15
- RootSearchSchema
16
- >
17
- : Partial<Omit<FullSearchSchema<TRouteTree>, keyof RootSearchSchema>>,
18
- TSelected = TSearch,
65
+ TRouter extends AnyRouter = RegisteredRouter,
66
+ const TFrom extends string | undefined = undefined,
67
+ TStrict extends boolean = true,
68
+ TThrow extends boolean = true,
69
+ TSelected = unknown,
70
+ TStructuralSharing extends boolean = boolean,
19
71
  >(
20
- opts: StrictOrFrom<TFrom, TReturnIntersection> & {
21
- select?: (search: TSearch) => TSelected
22
- },
23
- ): TSelected {
72
+ opts: UseSearchOptions<
73
+ TRouter,
74
+ TFrom,
75
+ TStrict,
76
+ ThrowConstraint<TStrict, TThrow>,
77
+ TSelected,
78
+ TStructuralSharing
79
+ >,
80
+ ): ThrowOrOptional<
81
+ UseSearchResult<TRouter, TFrom, TStrict, TSelected>,
82
+ TThrow
83
+ > {
24
84
  return useMatch({
25
- ...opts,
26
- select: (match: RouteMatch) => {
27
- return opts?.select ? opts.select(match.search as TSearch) : match.search
85
+ from: opts.from!,
86
+ strict: opts.strict,
87
+ shouldThrow: opts.shouldThrow,
88
+ structuralSharing: opts.structuralSharing,
89
+ select: (match: any) => {
90
+ return opts.select ? opts.select(match.search) : match.search
28
91
  },
29
- })
92
+ }) as any
30
93
  }