@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.
Files changed (363) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +32 -0
  3. package/dist/cjs/Asset.cjs +177 -0
  4. package/dist/cjs/Asset.cjs.map +1 -0
  5. package/dist/cjs/Asset.d.cts +5 -0
  6. package/dist/cjs/CatchBoundary.cjs +114 -0
  7. package/dist/cjs/CatchBoundary.cjs.map +1 -0
  8. package/dist/cjs/CatchBoundary.d.cts +12 -0
  9. package/dist/cjs/ClientOnly.cjs +21 -0
  10. package/dist/cjs/ClientOnly.cjs.map +1 -0
  11. package/dist/cjs/ClientOnly.d.cts +49 -0
  12. package/dist/cjs/HeadContent.cjs +15 -0
  13. package/dist/cjs/HeadContent.cjs.map +1 -0
  14. package/dist/cjs/HeadContent.d.cts +6 -0
  15. package/dist/cjs/HeadContent.dev.cjs +41 -0
  16. package/dist/cjs/HeadContent.dev.cjs.map +1 -0
  17. package/dist/cjs/HeadContent.dev.d.cts +10 -0
  18. package/dist/cjs/Match.cjs +255 -0
  19. package/dist/cjs/Match.cjs.map +1 -0
  20. package/dist/cjs/Match.d.cts +14 -0
  21. package/dist/cjs/Matches.cjs +138 -0
  22. package/dist/cjs/Matches.cjs.map +1 -0
  23. package/dist/cjs/Matches.d.cts +68 -0
  24. package/dist/cjs/RouterProvider.cjs +32 -0
  25. package/dist/cjs/RouterProvider.cjs.map +1 -0
  26. package/dist/cjs/RouterProvider.d.cts +23 -0
  27. package/dist/cjs/SafeFragment.cjs +8 -0
  28. package/dist/cjs/SafeFragment.cjs.map +1 -0
  29. package/dist/cjs/SafeFragment.d.cts +1 -0
  30. package/dist/cjs/ScriptOnce.cjs +22 -0
  31. package/dist/cjs/ScriptOnce.cjs.map +1 -0
  32. package/dist/cjs/ScriptOnce.d.cts +6 -0
  33. package/dist/cjs/Scripts.cjs +56 -0
  34. package/dist/cjs/Scripts.cjs.map +1 -0
  35. package/dist/cjs/Scripts.d.cts +5 -0
  36. package/dist/cjs/ScrollRestoration.cjs +38 -0
  37. package/dist/cjs/ScrollRestoration.cjs.map +1 -0
  38. package/dist/cjs/ScrollRestoration.d.cts +14 -0
  39. package/dist/cjs/Transitioner.cjs +119 -0
  40. package/dist/cjs/Transitioner.cjs.map +1 -0
  41. package/dist/cjs/Transitioner.d.cts +1 -0
  42. package/dist/cjs/awaited.cjs +51 -0
  43. package/dist/cjs/awaited.cjs.map +1 -0
  44. package/dist/cjs/awaited.d.cts +14 -0
  45. package/dist/cjs/fileRoute.cjs +109 -0
  46. package/dist/cjs/fileRoute.cjs.map +1 -0
  47. package/dist/cjs/fileRoute.d.cts +87 -0
  48. package/dist/cjs/headContentUtils.cjs +185 -0
  49. package/dist/cjs/headContentUtils.cjs.map +1 -0
  50. package/dist/cjs/headContentUtils.d.cts +7 -0
  51. package/dist/cjs/history.d.cts +8 -0
  52. package/dist/cjs/index.cjs +241 -0
  53. package/dist/cjs/index.cjs.map +1 -0
  54. package/dist/cjs/index.d.cts +51 -0
  55. package/dist/cjs/index.dev.cjs +241 -0
  56. package/dist/cjs/index.dev.cjs.map +1 -0
  57. package/dist/cjs/index.dev.d.cts +2 -0
  58. package/dist/cjs/lazyRouteComponent.cjs +70 -0
  59. package/dist/cjs/lazyRouteComponent.cjs.map +1 -0
  60. package/dist/cjs/lazyRouteComponent.d.cts +11 -0
  61. package/dist/cjs/link.cjs +573 -0
  62. package/dist/cjs/link.cjs.map +1 -0
  63. package/dist/cjs/link.d.cts +98 -0
  64. package/dist/cjs/matchContext.cjs +27 -0
  65. package/dist/cjs/matchContext.cjs.map +1 -0
  66. package/dist/cjs/matchContext.d.cts +3 -0
  67. package/dist/cjs/not-found.cjs +38 -0
  68. package/dist/cjs/not-found.cjs.map +1 -0
  69. package/dist/cjs/not-found.d.cts +9 -0
  70. package/dist/cjs/renderRouteNotFound.cjs +22 -0
  71. package/dist/cjs/renderRouteNotFound.cjs.map +1 -0
  72. package/dist/cjs/renderRouteNotFound.d.cts +10 -0
  73. package/dist/cjs/route.cjs +198 -0
  74. package/dist/cjs/route.cjs.map +1 -0
  75. package/dist/cjs/route.d.cts +142 -0
  76. package/dist/cjs/router.cjs +22 -0
  77. package/dist/cjs/router.cjs.map +1 -0
  78. package/dist/cjs/router.d.cts +83 -0
  79. package/dist/cjs/routerContext.cjs +23 -0
  80. package/dist/cjs/routerContext.cjs.map +1 -0
  81. package/dist/cjs/routerContext.d.cts +3 -0
  82. package/dist/cjs/scroll-restoration.cjs +39 -0
  83. package/dist/cjs/scroll-restoration.cjs.map +1 -0
  84. package/dist/cjs/scroll-restoration.d.cts +1 -0
  85. package/dist/cjs/ssr/RouterClient.cjs +25 -0
  86. package/dist/cjs/ssr/RouterClient.cjs.map +1 -0
  87. package/dist/cjs/ssr/RouterClient.d.cts +4 -0
  88. package/dist/cjs/ssr/RouterServer.cjs +9 -0
  89. package/dist/cjs/ssr/RouterServer.cjs.map +1 -0
  90. package/dist/cjs/ssr/RouterServer.d.cts +4 -0
  91. package/dist/cjs/ssr/client.cjs +12 -0
  92. package/dist/cjs/ssr/client.cjs.map +1 -0
  93. package/dist/cjs/ssr/client.d.cts +2 -0
  94. package/dist/cjs/ssr/defaultRenderHandler.cjs +15 -0
  95. package/dist/cjs/ssr/defaultRenderHandler.cjs.map +1 -0
  96. package/dist/cjs/ssr/defaultRenderHandler.d.cts +1 -0
  97. package/dist/cjs/ssr/defaultStreamHandler.cjs +16 -0
  98. package/dist/cjs/ssr/defaultStreamHandler.cjs.map +1 -0
  99. package/dist/cjs/ssr/defaultStreamHandler.d.cts +1 -0
  100. package/dist/cjs/ssr/renderRouterToStream.cjs +73 -0
  101. package/dist/cjs/ssr/renderRouterToStream.cjs.map +1 -0
  102. package/dist/cjs/ssr/renderRouterToStream.d.cts +8 -0
  103. package/dist/cjs/ssr/renderRouterToString.cjs +31 -0
  104. package/dist/cjs/ssr/renderRouterToString.cjs.map +1 -0
  105. package/dist/cjs/ssr/renderRouterToString.d.cts +7 -0
  106. package/dist/cjs/ssr/serializer.d.cts +6 -0
  107. package/dist/cjs/ssr/server.cjs +20 -0
  108. package/dist/cjs/ssr/server.cjs.map +1 -0
  109. package/dist/cjs/ssr/server.d.cts +6 -0
  110. package/dist/cjs/structuralSharing.d.cts +8 -0
  111. package/dist/cjs/typePrimitives.d.cts +16 -0
  112. package/dist/cjs/useBlocker.cjs +171 -0
  113. package/dist/cjs/useBlocker.cjs.map +1 -0
  114. package/dist/cjs/useBlocker.d.cts +66 -0
  115. package/dist/cjs/useCanGoBack.cjs +8 -0
  116. package/dist/cjs/useCanGoBack.cjs.map +1 -0
  117. package/dist/cjs/useCanGoBack.d.cts +1 -0
  118. package/dist/cjs/useLoaderData.cjs +15 -0
  119. package/dist/cjs/useLoaderData.cjs.map +1 -0
  120. package/dist/cjs/useLoaderData.d.cts +19 -0
  121. package/dist/cjs/useLoaderDeps.cjs +14 -0
  122. package/dist/cjs/useLoaderDeps.cjs.map +1 -0
  123. package/dist/cjs/useLoaderDeps.d.cts +19 -0
  124. package/dist/cjs/useLocation.cjs +10 -0
  125. package/dist/cjs/useLocation.cjs.map +1 -0
  126. package/dist/cjs/useLocation.d.cts +18 -0
  127. package/dist/cjs/useMatch.cjs +47 -0
  128. package/dist/cjs/useMatch.cjs.map +1 -0
  129. package/dist/cjs/useMatch.d.cts +14 -0
  130. package/dist/cjs/useNavigate.cjs +49 -0
  131. package/dist/cjs/useNavigate.cjs.map +1 -0
  132. package/dist/cjs/useNavigate.d.cts +28 -0
  133. package/dist/cjs/useParams.cjs +17 -0
  134. package/dist/cjs/useParams.cjs.map +1 -0
  135. package/dist/cjs/useParams.d.cts +21 -0
  136. package/dist/cjs/useRouteContext.cjs +11 -0
  137. package/dist/cjs/useRouteContext.cjs.map +1 -0
  138. package/dist/cjs/useRouteContext.d.cts +3 -0
  139. package/dist/cjs/useRouter.cjs +32 -0
  140. package/dist/cjs/useRouter.cjs.map +1 -0
  141. package/dist/cjs/useRouter.d.cts +14 -0
  142. package/dist/cjs/useRouterState.cjs +38 -0
  143. package/dist/cjs/useRouterState.cjs.map +1 -0
  144. package/dist/cjs/useRouterState.d.cts +20 -0
  145. package/dist/cjs/useSearch.cjs +16 -0
  146. package/dist/cjs/useSearch.cjs.map +1 -0
  147. package/dist/cjs/useSearch.d.cts +21 -0
  148. package/dist/cjs/utils.cjs +62 -0
  149. package/dist/cjs/utils.cjs.map +1 -0
  150. package/dist/cjs/utils.d.cts +54 -0
  151. package/dist/esm/Asset.d.ts +5 -0
  152. package/dist/esm/Asset.js +160 -0
  153. package/dist/esm/Asset.js.map +1 -0
  154. package/dist/esm/CatchBoundary.d.ts +12 -0
  155. package/dist/esm/CatchBoundary.js +97 -0
  156. package/dist/esm/CatchBoundary.js.map +1 -0
  157. package/dist/esm/ClientOnly.d.ts +49 -0
  158. package/dist/esm/ClientOnly.js +21 -0
  159. package/dist/esm/ClientOnly.js.map +1 -0
  160. package/dist/esm/HeadContent.d.ts +6 -0
  161. package/dist/esm/HeadContent.dev.d.ts +10 -0
  162. package/dist/esm/HeadContent.dev.js +25 -0
  163. package/dist/esm/HeadContent.dev.js.map +1 -0
  164. package/dist/esm/HeadContent.js +15 -0
  165. package/dist/esm/HeadContent.js.map +1 -0
  166. package/dist/esm/Match.d.ts +14 -0
  167. package/dist/esm/Match.js +238 -0
  168. package/dist/esm/Match.js.map +1 -0
  169. package/dist/esm/Matches.d.ts +68 -0
  170. package/dist/esm/Matches.js +121 -0
  171. package/dist/esm/Matches.js.map +1 -0
  172. package/dist/esm/RouterProvider.d.ts +23 -0
  173. package/dist/esm/RouterProvider.js +32 -0
  174. package/dist/esm/RouterProvider.js.map +1 -0
  175. package/dist/esm/SafeFragment.d.ts +1 -0
  176. package/dist/esm/SafeFragment.js +8 -0
  177. package/dist/esm/SafeFragment.js.map +1 -0
  178. package/dist/esm/ScriptOnce.d.ts +6 -0
  179. package/dist/esm/ScriptOnce.js +22 -0
  180. package/dist/esm/ScriptOnce.js.map +1 -0
  181. package/dist/esm/Scripts.d.ts +5 -0
  182. package/dist/esm/Scripts.js +56 -0
  183. package/dist/esm/Scripts.js.map +1 -0
  184. package/dist/esm/ScrollRestoration.d.ts +14 -0
  185. package/dist/esm/ScrollRestoration.js +38 -0
  186. package/dist/esm/ScrollRestoration.js.map +1 -0
  187. package/dist/esm/Transitioner.d.ts +1 -0
  188. package/dist/esm/Transitioner.js +102 -0
  189. package/dist/esm/Transitioner.js.map +1 -0
  190. package/dist/esm/awaited.d.ts +14 -0
  191. package/dist/esm/awaited.js +34 -0
  192. package/dist/esm/awaited.js.map +1 -0
  193. package/dist/esm/fileRoute.d.ts +87 -0
  194. package/dist/esm/fileRoute.js +109 -0
  195. package/dist/esm/fileRoute.js.map +1 -0
  196. package/dist/esm/headContentUtils.d.ts +7 -0
  197. package/dist/esm/headContentUtils.js +168 -0
  198. package/dist/esm/headContentUtils.js.map +1 -0
  199. package/dist/esm/history.d.ts +8 -0
  200. package/dist/esm/index.d.ts +51 -0
  201. package/dist/esm/index.dev.d.ts +2 -0
  202. package/dist/esm/index.dev.js +133 -0
  203. package/dist/esm/index.dev.js.map +1 -0
  204. package/dist/esm/index.js +133 -0
  205. package/dist/esm/index.js.map +1 -0
  206. package/dist/esm/lazyRouteComponent.d.ts +11 -0
  207. package/dist/esm/lazyRouteComponent.js +53 -0
  208. package/dist/esm/lazyRouteComponent.js.map +1 -0
  209. package/dist/esm/link.d.ts +98 -0
  210. package/dist/esm/link.js +556 -0
  211. package/dist/esm/link.js.map +1 -0
  212. package/dist/esm/matchContext.d.ts +3 -0
  213. package/dist/esm/matchContext.js +10 -0
  214. package/dist/esm/matchContext.js.map +1 -0
  215. package/dist/esm/not-found.d.ts +9 -0
  216. package/dist/esm/not-found.js +38 -0
  217. package/dist/esm/not-found.js.map +1 -0
  218. package/dist/esm/renderRouteNotFound.d.ts +10 -0
  219. package/dist/esm/renderRouteNotFound.js +22 -0
  220. package/dist/esm/renderRouteNotFound.js.map +1 -0
  221. package/dist/esm/route.d.ts +142 -0
  222. package/dist/esm/route.js +198 -0
  223. package/dist/esm/route.js.map +1 -0
  224. package/dist/esm/router.d.ts +83 -0
  225. package/dist/esm/router.js +22 -0
  226. package/dist/esm/router.js.map +1 -0
  227. package/dist/esm/routerContext.d.ts +3 -0
  228. package/dist/esm/routerContext.js +6 -0
  229. package/dist/esm/routerContext.js.map +1 -0
  230. package/dist/esm/scroll-restoration.d.ts +1 -0
  231. package/dist/esm/scroll-restoration.js +39 -0
  232. package/dist/esm/scroll-restoration.js.map +1 -0
  233. package/dist/esm/ssr/RouterClient.d.ts +4 -0
  234. package/dist/esm/ssr/RouterClient.js +25 -0
  235. package/dist/esm/ssr/RouterClient.js.map +1 -0
  236. package/dist/esm/ssr/RouterServer.d.ts +4 -0
  237. package/dist/esm/ssr/RouterServer.js +9 -0
  238. package/dist/esm/ssr/RouterServer.js.map +1 -0
  239. package/dist/esm/ssr/client.d.ts +2 -0
  240. package/dist/esm/ssr/client.js +6 -0
  241. package/dist/esm/ssr/client.js.map +1 -0
  242. package/dist/esm/ssr/defaultRenderHandler.d.ts +1 -0
  243. package/dist/esm/ssr/defaultRenderHandler.js +15 -0
  244. package/dist/esm/ssr/defaultRenderHandler.js.map +1 -0
  245. package/dist/esm/ssr/defaultStreamHandler.d.ts +1 -0
  246. package/dist/esm/ssr/defaultStreamHandler.js +16 -0
  247. package/dist/esm/ssr/defaultStreamHandler.js.map +1 -0
  248. package/dist/esm/ssr/renderRouterToStream.d.ts +8 -0
  249. package/dist/esm/ssr/renderRouterToStream.js +73 -0
  250. package/dist/esm/ssr/renderRouterToStream.js.map +1 -0
  251. package/dist/esm/ssr/renderRouterToString.d.ts +7 -0
  252. package/dist/esm/ssr/renderRouterToString.js +31 -0
  253. package/dist/esm/ssr/renderRouterToString.js.map +1 -0
  254. package/dist/esm/ssr/serializer.d.ts +6 -0
  255. package/dist/esm/ssr/server.d.ts +6 -0
  256. package/dist/esm/ssr/server.js +14 -0
  257. package/dist/esm/ssr/server.js.map +1 -0
  258. package/dist/esm/structuralSharing.d.ts +8 -0
  259. package/dist/esm/typePrimitives.d.ts +16 -0
  260. package/dist/esm/useBlocker.d.ts +66 -0
  261. package/dist/esm/useBlocker.js +154 -0
  262. package/dist/esm/useBlocker.js.map +1 -0
  263. package/dist/esm/useCanGoBack.d.ts +1 -0
  264. package/dist/esm/useCanGoBack.js +8 -0
  265. package/dist/esm/useCanGoBack.js.map +1 -0
  266. package/dist/esm/useLoaderData.d.ts +19 -0
  267. package/dist/esm/useLoaderData.js +15 -0
  268. package/dist/esm/useLoaderData.js.map +1 -0
  269. package/dist/esm/useLoaderDeps.d.ts +19 -0
  270. package/dist/esm/useLoaderDeps.js +14 -0
  271. package/dist/esm/useLoaderDeps.js.map +1 -0
  272. package/dist/esm/useLocation.d.ts +18 -0
  273. package/dist/esm/useLocation.js +10 -0
  274. package/dist/esm/useLocation.js.map +1 -0
  275. package/dist/esm/useMatch.d.ts +14 -0
  276. package/dist/esm/useMatch.js +30 -0
  277. package/dist/esm/useMatch.js.map +1 -0
  278. package/dist/esm/useNavigate.d.ts +28 -0
  279. package/dist/esm/useNavigate.js +32 -0
  280. package/dist/esm/useNavigate.js.map +1 -0
  281. package/dist/esm/useParams.d.ts +21 -0
  282. package/dist/esm/useParams.js +17 -0
  283. package/dist/esm/useParams.js.map +1 -0
  284. package/dist/esm/useRouteContext.d.ts +3 -0
  285. package/dist/esm/useRouteContext.js +11 -0
  286. package/dist/esm/useRouteContext.js.map +1 -0
  287. package/dist/esm/useRouter.d.ts +14 -0
  288. package/dist/esm/useRouter.js +15 -0
  289. package/dist/esm/useRouter.js.map +1 -0
  290. package/dist/esm/useRouterState.d.ts +20 -0
  291. package/dist/esm/useRouterState.js +38 -0
  292. package/dist/esm/useRouterState.js.map +1 -0
  293. package/dist/esm/useSearch.d.ts +21 -0
  294. package/dist/esm/useSearch.js +16 -0
  295. package/dist/esm/useSearch.js.map +1 -0
  296. package/dist/esm/utils.d.ts +54 -0
  297. package/dist/esm/utils.js +45 -0
  298. package/dist/esm/utils.js.map +1 -0
  299. package/dist/llms/index.d.ts +3 -0
  300. package/dist/llms/index.js +43 -0
  301. package/dist/llms/rules/api.d.ts +2 -0
  302. package/dist/llms/rules/api.js +4612 -0
  303. package/dist/llms/rules/guide.d.ts +2 -0
  304. package/dist/llms/rules/guide.js +10690 -0
  305. package/dist/llms/rules/installation.d.ts +2 -0
  306. package/dist/llms/rules/installation.js +1285 -0
  307. package/dist/llms/rules/routing.d.ts +2 -0
  308. package/dist/llms/rules/routing.js +1984 -0
  309. package/dist/llms/rules/setup-and-architecture.d.ts +2 -0
  310. package/dist/llms/rules/setup-and-architecture.js +920 -0
  311. package/package.json +142 -0
  312. package/src/Asset.tsx +219 -0
  313. package/src/CatchBoundary.tsx +120 -0
  314. package/src/ClientOnly.tsx +68 -0
  315. package/src/HeadContent.dev.tsx +46 -0
  316. package/src/HeadContent.tsx +22 -0
  317. package/src/Match.tsx +360 -0
  318. package/src/Matches.tsx +313 -0
  319. package/src/RouterProvider.tsx +92 -0
  320. package/src/SafeFragment.tsx +5 -0
  321. package/src/ScriptOnce.tsx +21 -0
  322. package/src/Scripts.tsx +80 -0
  323. package/src/ScrollRestoration.tsx +69 -0
  324. package/src/Transitioner.tsx +134 -0
  325. package/src/awaited.tsx +55 -0
  326. package/src/fileRoute.ts +313 -0
  327. package/src/headContentUtils.tsx +217 -0
  328. package/src/history.ts +9 -0
  329. package/src/index.dev.tsx +6 -0
  330. package/src/index.tsx +341 -0
  331. package/src/lazyRouteComponent.tsx +96 -0
  332. package/src/link.tsx +984 -0
  333. package/src/matchContext.tsx +8 -0
  334. package/src/not-found.tsx +43 -0
  335. package/src/renderRouteNotFound.tsx +35 -0
  336. package/src/route.tsx +740 -0
  337. package/src/router.ts +127 -0
  338. package/src/routerContext.tsx +4 -0
  339. package/src/scroll-restoration.tsx +45 -0
  340. package/src/ssr/RouterClient.tsx +22 -0
  341. package/src/ssr/RouterServer.tsx +9 -0
  342. package/src/ssr/client.ts +2 -0
  343. package/src/ssr/defaultRenderHandler.tsx +12 -0
  344. package/src/ssr/defaultStreamHandler.tsx +13 -0
  345. package/src/ssr/renderRouterToStream.tsx +90 -0
  346. package/src/ssr/renderRouterToString.tsx +36 -0
  347. package/src/ssr/serializer.ts +7 -0
  348. package/src/ssr/server.ts +6 -0
  349. package/src/structuralSharing.ts +47 -0
  350. package/src/typePrimitives.ts +84 -0
  351. package/src/useBlocker.tsx +320 -0
  352. package/src/useCanGoBack.ts +5 -0
  353. package/src/useLoaderData.tsx +91 -0
  354. package/src/useLoaderDeps.tsx +69 -0
  355. package/src/useLocation.tsx +52 -0
  356. package/src/useMatch.tsx +123 -0
  357. package/src/useNavigate.tsx +78 -0
  358. package/src/useParams.tsx +107 -0
  359. package/src/useRouteContext.ts +30 -0
  360. package/src/useRouter.tsx +25 -0
  361. package/src/useRouterState.tsx +86 -0
  362. package/src/useSearch.tsx +105 -0
  363. 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,5 @@
1
+ import { useRouterState } from './useRouterState'
2
+
3
+ export function useCanGoBack() {
4
+ return useRouterState({ select: (s) => s.location.state.__TSR_index !== 0 })
5
+ }
@@ -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
+ }
@@ -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
+ }