@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,62 @@
1
+ import { useMatch } from './useMatch'
2
+ import type { Accessor } from 'solid-js'
3
+ import type { AllContext, RouteById } from './routeInfo'
4
+ import type { AnyRouter, RegisteredRouter } from './router'
5
+ import type { StrictOrFrom } from './utils'
6
+ import type { Expand } from '@tanstack/router-core'
7
+
8
+ export interface UseRouteContextBaseOptions<
9
+ TRouter extends AnyRouter,
10
+ TFrom,
11
+ TStrict extends boolean,
12
+ TSelected,
13
+ > {
14
+ select?: (search: ResolveRouteContext<TRouter, TFrom, TStrict>) => TSelected
15
+ }
16
+
17
+ export type UseRouteContextOptions<
18
+ TRouter extends AnyRouter,
19
+ TFrom extends string | undefined,
20
+ TStrict extends boolean,
21
+ TSelected,
22
+ > = StrictOrFrom<TRouter, TFrom, TStrict> &
23
+ UseRouteContextBaseOptions<TRouter, TFrom, TStrict, TSelected>
24
+
25
+ export type ResolveRouteContext<
26
+ TRouter extends AnyRouter,
27
+ TFrom,
28
+ TStrict extends boolean,
29
+ > = TStrict extends false
30
+ ? AllContext<TRouter['routeTree']>
31
+ : Expand<RouteById<TRouter['routeTree'], TFrom>['types']['allContext']>
32
+
33
+ export type UseRouteContextResult<
34
+ TRouter extends AnyRouter,
35
+ TFrom,
36
+ TStrict extends boolean,
37
+ TSelected,
38
+ > = unknown extends TSelected
39
+ ? ResolveRouteContext<TRouter, TFrom, TStrict>
40
+ : TSelected
41
+
42
+ export type UseRouteContextRoute<out TFrom> = <
43
+ TRouter extends AnyRouter = RegisteredRouter,
44
+ TSelected = unknown,
45
+ >(
46
+ opts?: UseRouteContextBaseOptions<TRouter, TFrom, true, TSelected>,
47
+ ) => Accessor<UseRouteContextResult<TRouter, TFrom, true, TSelected>>
48
+
49
+ export function useRouteContext<
50
+ TRouter extends AnyRouter = RegisteredRouter,
51
+ const TFrom extends string | undefined = undefined,
52
+ TStrict extends boolean = true,
53
+ TSelected = unknown,
54
+ >(
55
+ opts: UseRouteContextOptions<TRouter, TFrom, TStrict, TSelected>,
56
+ ): Accessor<UseRouteContextResult<TRouter, TFrom, TStrict, TSelected>> {
57
+ return useMatch({
58
+ ...(opts as any),
59
+ select: (match) =>
60
+ opts.select ? opts.select(match.context) : match.context,
61
+ }) as any
62
+ }
@@ -0,0 +1,15 @@
1
+ import * as Solid from 'solid-js'
2
+ import warning from 'tiny-warning'
3
+ import { getRouterContext } from './routerContext'
4
+ import type { AnyRouter, RegisteredRouter } from './router'
5
+
6
+ export function useRouter<TRouter extends AnyRouter = RegisteredRouter>(opts?: {
7
+ warn?: boolean
8
+ }): TRouter {
9
+ const value = Solid.useContext(getRouterContext() as any)
10
+ warning(
11
+ !((opts?.warn ?? true) && !value),
12
+ 'useRouter must be used inside a <RouterProvider> component!',
13
+ )
14
+ return value as any
15
+ }
@@ -0,0 +1,32 @@
1
+ import { useStore } from '@tanstack/solid-store'
2
+ import { useRouter } from './useRouter'
3
+ import type { AnyRouter, RegisteredRouter, RouterState } from './router'
4
+ import type { Accessor } from 'solid-js'
5
+
6
+ export type UseRouterStateOptions<TRouter extends AnyRouter, TSelected> = {
7
+ router?: TRouter
8
+ select?: (state: RouterState<TRouter['routeTree']>) => TSelected
9
+ }
10
+
11
+ export type UseRouterStateResult<
12
+ TRouter extends AnyRouter,
13
+ TSelected,
14
+ > = unknown extends TSelected ? RouterState<TRouter['routeTree']> : TSelected
15
+
16
+ export function useRouterState<
17
+ TRouter extends AnyRouter = RegisteredRouter,
18
+ TSelected = unknown,
19
+ >(
20
+ opts?: UseRouterStateOptions<TRouter, TSelected>,
21
+ ): Accessor<UseRouterStateResult<TRouter, TSelected>> {
22
+ const contextRouter = useRouter<TRouter>({
23
+ warn: opts?.router === undefined,
24
+ })
25
+ const router = opts?.router || contextRouter
26
+
27
+ return useStore(router.__store, (state) => {
28
+ if (opts?.select) return opts.select(state)
29
+
30
+ return state
31
+ }) as Accessor<UseRouterStateResult<TRouter, TSelected>>
32
+ }
@@ -0,0 +1,84 @@
1
+ import { useMatch } from './useMatch'
2
+ import type { ThrowConstraint } from './useMatch'
3
+ import type { Accessor } from 'solid-js'
4
+ import type { FullSearchSchema, RouteById } from './routeInfo'
5
+ import type { AnyRouter, RegisteredRouter } from './router'
6
+ import type { StrictOrFrom } from './utils'
7
+ import type { Expand, ThrowOrOptional } from '@tanstack/router-core'
8
+
9
+ export interface UseSearchBaseOptions<
10
+ TRouter extends AnyRouter,
11
+ TFrom,
12
+ TStrict extends boolean,
13
+ TThrow extends boolean,
14
+ TSelected,
15
+ > {
16
+ select?: (state: ResolveSearch<TRouter, TFrom, TStrict>) => TSelected
17
+ shouldThrow?: TThrow
18
+ }
19
+
20
+ export type UseSearchOptions<
21
+ TRouter extends AnyRouter,
22
+ TFrom,
23
+ TStrict extends boolean,
24
+ TThrow extends boolean,
25
+ TSelected,
26
+ > = StrictOrFrom<TRouter, TFrom, TStrict> &
27
+ UseSearchBaseOptions<TRouter, TFrom, TStrict, TThrow, TSelected>
28
+
29
+ export type UseSearchResult<
30
+ TRouter extends AnyRouter,
31
+ TFrom,
32
+ TStrict extends boolean,
33
+ TSelected,
34
+ > = unknown extends TSelected
35
+ ? ResolveSearch<TRouter, TFrom, TStrict>
36
+ : TSelected
37
+
38
+ export type ResolveSearch<
39
+ TRouter extends AnyRouter,
40
+ TFrom,
41
+ TStrict extends boolean,
42
+ > = TStrict extends false
43
+ ? FullSearchSchema<TRouter['routeTree']>
44
+ : Expand<RouteById<TRouter['routeTree'], TFrom>['types']['fullSearchSchema']>
45
+
46
+ export type UseSearchRoute<out TFrom> = <
47
+ TRouter extends AnyRouter = RegisteredRouter,
48
+ TSelected = unknown,
49
+ >(
50
+ opts?: UseSearchBaseOptions<
51
+ TRouter,
52
+ TFrom,
53
+ /* TStrict */ true,
54
+ /* TThrow */ true,
55
+ TSelected
56
+ >,
57
+ ) => Accessor<UseSearchResult<TRouter, TFrom, true, TSelected>>
58
+
59
+ export function useSearch<
60
+ TRouter extends AnyRouter = RegisteredRouter,
61
+ const TFrom extends string | undefined = undefined,
62
+ TStrict extends boolean = true,
63
+ TThrow extends boolean = true,
64
+ TSelected = unknown,
65
+ >(
66
+ opts: UseSearchOptions<
67
+ TRouter,
68
+ TFrom,
69
+ TStrict,
70
+ ThrowConstraint<TStrict, TThrow>,
71
+ TSelected
72
+ >,
73
+ ): Accessor<
74
+ ThrowOrOptional<UseSearchResult<TRouter, TFrom, TStrict, TSelected>, TThrow>
75
+ > {
76
+ return useMatch({
77
+ from: opts.from!,
78
+ strict: opts.strict,
79
+ shouldThrow: opts.shouldThrow,
80
+ select: (match: any) => {
81
+ return opts.select ? opts.select(match.search) : match.search
82
+ },
83
+ }) as any
84
+ }
package/src/utils.ts ADDED
@@ -0,0 +1,96 @@
1
+ import * as Solid from 'solid-js'
2
+ import type { RouteIds } from './routeInfo'
3
+ import type { AnyRouter } from './router'
4
+ import type { ConstrainLiteral } from '@tanstack/router-core'
5
+
6
+ export type StrictOrFrom<
7
+ TRouter extends AnyRouter,
8
+ TFrom,
9
+ TStrict extends boolean = true,
10
+ > = TStrict extends false
11
+ ? {
12
+ from?: never
13
+ strict: TStrict
14
+ }
15
+ : {
16
+ from: ConstrainLiteral<TFrom, RouteIds<TRouter['routeTree']>>
17
+ strict?: TStrict
18
+ }
19
+
20
+ export const useLayoutEffect =
21
+ typeof window !== 'undefined' ? Solid.createRenderEffect : Solid.createEffect
22
+
23
+ export const usePrevious = (fn: () => boolean) => {
24
+ return Solid.createMemo(
25
+ (
26
+ prev: { current: boolean | null; previous: boolean | null } = {
27
+ current: null,
28
+ previous: null,
29
+ },
30
+ ) => {
31
+ const current = fn()
32
+
33
+ if (prev.current !== current) {
34
+ prev.previous = prev.current
35
+ prev.current = current
36
+ }
37
+
38
+ return prev
39
+ },
40
+ )
41
+ }
42
+
43
+ /**
44
+ * React hook to wrap `IntersectionObserver`.
45
+ *
46
+ * This hook will create an `IntersectionObserver` and observe the ref passed to it.
47
+ *
48
+ * When the intersection changes, the callback will be called with the `IntersectionObserverEntry`.
49
+ *
50
+ * @param ref - The ref to observe
51
+ * @param intersectionObserverOptions - The options to pass to the IntersectionObserver
52
+ * @param options - The options to pass to the hook
53
+ * @param callback - The callback to call when the intersection changes
54
+ * @returns The IntersectionObserver instance
55
+ * @example
56
+ * ```tsx
57
+ * const MyComponent = () => {
58
+ * const ref = React.useRef<HTMLDivElement>(null)
59
+ * useIntersectionObserver(
60
+ * ref,
61
+ * (entry) => { doSomething(entry) },
62
+ * { rootMargin: '10px' },
63
+ * { disabled: false }
64
+ * )
65
+ * return <div ref={ref} />
66
+ * ```
67
+ */
68
+ export function useIntersectionObserver<T extends Element>(
69
+ ref: Solid.Accessor<T | null>,
70
+ callback: (entry: IntersectionObserverEntry | undefined) => void,
71
+ intersectionObserverOptions: IntersectionObserverInit = {},
72
+ options: { disabled?: boolean } = {},
73
+ ): Solid.Accessor<IntersectionObserver | null> {
74
+ const isIntersectionObserverAvailable =
75
+ typeof IntersectionObserver === 'function'
76
+ let observerRef: IntersectionObserver | null = null
77
+
78
+ Solid.createEffect(() => {
79
+ const r = ref()
80
+ if (!r || !isIntersectionObserverAvailable || options.disabled) {
81
+ return
82
+ }
83
+
84
+ observerRef = new IntersectionObserver(([entry]) => {
85
+ callback(entry)
86
+ }, intersectionObserverOptions)
87
+
88
+ observerRef.observe(r)
89
+
90
+ Solid.onCleanup(() => {
91
+ observerRef?.disconnect()
92
+ })
93
+ })
94
+
95
+ return () => observerRef
96
+ }