@tanstack/solid-router 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 (385) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -0
  3. package/dist/cjs/Asset.cjs +49 -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/ClientOnly.cjs +36 -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 +146 -0
  13. package/dist/cjs/HeadContent.cjs.map +1 -0
  14. package/dist/cjs/HeadContent.d.cts +8 -0
  15. package/dist/cjs/Match.cjs +339 -0
  16. package/dist/cjs/Match.cjs.map +1 -0
  17. package/dist/cjs/Match.d.cts +8 -0
  18. package/dist/cjs/Matches.cjs +151 -0
  19. package/dist/cjs/Matches.cjs.map +1 -0
  20. package/dist/cjs/Matches.d.cts +24 -0
  21. package/dist/cjs/RouterProvider.cjs +45 -0
  22. package/dist/cjs/RouterProvider.cjs.map +1 -0
  23. package/dist/cjs/RouterProvider.d.cts +10 -0
  24. package/dist/cjs/SafeFragment.cjs +8 -0
  25. package/dist/cjs/SafeFragment.cjs.map +1 -0
  26. package/dist/cjs/SafeFragment.d.cts +1 -0
  27. package/dist/cjs/ScriptOnce.cjs +23 -0
  28. package/dist/cjs/ScriptOnce.cjs.map +1 -0
  29. package/dist/cjs/ScriptOnce.d.cts +5 -0
  30. package/dist/cjs/Scripts.cjs +48 -0
  31. package/dist/cjs/Scripts.cjs.map +1 -0
  32. package/dist/cjs/Scripts.d.cts +1 -0
  33. package/dist/cjs/ScrollRestoration.cjs +37 -0
  34. package/dist/cjs/ScrollRestoration.cjs.map +1 -0
  35. package/dist/cjs/ScrollRestoration.d.cts +14 -0
  36. package/dist/cjs/Transitioner.cjs +124 -0
  37. package/dist/cjs/Transitioner.cjs.map +1 -0
  38. package/dist/cjs/Transitioner.d.cts +1 -0
  39. package/dist/cjs/awaited.cjs +49 -0
  40. package/dist/cjs/awaited.cjs.map +1 -0
  41. package/dist/cjs/awaited.d.cts +11 -0
  42. package/dist/cjs/fileRoute.cjs +103 -0
  43. package/dist/cjs/fileRoute.cjs.map +1 -0
  44. package/dist/cjs/fileRoute.d.cts +54 -0
  45. package/dist/cjs/history.d.cts +8 -0
  46. package/dist/cjs/index.cjs +289 -0
  47. package/dist/cjs/index.cjs.map +1 -0
  48. package/dist/cjs/index.d.cts +52 -0
  49. package/dist/cjs/lazyRouteComponent.cjs +73 -0
  50. package/dist/cjs/lazyRouteComponent.cjs.map +1 -0
  51. package/dist/cjs/lazyRouteComponent.d.cts +2 -0
  52. package/dist/cjs/link.cjs +278 -0
  53. package/dist/cjs/link.cjs.map +1 -0
  54. package/dist/cjs/link.d.cts +44 -0
  55. package/dist/cjs/matchContext.cjs +25 -0
  56. package/dist/cjs/matchContext.cjs.map +1 -0
  57. package/dist/cjs/matchContext.d.cts +3 -0
  58. package/dist/cjs/not-found.cjs +42 -0
  59. package/dist/cjs/not-found.cjs.map +1 -0
  60. package/dist/cjs/not-found.d.cts +8 -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 +2 -0
  64. package/dist/cjs/route.cjs +236 -0
  65. package/dist/cjs/route.cjs.map +1 -0
  66. package/dist/cjs/route.d.cts +95 -0
  67. package/dist/cjs/router.cjs +22 -0
  68. package/dist/cjs/router.cjs.map +1 -0
  69. package/dist/cjs/router.d.cts +69 -0
  70. package/dist/cjs/routerContext.cjs +33 -0
  71. package/dist/cjs/routerContext.cjs.map +1 -0
  72. package/dist/cjs/routerContext.d.cts +8 -0
  73. package/dist/cjs/scroll-restoration.cjs +23 -0
  74. package/dist/cjs/scroll-restoration.cjs.map +1 -0
  75. package/dist/cjs/scroll-restoration.d.cts +1 -0
  76. package/dist/cjs/typePrimitives.d.cts +10 -0
  77. package/dist/cjs/useBlocker.cjs +165 -0
  78. package/dist/cjs/useBlocker.cjs.map +1 -0
  79. package/dist/cjs/useBlocker.d.cts +67 -0
  80. package/dist/cjs/useCanGoBack.cjs +8 -0
  81. package/dist/cjs/useCanGoBack.cjs.map +1 -0
  82. package/dist/cjs/useCanGoBack.d.cts +1 -0
  83. package/dist/cjs/useLoaderData.cjs +14 -0
  84. package/dist/cjs/useLoaderData.cjs.map +1 -0
  85. package/dist/cjs/useLoaderData.d.cts +8 -0
  86. package/dist/cjs/useLoaderDeps.cjs +17 -0
  87. package/dist/cjs/useLoaderDeps.cjs.map +1 -0
  88. package/dist/cjs/useLoaderDeps.d.cts +7 -0
  89. package/dist/cjs/useLocation.cjs +10 -0
  90. package/dist/cjs/useLocation.cjs.map +1 -0
  91. package/dist/cjs/useLocation.d.cts +7 -0
  92. package/dist/cjs/useMatch.cjs +39 -0
  93. package/dist/cjs/useMatch.cjs.map +1 -0
  94. package/dist/cjs/useMatch.d.cts +10 -0
  95. package/dist/cjs/useNavigate.cjs +46 -0
  96. package/dist/cjs/useNavigate.cjs.map +1 -0
  97. package/dist/cjs/useNavigate.d.cts +5 -0
  98. package/dist/cjs/useParams.cjs +15 -0
  99. package/dist/cjs/useParams.cjs.map +1 -0
  100. package/dist/cjs/useParams.d.cts +9 -0
  101. package/dist/cjs/useRouteContext.cjs +11 -0
  102. package/dist/cjs/useRouteContext.cjs.map +1 -0
  103. package/dist/cjs/useRouteContext.d.cts +4 -0
  104. package/dist/cjs/useRouter.cjs +29 -0
  105. package/dist/cjs/useRouter.cjs.map +1 -0
  106. package/dist/cjs/useRouter.d.cts +4 -0
  107. package/dist/cjs/useRouterState.cjs +16 -0
  108. package/dist/cjs/useRouterState.cjs.map +1 -0
  109. package/dist/cjs/useRouterState.d.cts +8 -0
  110. package/dist/cjs/useSearch.cjs +15 -0
  111. package/dist/cjs/useSearch.cjs.map +1 -0
  112. package/dist/cjs/useSearch.d.cts +9 -0
  113. package/dist/cjs/utils.cjs +58 -0
  114. package/dist/cjs/utils.cjs.map +1 -0
  115. package/dist/cjs/utils.d.cts +34 -0
  116. package/dist/esm/Asset.d.ts +2 -0
  117. package/dist/esm/Asset.js +49 -0
  118. package/dist/esm/Asset.js.map +1 -0
  119. package/dist/esm/CatchBoundary.d.ts +11 -0
  120. package/dist/esm/CatchBoundary.js +75 -0
  121. package/dist/esm/CatchBoundary.js.map +1 -0
  122. package/dist/esm/ClientOnly.d.ts +49 -0
  123. package/dist/esm/ClientOnly.js +19 -0
  124. package/dist/esm/ClientOnly.js.map +1 -0
  125. package/dist/esm/HeadContent.d.ts +8 -0
  126. package/dist/esm/HeadContent.js +129 -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 +322 -0
  130. package/dist/esm/Match.js.map +1 -0
  131. package/dist/esm/Matches.d.ts +24 -0
  132. package/dist/esm/Matches.js +134 -0
  133. package/dist/esm/Matches.js.map +1 -0
  134. package/dist/esm/RouterProvider.d.ts +10 -0
  135. package/dist/esm/RouterProvider.js +45 -0
  136. package/dist/esm/RouterProvider.js.map +1 -0
  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 +23 -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 +48 -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 +37 -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 +107 -0
  151. package/dist/esm/Transitioner.js.map +1 -0
  152. package/dist/esm/awaited.d.ts +11 -0
  153. package/dist/esm/awaited.js +32 -0
  154. package/dist/esm/awaited.js.map +1 -0
  155. package/dist/esm/fileRoute.d.ts +54 -0
  156. package/dist/esm/fileRoute.js +103 -0
  157. package/dist/esm/fileRoute.js.map +1 -0
  158. package/dist/esm/history.d.ts +8 -0
  159. package/dist/esm/index.d.ts +52 -0
  160. package/dist/esm/index.js +151 -0
  161. package/dist/esm/index.js.map +1 -0
  162. package/dist/esm/lazyRouteComponent.d.ts +2 -0
  163. package/dist/esm/lazyRouteComponent.js +73 -0
  164. package/dist/esm/lazyRouteComponent.js.map +1 -0
  165. package/dist/esm/link.d.ts +44 -0
  166. package/dist/esm/link.js +261 -0
  167. package/dist/esm/link.js.map +1 -0
  168. package/dist/esm/matchContext.d.ts +3 -0
  169. package/dist/esm/matchContext.js +8 -0
  170. package/dist/esm/matchContext.js.map +1 -0
  171. package/dist/esm/not-found.d.ts +8 -0
  172. package/dist/esm/not-found.js +42 -0
  173. package/dist/esm/not-found.js.map +1 -0
  174. package/dist/esm/renderRouteNotFound.d.ts +2 -0
  175. package/dist/esm/renderRouteNotFound.js +23 -0
  176. package/dist/esm/renderRouteNotFound.js.map +1 -0
  177. package/dist/esm/route.d.ts +95 -0
  178. package/dist/esm/route.js +236 -0
  179. package/dist/esm/route.js.map +1 -0
  180. package/dist/esm/router.d.ts +69 -0
  181. package/dist/esm/router.js +22 -0
  182. package/dist/esm/router.js.map +1 -0
  183. package/dist/esm/routerContext.d.ts +8 -0
  184. package/dist/esm/routerContext.js +16 -0
  185. package/dist/esm/routerContext.js.map +1 -0
  186. package/dist/esm/scroll-restoration.d.ts +1 -0
  187. package/dist/esm/scroll-restoration.js +23 -0
  188. package/dist/esm/scroll-restoration.js.map +1 -0
  189. package/dist/esm/typePrimitives.d.ts +10 -0
  190. package/dist/esm/useBlocker.d.ts +67 -0
  191. package/dist/esm/useBlocker.js +148 -0
  192. package/dist/esm/useBlocker.js.map +1 -0
  193. package/dist/esm/useCanGoBack.d.ts +1 -0
  194. package/dist/esm/useCanGoBack.js +8 -0
  195. package/dist/esm/useCanGoBack.js.map +1 -0
  196. package/dist/esm/useLoaderData.d.ts +8 -0
  197. package/dist/esm/useLoaderData.js +14 -0
  198. package/dist/esm/useLoaderData.js.map +1 -0
  199. package/dist/esm/useLoaderDeps.d.ts +7 -0
  200. package/dist/esm/useLoaderDeps.js +17 -0
  201. package/dist/esm/useLoaderDeps.js.map +1 -0
  202. package/dist/esm/useLocation.d.ts +7 -0
  203. package/dist/esm/useLocation.js +10 -0
  204. package/dist/esm/useLocation.js.map +1 -0
  205. package/dist/esm/useMatch.d.ts +10 -0
  206. package/dist/esm/useMatch.js +22 -0
  207. package/dist/esm/useMatch.js.map +1 -0
  208. package/dist/esm/useNavigate.d.ts +5 -0
  209. package/dist/esm/useNavigate.js +29 -0
  210. package/dist/esm/useNavigate.js.map +1 -0
  211. package/dist/esm/useParams.d.ts +9 -0
  212. package/dist/esm/useParams.js +15 -0
  213. package/dist/esm/useParams.js.map +1 -0
  214. package/dist/esm/useRouteContext.d.ts +4 -0
  215. package/dist/esm/useRouteContext.js +11 -0
  216. package/dist/esm/useRouteContext.js.map +1 -0
  217. package/dist/esm/useRouter.d.ts +4 -0
  218. package/dist/esm/useRouter.js +12 -0
  219. package/dist/esm/useRouter.js.map +1 -0
  220. package/dist/esm/useRouterState.d.ts +8 -0
  221. package/dist/esm/useRouterState.js +16 -0
  222. package/dist/esm/useRouterState.js.map +1 -0
  223. package/dist/esm/useSearch.d.ts +9 -0
  224. package/dist/esm/useSearch.js +15 -0
  225. package/dist/esm/useSearch.js.map +1 -0
  226. package/dist/esm/utils.d.ts +34 -0
  227. package/dist/esm/utils.js +41 -0
  228. package/dist/esm/utils.js.map +1 -0
  229. package/dist/source/Asset.d.ts +2 -0
  230. package/dist/source/Asset.jsx +23 -0
  231. package/dist/source/Asset.jsx.map +1 -0
  232. package/dist/source/CatchBoundary.d.ts +11 -0
  233. package/dist/source/CatchBoundary.jsx +43 -0
  234. package/dist/source/CatchBoundary.jsx.map +1 -0
  235. package/dist/source/ClientOnly.d.ts +49 -0
  236. package/dist/source/ClientOnly.jsx +51 -0
  237. package/dist/source/ClientOnly.jsx.map +1 -0
  238. package/dist/source/HeadContent.d.ts +8 -0
  239. package/dist/source/HeadContent.jsx +143 -0
  240. package/dist/source/HeadContent.jsx.map +1 -0
  241. package/dist/source/Match.d.ts +8 -0
  242. package/dist/source/Match.jsx +255 -0
  243. package/dist/source/Match.jsx.map +1 -0
  244. package/dist/source/Matches.d.ts +24 -0
  245. package/dist/source/Matches.jsx +103 -0
  246. package/dist/source/Matches.jsx.map +1 -0
  247. package/dist/source/RouterProvider.d.ts +10 -0
  248. package/dist/source/RouterProvider.jsx +27 -0
  249. package/dist/source/RouterProvider.jsx.map +1 -0
  250. package/dist/source/SafeFragment.d.ts +1 -0
  251. package/dist/source/SafeFragment.jsx +4 -0
  252. package/dist/source/SafeFragment.jsx.map +1 -0
  253. package/dist/source/ScriptOnce.d.ts +5 -0
  254. package/dist/source/ScriptOnce.jsx +17 -0
  255. package/dist/source/ScriptOnce.jsx.map +1 -0
  256. package/dist/source/Scripts.d.ts +1 -0
  257. package/dist/source/Scripts.jsx +49 -0
  258. package/dist/source/Scripts.jsx.map +1 -0
  259. package/dist/source/ScrollRestoration.d.ts +14 -0
  260. package/dist/source/ScrollRestoration.jsx +37 -0
  261. package/dist/source/ScrollRestoration.jsx.map +1 -0
  262. package/dist/source/Transitioner.d.ts +1 -0
  263. package/dist/source/Transitioner.jsx +102 -0
  264. package/dist/source/Transitioner.jsx.map +1 -0
  265. package/dist/source/awaited.d.ts +11 -0
  266. package/dist/source/awaited.jsx +19 -0
  267. package/dist/source/awaited.jsx.map +1 -0
  268. package/dist/source/fileRoute.d.ts +54 -0
  269. package/dist/source/fileRoute.js +98 -0
  270. package/dist/source/fileRoute.js.map +1 -0
  271. package/dist/source/history.d.ts +8 -0
  272. package/dist/source/history.js +2 -0
  273. package/dist/source/history.js.map +1 -0
  274. package/dist/source/index.d.ts +52 -0
  275. package/dist/source/index.jsx +43 -0
  276. package/dist/source/index.jsx.map +1 -0
  277. package/dist/source/lazyRouteComponent.d.ts +2 -0
  278. package/dist/source/lazyRouteComponent.jsx +83 -0
  279. package/dist/source/lazyRouteComponent.jsx.map +1 -0
  280. package/dist/source/link.d.ts +44 -0
  281. package/dist/source/link.jsx +335 -0
  282. package/dist/source/link.jsx.map +1 -0
  283. package/dist/source/matchContext.d.ts +3 -0
  284. package/dist/source/matchContext.jsx +5 -0
  285. package/dist/source/matchContext.jsx.map +1 -0
  286. package/dist/source/not-found.d.ts +8 -0
  287. package/dist/source/not-found.jsx +30 -0
  288. package/dist/source/not-found.jsx.map +1 -0
  289. package/dist/source/renderRouteNotFound.d.ts +2 -0
  290. package/dist/source/renderRouteNotFound.jsx +15 -0
  291. package/dist/source/renderRouteNotFound.jsx.map +1 -0
  292. package/dist/source/route.d.ts +96 -0
  293. package/dist/source/route.jsx +179 -0
  294. package/dist/source/route.jsx.map +1 -0
  295. package/dist/source/router.d.ts +70 -0
  296. package/dist/source/router.js +21 -0
  297. package/dist/source/router.js.map +1 -0
  298. package/dist/source/routerContext.d.ts +8 -0
  299. package/dist/source/routerContext.jsx +13 -0
  300. package/dist/source/routerContext.jsx.map +1 -0
  301. package/dist/source/scroll-restoration.d.ts +1 -0
  302. package/dist/source/scroll-restoration.jsx +16 -0
  303. package/dist/source/scroll-restoration.jsx.map +1 -0
  304. package/dist/source/typePrimitives.d.ts +10 -0
  305. package/dist/source/typePrimitives.js +2 -0
  306. package/dist/source/typePrimitives.js.map +1 -0
  307. package/dist/source/useBlocker.d.ts +67 -0
  308. package/dist/source/useBlocker.jsx +136 -0
  309. package/dist/source/useBlocker.jsx.map +1 -0
  310. package/dist/source/useCanGoBack.d.ts +1 -0
  311. package/dist/source/useCanGoBack.js +5 -0
  312. package/dist/source/useCanGoBack.js.map +1 -0
  313. package/dist/source/useLoaderData.d.ts +8 -0
  314. package/dist/source/useLoaderData.jsx +11 -0
  315. package/dist/source/useLoaderData.jsx.map +1 -0
  316. package/dist/source/useLoaderDeps.d.ts +7 -0
  317. package/dist/source/useLoaderDeps.jsx +11 -0
  318. package/dist/source/useLoaderDeps.jsx.map +1 -0
  319. package/dist/source/useLocation.d.ts +7 -0
  320. package/dist/source/useLocation.jsx +7 -0
  321. package/dist/source/useLocation.jsx.map +1 -0
  322. package/dist/source/useMatch.d.ts +10 -0
  323. package/dist/source/useMatch.jsx +19 -0
  324. package/dist/source/useMatch.jsx.map +1 -0
  325. package/dist/source/useNavigate.d.ts +5 -0
  326. package/dist/source/useNavigate.jsx +18 -0
  327. package/dist/source/useNavigate.jsx.map +1 -0
  328. package/dist/source/useParams.d.ts +9 -0
  329. package/dist/source/useParams.jsx +12 -0
  330. package/dist/source/useParams.jsx.map +1 -0
  331. package/dist/source/useRouteContext.d.ts +4 -0
  332. package/dist/source/useRouteContext.js +8 -0
  333. package/dist/source/useRouteContext.js.map +1 -0
  334. package/dist/source/useRouter.d.ts +4 -0
  335. package/dist/source/useRouter.jsx +9 -0
  336. package/dist/source/useRouter.jsx.map +1 -0
  337. package/dist/source/useRouterState.d.ts +8 -0
  338. package/dist/source/useRouterState.jsx +14 -0
  339. package/dist/source/useRouterState.jsx.map +1 -0
  340. package/dist/source/useSearch.d.ts +9 -0
  341. package/dist/source/useSearch.jsx +12 -0
  342. package/dist/source/useSearch.jsx.map +1 -0
  343. package/dist/source/utils.d.ts +34 -0
  344. package/dist/source/utils.js +59 -0
  345. package/dist/source/utils.js.map +1 -0
  346. package/package.json +80 -0
  347. package/src/Asset.tsx +24 -0
  348. package/src/CatchBoundary.tsx +78 -0
  349. package/src/ClientOnly.tsx +65 -0
  350. package/src/HeadContent.tsx +174 -0
  351. package/src/Match.tsx +357 -0
  352. package/src/Matches.tsx +243 -0
  353. package/src/RouterProvider.tsx +79 -0
  354. package/src/SafeFragment.tsx +3 -0
  355. package/src/ScriptOnce.tsx +30 -0
  356. package/src/Scripts.tsx +65 -0
  357. package/src/ScrollRestoration.tsx +69 -0
  358. package/src/Transitioner.tsx +140 -0
  359. package/src/awaited.tsx +40 -0
  360. package/src/fileRoute.ts +256 -0
  361. package/src/history.ts +9 -0
  362. package/src/index.tsx +374 -0
  363. package/src/lazyRouteComponent.tsx +110 -0
  364. package/src/link.tsx +597 -0
  365. package/src/matchContext.tsx +10 -0
  366. package/src/not-found.tsx +42 -0
  367. package/src/renderRouteNotFound.tsx +26 -0
  368. package/src/route.tsx +550 -0
  369. package/src/router.ts +112 -0
  370. package/src/routerContext.tsx +26 -0
  371. package/src/scroll-restoration.tsx +29 -0
  372. package/src/typePrimitives.ts +74 -0
  373. package/src/useBlocker.tsx +305 -0
  374. package/src/useCanGoBack.ts +5 -0
  375. package/src/useLoaderData.tsx +50 -0
  376. package/src/useLoaderDeps.tsx +46 -0
  377. package/src/useLocation.tsx +30 -0
  378. package/src/useMatch.tsx +96 -0
  379. package/src/useNavigate.tsx +40 -0
  380. package/src/useParams.tsx +71 -0
  381. package/src/useRouteContext.ts +31 -0
  382. package/src/useRouter.tsx +15 -0
  383. package/src/useRouterState.tsx +36 -0
  384. package/src/useSearch.tsx +71 -0
  385. package/src/utils.ts +79 -0
@@ -0,0 +1,243 @@
1
+ import * as Solid from 'solid-js'
2
+ import warning from 'tiny-warning'
3
+ import { CatchBoundary, ErrorComponent } from './CatchBoundary'
4
+ import { useRouterState } from './useRouterState'
5
+ import { useRouter } from './useRouter'
6
+ import { Transitioner } from './Transitioner'
7
+ import { matchContext } from './matchContext'
8
+ import { Match } from './Match'
9
+ import { SafeFragment } from './SafeFragment'
10
+ import type {
11
+ AnyRouter,
12
+ DeepPartial,
13
+ MakeOptionalPathParams,
14
+ MakeOptionalSearchParams,
15
+ MakeRouteMatchUnion,
16
+ MaskOptions,
17
+ MatchRouteOptions,
18
+ NoInfer,
19
+ RegisteredRouter,
20
+ ResolveRelativePath,
21
+ ResolveRoute,
22
+ RouteByPath,
23
+ RouterState,
24
+ ToSubOptionsProps,
25
+ } from '@tanstack/router-core'
26
+
27
+ declare module '@tanstack/router-core' {
28
+ export interface RouteMatchExtensions {
29
+ meta?: Array<Solid.JSX.IntrinsicElements['meta'] | undefined>
30
+ links?: Array<Solid.JSX.IntrinsicElements['link'] | undefined>
31
+ scripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>
32
+ headScripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>
33
+ }
34
+ }
35
+
36
+ export function Matches() {
37
+ const router = useRouter()
38
+
39
+ const pendingElement = router.options.defaultPendingComponent ? (
40
+ <router.options.defaultPendingComponent />
41
+ ) : null
42
+
43
+ // Do not render a root Suspense during SSR or hydrating from SSR
44
+ const ResolvedSuspense =
45
+ router.isServer || (typeof document !== 'undefined' && router.clientSsr)
46
+ ? SafeFragment
47
+ : Solid.Suspense
48
+
49
+ const inner = (
50
+ <ResolvedSuspense fallback={pendingElement}>
51
+ <Transitioner />
52
+ <MatchesInner />
53
+ </ResolvedSuspense>
54
+ )
55
+
56
+ return router.options.InnerWrap ? (
57
+ <router.options.InnerWrap>{inner}</router.options.InnerWrap>
58
+ ) : (
59
+ inner
60
+ )
61
+ }
62
+
63
+ function MatchesInner() {
64
+ const matchId = useRouterState({
65
+ select: (s) => {
66
+ return s.matches[0]?.id
67
+ },
68
+ })
69
+
70
+ const resetKey = useRouterState({
71
+ select: (s) => s.loadedAt,
72
+ })
73
+
74
+ return (
75
+ <matchContext.Provider value={matchId}>
76
+ <CatchBoundary
77
+ getResetKey={() => resetKey()}
78
+ errorComponent={ErrorComponent}
79
+ onCatch={(error) => {
80
+ warning(
81
+ false,
82
+ `The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!`,
83
+ )
84
+ warning(false, error.message || error.toString())
85
+ }}
86
+ >
87
+ {matchId() ? <Match matchId={matchId()!} /> : null}
88
+ </CatchBoundary>
89
+ </matchContext.Provider>
90
+ )
91
+ }
92
+
93
+ export type UseMatchRouteOptions<
94
+ TRouter extends AnyRouter = RegisteredRouter,
95
+ TFrom extends string = string,
96
+ TTo extends string | undefined = undefined,
97
+ TMaskFrom extends string = TFrom,
98
+ TMaskTo extends string = '',
99
+ > = ToSubOptionsProps<TRouter, TFrom, TTo> &
100
+ DeepPartial<MakeOptionalSearchParams<TRouter, TFrom, TTo>> &
101
+ DeepPartial<MakeOptionalPathParams<TRouter, TFrom, TTo>> &
102
+ MaskOptions<TRouter, TMaskFrom, TMaskTo> &
103
+ MatchRouteOptions
104
+
105
+ export function useMatchRoute<TRouter extends AnyRouter = RegisteredRouter>() {
106
+ const router = useRouter()
107
+
108
+ const status = useRouterState({
109
+ select: (s) => s.status,
110
+ })
111
+
112
+ return <
113
+ const TFrom extends string = string,
114
+ const TTo extends string | undefined = undefined,
115
+ const TMaskFrom extends string = TFrom,
116
+ const TMaskTo extends string = '',
117
+ >(
118
+ opts: UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,
119
+ ): Solid.Accessor<
120
+ false | ResolveRoute<TRouter, TFrom, TTo>['types']['allParams']
121
+ > => {
122
+ const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts
123
+
124
+ const matchRoute = Solid.createMemo(() => {
125
+ status()
126
+ return router.matchRoute(rest as any, {
127
+ pending,
128
+ caseSensitive,
129
+ fuzzy,
130
+ includeSearch,
131
+ })
132
+ })
133
+
134
+ return matchRoute
135
+ }
136
+ }
137
+
138
+ export type MakeMatchRouteOptions<
139
+ TRouter extends AnyRouter = RegisteredRouter,
140
+ TFrom extends string = string,
141
+ TTo extends string | undefined = undefined,
142
+ TMaskFrom extends string = TFrom,
143
+ TMaskTo extends string = '',
144
+ > = UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> & {
145
+ // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns
146
+ children?:
147
+ | ((
148
+ params?: RouteByPath<
149
+ TRouter['routeTree'],
150
+ ResolveRelativePath<TFrom, NoInfer<TTo>>
151
+ >['types']['allParams'],
152
+ ) => Solid.JSX.Element)
153
+ | Solid.JSX.Element
154
+ }
155
+
156
+ export function MatchRoute<
157
+ TRouter extends AnyRouter = RegisteredRouter,
158
+ const TFrom extends string = string,
159
+ const TTo extends string | undefined = undefined,
160
+ const TMaskFrom extends string = TFrom,
161
+ const TMaskTo extends string = '',
162
+ >(props: MakeMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): any {
163
+ const status = useRouterState({
164
+ select: (s) => s.status,
165
+ })
166
+
167
+ return (
168
+ <Solid.Show when={status()} keyed>
169
+ {(_) => {
170
+ const matchRoute = useMatchRoute()
171
+ const params = matchRoute(props as any)() as boolean
172
+
173
+ if (typeof props.children === 'function') {
174
+ return (props.children as any)(params)
175
+ }
176
+
177
+ return params ? props.children : null
178
+ }}
179
+ </Solid.Show>
180
+ )
181
+ }
182
+
183
+ export interface UseMatchesBaseOptions<TRouter extends AnyRouter, TSelected> {
184
+ select?: (matches: Array<MakeRouteMatchUnion<TRouter>>) => TSelected
185
+ }
186
+
187
+ export type UseMatchesResult<
188
+ TRouter extends AnyRouter,
189
+ TSelected,
190
+ > = unknown extends TSelected ? Array<MakeRouteMatchUnion<TRouter>> : TSelected
191
+
192
+ export function useMatches<
193
+ TRouter extends AnyRouter = RegisteredRouter,
194
+ TSelected = unknown,
195
+ >(
196
+ opts?: UseMatchesBaseOptions<TRouter, TSelected>,
197
+ ): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {
198
+ return useRouterState({
199
+ select: (state: RouterState<TRouter['routeTree']>) => {
200
+ const matches = state.matches
201
+ return opts?.select
202
+ ? opts.select(matches as Array<MakeRouteMatchUnion<TRouter>>)
203
+ : matches
204
+ },
205
+ } as any) as Solid.Accessor<UseMatchesResult<TRouter, TSelected>>
206
+ }
207
+
208
+ export function useParentMatches<
209
+ TRouter extends AnyRouter = RegisteredRouter,
210
+ TSelected = unknown,
211
+ >(
212
+ opts?: UseMatchesBaseOptions<TRouter, TSelected>,
213
+ ): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {
214
+ const contextMatchId = Solid.useContext(matchContext)
215
+
216
+ return useMatches({
217
+ select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {
218
+ matches = matches.slice(
219
+ 0,
220
+ matches.findIndex((d) => d.id === contextMatchId()),
221
+ )
222
+ return opts?.select ? opts.select(matches) : matches
223
+ },
224
+ } as any)
225
+ }
226
+
227
+ export function useChildMatches<
228
+ TRouter extends AnyRouter = RegisteredRouter,
229
+ TSelected = unknown,
230
+ >(
231
+ opts?: UseMatchesBaseOptions<TRouter, TSelected>,
232
+ ): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {
233
+ const contextMatchId = Solid.useContext(matchContext)
234
+
235
+ return useMatches({
236
+ select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {
237
+ matches = matches.slice(
238
+ matches.findIndex((d) => d.id === contextMatchId()) + 1,
239
+ )
240
+ return opts?.select ? opts.select(matches) : matches
241
+ },
242
+ } as any)
243
+ }
@@ -0,0 +1,79 @@
1
+ import { Matches } from './Matches'
2
+ import { getRouterContext } from './routerContext'
3
+ import type * as Solid from 'solid-js'
4
+ import type {
5
+ AnyRouter,
6
+ RegisteredRouter,
7
+ RouterOptions,
8
+ } from '@tanstack/router-core'
9
+
10
+ export function RouterContextProvider<
11
+ TRouter extends AnyRouter = RegisteredRouter,
12
+ TDehydrated extends Record<string, any> = Record<string, any>,
13
+ >({
14
+ router,
15
+ children,
16
+ ...rest
17
+ }: RouterProps<TRouter, TDehydrated> & {
18
+ children: () => Solid.JSX.Element
19
+ }) {
20
+ // Allow the router to update options on the router instance
21
+ router.update({
22
+ ...router.options,
23
+ ...rest,
24
+ context: {
25
+ ...router.options.context,
26
+ ...rest.context,
27
+ },
28
+ } as any)
29
+
30
+ const routerContext = getRouterContext()
31
+
32
+ const provider = (
33
+ <routerContext.Provider value={router as AnyRouter}>
34
+ {children()}
35
+ </routerContext.Provider>
36
+ )
37
+
38
+ if (router.options.Wrap) {
39
+ return <router.options.Wrap>{provider}</router.options.Wrap>
40
+ }
41
+
42
+ return provider
43
+ }
44
+
45
+ export function RouterProvider<
46
+ TRouter extends AnyRouter = RegisteredRouter,
47
+ TDehydrated extends Record<string, any> = Record<string, any>,
48
+ >({ router, ...rest }: RouterProps<TRouter, TDehydrated>) {
49
+ return (
50
+ <RouterContextProvider router={router} {...rest}>
51
+ {() => <Matches />}
52
+ </RouterContextProvider>
53
+ )
54
+ }
55
+
56
+ export type RouterProps<
57
+ TRouter extends AnyRouter = RegisteredRouter,
58
+ TDehydrated extends Record<string, any> = Record<string, any>,
59
+ > = Omit<
60
+ RouterOptions<
61
+ TRouter['routeTree'],
62
+ NonNullable<TRouter['options']['trailingSlash']>,
63
+ false,
64
+ TRouter['history'],
65
+ TDehydrated
66
+ >,
67
+ 'context'
68
+ > & {
69
+ router: TRouter
70
+ context?: Partial<
71
+ RouterOptions<
72
+ TRouter['routeTree'],
73
+ NonNullable<TRouter['options']['trailingSlash']>,
74
+ false,
75
+ TRouter['history'],
76
+ TDehydrated
77
+ >['context']
78
+ >
79
+ }
@@ -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,69 @@
1
+ import {
2
+ defaultGetScrollRestorationKey,
3
+ getCssSelector,
4
+ scrollRestorationCache,
5
+ setupScrollRestoration,
6
+ } from '@tanstack/router-core'
7
+ import { useRouter } from './useRouter'
8
+ import type {
9
+ ParsedLocation,
10
+ ScrollRestorationEntry,
11
+ ScrollRestorationOptions,
12
+ } from '@tanstack/router-core'
13
+
14
+ function useScrollRestoration() {
15
+ const router = useRouter()
16
+ setupScrollRestoration(router, true)
17
+ }
18
+
19
+ /**
20
+ * @deprecated use createRouter's `scrollRestoration` option instead
21
+ */
22
+ export function ScrollRestoration(_props: ScrollRestorationOptions) {
23
+ useScrollRestoration()
24
+
25
+ if (process.env.NODE_ENV === 'development') {
26
+ console.warn(
27
+ "The ScrollRestoration component is deprecated. Use createRouter's `scrollRestoration` option instead.",
28
+ )
29
+ }
30
+
31
+ return null
32
+ }
33
+
34
+ export function useElementScrollRestoration(
35
+ options: (
36
+ | {
37
+ id: string
38
+ getElement?: () => Window | Element | undefined | null
39
+ }
40
+ | {
41
+ id?: string
42
+ getElement: () => Window | Element | undefined | null
43
+ }
44
+ ) & {
45
+ getKey?: (location: ParsedLocation) => string
46
+ },
47
+ ): ScrollRestorationEntry | undefined {
48
+ useScrollRestoration()
49
+
50
+ const router = useRouter()
51
+ const getKey = options.getKey || defaultGetScrollRestorationKey
52
+
53
+ let elementSelector = ''
54
+
55
+ if (options.id) {
56
+ elementSelector = `[data-scroll-restoration-id="${options.id}"]`
57
+ } else {
58
+ const element = options.getElement?.()
59
+ if (!element) {
60
+ return
61
+ }
62
+ elementSelector =
63
+ element instanceof Window ? 'window' : getCssSelector(element)
64
+ }
65
+
66
+ const restoreKey = getKey(router.latestLocation)
67
+ const byKey = scrollRestorationCache.state[restoreKey]
68
+ return byKey?.[elementSelector]
69
+ }
@@ -0,0 +1,140 @@
1
+ import * as Solid from 'solid-js'
2
+ import {
3
+ getLocationChangeInfo,
4
+ handleHashScroll,
5
+ trimPathRight,
6
+ } from '@tanstack/router-core'
7
+ import { useRouter } from './useRouter'
8
+ import { useRouterState } from './useRouterState'
9
+ import { usePrevious } from './utils'
10
+
11
+ export function Transitioner() {
12
+ const router = useRouter()
13
+ let mountLoadForRouter = { router, mounted: false }
14
+ const isLoading = useRouterState({
15
+ select: ({ isLoading }) => isLoading,
16
+ })
17
+
18
+ const [isTransitioning, setIsTransitioning] = Solid.createSignal(false)
19
+ // Track pending state changes
20
+ const hasPendingMatches = useRouterState({
21
+ select: (s) => s.matches.some((d) => d.status === 'pending'),
22
+ })
23
+
24
+ const previousIsLoading = usePrevious(isLoading)
25
+
26
+ const isAnyPending = () =>
27
+ isLoading() || isTransitioning() || hasPendingMatches()
28
+ const previousIsAnyPending = usePrevious(isAnyPending)
29
+
30
+ const isPagePending = () => isLoading() || hasPendingMatches()
31
+ const previousIsPagePending = usePrevious(isPagePending)
32
+
33
+ if (!router.isServer) {
34
+ router.startTransition = async (fn: () => void | Promise<void>) => {
35
+ setIsTransitioning(true)
36
+ await fn()
37
+ setIsTransitioning(false)
38
+ }
39
+ }
40
+
41
+ // Subscribe to location changes
42
+ // and try to load the new location
43
+ Solid.onMount(() => {
44
+ const unsub = router.history.subscribe(router.load)
45
+
46
+ const nextLocation = router.buildLocation({
47
+ to: router.latestLocation.pathname,
48
+ search: true,
49
+ params: true,
50
+ hash: true,
51
+ state: true,
52
+ _includeValidateSearch: true,
53
+ })
54
+
55
+ if (
56
+ trimPathRight(router.latestLocation.href) !==
57
+ trimPathRight(nextLocation.href)
58
+ ) {
59
+ router.commitLocation({ ...nextLocation, replace: true })
60
+ }
61
+
62
+ Solid.onCleanup(() => {
63
+ unsub()
64
+ })
65
+ })
66
+
67
+ // Try to load the initial location
68
+ Solid.createRenderEffect(() => {
69
+ Solid.untrack(() => {
70
+ if (
71
+ (typeof window !== 'undefined' && router.clientSsr) ||
72
+ (mountLoadForRouter.router === router && mountLoadForRouter.mounted)
73
+ ) {
74
+ return
75
+ }
76
+ mountLoadForRouter = { router, mounted: true }
77
+ const tryLoad = async () => {
78
+ try {
79
+ await router.load()
80
+ } catch (err) {
81
+ console.error(err)
82
+ }
83
+ }
84
+ tryLoad()
85
+ })
86
+ })
87
+
88
+ Solid.createRenderEffect(
89
+ Solid.on(
90
+ [previousIsLoading, isLoading],
91
+ ([previousIsLoading, isLoading]) => {
92
+ if (previousIsLoading.previous && !isLoading) {
93
+ router.emit({
94
+ type: 'onLoad',
95
+ ...getLocationChangeInfo(router.state),
96
+ })
97
+ }
98
+ },
99
+ ),
100
+ )
101
+ Solid.createRenderEffect(
102
+ Solid.on(
103
+ [isPagePending, previousIsPagePending],
104
+ ([isPagePending, previousIsPagePending]) => {
105
+ // emit onBeforeRouteMount
106
+ if (previousIsPagePending.previous && !isPagePending) {
107
+ router.emit({
108
+ type: 'onBeforeRouteMount',
109
+ ...getLocationChangeInfo(router.state),
110
+ })
111
+ }
112
+ },
113
+ ),
114
+ )
115
+
116
+ Solid.createRenderEffect(
117
+ Solid.on(
118
+ [isAnyPending, previousIsAnyPending],
119
+ ([isAnyPending, previousIsAnyPending]) => {
120
+ // The router was pending and now it's not
121
+ if (previousIsAnyPending.previous && !isAnyPending) {
122
+ router.emit({
123
+ type: 'onResolved',
124
+ ...getLocationChangeInfo(router.state),
125
+ })
126
+
127
+ router.__store.setState((s) => ({
128
+ ...s,
129
+ status: 'idle',
130
+ resolvedLocation: s.location,
131
+ }))
132
+
133
+ handleHashScroll(router)
134
+ }
135
+ },
136
+ ),
137
+ )
138
+
139
+ return null
140
+ }
@@ -0,0 +1,40 @@
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 [resource] = Solid.createResource(() => props.promise)
34
+
35
+ return (
36
+ <Solid.Show fallback={props.fallback} when={resource()}>
37
+ {(data) => props.children(data())}
38
+ </Solid.Show>
39
+ )
40
+ }