@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,174 @@
1
+ import * as Solid from 'solid-js'
2
+ import { MetaProvider } from '@solidjs/meta'
3
+ import { Asset } from './Asset'
4
+ import { useRouter } from './useRouter'
5
+ import { useRouterState } from './useRouterState'
6
+ import type { RouterManagedTag } from '@tanstack/router-core'
7
+
8
+ export const useTags = () => {
9
+ const router = useRouter()
10
+
11
+ const routeMeta = useRouterState({
12
+ select: (state) => {
13
+ return state.matches.map((match) => match.meta!).filter(Boolean)
14
+ },
15
+ })
16
+
17
+ const meta: Solid.Accessor<Array<RouterManagedTag>> = Solid.createMemo(() => {
18
+ const resultMeta: Array<RouterManagedTag> = []
19
+ const metaByAttribute: Record<string, true> = {}
20
+ let title: RouterManagedTag | undefined
21
+ ;[...routeMeta()].reverse().forEach((metas) => {
22
+ ;[...metas].reverse().forEach((m) => {
23
+ if (!m) return
24
+
25
+ if (m.title) {
26
+ if (!title) {
27
+ title = {
28
+ tag: 'title',
29
+ children: m.title,
30
+ }
31
+ }
32
+ } else {
33
+ const attribute = m.name ?? m.property
34
+ if (attribute) {
35
+ if (metaByAttribute[attribute]) {
36
+ return
37
+ } else {
38
+ metaByAttribute[attribute] = true
39
+ }
40
+ }
41
+
42
+ resultMeta.push({
43
+ tag: 'meta',
44
+ attrs: {
45
+ ...m,
46
+ },
47
+ })
48
+ }
49
+ })
50
+ })
51
+
52
+ if (title) {
53
+ resultMeta.push(title)
54
+ }
55
+
56
+ resultMeta.reverse()
57
+
58
+ return resultMeta
59
+ })
60
+
61
+ const links = useRouterState({
62
+ select: (state) => {
63
+ const constructed = state.matches
64
+ .map((match) => match.links!)
65
+ .filter(Boolean)
66
+ .flat(1)
67
+ .map((link) => ({
68
+ tag: 'link',
69
+ attrs: {
70
+ ...link,
71
+ },
72
+ })) satisfies Array<RouterManagedTag>
73
+
74
+ const manifest = router.ssr?.manifest
75
+
76
+ // These are the assets extracted from the ViteManifest
77
+ // using the `startManifestPlugin`
78
+ const assets = state.matches
79
+ .map((match) => manifest?.routes[match.routeId]?.assets ?? [])
80
+ .filter(Boolean)
81
+ .flat(1)
82
+ .filter((asset) => asset.tag === 'link')
83
+ .map(
84
+ (asset) =>
85
+ ({
86
+ tag: 'link',
87
+ attrs: asset.attrs,
88
+ }) satisfies RouterManagedTag,
89
+ )
90
+
91
+ return [...constructed, ...assets]
92
+ },
93
+ })
94
+
95
+ const preloadMeta = useRouterState({
96
+ select: (state) => {
97
+ const preloadMeta: Array<RouterManagedTag> = []
98
+
99
+ state.matches
100
+ .map((match) => router.looseRoutesById[match.routeId]!)
101
+ .forEach((route) =>
102
+ router.ssr?.manifest?.routes[route.id]?.preloads
103
+ ?.filter(Boolean)
104
+ .forEach((preload) => {
105
+ preloadMeta.push({
106
+ tag: 'link',
107
+ attrs: {
108
+ rel: 'modulepreload',
109
+ href: preload,
110
+ },
111
+ })
112
+ }),
113
+ )
114
+
115
+ return preloadMeta
116
+ },
117
+ })
118
+
119
+ const headScripts = useRouterState({
120
+ select: (state) =>
121
+ (
122
+ state.matches
123
+ .map((match) => match.headScripts!)
124
+ .flat(1)
125
+ .filter(Boolean) as Array<RouterManagedTag>
126
+ ).map(({ children, ...script }) => ({
127
+ tag: 'script',
128
+ attrs: {
129
+ ...script,
130
+ },
131
+ children,
132
+ })),
133
+ })
134
+
135
+ return () =>
136
+ uniqBy(
137
+ [
138
+ ...meta(),
139
+ ...preloadMeta(),
140
+ ...links(),
141
+ ...headScripts(),
142
+ ] as Array<RouterManagedTag>,
143
+ (d) => {
144
+ return JSON.stringify(d)
145
+ },
146
+ )
147
+ }
148
+
149
+ /**
150
+ * @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.
151
+ * It should be rendered in the `<head>` of your document.
152
+ */
153
+ export function HeadContent() {
154
+ const tags = useTags()
155
+ return (
156
+ <MetaProvider>
157
+ {tags().map((tag) => (
158
+ <Asset {...tag} />
159
+ ))}
160
+ </MetaProvider>
161
+ )
162
+ }
163
+
164
+ function uniqBy<T>(arr: Array<T>, fn: (item: T) => string) {
165
+ const seen = new Set<string>()
166
+ return arr.filter((item) => {
167
+ const key = fn(item)
168
+ if (seen.has(key)) {
169
+ return false
170
+ }
171
+ seen.add(key)
172
+ return true
173
+ })
174
+ }
package/src/Match.tsx ADDED
@@ -0,0 +1,357 @@
1
+ import * as Solid from 'solid-js'
2
+ import invariant from 'tiny-invariant'
3
+ import warning from 'tiny-warning'
4
+ import {
5
+ createControlledPromise,
6
+ getLocationChangeInfo,
7
+ isNotFound,
8
+ isRedirect,
9
+ pick,
10
+ rootRouteId,
11
+ } from '@tanstack/router-core'
12
+ import { Dynamic } from 'solid-js/web'
13
+ import { CatchBoundary, ErrorComponent } from './CatchBoundary'
14
+ import { useRouterState } from './useRouterState'
15
+ import { useRouter } from './useRouter'
16
+ import { CatchNotFound } from './not-found'
17
+ import { matchContext } from './matchContext'
18
+ import { SafeFragment } from './SafeFragment'
19
+ import { renderRouteNotFound } from './renderRouteNotFound'
20
+ import { ScrollRestoration } from './scroll-restoration'
21
+ import type { AnyRoute } from '@tanstack/router-core'
22
+
23
+ export const Match = (props: { matchId: string }) => {
24
+ const router = useRouter()
25
+ const routeId = useRouterState({
26
+ select: (s) => {
27
+ return s.matches.find((d) => d.id === props.matchId)?.routeId as string
28
+ },
29
+ })
30
+
31
+ invariant(
32
+ routeId,
33
+ `Could not find routeId for matchId "${props.matchId}". Please file an issue!`,
34
+ )
35
+
36
+ const route: () => AnyRoute = () => router.routesById[routeId()]
37
+
38
+ const PendingComponent = () =>
39
+ route().options.pendingComponent ?? router.options.defaultPendingComponent
40
+
41
+ const routeErrorComponent = () =>
42
+ route().options.errorComponent ?? router.options.defaultErrorComponent
43
+
44
+ const routeOnCatch = () =>
45
+ route().options.onCatch ?? router.options.defaultOnCatch
46
+
47
+ const routeNotFoundComponent = () =>
48
+ route().isRoot
49
+ ? // If it's the root route, use the globalNotFound option, with fallback to the notFoundRoute's component
50
+ (route().options.notFoundComponent ??
51
+ router.options.notFoundRoute?.options.component)
52
+ : route().options.notFoundComponent
53
+
54
+ const ResolvedSuspenseBoundary = () =>
55
+ // If we're on the root route, allow forcefully wrapping in suspense
56
+ (!route().isRoot || route().options.wrapInSuspense) &&
57
+ (route().options.wrapInSuspense ??
58
+ PendingComponent() ??
59
+ (route().options.errorComponent as any)?.preload)
60
+ ? Solid.Suspense
61
+ : SafeFragment
62
+
63
+ const ResolvedCatchBoundary = () =>
64
+ routeErrorComponent() ? CatchBoundary : SafeFragment
65
+
66
+ const ResolvedNotFoundBoundary = () =>
67
+ routeNotFoundComponent() ? CatchNotFound : SafeFragment
68
+
69
+ const resetKey = useRouterState({
70
+ select: (s) => s.loadedAt,
71
+ })
72
+
73
+ const parentRouteId = useRouterState({
74
+ select: (s) => {
75
+ const index = s.matches.findIndex((d) => d.id === props.matchId)
76
+ return s.matches[index - 1]?.routeId as string
77
+ },
78
+ })
79
+
80
+ return (
81
+ <>
82
+ <matchContext.Provider value={() => props.matchId}>
83
+ <Dynamic
84
+ component={ResolvedSuspenseBoundary()}
85
+ fallback={<Dynamic component={PendingComponent()} />}
86
+ >
87
+ <Dynamic
88
+ component={ResolvedCatchBoundary()}
89
+ getResetKey={() => resetKey()}
90
+ errorComponent={routeErrorComponent() || ErrorComponent}
91
+ onCatch={(error: Error) => {
92
+ // Forward not found errors (we don't want to show the error component for these)
93
+ if (isNotFound(error)) throw error
94
+ warning(false, `Error in route match: ${props.matchId}`)
95
+ routeOnCatch()?.(error)
96
+ }}
97
+ >
98
+ <Dynamic
99
+ component={ResolvedNotFoundBoundary()}
100
+ fallback={(error: any) => {
101
+ // If the current not found handler doesn't exist or it has a
102
+ // route ID which doesn't match the current route, rethrow the error
103
+ if (
104
+ !routeNotFoundComponent() ||
105
+ (error.routeId && error.routeId !== routeId) ||
106
+ (!error.routeId && !route().isRoot)
107
+ )
108
+ throw error
109
+
110
+ return (
111
+ <Dynamic component={routeNotFoundComponent()} {...error} />
112
+ )
113
+ }}
114
+ >
115
+ <MatchInner matchId={props.matchId} />
116
+ </Dynamic>
117
+ </Dynamic>
118
+ </Dynamic>
119
+ </matchContext.Provider>
120
+
121
+ {parentRouteId() === rootRouteId ? (
122
+ <>
123
+ <OnRendered />
124
+ <ScrollRestoration />
125
+ </>
126
+ ) : null}
127
+ </>
128
+ )
129
+ }
130
+
131
+ // On Rendered can't happen above the root layout because it actually
132
+ // renders a dummy dom element to track the rendered state of the app.
133
+ // We render a script tag with a key that changes based on the current
134
+ // location state.key. Also, because it's below the root layout, it
135
+ // allows us to fire onRendered events even after a hydration mismatch
136
+ // error that occurred above the root layout (like bad head/link tags,
137
+ // which is common).
138
+ function OnRendered() {
139
+ const router = useRouter()
140
+
141
+ const location = useRouterState({
142
+ select: (s) => {
143
+ return s.resolvedLocation?.state.key
144
+ },
145
+ })
146
+ Solid.createEffect(
147
+ Solid.on([location], () => {
148
+ router.emit({
149
+ type: 'onRendered',
150
+ ...getLocationChangeInfo(router.state),
151
+ })
152
+ }),
153
+ )
154
+ return null
155
+ }
156
+
157
+ export const MatchInner = (props: { matchId: string }): any => {
158
+ const router = useRouter()
159
+
160
+ // { match, key, routeId } =
161
+ const matchState: Solid.Accessor<any> = useRouterState({
162
+ select: (s) => {
163
+ const matchIndex = s.matches.findIndex((d) => d.id === props.matchId)
164
+ const match = s.matches[matchIndex]!
165
+ const routeId = match.routeId as string
166
+
167
+ const remountFn =
168
+ (router.routesById[routeId] as AnyRoute).options.remountDeps ??
169
+ router.options.defaultRemountDeps
170
+ const remountDeps = remountFn?.({
171
+ routeId,
172
+ loaderDeps: match.loaderDeps,
173
+ params: match._strictParams,
174
+ search: match._strictSearch,
175
+ })
176
+ const key = remountDeps ? JSON.stringify(remountDeps) : undefined
177
+
178
+ return {
179
+ key,
180
+ routeId,
181
+ match: pick(match, ['id', 'status', 'error']),
182
+ }
183
+ },
184
+ })
185
+
186
+ const route = () => router.routesById[matchState().routeId]!
187
+
188
+ // function useChangedDiff(value: any) {
189
+ // const ref = Solid.useRef(value)
190
+ // const changed = ref.current !== value
191
+ // if (changed) {
192
+ // console.log(
193
+ // 'Changed:',
194
+ // value,
195
+ // Object.fromEntries(
196
+ // Object.entries(value).filter(
197
+ // ([key, val]) => val !== ref.current[key],
198
+ // ),
199
+ // ),
200
+ // )
201
+ // }
202
+ // ref.current = value
203
+ // }
204
+
205
+ // useChangedDiff(match)
206
+ const match = () => matchState().match
207
+
208
+ const out = () => {
209
+ const Comp = route().options.component ?? router.options.defaultComponent
210
+ if (Comp) {
211
+ return <Comp />
212
+ }
213
+ return <Outlet />
214
+ }
215
+
216
+ return (
217
+ <Solid.Switch>
218
+ <Solid.Match when={match().status === 'notFound'}>
219
+ {(_) => {
220
+ invariant(isNotFound(match().error), 'Expected a notFound error')
221
+
222
+ return renderRouteNotFound(router, route(), match().error)
223
+ }}
224
+ </Solid.Match>
225
+ <Solid.Match when={match().status === 'redirected'}>
226
+ {(_) => {
227
+ invariant(isRedirect(match().error), 'Expected a redirect error')
228
+
229
+ const [loaderResult] = Solid.createResource(async () => {
230
+ await new Promise((r) => setTimeout(r, 0))
231
+ return router.getMatch(match().id)?.loadPromise
232
+ })
233
+
234
+ return <>{loaderResult()}</>
235
+ }}
236
+ </Solid.Match>
237
+ <Solid.Match when={match().status === 'error'}>
238
+ {(_) => {
239
+ if (router.isServer) {
240
+ const RouteErrorComponent =
241
+ (route().options.errorComponent ??
242
+ router.options.defaultErrorComponent) ||
243
+ ErrorComponent
244
+
245
+ return (
246
+ <RouteErrorComponent
247
+ error={match().error}
248
+ info={{
249
+ componentStack: '',
250
+ }}
251
+ />
252
+ )
253
+ }
254
+
255
+ throw match().error
256
+ }}
257
+ </Solid.Match>
258
+ <Solid.Match when={match().status === 'pending'}>
259
+ {(_) => {
260
+ const pendingMinMs =
261
+ route().options.pendingMinMs ?? router.options.defaultPendingMinMs
262
+
263
+ if (pendingMinMs && !router.getMatch(match().id)?.minPendingPromise) {
264
+ // Create a promise that will resolve after the minPendingMs
265
+ if (!router.isServer) {
266
+ const minPendingPromise = createControlledPromise<void>()
267
+
268
+ Promise.resolve().then(() => {
269
+ router.updateMatch(match().id, (prev) => ({
270
+ ...prev,
271
+ minPendingPromise,
272
+ }))
273
+ })
274
+
275
+ setTimeout(() => {
276
+ minPendingPromise.resolve()
277
+
278
+ // We've handled the minPendingPromise, so we can delete it
279
+ router.updateMatch(match().id, (prev) => ({
280
+ ...prev,
281
+ minPendingPromise: undefined,
282
+ }))
283
+ }, pendingMinMs)
284
+ }
285
+ }
286
+
287
+ const [loaderResult] = Solid.createResource(async () => {
288
+ await new Promise((r) => setTimeout(r, 0))
289
+ return router.getMatch(match().id)?.loadPromise
290
+ })
291
+
292
+ return <>{loaderResult()}</>
293
+ }}
294
+ </Solid.Match>
295
+ <Solid.Match when={match().status === 'success'}>{out()}</Solid.Match>
296
+ </Solid.Switch>
297
+ )
298
+ }
299
+
300
+ export const Outlet = () => {
301
+ const router = useRouter()
302
+ const matchId = Solid.useContext(matchContext)
303
+ const routeId = useRouterState({
304
+ select: (s) => s.matches.find((d) => d.id === matchId())?.routeId as string,
305
+ })
306
+
307
+ const route = () => router.routesById[routeId()]!
308
+
309
+ const parentGlobalNotFound = useRouterState({
310
+ select: (s) => {
311
+ const matches = s.matches
312
+ const parentMatch = matches.find((d) => d.id === matchId())
313
+ invariant(
314
+ parentMatch,
315
+ `Could not find parent match for matchId "${matchId()}"`,
316
+ )
317
+ return parentMatch.globalNotFound
318
+ },
319
+ })
320
+
321
+ const childMatchId = useRouterState({
322
+ select: (s) => {
323
+ const matches = s.matches
324
+ const index = matches.findIndex((d) => d.id === matchId())
325
+ const v = matches[index + 1]?.id
326
+ return v
327
+ },
328
+ })
329
+
330
+ return (
331
+ <Solid.Switch>
332
+ <Solid.Match when={parentGlobalNotFound()}>
333
+ {renderRouteNotFound(router, route(), undefined)}
334
+ </Solid.Match>
335
+ <Solid.Match when={childMatchId()}>
336
+ {(matchId) => {
337
+ // const nextMatch = <Match matchId={matchId()} />
338
+
339
+ return (
340
+ <Solid.Show
341
+ when={matchId() === rootRouteId}
342
+ fallback={<Match matchId={matchId()} />}
343
+ >
344
+ <Solid.Suspense
345
+ fallback={
346
+ <Dynamic component={router.options.defaultPendingComponent} />
347
+ }
348
+ >
349
+ <Match matchId={matchId()} />
350
+ </Solid.Suspense>
351
+ </Solid.Show>
352
+ )
353
+ }}
354
+ </Solid.Match>
355
+ </Solid.Switch>
356
+ )
357
+ }