@tanstack/solid-router 1.108.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 (271) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -0
  3. package/dist/cjs/Asset.cjs +59 -0
  4. package/dist/cjs/Asset.cjs.map +1 -0
  5. package/dist/cjs/Asset.d.cts +2 -0
  6. package/dist/cjs/CatchBoundary.cjs +92 -0
  7. package/dist/cjs/CatchBoundary.cjs.map +1 -0
  8. package/dist/cjs/CatchBoundary.d.cts +11 -0
  9. package/dist/cjs/HeadContent.cjs +129 -0
  10. package/dist/cjs/HeadContent.cjs.map +1 -0
  11. package/dist/cjs/HeadContent.d.cts +8 -0
  12. package/dist/cjs/Match.cjs +340 -0
  13. package/dist/cjs/Match.cjs.map +1 -0
  14. package/dist/cjs/Match.d.cts +8 -0
  15. package/dist/cjs/Matches.cjs +151 -0
  16. package/dist/cjs/Matches.cjs.map +1 -0
  17. package/dist/cjs/Matches.d.cts +69 -0
  18. package/dist/cjs/RouterProvider.cjs +45 -0
  19. package/dist/cjs/RouterProvider.cjs.map +1 -0
  20. package/dist/cjs/RouterProvider.d.cts +35 -0
  21. package/dist/cjs/SafeFragment.cjs +8 -0
  22. package/dist/cjs/SafeFragment.cjs.map +1 -0
  23. package/dist/cjs/SafeFragment.d.cts +1 -0
  24. package/dist/cjs/ScriptOnce.cjs +23 -0
  25. package/dist/cjs/ScriptOnce.cjs.map +1 -0
  26. package/dist/cjs/ScriptOnce.d.cts +5 -0
  27. package/dist/cjs/Scripts.cjs +48 -0
  28. package/dist/cjs/Scripts.cjs.map +1 -0
  29. package/dist/cjs/Scripts.d.cts +1 -0
  30. package/dist/cjs/ScrollRestoration.cjs +37 -0
  31. package/dist/cjs/ScrollRestoration.cjs.map +1 -0
  32. package/dist/cjs/ScrollRestoration.d.cts +15 -0
  33. package/dist/cjs/Transitioner.cjs +132 -0
  34. package/dist/cjs/Transitioner.cjs.map +1 -0
  35. package/dist/cjs/Transitioner.d.cts +1 -0
  36. package/dist/cjs/awaited.cjs +53 -0
  37. package/dist/cjs/awaited.cjs.map +1 -0
  38. package/dist/cjs/awaited.d.cts +11 -0
  39. package/dist/cjs/fileRoute.cjs +90 -0
  40. package/dist/cjs/fileRoute.cjs.map +1 -0
  41. package/dist/cjs/fileRoute.d.cts +58 -0
  42. package/dist/cjs/history.d.cts +8 -0
  43. package/dist/cjs/index.cjs +260 -0
  44. package/dist/cjs/index.cjs.map +1 -0
  45. package/dist/cjs/index.d.cts +53 -0
  46. package/dist/cjs/lazyRouteComponent.cjs +74 -0
  47. package/dist/cjs/lazyRouteComponent.cjs.map +1 -0
  48. package/dist/cjs/lazyRouteComponent.d.cts +7 -0
  49. package/dist/cjs/link.cjs +279 -0
  50. package/dist/cjs/link.cjs.map +1 -0
  51. package/dist/cjs/link.d.cts +113 -0
  52. package/dist/cjs/matchContext.cjs +25 -0
  53. package/dist/cjs/matchContext.cjs.map +1 -0
  54. package/dist/cjs/matchContext.d.cts +3 -0
  55. package/dist/cjs/not-found.cjs +51 -0
  56. package/dist/cjs/not-found.cjs.map +1 -0
  57. package/dist/cjs/not-found.d.cts +27 -0
  58. package/dist/cjs/redirects.cjs +29 -0
  59. package/dist/cjs/redirects.cjs.map +1 -0
  60. package/dist/cjs/redirects.d.cts +21 -0
  61. package/dist/cjs/renderRouteNotFound.cjs +23 -0
  62. package/dist/cjs/renderRouteNotFound.cjs.map +1 -0
  63. package/dist/cjs/renderRouteNotFound.d.cts +3 -0
  64. package/dist/cjs/route.cjs +233 -0
  65. package/dist/cjs/route.cjs.map +1 -0
  66. package/dist/cjs/route.d.cts +297 -0
  67. package/dist/cjs/routeInfo.d.cts +53 -0
  68. package/dist/cjs/router.cjs +1687 -0
  69. package/dist/cjs/router.cjs.map +1 -0
  70. package/dist/cjs/router.d.cts +555 -0
  71. package/dist/cjs/routerContext.cjs +33 -0
  72. package/dist/cjs/routerContext.cjs.map +1 -0
  73. package/dist/cjs/routerContext.d.cts +8 -0
  74. package/dist/cjs/scroll-restoration.cjs +183 -0
  75. package/dist/cjs/scroll-restoration.cjs.map +1 -0
  76. package/dist/cjs/scroll-restoration.d.cts +29 -0
  77. package/dist/cjs/typePrimitives.d.cts +66 -0
  78. package/dist/cjs/useBlocker.cjs +165 -0
  79. package/dist/cjs/useBlocker.cjs.map +1 -0
  80. package/dist/cjs/useBlocker.d.cts +68 -0
  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 +14 -0
  85. package/dist/cjs/useLoaderData.cjs.map +1 -0
  86. package/dist/cjs/useLoaderData.d.cts +13 -0
  87. package/dist/cjs/useLoaderDeps.cjs +17 -0
  88. package/dist/cjs/useLoaderDeps.cjs.map +1 -0
  89. package/dist/cjs/useLoaderDeps.d.cts +12 -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 +39 -0
  94. package/dist/cjs/useMatch.cjs.map +1 -0
  95. package/dist/cjs/useMatch.d.cts +14 -0
  96. package/dist/cjs/useNavigate.cjs +45 -0
  97. package/dist/cjs/useNavigate.cjs.map +1 -0
  98. package/dist/cjs/useNavigate.d.cts +7 -0
  99. package/dist/cjs/useParams.cjs +15 -0
  100. package/dist/cjs/useParams.cjs.map +1 -0
  101. package/dist/cjs/useParams.d.cts +15 -0
  102. package/dist/cjs/useRouteContext.cjs +11 -0
  103. package/dist/cjs/useRouteContext.cjs.map +1 -0
  104. package/dist/cjs/useRouteContext.d.cts +13 -0
  105. package/dist/cjs/useRouter.cjs +29 -0
  106. package/dist/cjs/useRouter.cjs.map +1 -0
  107. package/dist/cjs/useRouter.d.cts +4 -0
  108. package/dist/cjs/useRouterState.cjs +16 -0
  109. package/dist/cjs/useRouterState.cjs.map +1 -0
  110. package/dist/cjs/useRouterState.d.cts +8 -0
  111. package/dist/cjs/useSearch.cjs +15 -0
  112. package/dist/cjs/useSearch.cjs.map +1 -0
  113. package/dist/cjs/useSearch.d.cts +15 -0
  114. package/dist/cjs/utils.cjs +58 -0
  115. package/dist/cjs/utils.cjs.map +1 -0
  116. package/dist/cjs/utils.d.cts +44 -0
  117. package/dist/esm/Asset.d.ts +2 -0
  118. package/dist/esm/Asset.js +59 -0
  119. package/dist/esm/Asset.js.map +1 -0
  120. package/dist/esm/CatchBoundary.d.ts +11 -0
  121. package/dist/esm/CatchBoundary.js +75 -0
  122. package/dist/esm/CatchBoundary.js.map +1 -0
  123. package/dist/esm/HeadContent.d.ts +8 -0
  124. package/dist/esm/HeadContent.js +112 -0
  125. package/dist/esm/HeadContent.js.map +1 -0
  126. package/dist/esm/Match.d.ts +8 -0
  127. package/dist/esm/Match.js +323 -0
  128. package/dist/esm/Match.js.map +1 -0
  129. package/dist/esm/Matches.d.ts +69 -0
  130. package/dist/esm/Matches.js +134 -0
  131. package/dist/esm/Matches.js.map +1 -0
  132. package/dist/esm/RouterProvider.d.ts +35 -0
  133. package/dist/esm/RouterProvider.js +45 -0
  134. package/dist/esm/RouterProvider.js.map +1 -0
  135. package/dist/esm/SafeFragment.d.ts +1 -0
  136. package/dist/esm/SafeFragment.js +8 -0
  137. package/dist/esm/SafeFragment.js.map +1 -0
  138. package/dist/esm/ScriptOnce.d.ts +5 -0
  139. package/dist/esm/ScriptOnce.js +23 -0
  140. package/dist/esm/ScriptOnce.js.map +1 -0
  141. package/dist/esm/Scripts.d.ts +1 -0
  142. package/dist/esm/Scripts.js +48 -0
  143. package/dist/esm/Scripts.js.map +1 -0
  144. package/dist/esm/ScrollRestoration.d.ts +15 -0
  145. package/dist/esm/ScrollRestoration.js +37 -0
  146. package/dist/esm/ScrollRestoration.js.map +1 -0
  147. package/dist/esm/Transitioner.d.ts +1 -0
  148. package/dist/esm/Transitioner.js +115 -0
  149. package/dist/esm/Transitioner.js.map +1 -0
  150. package/dist/esm/awaited.d.ts +11 -0
  151. package/dist/esm/awaited.js +36 -0
  152. package/dist/esm/awaited.js.map +1 -0
  153. package/dist/esm/fileRoute.d.ts +58 -0
  154. package/dist/esm/fileRoute.js +90 -0
  155. package/dist/esm/fileRoute.js.map +1 -0
  156. package/dist/esm/history.d.ts +8 -0
  157. package/dist/esm/index.d.ts +53 -0
  158. package/dist/esm/index.js +149 -0
  159. package/dist/esm/index.js.map +1 -0
  160. package/dist/esm/lazyRouteComponent.d.ts +7 -0
  161. package/dist/esm/lazyRouteComponent.js +74 -0
  162. package/dist/esm/lazyRouteComponent.js.map +1 -0
  163. package/dist/esm/link.d.ts +113 -0
  164. package/dist/esm/link.js +262 -0
  165. package/dist/esm/link.js.map +1 -0
  166. package/dist/esm/matchContext.d.ts +3 -0
  167. package/dist/esm/matchContext.js +8 -0
  168. package/dist/esm/matchContext.js.map +1 -0
  169. package/dist/esm/not-found.d.ts +27 -0
  170. package/dist/esm/not-found.js +51 -0
  171. package/dist/esm/not-found.js.map +1 -0
  172. package/dist/esm/redirects.d.ts +21 -0
  173. package/dist/esm/redirects.js +29 -0
  174. package/dist/esm/redirects.js.map +1 -0
  175. package/dist/esm/renderRouteNotFound.d.ts +3 -0
  176. package/dist/esm/renderRouteNotFound.js +23 -0
  177. package/dist/esm/renderRouteNotFound.js.map +1 -0
  178. package/dist/esm/route.d.ts +297 -0
  179. package/dist/esm/route.js +233 -0
  180. package/dist/esm/route.js.map +1 -0
  181. package/dist/esm/routeInfo.d.ts +53 -0
  182. package/dist/esm/router.d.ts +555 -0
  183. package/dist/esm/router.js +1687 -0
  184. package/dist/esm/router.js.map +1 -0
  185. package/dist/esm/routerContext.d.ts +8 -0
  186. package/dist/esm/routerContext.js +16 -0
  187. package/dist/esm/routerContext.js.map +1 -0
  188. package/dist/esm/scroll-restoration.d.ts +29 -0
  189. package/dist/esm/scroll-restoration.js +183 -0
  190. package/dist/esm/scroll-restoration.js.map +1 -0
  191. package/dist/esm/typePrimitives.d.ts +66 -0
  192. package/dist/esm/useBlocker.d.ts +68 -0
  193. package/dist/esm/useBlocker.js +148 -0
  194. package/dist/esm/useBlocker.js.map +1 -0
  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 +13 -0
  199. package/dist/esm/useLoaderData.js +14 -0
  200. package/dist/esm/useLoaderData.js.map +1 -0
  201. package/dist/esm/useLoaderDeps.d.ts +12 -0
  202. package/dist/esm/useLoaderDeps.js +17 -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 +14 -0
  208. package/dist/esm/useMatch.js +22 -0
  209. package/dist/esm/useMatch.js.map +1 -0
  210. package/dist/esm/useNavigate.d.ts +7 -0
  211. package/dist/esm/useNavigate.js +28 -0
  212. package/dist/esm/useNavigate.js.map +1 -0
  213. package/dist/esm/useParams.d.ts +15 -0
  214. package/dist/esm/useParams.js +15 -0
  215. package/dist/esm/useParams.js.map +1 -0
  216. package/dist/esm/useRouteContext.d.ts +13 -0
  217. package/dist/esm/useRouteContext.js +11 -0
  218. package/dist/esm/useRouteContext.js.map +1 -0
  219. package/dist/esm/useRouter.d.ts +4 -0
  220. package/dist/esm/useRouter.js +12 -0
  221. package/dist/esm/useRouter.js.map +1 -0
  222. package/dist/esm/useRouterState.d.ts +8 -0
  223. package/dist/esm/useRouterState.js +16 -0
  224. package/dist/esm/useRouterState.js.map +1 -0
  225. package/dist/esm/useSearch.d.ts +15 -0
  226. package/dist/esm/useSearch.js +15 -0
  227. package/dist/esm/useSearch.js.map +1 -0
  228. package/dist/esm/utils.d.ts +44 -0
  229. package/dist/esm/utils.js +41 -0
  230. package/dist/esm/utils.js.map +1 -0
  231. package/package.json +75 -0
  232. package/src/Asset.tsx +23 -0
  233. package/src/CatchBoundary.tsx +78 -0
  234. package/src/HeadContent.tsx +146 -0
  235. package/src/Match.tsx +356 -0
  236. package/src/Matches.tsx +348 -0
  237. package/src/RouterProvider.tsx +130 -0
  238. package/src/SafeFragment.tsx +3 -0
  239. package/src/ScriptOnce.tsx +30 -0
  240. package/src/Scripts.tsx +65 -0
  241. package/src/ScrollRestoration.tsx +65 -0
  242. package/src/Transitioner.tsx +152 -0
  243. package/src/awaited.tsx +49 -0
  244. package/src/fileRoute.ts +274 -0
  245. package/src/history.ts +9 -0
  246. package/src/index.tsx +359 -0
  247. package/src/lazyRouteComponent.tsx +114 -0
  248. package/src/link.tsx +1002 -0
  249. package/src/matchContext.tsx +10 -0
  250. package/src/not-found.tsx +69 -0
  251. package/src/redirects.ts +71 -0
  252. package/src/renderRouteNotFound.tsx +27 -0
  253. package/src/route.ts +1477 -0
  254. package/src/routeInfo.ts +239 -0
  255. package/src/router.ts +3066 -0
  256. package/src/routerContext.tsx +26 -0
  257. package/src/scroll-restoration.tsx +337 -0
  258. package/src/typePrimitives.ts +195 -0
  259. package/src/useBlocker.tsx +298 -0
  260. package/src/useCanGoBack.ts +5 -0
  261. package/src/useLoaderData.tsx +64 -0
  262. package/src/useLoaderDeps.tsx +52 -0
  263. package/src/useLocation.tsx +26 -0
  264. package/src/useMatch.tsx +96 -0
  265. package/src/useNavigate.tsx +61 -0
  266. package/src/useParams.tsx +83 -0
  267. package/src/useRouteContext.ts +62 -0
  268. package/src/useRouter.tsx +15 -0
  269. package/src/useRouterState.tsx +32 -0
  270. package/src/useSearch.tsx +84 -0
  271. package/src/utils.ts +96 -0
@@ -0,0 +1,130 @@
1
+ import { Matches } from './Matches'
2
+ import { getRouterContext } from './routerContext'
3
+ import type * as Solid from 'solid-js'
4
+ import type { NavigateOptions, ToOptions } from './link'
5
+ import type {
6
+ ParsedLocation,
7
+ ViewTransitionOptions,
8
+ } from '@tanstack/router-core'
9
+ import type { RoutePaths } from './routeInfo'
10
+ import type {
11
+ AnyRouter,
12
+ RegisteredRouter,
13
+ Router,
14
+ RouterOptions,
15
+ } from './router'
16
+
17
+ export interface CommitLocationOptions {
18
+ replace?: boolean
19
+ resetScroll?: boolean
20
+ hashScrollIntoView?: boolean | ScrollIntoViewOptions
21
+ viewTransition?: boolean | ViewTransitionOptions
22
+ /**
23
+ * @deprecated All navigations use Solid transitions under the hood now
24
+ **/
25
+ startTransition?: boolean
26
+ ignoreBlocker?: boolean
27
+ }
28
+
29
+ export interface MatchLocation {
30
+ to?: string | number | null
31
+ fuzzy?: boolean
32
+ caseSensitive?: boolean
33
+ from?: string
34
+ }
35
+
36
+ export type NavigateFn = <
37
+ TRouter extends RegisteredRouter,
38
+ TTo extends string | undefined,
39
+ TFrom extends RoutePaths<TRouter['routeTree']> | string = string,
40
+ TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,
41
+ TMaskTo extends string = '',
42
+ >(
43
+ opts: NavigateOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,
44
+ ) => Promise<void> | void
45
+
46
+ export type BuildLocationFn = <
47
+ TRouter extends RegisteredRouter,
48
+ TTo extends string | undefined,
49
+ TFrom extends RoutePaths<TRouter['routeTree']> | string = string,
50
+ TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,
51
+ TMaskTo extends string = '',
52
+ >(
53
+ opts: ToOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> & {
54
+ leaveParams?: boolean
55
+ _includeValidateSearch?: boolean
56
+ },
57
+ ) => ParsedLocation
58
+
59
+ export function RouterContextProvider<
60
+ TRouter extends AnyRouter = RegisteredRouter,
61
+ TDehydrated extends Record<string, any> = Record<string, any>,
62
+ >({
63
+ router,
64
+ children,
65
+ ...rest
66
+ }: RouterProps<TRouter, TDehydrated> & {
67
+ children: () => Solid.JSX.Element
68
+ }) {
69
+ // Allow the router to update options on the router instance
70
+ router.update({
71
+ ...router.options,
72
+ ...rest,
73
+ context: {
74
+ ...router.options.context,
75
+ ...rest.context,
76
+ },
77
+ } as any)
78
+
79
+ const routerContext = getRouterContext()
80
+
81
+ const provider = (
82
+ <routerContext.Provider value={router as AnyRouter}>
83
+ {children()}
84
+ </routerContext.Provider>
85
+ )
86
+
87
+ if (router.options.Wrap) {
88
+ return <router.options.Wrap>{provider}</router.options.Wrap>
89
+ }
90
+
91
+ return provider
92
+ }
93
+
94
+ export function RouterProvider<
95
+ TRouter extends AnyRouter = RegisteredRouter,
96
+ TDehydrated extends Record<string, any> = Record<string, any>,
97
+ >({ router, ...rest }: RouterProps<TRouter, TDehydrated>) {
98
+ return (
99
+ <RouterContextProvider router={router} {...rest}>
100
+ {() => <Matches />}
101
+ </RouterContextProvider>
102
+ )
103
+ }
104
+
105
+ export type RouterProps<
106
+ TRouter extends AnyRouter = RegisteredRouter,
107
+ TDehydrated extends Record<string, any> = Record<string, any>,
108
+ > = Omit<
109
+ RouterOptions<
110
+ TRouter['routeTree'],
111
+ NonNullable<TRouter['options']['trailingSlash']>,
112
+ TRouter['history'],
113
+ TDehydrated
114
+ >,
115
+ 'context'
116
+ > & {
117
+ router: Router<
118
+ TRouter['routeTree'],
119
+ NonNullable<TRouter['options']['trailingSlash']>,
120
+ TRouter['history']
121
+ >
122
+ context?: Partial<
123
+ RouterOptions<
124
+ TRouter['routeTree'],
125
+ NonNullable<TRouter['options']['trailingSlash']>,
126
+ TRouter['history'],
127
+ TDehydrated
128
+ >['context']
129
+ >
130
+ }
@@ -0,0 +1,3 @@
1
+ export function SafeFragment(props: any) {
2
+ return <>{props.children}</>
3
+ }
@@ -0,0 +1,30 @@
1
+ import jsesc from 'jsesc'
2
+
3
+ export function ScriptOnce({
4
+ children,
5
+ log,
6
+ }: {
7
+ children: string
8
+ log?: boolean
9
+ sync?: boolean
10
+ }) {
11
+ if (typeof document !== 'undefined') {
12
+ return null
13
+ }
14
+
15
+ return (
16
+ <script
17
+ class="tsr-once"
18
+ innerHTML={[
19
+ children,
20
+ (log ?? true) && process.env.NODE_ENV === 'development'
21
+ ? `console.info(\`Injected From Server:
22
+ ${jsesc(children.toString(), { quotes: 'backtick' })}\`)`
23
+ : '',
24
+ 'if (typeof __TSR_SSR__ !== "undefined") __TSR_SSR__.cleanScripts()',
25
+ ]
26
+ .filter(Boolean)
27
+ .join('\n')}
28
+ />
29
+ )
30
+ }
@@ -0,0 +1,65 @@
1
+ import { Asset } from './Asset'
2
+ import { useRouterState } from './useRouterState'
3
+ import { useRouter } from './useRouter'
4
+ import type { RouterManagedTag } from '@tanstack/router-core'
5
+
6
+ export const Scripts = () => {
7
+ const router = useRouter()
8
+
9
+ const assetScripts = useRouterState({
10
+ select: (state) => {
11
+ const assetScripts: Array<RouterManagedTag> = []
12
+ const manifest = router.ssr?.manifest
13
+
14
+ if (!manifest) {
15
+ return []
16
+ }
17
+
18
+ state.matches
19
+ .map((match) => router.looseRoutesById[match.routeId]!)
20
+ .forEach((route) =>
21
+ manifest.routes[route.id]?.assets
22
+ ?.filter((d) => d.tag === 'script')
23
+ .forEach((asset) => {
24
+ assetScripts.push({
25
+ tag: 'script',
26
+ attrs: asset.attrs,
27
+ children: asset.children,
28
+ } as any)
29
+ }),
30
+ )
31
+
32
+ return assetScripts
33
+ },
34
+ })
35
+
36
+ const scripts = useRouterState({
37
+ select: (state) => ({
38
+ scripts: (
39
+ state.matches
40
+ .map((match) => match.scripts!)
41
+ .flat(1)
42
+ .filter(Boolean) as Array<RouterManagedTag>
43
+ ).map(({ children, ...script }) => ({
44
+ tag: 'script',
45
+ attrs: {
46
+ ...script,
47
+ },
48
+ children,
49
+ })),
50
+ }),
51
+ })
52
+
53
+ const allScripts = [
54
+ ...scripts().scripts,
55
+ ...assetScripts(),
56
+ ] as Array<RouterManagedTag>
57
+
58
+ return (
59
+ <>
60
+ {allScripts.map((asset, i) => (
61
+ <Asset {...asset} />
62
+ ))}
63
+ </>
64
+ )
65
+ }
@@ -0,0 +1,65 @@
1
+ import { useRouter } from './useRouter'
2
+ import {
3
+ defaultGetScrollRestorationKey,
4
+ getCssSelector,
5
+ scrollRestorationCache,
6
+ setupScrollRestoration,
7
+ } from './scroll-restoration'
8
+ import type { ScrollRestorationOptions } from './scroll-restoration'
9
+ import type { ParsedLocation } from '@tanstack/router-core'
10
+
11
+ function useScrollRestoration() {
12
+ const router = useRouter()
13
+ setupScrollRestoration(router, true)
14
+ }
15
+
16
+ /**
17
+ * @deprecated use createRouter's `scrollRestoration` option instead
18
+ */
19
+ export function ScrollRestoration(_props: ScrollRestorationOptions) {
20
+ useScrollRestoration()
21
+
22
+ if (process.env.NODE_ENV === 'development') {
23
+ console.warn(
24
+ "The ScrollRestoration component is deprecated. Use createRouter's `scrollRestoration` option instead.",
25
+ )
26
+ }
27
+
28
+ return null
29
+ }
30
+
31
+ export function useElementScrollRestoration(
32
+ options: (
33
+ | {
34
+ id: string
35
+ getElement?: () => Element | undefined | null
36
+ }
37
+ | {
38
+ id?: string
39
+ getElement: () => Element | undefined | null
40
+ }
41
+ ) & {
42
+ getKey?: (location: ParsedLocation) => string
43
+ },
44
+ ) {
45
+ useScrollRestoration()
46
+
47
+ const router = useRouter()
48
+ const getKey = options.getKey || defaultGetScrollRestorationKey
49
+
50
+ let elementSelector = ''
51
+
52
+ if (options.id) {
53
+ elementSelector = `[data-scroll-restoration-id="${options.id}"]`
54
+ } else {
55
+ const element = options.getElement?.()
56
+ if (!element) {
57
+ return
58
+ }
59
+ elementSelector = getCssSelector(element)
60
+ }
61
+
62
+ const restoreKey = getKey(router.latestLocation)
63
+ const byKey = scrollRestorationCache.state[restoreKey]
64
+ return byKey?.[elementSelector]
65
+ }
@@ -0,0 +1,152 @@
1
+ import * as Solid from 'solid-js'
2
+ import { getLocationChangeInfo, trimPathRight } from '@tanstack/router-core'
3
+ import { useRouter } from './useRouter'
4
+ import { useRouterState } from './useRouterState'
5
+ import { usePrevious } from './utils'
6
+
7
+ export function Transitioner() {
8
+ const router = useRouter()
9
+ let mountLoadForRouter = { router, mounted: false }
10
+ const isLoading = useRouterState({
11
+ select: ({ isLoading }) => isLoading,
12
+ })
13
+
14
+ const [isTransitioning, setIsTransitioning] = Solid.createSignal(false)
15
+ // Track pending state changes
16
+ const hasPendingMatches = useRouterState({
17
+ select: (s) => s.matches.some((d) => d.status === 'pending'),
18
+ })
19
+
20
+ const previousIsLoading = usePrevious(isLoading)
21
+
22
+ const isAnyPending = () =>
23
+ isLoading() || isTransitioning() || hasPendingMatches()
24
+ const previousIsAnyPending = usePrevious(isAnyPending)
25
+
26
+ const isPagePending = () => isLoading() || hasPendingMatches()
27
+ const previousIsPagePending = usePrevious(isPagePending)
28
+
29
+ if (!router.isServer) {
30
+ router.startSolidTransition = (fn: () => void) => {
31
+ setIsTransitioning(true)
32
+ fn()
33
+ setIsTransitioning(false)
34
+ }
35
+ }
36
+
37
+ // Subscribe to location changes
38
+ // and try to load the new location
39
+ Solid.onMount(() => {
40
+ const unsub = router.history.subscribe(router.load)
41
+
42
+ const nextLocation = router.buildLocation({
43
+ to: router.latestLocation.pathname,
44
+ search: true,
45
+ params: true,
46
+ hash: true,
47
+ state: true,
48
+ _includeValidateSearch: true,
49
+ })
50
+
51
+ if (
52
+ trimPathRight(router.latestLocation.href) !==
53
+ trimPathRight(nextLocation.href)
54
+ ) {
55
+ router.commitLocation({ ...nextLocation, replace: true })
56
+ }
57
+
58
+ Solid.onCleanup(() => {
59
+ unsub()
60
+ })
61
+ })
62
+
63
+ // Try to load the initial location
64
+ Solid.createRenderEffect(() => {
65
+ Solid.untrack(() => {
66
+ if (
67
+ (typeof window !== 'undefined' && router.clientSsr) ||
68
+ (mountLoadForRouter.router === router && mountLoadForRouter.mounted)
69
+ ) {
70
+ return
71
+ }
72
+ mountLoadForRouter = { router, mounted: true }
73
+ const tryLoad = async () => {
74
+ try {
75
+ await router.load()
76
+ } catch (err) {
77
+ console.error(err)
78
+ }
79
+ }
80
+ tryLoad()
81
+ })
82
+ })
83
+
84
+ Solid.createRenderEffect(
85
+ Solid.on(
86
+ [previousIsLoading, isLoading],
87
+ ([previousIsLoading, isLoading]) => {
88
+ if (previousIsLoading.previous && !isLoading) {
89
+ router.emit({
90
+ type: 'onLoad',
91
+ ...getLocationChangeInfo(router.state),
92
+ })
93
+ }
94
+ },
95
+ ),
96
+ )
97
+ Solid.createRenderEffect(
98
+ Solid.on(
99
+ [isPagePending, previousIsPagePending],
100
+ ([isPagePending, previousIsPagePending]) => {
101
+ // emit onBeforeRouteMount
102
+ if (previousIsPagePending.previous && !isPagePending) {
103
+ router.emit({
104
+ type: 'onBeforeRouteMount',
105
+ ...getLocationChangeInfo(router.state),
106
+ })
107
+ }
108
+ },
109
+ ),
110
+ )
111
+
112
+ Solid.createRenderEffect(
113
+ Solid.on(
114
+ [isAnyPending, previousIsAnyPending],
115
+ ([isAnyPending, previousIsAnyPending]) => {
116
+ // The router was pending and now it's not
117
+ if (previousIsAnyPending.previous && !isAnyPending) {
118
+ router.emit({
119
+ type: 'onResolved',
120
+ ...getLocationChangeInfo(router.state),
121
+ })
122
+
123
+ router.__store.setState((s) => ({
124
+ ...s,
125
+ status: 'idle',
126
+ resolvedLocation: s.location,
127
+ }))
128
+
129
+ if (
130
+ typeof document !== 'undefined' &&
131
+ (document as any).querySelector
132
+ ) {
133
+ const hashScrollIntoViewOptions =
134
+ router.state.location.state.__hashScrollIntoViewOptions ?? true
135
+
136
+ if (
137
+ hashScrollIntoViewOptions &&
138
+ router.state.location.hash !== ''
139
+ ) {
140
+ const el = document.getElementById(router.state.location.hash)
141
+ if (el) {
142
+ el.scrollIntoView(hashScrollIntoViewOptions)
143
+ }
144
+ }
145
+ }
146
+ }
147
+ },
148
+ ),
149
+ )
150
+
151
+ return null
152
+ }
@@ -0,0 +1,49 @@
1
+ import * as Solid from 'solid-js'
2
+
3
+ import { TSR_DEFERRED_PROMISE, defer } from '@tanstack/router-core'
4
+ import type { DeferredPromise } from '@tanstack/router-core'
5
+ import type { SolidNode } from './route'
6
+
7
+ export type AwaitOptions<T> = {
8
+ promise: Promise<T>
9
+ }
10
+
11
+ export function useAwaited<T>({
12
+ promise: _promise,
13
+ }: AwaitOptions<T>): [T, DeferredPromise<T>] {
14
+ const promise = defer(_promise)
15
+
16
+ if (promise[TSR_DEFERRED_PROMISE].status === 'pending') {
17
+ throw promise
18
+ }
19
+
20
+ if (promise[TSR_DEFERRED_PROMISE].status === 'error') {
21
+ throw promise[TSR_DEFERRED_PROMISE].error
22
+ }
23
+
24
+ return [promise[TSR_DEFERRED_PROMISE].data, promise]
25
+ }
26
+
27
+ export function Await<T>(
28
+ props: AwaitOptions<T> & {
29
+ fallback?: SolidNode
30
+ children: (result: T) => SolidNode
31
+ },
32
+ ) {
33
+ const inner = <AwaitInner {...props} />
34
+ if (props.fallback) {
35
+ return <Solid.Suspense fallback={props.fallback}>{inner}</Solid.Suspense>
36
+ }
37
+ return inner
38
+ }
39
+
40
+ function AwaitInner<T>(
41
+ props: AwaitOptions<T> & {
42
+ fallback?: SolidNode
43
+ children: (result: T) => SolidNode
44
+ },
45
+ ): Solid.JSX.Element {
46
+ const [data] = useAwaited(props)
47
+
48
+ return props.children(data)
49
+ }