@tanstack/react-router 1.20.0 → 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 -33
  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 -33
  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 -62
  320. package/src/searchParams.ts +0 -79
@@ -1,7 +1,13 @@
1
1
  import * as React from 'react'
2
- import { Router } from './router'
2
+ import type { AnyRouter } from '@tanstack/router-core'
3
3
 
4
- let routerContext = React.createContext<Router<any>>(null!)
4
+ declare global {
5
+ interface Window {
6
+ __TSR_ROUTER_CONTEXT__?: React.Context<AnyRouter>
7
+ }
8
+ }
9
+
10
+ const routerContext = React.createContext<AnyRouter>(null!)
5
11
 
6
12
  export function getRouterContext() {
7
13
  if (typeof document === 'undefined') {
@@ -1,230 +1,29 @@
1
- import * as React from 'react'
2
-
3
- const useLayoutEffect =
4
- typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect
5
-
6
- import { ParsedLocation } from './location'
1
+ import {
2
+ defaultGetScrollRestorationKey,
3
+ restoreScroll,
4
+ storageKey,
5
+ } from '@tanstack/router-core'
7
6
  import { useRouter } from './useRouter'
8
- import { NonNullableUpdater, functionalUpdate } from './utils'
9
-
10
- const windowKey = 'window'
11
- const delimiter = '___'
12
-
13
- let weakScrolledElements = new WeakSet<any>()
14
-
15
- type CacheValue = Record<string, { scrollX: number; scrollY: number }>
16
- type CacheState = {
17
- cached: CacheValue
18
- next: CacheValue
19
- }
20
-
21
- type Cache = {
22
- state: CacheState
23
- set: (updater: NonNullableUpdater<CacheState>) => void
24
- }
25
-
26
- const sessionsStorage = typeof window !== 'undefined' && window.sessionStorage
27
-
28
- let cache: Cache = sessionsStorage
29
- ? (() => {
30
- const storageKey = 'tsr-scroll-restoration-v2'
31
-
32
- const state: CacheState = JSON.parse(
33
- window.sessionStorage.getItem(storageKey) || 'null',
34
- ) || { cached: {}, next: {} }
35
-
36
- return {
37
- state,
38
- set: (updater) => {
39
- cache.state = functionalUpdate(updater, cache.state)
40
- window.sessionStorage.setItem(storageKey, JSON.stringify(cache.state))
41
- },
42
- }
43
- })()
44
- : (undefined as any)
45
-
46
- export type ScrollRestorationOptions = {
47
- getKey?: (location: ParsedLocation) => string
48
- }
49
-
50
- const defaultGetKey = (location: ParsedLocation) => location.state.key!
51
-
52
- export function useScrollRestoration(options?: ScrollRestorationOptions) {
53
- const router = useRouter()
54
-
55
- useLayoutEffect(() => {
56
- const getKey = options?.getKey || defaultGetKey
57
-
58
- const { history } = window
59
- if (history.scrollRestoration) {
60
- history.scrollRestoration = 'manual'
61
- }
62
-
63
- const onScroll = (event: Event) => {
64
- if (weakScrolledElements.has(event.target)) return
65
- weakScrolledElements.add(event.target)
66
-
67
- let elementSelector = ''
68
-
69
- if (event.target === document || event.target === window) {
70
- elementSelector = windowKey
71
- } else {
72
- const attrId = (event.target as Element).getAttribute(
73
- 'data-scroll-restoration-id',
74
- )
7
+ import { ScriptOnce } from './ScriptOnce'
75
8
 
76
- if (attrId) {
77
- elementSelector = `[data-scroll-restoration-id="${attrId}"]`
78
- } else {
79
- elementSelector = getCssSelector(event.target)
80
- }
81
- }
82
-
83
- if (!cache.state.next[elementSelector]) {
84
- cache.set((c) => ({
85
- ...c,
86
- next: {
87
- ...c.next,
88
- [elementSelector]: {
89
- scrollX: NaN,
90
- scrollY: NaN,
91
- },
92
- },
93
- }))
94
- }
95
- }
96
-
97
- if (typeof document !== 'undefined') {
98
- document.addEventListener('scroll', onScroll, true)
99
- }
100
-
101
- const unsubOnBeforeLoad = router.subscribe('onBeforeLoad', (event) => {
102
- if (event.pathChanged) {
103
- const restoreKey = getKey(event.fromLocation)
104
- for (const elementSelector in cache.state.next) {
105
- const entry = cache.state.next[elementSelector]!
106
- if (elementSelector === windowKey) {
107
- entry.scrollX = window.scrollX || 0
108
- entry.scrollY = window.scrollY || 0
109
- } else if (elementSelector) {
110
- const element = document.querySelector(elementSelector)
111
- entry.scrollX = element?.scrollLeft || 0
112
- entry.scrollY = element?.scrollTop || 0
113
- }
114
-
115
- cache.set((c) => {
116
- const next = { ...c.next }
117
- delete next[elementSelector]
118
-
119
- return {
120
- ...c,
121
- next,
122
- cached: {
123
- ...c.cached,
124
- [[restoreKey, elementSelector].join(delimiter)]: entry,
125
- },
126
- }
127
- })
128
- }
129
- }
130
- })
131
-
132
- const unsubOnResolved = router.subscribe('onResolved', (event) => {
133
- if (event.pathChanged) {
134
- if (!router.resetNextScroll) {
135
- return
136
- }
137
-
138
- router.resetNextScroll = true
139
-
140
- const getKey = options?.getKey || defaultGetKey
141
-
142
- const restoreKey = getKey(event.toLocation)
143
- let windowRestored = false
144
-
145
- for (const cacheKey in cache.state.cached) {
146
- const entry = cache.state.cached[cacheKey]!
147
- const [key, elementSelector] = cacheKey.split(delimiter)
148
- if (key === restoreKey) {
149
- if (elementSelector === windowKey) {
150
- windowRestored = true
151
- window.scrollTo(entry.scrollX, entry.scrollY)
152
- } else if (elementSelector) {
153
- const element = document.querySelector(elementSelector)
154
- if (element) {
155
- element.scrollLeft = entry.scrollX
156
- element.scrollTop = entry.scrollY
157
- }
158
- }
159
- }
160
- }
161
-
162
- if (!windowRestored) {
163
- window.scrollTo(0, 0)
164
- }
165
-
166
- cache.set((c) => ({ ...c, next: {} }))
167
- weakScrolledElements = new WeakSet<any>()
168
- }
169
- })
170
-
171
- return () => {
172
- document.removeEventListener('scroll', onScroll)
173
- unsubOnBeforeLoad()
174
- unsubOnResolved()
175
- }
176
- }, [])
177
- }
178
-
179
- export function ScrollRestoration(props: ScrollRestorationOptions) {
180
- useScrollRestoration(props)
181
- return null
182
- }
183
-
184
- export function useElementScrollRestoration(
185
- options: (
186
- | {
187
- id: string
188
- getElement?: () => Element | undefined | null
189
- }
190
- | {
191
- id?: string
192
- getElement: () => Element | undefined | null
193
- }
194
- ) & {
195
- getKey?: (location: ParsedLocation) => string
196
- },
197
- ) {
9
+ export function ScrollRestoration() {
198
10
  const router = useRouter()
199
- const getKey = options?.getKey || defaultGetKey
200
-
201
- let elementSelector = ''
202
-
203
- if (options.id) {
204
- elementSelector = `[data-scroll-restoration-id="${options.id}"]`
205
- } else {
206
- const element = options.getElement?.()
207
- if (!element) {
208
- return
209
- }
210
- elementSelector = getCssSelector(element)
11
+ const getKey =
12
+ router.options.getScrollRestorationKey || defaultGetScrollRestorationKey
13
+ const userKey = getKey(router.latestLocation)
14
+ const resolvedKey =
15
+ userKey !== defaultGetScrollRestorationKey(router.latestLocation)
16
+ ? userKey
17
+ : null
18
+
19
+ if (!router.isScrollRestoring || !router.isServer) {
20
+ return null
211
21
  }
212
22
 
213
- const restoreKey = getKey(router.latestLocation)
214
- const cacheKey = [restoreKey, elementSelector].join(delimiter)
215
- return cache.state.cached[cacheKey]
216
- }
217
-
218
- function getCssSelector(el: any): string {
219
- let path = [],
220
- parent
221
- while ((parent = el.parentNode)) {
222
- path.unshift(
223
- `${el.tagName}:nth-child(${
224
- ([].indexOf as any).call(parent.children, el) + 1
225
- })`,
226
- )
227
- el = parent
228
- }
229
- return `${path.join(' > ')}`.toLowerCase()
23
+ return (
24
+ <ScriptOnce
25
+ children={`(${restoreScroll.toString()})(${JSON.stringify(storageKey)},${JSON.stringify(resolvedKey)}, undefined, true)`}
26
+ log={false}
27
+ />
28
+ )
230
29
  }
@@ -0,0 +1,7 @@
1
+ import type * as React from 'react'
2
+
3
+ declare module '@tanstack/router-core' {
4
+ export interface SerializerExtensions {
5
+ ReadableStream: React.JSX.Element
6
+ }
7
+ }
@@ -0,0 +1,47 @@
1
+ import type {
2
+ AnyRouter,
3
+ Constrain,
4
+ OptionalStructuralSharing,
5
+ ValidateJSON,
6
+ } from '@tanstack/router-core'
7
+
8
+ export type DefaultStructuralSharingEnabled<TRouter extends AnyRouter> =
9
+ boolean extends TRouter['options']['defaultStructuralSharing']
10
+ ? // for now, default to false.
11
+ // TODO in V2: default to true
12
+ false
13
+ : NonNullable<TRouter['options']['defaultStructuralSharing']>
14
+
15
+ export interface RequiredStructuralSharing<TStructuralSharing, TConstraint> {
16
+ readonly structuralSharing: Constrain<TStructuralSharing, TConstraint>
17
+ }
18
+
19
+ export type StructuralSharingOption<
20
+ TRouter extends AnyRouter,
21
+ TSelected,
22
+ TStructuralSharing,
23
+ > = unknown extends TSelected
24
+ ? OptionalStructuralSharing<TStructuralSharing, boolean>
25
+ : unknown extends TRouter['routeTree']
26
+ ? OptionalStructuralSharing<TStructuralSharing, boolean>
27
+ : TSelected extends ValidateJSON<TSelected>
28
+ ? OptionalStructuralSharing<TStructuralSharing, boolean>
29
+ : DefaultStructuralSharingEnabled<TRouter> extends true
30
+ ? RequiredStructuralSharing<TStructuralSharing, false>
31
+ : OptionalStructuralSharing<TStructuralSharing, false>
32
+
33
+ export type StructuralSharingEnabled<
34
+ TRouter extends AnyRouter,
35
+ TStructuralSharing,
36
+ > = boolean extends TStructuralSharing
37
+ ? DefaultStructuralSharingEnabled<TRouter>
38
+ : TStructuralSharing
39
+
40
+ export type ValidateSelected<
41
+ TRouter extends AnyRouter,
42
+ TSelected,
43
+ TStructuralSharing,
44
+ > =
45
+ StructuralSharingEnabled<TRouter, TStructuralSharing> extends true
46
+ ? ValidateJSON<TSelected>
47
+ : TSelected
@@ -0,0 +1,84 @@
1
+ import type {
2
+ AnyRouter,
3
+ Constrain,
4
+ InferFrom,
5
+ InferMaskFrom,
6
+ InferMaskTo,
7
+ InferSelected,
8
+ InferShouldThrow,
9
+ InferStrict,
10
+ InferTo,
11
+ RegisteredRouter,
12
+ } from '@tanstack/router-core'
13
+ import type { LinkComponentProps } from './link'
14
+ import type { UseParamsOptions } from './useParams'
15
+ import type { UseSearchOptions } from './useSearch'
16
+
17
+ export type ValidateLinkOptions<
18
+ TRouter extends AnyRouter = RegisteredRouter,
19
+ TOptions = unknown,
20
+ TDefaultFrom extends string = string,
21
+ TComp = 'a',
22
+ > = Constrain<
23
+ TOptions,
24
+ LinkComponentProps<
25
+ TComp,
26
+ TRouter,
27
+ InferFrom<TOptions, TDefaultFrom>,
28
+ InferTo<TOptions>,
29
+ InferMaskFrom<TOptions>,
30
+ InferMaskTo<TOptions>
31
+ >
32
+ >
33
+
34
+ /**
35
+ * @internal
36
+ */
37
+ export type InferStructuralSharing<TOptions> = TOptions extends {
38
+ structuralSharing: infer TStructuralSharing
39
+ }
40
+ ? TStructuralSharing
41
+ : unknown
42
+
43
+ export type ValidateUseSearchOptions<
44
+ TOptions,
45
+ TRouter extends AnyRouter = RegisteredRouter,
46
+ > = Constrain<
47
+ TOptions,
48
+ UseSearchOptions<
49
+ TRouter,
50
+ InferFrom<TOptions>,
51
+ InferStrict<TOptions>,
52
+ InferShouldThrow<TOptions>,
53
+ InferSelected<TOptions>,
54
+ InferStructuralSharing<TOptions>
55
+ >
56
+ >
57
+
58
+ export type ValidateUseParamsOptions<
59
+ TOptions,
60
+ TRouter extends AnyRouter = RegisteredRouter,
61
+ > = Constrain<
62
+ TOptions,
63
+ UseParamsOptions<
64
+ TRouter,
65
+ InferFrom<TOptions>,
66
+ InferStrict<TOptions>,
67
+ InferShouldThrow<TOptions>,
68
+ InferSelected<TOptions>,
69
+ InferSelected<TOptions>
70
+ >
71
+ >
72
+ export type ValidateLinkOptionsArray<
73
+ TRouter extends AnyRouter = RegisteredRouter,
74
+ TOptions extends ReadonlyArray<any> = ReadonlyArray<unknown>,
75
+ TDefaultFrom extends string = string,
76
+ TComp = 'a',
77
+ > = {
78
+ [K in keyof TOptions]: ValidateLinkOptions<
79
+ TRouter,
80
+ TOptions[K],
81
+ TDefaultFrom,
82
+ TComp
83
+ >
84
+ }