@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,183 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const web = require("solid-js/web");
4
+ const routerCore = require("@tanstack/router-core");
5
+ const useRouter = require("./useRouter.cjs");
6
+ const ScriptOnce = require("./ScriptOnce.cjs");
7
+ const storageKey = "tsr-scroll-restoration-v1_3";
8
+ const sessionsStorage = typeof window !== "undefined" && window.sessionStorage;
9
+ const throttle = (fn, wait) => {
10
+ let timeout;
11
+ return (...args) => {
12
+ if (!timeout) {
13
+ timeout = setTimeout(() => {
14
+ fn(...args);
15
+ timeout = null;
16
+ }, wait);
17
+ }
18
+ };
19
+ };
20
+ const scrollRestorationCache = sessionsStorage ? (() => {
21
+ const state = JSON.parse(window.sessionStorage.getItem(storageKey) || "null") || {};
22
+ return {
23
+ state,
24
+ // This setter is simply to make sure that we set the sessionStorage right
25
+ // after the state is updated. It doesn't necessarily need to be a functional
26
+ // update.
27
+ set: (updater) => (scrollRestorationCache.state = routerCore.functionalUpdate(updater, scrollRestorationCache.state) || scrollRestorationCache.state, window.sessionStorage.setItem(storageKey, JSON.stringify(scrollRestorationCache.state)))
28
+ };
29
+ })() : void 0;
30
+ const defaultGetScrollRestorationKey = (location) => {
31
+ return location.state.key || location.href;
32
+ };
33
+ function getCssSelector(el) {
34
+ const path = [];
35
+ let parent;
36
+ while (parent = el.parentNode) {
37
+ path.unshift(`${el.tagName}:nth-child(${[].indexOf.call(parent.children, el) + 1})`);
38
+ el = parent;
39
+ }
40
+ return `${path.join(" > ")}`.toLowerCase();
41
+ }
42
+ let ignoreScroll = false;
43
+ function restoreScroll(storageKey2, key, behavior, shouldScrollRestoration, scrollToTopSelectors) {
44
+ var _a;
45
+ let byKey;
46
+ try {
47
+ byKey = JSON.parse(sessionStorage.getItem(storageKey2) || "{}");
48
+ } catch (error) {
49
+ console.error(error);
50
+ return;
51
+ }
52
+ const resolvedKey = key || ((_a = window.history.state) == null ? void 0 : _a.key);
53
+ const elementEntries = byKey[resolvedKey];
54
+ ignoreScroll = true;
55
+ (() => {
56
+ if (shouldScrollRestoration && elementEntries) {
57
+ for (const elementSelector in elementEntries) {
58
+ const entry = elementEntries[elementSelector];
59
+ if (elementSelector === "window") {
60
+ window.scrollTo({
61
+ top: entry.scrollY,
62
+ left: entry.scrollX,
63
+ behavior
64
+ });
65
+ } else if (elementSelector) {
66
+ const element = document.querySelector(elementSelector);
67
+ if (element) {
68
+ element.scrollLeft = entry.scrollX;
69
+ element.scrollTop = entry.scrollY;
70
+ }
71
+ }
72
+ }
73
+ return;
74
+ }
75
+ const hash = window.location.hash.split("#")[1];
76
+ if (hash) {
77
+ const hashScrollIntoViewOptions = (window.history.state || {}).__hashScrollIntoViewOptions ?? true;
78
+ if (hashScrollIntoViewOptions) {
79
+ const el = document.getElementById(hash);
80
+ if (el) {
81
+ el.scrollIntoView(hashScrollIntoViewOptions);
82
+ }
83
+ }
84
+ return;
85
+ }
86
+ ["window", ...(scrollToTopSelectors == null ? void 0 : scrollToTopSelectors.filter((d) => d !== "window")) ?? []].forEach((selector) => {
87
+ const element = selector === "window" ? window : document.querySelector(selector);
88
+ if (element) {
89
+ element.scrollTo({
90
+ top: 0,
91
+ left: 0,
92
+ behavior
93
+ });
94
+ }
95
+ });
96
+ })();
97
+ ignoreScroll = false;
98
+ }
99
+ function setupScrollRestoration(router, force) {
100
+ const shouldScrollRestoration = force ?? router.options.scrollRestoration ?? false;
101
+ if (shouldScrollRestoration) {
102
+ router.isScrollRestoring = true;
103
+ }
104
+ if (typeof document === "undefined" || router.isScrollRestorationSetup) {
105
+ return;
106
+ }
107
+ router.isScrollRestorationSetup = true;
108
+ ignoreScroll = false;
109
+ const getKey = router.options.getScrollRestorationKey || defaultGetScrollRestorationKey;
110
+ window.history.scrollRestoration = "manual";
111
+ const onScroll = (event) => {
112
+ if (ignoreScroll || !router.isScrollRestoring) {
113
+ return;
114
+ }
115
+ let elementSelector = "";
116
+ if (event.target === document || event.target === window) {
117
+ elementSelector = "window";
118
+ } else {
119
+ const attrId = event.target.getAttribute("data-scroll-restoration-id");
120
+ if (attrId) {
121
+ elementSelector = `[data-scroll-restoration-id="${attrId}"]`;
122
+ } else {
123
+ elementSelector = getCssSelector(event.target);
124
+ }
125
+ }
126
+ const restoreKey = getKey(router.state.location);
127
+ scrollRestorationCache.set((state) => {
128
+ const keyEntry = state[restoreKey] = state[restoreKey] || {};
129
+ const elementEntry = keyEntry[elementSelector] = keyEntry[elementSelector] || {};
130
+ if (elementSelector === "window") {
131
+ elementEntry.scrollX = window.scrollX || 0;
132
+ elementEntry.scrollY = window.scrollY || 0;
133
+ } else if (elementSelector) {
134
+ const element = document.querySelector(elementSelector);
135
+ if (element) {
136
+ elementEntry.scrollX = element.scrollLeft || 0;
137
+ elementEntry.scrollY = element.scrollTop || 0;
138
+ }
139
+ }
140
+ return state;
141
+ });
142
+ };
143
+ if (typeof document !== "undefined") {
144
+ document.addEventListener("scroll", throttle(onScroll, 100), true);
145
+ }
146
+ router.subscribe("onRendered", (event) => {
147
+ const cacheKey = getKey(event.toLocation);
148
+ if (!router.resetNextScroll) {
149
+ router.resetNextScroll = true;
150
+ return;
151
+ }
152
+ restoreScroll(storageKey, cacheKey, router.options.scrollRestorationBehavior, router.isScrollRestoring, router.options.scrollToTopSelectors);
153
+ if (router.isScrollRestoring) {
154
+ scrollRestorationCache.set((state) => {
155
+ state[cacheKey] = state[cacheKey] || {};
156
+ return state;
157
+ });
158
+ }
159
+ });
160
+ }
161
+ function ScrollRestoration() {
162
+ const router = useRouter.useRouter();
163
+ const getKey = router.options.getScrollRestorationKey || defaultGetScrollRestorationKey;
164
+ const userKey = getKey(router.latestLocation);
165
+ const resolvedKey = userKey !== defaultGetScrollRestorationKey(router.latestLocation) ? userKey : null;
166
+ if (!router.isScrollRestoring || !router.isServer) {
167
+ return null;
168
+ }
169
+ return web.createComponent(ScriptOnce.ScriptOnce, {
170
+ get children() {
171
+ return `(${restoreScroll.toString()})(${JSON.stringify(storageKey)},${JSON.stringify(resolvedKey)}, undefined, true)`;
172
+ },
173
+ log: false
174
+ });
175
+ }
176
+ exports.ScrollRestoration = ScrollRestoration;
177
+ exports.defaultGetScrollRestorationKey = defaultGetScrollRestorationKey;
178
+ exports.getCssSelector = getCssSelector;
179
+ exports.restoreScroll = restoreScroll;
180
+ exports.scrollRestorationCache = scrollRestorationCache;
181
+ exports.setupScrollRestoration = setupScrollRestoration;
182
+ exports.storageKey = storageKey;
183
+ //# sourceMappingURL=scroll-restoration.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-restoration.cjs","sources":["../../src/scroll-restoration.tsx"],"sourcesContent":["import { functionalUpdate } from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport { ScriptOnce } from './ScriptOnce'\nimport type { AnyRouter } from './router'\nimport type { NonNullableUpdater, ParsedLocation } from '@tanstack/router-core'\n\nexport type ScrollRestorationEntry = { scrollX: number; scrollY: number }\n\nexport type ScrollRestorationByElement = Record<string, ScrollRestorationEntry>\n\nexport type ScrollRestorationByKey = Record<string, ScrollRestorationByElement>\n\nexport type ScrollRestorationCache = {\n state: ScrollRestorationByKey\n set: (updater: NonNullableUpdater<ScrollRestorationByKey>) => void\n}\nexport type ScrollRestorationOptions = {\n getKey?: (location: ParsedLocation) => string\n scrollBehavior?: ScrollToOptions['behavior']\n}\n\nexport const storageKey = 'tsr-scroll-restoration-v1_3'\nconst sessionsStorage = typeof window !== 'undefined' && window.sessionStorage\nconst throttle = (fn: (...args: Array<any>) => void, wait: number) => {\n let timeout: any\n return (...args: Array<any>) => {\n if (!timeout) {\n timeout = setTimeout(() => {\n fn(...args)\n timeout = null\n }, wait)\n }\n }\n}\nexport const scrollRestorationCache: ScrollRestorationCache = sessionsStorage\n ? (() => {\n const state: ScrollRestorationByKey =\n JSON.parse(window.sessionStorage.getItem(storageKey) || 'null') || {}\n\n return {\n state,\n // This setter is simply to make sure that we set the sessionStorage right\n // after the state is updated. It doesn't necessarily need to be a functional\n // update.\n set: (updater) => (\n (scrollRestorationCache.state =\n functionalUpdate(updater, scrollRestorationCache.state) ||\n scrollRestorationCache.state),\n window.sessionStorage.setItem(\n storageKey,\n JSON.stringify(scrollRestorationCache.state),\n )\n ),\n }\n })()\n : (undefined as any)\n/**\n * The default `getKey` function for `useScrollRestoration`.\n * It returns the `key` from the location state or the `href` of the location.\n *\n * The `location.href` is used as a fallback to support the use case where the location state is not available like the initial render.\n */\n\nexport const defaultGetScrollRestorationKey = (location: ParsedLocation) => {\n return location.state.key! || location.href\n}\n\nexport function getCssSelector(el: any): string {\n const path = []\n let parent\n while ((parent = el.parentNode)) {\n path.unshift(\n `${el.tagName}:nth-child(${([].indexOf as any).call(parent.children, el) + 1})`,\n )\n el = parent\n }\n return `${path.join(' > ')}`.toLowerCase()\n}\n\nlet ignoreScroll = false\n\n// NOTE: This function must remain pure and not use any outside variables\n// unless they are passed in as arguments. Why? Because we need to be able to\n// toString() it into a script tag to execute as early as possible in the browser\n// during SSR. Additionally, we also call it from within the router lifecycle\nexport function restoreScroll(\n storageKey: string,\n key?: string,\n behavior?: ScrollToOptions['behavior'],\n shouldScrollRestoration?: boolean,\n scrollToTopSelectors?: Array<string>,\n) {\n let byKey: ScrollRestorationByKey\n\n try {\n byKey = JSON.parse(sessionStorage.getItem(storageKey) || '{}')\n } catch (error: any) {\n console.error(error)\n return\n }\n\n const resolvedKey = key || window.history.state?.key\n const elementEntries = byKey[resolvedKey]\n\n //\n ignoreScroll = true\n\n //\n ;(() => {\n // If we have a cached entry for this location state,\n // we always need to prefer that over the hash scroll.\n if (shouldScrollRestoration && elementEntries) {\n for (const elementSelector in elementEntries) {\n const entry = elementEntries[elementSelector]!\n if (elementSelector === 'window') {\n window.scrollTo({\n top: entry.scrollY,\n left: entry.scrollX,\n behavior,\n })\n } else if (elementSelector) {\n const element = document.querySelector(elementSelector)\n if (element) {\n element.scrollLeft = entry.scrollX\n element.scrollTop = entry.scrollY\n }\n }\n }\n\n return\n }\n\n // If we don't have a cached entry for the hash,\n // Which means we've never seen this location before,\n // we need to check if there is a hash in the URL.\n // If there is, we need to scroll it's ID into view.\n const hash = window.location.hash.split('#')[1]\n\n if (hash) {\n const hashScrollIntoViewOptions =\n (window.history.state || {}).__hashScrollIntoViewOptions ?? true\n\n if (hashScrollIntoViewOptions) {\n const el = document.getElementById(hash)\n if (el) {\n el.scrollIntoView(hashScrollIntoViewOptions)\n }\n }\n\n return\n }\n\n // If there is no cached entry for the hash and there is no hash in the URL,\n // we need to scroll to the top of the page for every scrollToTop element\n ;[\n 'window',\n ...(scrollToTopSelectors?.filter((d) => d !== 'window') ?? []),\n ].forEach((selector) => {\n const element =\n selector === 'window' ? window : document.querySelector(selector)\n if (element) {\n element.scrollTo({\n top: 0,\n left: 0,\n behavior,\n })\n }\n })\n })()\n\n //\n ignoreScroll = false\n}\n\nexport function setupScrollRestoration(router: AnyRouter, force?: boolean) {\n const shouldScrollRestoration =\n force ?? router.options.scrollRestoration ?? false\n\n if (shouldScrollRestoration) {\n router.isScrollRestoring = true\n }\n\n if (typeof document === 'undefined' || router.isScrollRestorationSetup) {\n return\n }\n\n router.isScrollRestorationSetup = true\n\n //\n ignoreScroll = false\n\n const getKey =\n router.options.getScrollRestorationKey || defaultGetScrollRestorationKey\n\n window.history.scrollRestoration = 'manual'\n\n // // Create a MutationObserver to monitor DOM changes\n // const mutationObserver = new MutationObserver(() => {\n // ;ignoreScroll = true\n // requestAnimationFrame(() => {\n // ;ignoreScroll = false\n\n // // Attempt to restore scroll position on each dom\n // // mutation until the user scrolls. We do this\n // // because dynamic content may come in at different\n // // ticks after the initial render and we want to\n // // keep up with that content as much as possible.\n // // As soon as the user scrolls, we no longer need\n // // to attempt router.\n // // console.log('mutation observer restoreScroll')\n // restoreScroll(\n // storageKey,\n // getKey(router.state.location),\n // router.options.scrollRestorationBehavior,\n // )\n // })\n // })\n\n // const observeDom = () => {\n // // Observe changes to the entire document\n // mutationObserver.observe(document, {\n // childList: true, // Detect added or removed child nodes\n // subtree: true, // Monitor all descendants\n // characterData: true, // Detect text content changes\n // })\n // }\n\n // const unobserveDom = () => {\n // mutationObserver.disconnect()\n // }\n\n // observeDom()\n\n const onScroll = (event: Event) => {\n // unobserveDom()\n\n if (ignoreScroll || !router.isScrollRestoring) {\n return\n }\n\n let elementSelector = ''\n\n if (event.target === document || event.target === window) {\n elementSelector = 'window'\n } else {\n const attrId = (event.target as Element).getAttribute(\n 'data-scroll-restoration-id',\n )\n\n if (attrId) {\n elementSelector = `[data-scroll-restoration-id=\"${attrId}\"]`\n } else {\n elementSelector = getCssSelector(event.target)\n }\n }\n\n const restoreKey = getKey(router.state.location)\n\n scrollRestorationCache.set((state) => {\n const keyEntry = (state[restoreKey] =\n state[restoreKey] || ({} as ScrollRestorationByElement))\n\n const elementEntry = (keyEntry[elementSelector] =\n keyEntry[elementSelector] || ({} as ScrollRestorationEntry))\n\n if (elementSelector === 'window') {\n elementEntry.scrollX = window.scrollX || 0\n elementEntry.scrollY = window.scrollY || 0\n } else if (elementSelector) {\n const element = document.querySelector(elementSelector)\n if (element) {\n elementEntry.scrollX = element.scrollLeft || 0\n elementEntry.scrollY = element.scrollTop || 0\n }\n }\n\n return state\n })\n }\n\n // Throttle the scroll event to avoid excessive updates\n if (typeof document !== 'undefined') {\n document.addEventListener('scroll', throttle(onScroll, 100), true)\n }\n\n router.subscribe('onRendered', (event) => {\n // unobserveDom()\n\n const cacheKey = getKey(event.toLocation)\n\n // If the user doesn't want to restore the scroll position,\n // we don't need to do anything.\n if (!router.resetNextScroll) {\n router.resetNextScroll = true\n return\n }\n\n restoreScroll(\n storageKey,\n cacheKey,\n router.options.scrollRestorationBehavior,\n router.isScrollRestoring,\n router.options.scrollToTopSelectors,\n )\n\n if (router.isScrollRestoring) {\n // Mark the location as having been seen\n scrollRestorationCache.set((state) => {\n state[cacheKey] = state[cacheKey] || ({} as ScrollRestorationByElement)\n\n return state\n })\n }\n })\n}\n\nexport function ScrollRestoration() {\n const router = useRouter()\n const getKey =\n router.options.getScrollRestorationKey || defaultGetScrollRestorationKey\n const userKey = getKey(router.latestLocation)\n const resolvedKey =\n userKey !== defaultGetScrollRestorationKey(router.latestLocation)\n ? userKey\n : null\n\n if (!router.isScrollRestoring || !router.isServer) {\n return null\n }\n\n return (\n <ScriptOnce\n children={`(${restoreScroll.toString()})(${JSON.stringify(storageKey)},${JSON.stringify(resolvedKey)}, undefined, true)`}\n log={false}\n />\n )\n}\n"],"names":["storageKey","sessionsStorage","window","sessionStorage","throttle","fn","wait","timeout","args","setTimeout","scrollRestorationCache","state","JSON","parse","getItem","set","updater","functionalUpdate","setItem","stringify","undefined","defaultGetScrollRestorationKey","location","key","href","getCssSelector","el","path","parent","parentNode","unshift","tagName","indexOf","call","children","join","toLowerCase","ignoreScroll","restoreScroll","behavior","shouldScrollRestoration","scrollToTopSelectors","byKey","error","console","resolvedKey","history","elementEntries","elementSelector","entry","scrollTo","top","scrollY","left","scrollX","element","document","querySelector","scrollLeft","scrollTop","hash","split","hashScrollIntoViewOptions","__hashScrollIntoViewOptions","getElementById","scrollIntoView","filter","d","forEach","selector","setupScrollRestoration","router","force","options","scrollRestoration","isScrollRestoring","isScrollRestorationSetup","getKey","getScrollRestorationKey","onScroll","event","target","attrId","getAttribute","restoreKey","keyEntry","elementEntry","addEventListener","subscribe","cacheKey","toLocation","resetNextScroll","scrollRestorationBehavior","ScrollRestoration","useRouter","userKey","latestLocation","isServer","_$createComponent","ScriptOnce","toString","log"],"mappings":";;;;;;AAqBO,MAAMA,aAAa;AAC1B,MAAMC,kBAAkB,OAAOC,WAAW,eAAeA,OAAOC;AAChE,MAAMC,WAAWA,CAACC,IAAmCC,SAAiB;AAChEC,MAAAA;AACJ,SAAO,IAAIC,SAAqB;AAC9B,QAAI,CAACD,SAAS;AACZA,gBAAUE,WAAW,MAAM;AACzBJ,WAAG,GAAGG,IAAI;AACA,kBAAA;AAAA,SACTF,IAAI;AAAA,IAAA;AAAA,EAEX;AACF;AACaI,MAAAA,yBAAiDT,mBACzD,MAAM;AACCU,QAAAA,QACJC,KAAKC,MAAMX,OAAOC,eAAeW,QAAQd,UAAU,KAAK,MAAM,KAAK,CAAC;AAE/D,SAAA;AAAA,IACLW;AAAAA;AAAAA;AAAAA;AAAAA,IAIAI,KAAMC,CACHN,aAAAA,uBAAuBC,QACtBM,WAAAA,iBAAiBD,SAASN,uBAAuBC,KAAK,KACtDD,uBAAuBC,OACzBT,OAAOC,eAAee,QACpBlB,YACAY,KAAKO,UAAUT,uBAAuBC,KAAK,CAC7C;AAAA,EAEJ;AACF,OACCS;AAQQC,MAAAA,iCAAiCA,CAACC,aAA6B;AACnEA,SAAAA,SAASX,MAAMY,OAAQD,SAASE;AACzC;AAEO,SAASC,eAAeC,IAAiB;AAC9C,QAAMC,OAAO,CAAE;AACXC,MAAAA;AACIA,SAAAA,SAASF,GAAGG,YAAa;AAC/BF,SAAKG,QACH,GAAGJ,GAAGK,OAAO,cAAe,CAAE,EAACC,QAAgBC,KAAKL,OAAOM,UAAUR,EAAE,IAAI,CAAC,GAC9E;AACKE,SAAAA;AAAAA,EAAAA;AAEP,SAAO,GAAGD,KAAKQ,KAAK,KAAK,CAAC,GAAGC,YAAY;AAC3C;AAEA,IAAIC,eAAe;AAMZ,SAASC,cACdtC,aACAuB,KACAgB,UACAC,yBACAC,sBACA;;AACIC,MAAAA;AAEA,MAAA;AACFA,YAAQ9B,KAAKC,MAAMV,eAAeW,QAAQd,WAAU,KAAK,IAAI;AAAA,WACtD2C,OAAY;AACnBC,YAAQD,MAAMA,KAAK;AACnB;AAAA,EAAA;AAGF,QAAME,cAActB,SAAOrB,YAAO4C,QAAQnC,UAAfT,mBAAsBqB;AAC3CwB,QAAAA,iBAAiBL,MAAMG,WAAW;AAGzB,iBAAA;AAGd,GAAC,MAAM;AAGN,QAAIL,2BAA2BO,gBAAgB;AAC7C,iBAAWC,mBAAmBD,gBAAgB;AACtCE,cAAAA,QAAQF,eAAeC,eAAe;AAC5C,YAAIA,oBAAoB,UAAU;AAChC9C,iBAAOgD,SAAS;AAAA,YACdC,KAAKF,MAAMG;AAAAA,YACXC,MAAMJ,MAAMK;AAAAA,YACZf;AAAAA,UAAAA,CACD;AAAA,mBACQS,iBAAiB;AACpBO,gBAAAA,UAAUC,SAASC,cAAcT,eAAe;AACtD,cAAIO,SAAS;AACXA,oBAAQG,aAAaT,MAAMK;AAC3BC,oBAAQI,YAAYV,MAAMG;AAAAA,UAAAA;AAAAA,QAC5B;AAAA,MACF;AAGF;AAAA,IAAA;AAOF,UAAMQ,OAAO1D,OAAOoB,SAASsC,KAAKC,MAAM,GAAG,EAAE,CAAC;AAE9C,QAAID,MAAM;AACR,YAAME,6BACH5D,OAAO4C,QAAQnC,SAAS,CAAA,GAAIoD,+BAA+B;AAE9D,UAAID,2BAA2B;AACvBpC,cAAAA,KAAK8B,SAASQ,eAAeJ,IAAI;AACvC,YAAIlC,IAAI;AACNA,aAAGuC,eAAeH,yBAAyB;AAAA,QAAA;AAAA,MAC7C;AAGF;AAAA,IAAA;AAKD,KACC,UACA,IAAIrB,6DAAsByB,OAAQC,CAAMA,MAAAA,MAAM,cAAa,CAAG,CAAA,EAC9DC,QAASC,CAAa,aAAA;AACtB,YAAMd,UACJc,aAAa,WAAWnE,SAASsD,SAASC,cAAcY,QAAQ;AAClE,UAAId,SAAS;AACXA,gBAAQL,SAAS;AAAA,UACfC,KAAK;AAAA,UACLE,MAAM;AAAA,UACNd;AAAAA,QAAAA,CACD;AAAA,MAAA;AAAA,IACH,CACD;AAAA,EAAA,GACA;AAGY,iBAAA;AACjB;AAEgB+B,SAAAA,uBAAuBC,QAAmBC,OAAiB;AACzE,QAAMhC,0BACJgC,SAASD,OAAOE,QAAQC,qBAAqB;AAE/C,MAAIlC,yBAAyB;AAC3B+B,WAAOI,oBAAoB;AAAA,EAAA;AAG7B,MAAI,OAAOnB,aAAa,eAAee,OAAOK,0BAA0B;AACtE;AAAA,EAAA;AAGFL,SAAOK,2BAA2B;AAGnB,iBAAA;AAETC,QAAAA,SACJN,OAAOE,QAAQK,2BAA2BzD;AAE5CnB,SAAO4C,QAAQ4B,oBAAoB;AAuC7BK,QAAAA,WAAWA,CAACC,UAAiB;AAG7B3C,QAAAA,gBAAgB,CAACkC,OAAOI,mBAAmB;AAC7C;AAAA,IAAA;AAGF,QAAI3B,kBAAkB;AAEtB,QAAIgC,MAAMC,WAAWzB,YAAYwB,MAAMC,WAAW/E,QAAQ;AACtC,wBAAA;AAAA,IAAA,OACb;AACL,YAAMgF,SAAUF,MAAMC,OAAmBE,aACvC,4BACF;AAEA,UAAID,QAAQ;AACVlC,0BAAkB,gCAAgCkC,MAAM;AAAA,MAAA,OACnD;AACazD,0BAAAA,eAAeuD,MAAMC,MAAM;AAAA,MAAA;AAAA,IAC/C;AAGF,UAAMG,aAAaP,OAAON,OAAO5D,MAAMW,QAAQ;AAE/CZ,2BAAuBK,IAAKJ,CAAU,UAAA;AACpC,YAAM0E,WAAY1E,MAAMyE,UAAU,IAChCzE,MAAMyE,UAAU,KAAM,CAAC;AAEzB,YAAME,eAAgBD,SAASrC,eAAe,IAC5CqC,SAASrC,eAAe,KAAM,CAAC;AAEjC,UAAIA,oBAAoB,UAAU;AACnBM,qBAAAA,UAAUpD,OAAOoD,WAAW;AAC5BF,qBAAAA,UAAUlD,OAAOkD,WAAW;AAAA,iBAChCJ,iBAAiB;AACpBO,cAAAA,UAAUC,SAASC,cAAcT,eAAe;AACtD,YAAIO,SAAS;AACED,uBAAAA,UAAUC,QAAQG,cAAc;AAChCN,uBAAAA,UAAUG,QAAQI,aAAa;AAAA,QAAA;AAAA,MAC9C;AAGKhD,aAAAA;AAAAA,IAAAA,CACR;AAAA,EACH;AAGI,MAAA,OAAO6C,aAAa,aAAa;AACnCA,aAAS+B,iBAAiB,UAAUnF,SAAS2E,UAAU,GAAG,GAAG,IAAI;AAAA,EAAA;AAG5DS,SAAAA,UAAU,cAAeR,CAAU,UAAA;AAGlCS,UAAAA,WAAWZ,OAAOG,MAAMU,UAAU;AAIpC,QAAA,CAACnB,OAAOoB,iBAAiB;AAC3BpB,aAAOoB,kBAAkB;AACzB;AAAA,IAAA;AAIA3F,kBAAAA,YACAyF,UACAlB,OAAOE,QAAQmB,2BACfrB,OAAOI,mBACPJ,OAAOE,QAAQhC,oBACjB;AAEA,QAAI8B,OAAOI,mBAAmB;AAE5BjE,6BAAuBK,IAAKJ,CAAU,UAAA;AACpCA,cAAM8E,QAAQ,IAAI9E,MAAM8E,QAAQ,KAAM,CAAC;AAEhC9E,eAAAA;AAAAA,MAAAA,CACR;AAAA,IAAA;AAAA,EACH,CACD;AACH;AAEO,SAASkF,oBAAoB;AAClC,QAAMtB,SAASuB,UAAAA,UAAU;AACnBjB,QAAAA,SACJN,OAAOE,QAAQK,2BAA2BzD;AACtC0E,QAAAA,UAAUlB,OAAON,OAAOyB,cAAc;AAC5C,QAAMnD,cACJkD,YAAY1E,+BAA+BkD,OAAOyB,cAAc,IAC5DD,UACA;AAEN,MAAI,CAACxB,OAAOI,qBAAqB,CAACJ,OAAO0B,UAAU;AAC1C,WAAA;AAAA,EAAA;AAGT,SAAAC,IAAAA,gBACGC,WAAAA,YAAU;AAAA,IAAA,IACTjE,WAAQ;AAAA,aAAE,IAAII,cAAc8D,SAAS,CAAC,KAAKxF,KAAKO,UAAUnB,UAAU,CAAC,IAAIY,KAAKO,UAAU0B,WAAW,CAAC;AAAA,IAAoB;AAAA,IACxHwD,KAAK;AAAA,EAAA,CAAK;AAGhB;;;;;;;;"}
@@ -0,0 +1,29 @@
1
+ import { AnyRouter } from './router.cjs';
2
+ import { NonNullableUpdater, ParsedLocation } from '@tanstack/router-core';
3
+ export type ScrollRestorationEntry = {
4
+ scrollX: number;
5
+ scrollY: number;
6
+ };
7
+ export type ScrollRestorationByElement = Record<string, ScrollRestorationEntry>;
8
+ export type ScrollRestorationByKey = Record<string, ScrollRestorationByElement>;
9
+ export type ScrollRestorationCache = {
10
+ state: ScrollRestorationByKey;
11
+ set: (updater: NonNullableUpdater<ScrollRestorationByKey>) => void;
12
+ };
13
+ export type ScrollRestorationOptions = {
14
+ getKey?: (location: ParsedLocation) => string;
15
+ scrollBehavior?: ScrollToOptions['behavior'];
16
+ };
17
+ export declare const storageKey = "tsr-scroll-restoration-v1_3";
18
+ export declare const scrollRestorationCache: ScrollRestorationCache;
19
+ /**
20
+ * The default `getKey` function for `useScrollRestoration`.
21
+ * It returns the `key` from the location state or the `href` of the location.
22
+ *
23
+ * The `location.href` is used as a fallback to support the use case where the location state is not available like the initial render.
24
+ */
25
+ export declare const defaultGetScrollRestorationKey: (location: ParsedLocation) => string;
26
+ export declare function getCssSelector(el: any): string;
27
+ export declare function restoreScroll(storageKey: string, key?: string, behavior?: ScrollToOptions['behavior'], shouldScrollRestoration?: boolean, scrollToTopSelectors?: Array<string>): void;
28
+ export declare function setupScrollRestoration(router: AnyRouter, force?: boolean): void;
29
+ export declare function ScrollRestoration(): import("solid-js").JSX.Element;
@@ -0,0 +1,66 @@
1
+ import { FromPathOption, LinkComponentProps, NavigateOptions, PathParamOptions, SearchParamOptions, ToPathOption } from './link.cjs';
2
+ import { RouteIds } from './routeInfo.cjs';
3
+ import { AnyRouter, RegisteredRouter } from './router.cjs';
4
+ import { UseParamsOptions, UseParamsResult } from './useParams.cjs';
5
+ import { UseSearchOptions, UseSearchResult } from './useSearch.cjs';
6
+ import { Constrain, ConstrainLiteral } from '@tanstack/router-core';
7
+ export type ValidateFromPath<TFrom, TRouter extends AnyRouter = RegisteredRouter> = FromPathOption<TRouter, TFrom>;
8
+ export type ValidateToPath<TTo extends string | undefined, TFrom extends string = string, TRouter extends AnyRouter = RegisteredRouter> = ToPathOption<TRouter, TFrom, TTo>;
9
+ export type ValidateSearch<TTo extends string | undefined, TFrom extends string = string, TRouter extends AnyRouter = RegisteredRouter> = SearchParamOptions<TRouter, TFrom, TTo>;
10
+ export type ValidateParams<TTo extends string | undefined, TFrom extends string = string, TRouter extends AnyRouter = RegisteredRouter> = PathParamOptions<TRouter, TFrom, TTo>;
11
+ /**
12
+ * @internal
13
+ */
14
+ export type InferFrom<TOptions> = TOptions extends {
15
+ from: infer TFrom extends string;
16
+ } ? TFrom : string;
17
+ /**
18
+ * @internal
19
+ */
20
+ export type InferTo<TOptions> = TOptions extends {
21
+ to: infer TTo extends string;
22
+ } ? TTo : undefined;
23
+ /**
24
+ * @internal
25
+ */
26
+ export type InferMaskTo<TOptions> = TOptions extends {
27
+ mask: {
28
+ to: infer TTo extends string;
29
+ };
30
+ } ? TTo : '';
31
+ export type InferMaskFrom<TOptions> = TOptions extends {
32
+ mask: {
33
+ from: infer TFrom extends string;
34
+ };
35
+ } ? TFrom : string;
36
+ export type ValidateNavigateOptions<TOptions, TRouter extends AnyRouter = RegisteredRouter> = Constrain<TOptions, NavigateOptions<TRouter, InferFrom<TOptions>, InferTo<TOptions>, InferMaskFrom<TOptions>, InferMaskTo<TOptions>>>;
37
+ export type ValidateNavigateOptionsArray<TOptions extends ReadonlyArray<any>, TRouter extends AnyRouter = RegisteredRouter> = {
38
+ [K in keyof TOptions]: ValidateNavigateOptions<TOptions[K], TRouter>;
39
+ };
40
+ export type ValidateLinkOptions<TOptions, TComp = 'a', TRouter extends AnyRouter = RegisteredRouter> = Constrain<TOptions, LinkComponentProps<TComp, TRouter, InferFrom<TOptions>, InferTo<TOptions>, InferMaskFrom<TOptions>, InferMaskTo<TOptions>>>;
41
+ export type ValidateLinkOptionsArray<TOptions extends ReadonlyArray<any>, TComp = 'a', TRouter extends AnyRouter = RegisteredRouter> = {
42
+ [K in keyof TOptions]: ValidateLinkOptions<TOptions[K], TComp, TRouter>;
43
+ };
44
+ export type ValidateId<TId extends string, TRouter extends AnyRouter = RegisteredRouter> = ConstrainLiteral<TId, RouteIds<TRouter['routeTree']>>;
45
+ /**
46
+ * @internal
47
+ */
48
+ export type InferStrict<TOptions> = TOptions extends {
49
+ strict: infer TStrict extends boolean;
50
+ } ? TStrict : true;
51
+ /**
52
+ * @internal
53
+ */
54
+ export type InferShouldThrow<TOptions> = TOptions extends {
55
+ shouldThrow: infer TShouldThrow extends boolean;
56
+ } ? TShouldThrow : true;
57
+ /**
58
+ * @internal
59
+ */
60
+ export type InferSelected<TOptions> = TOptions extends {
61
+ select: (...args: Array<any>) => infer TSelected;
62
+ } ? TSelected : unknown;
63
+ export type ValidateUseSearchOptions<TOptions, TRouter extends AnyRouter = RegisteredRouter> = Constrain<TOptions, UseSearchOptions<TRouter, InferFrom<TOptions>, InferStrict<TOptions>, InferShouldThrow<TOptions>, InferSelected<TOptions>>>;
64
+ export type ValidateUseSearchResult<TOptions, TRouter extends AnyRouter = RegisteredRouter> = UseSearchResult<TRouter, InferFrom<TOptions>, InferStrict<TOptions>, InferSelected<TOptions>>;
65
+ export type ValidateUseParamsOptions<TOptions, TRouter extends AnyRouter = RegisteredRouter> = Constrain<TOptions, UseParamsOptions<TRouter, InferFrom<TOptions>, InferStrict<TOptions>, InferShouldThrow<TOptions>, InferSelected<TOptions>>>;
66
+ export type ValidateUseParamsResult<TOptions, TRouter extends AnyRouter = RegisteredRouter> = Constrain<TOptions, UseParamsResult<TRouter, InferFrom<TOptions>, InferStrict<TOptions>, InferSelected<TOptions>>>;
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const Solid = require("solid-js");
4
+ const useRouter = require("./useRouter.cjs");
5
+ function _interopNamespaceDefault(e) {
6
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
7
+ if (e) {
8
+ for (const k in e) {
9
+ if (k !== "default") {
10
+ const d = Object.getOwnPropertyDescriptor(e, k);
11
+ Object.defineProperty(n, k, d.get ? d : {
12
+ enumerable: true,
13
+ get: () => e[k]
14
+ });
15
+ }
16
+ }
17
+ }
18
+ n.default = e;
19
+ return Object.freeze(n);
20
+ }
21
+ const Solid__namespace = /* @__PURE__ */ _interopNamespaceDefault(Solid);
22
+ function _resolveBlockerOpts(opts, condition) {
23
+ if (opts === void 0) {
24
+ return {
25
+ shouldBlockFn: () => true,
26
+ withResolver: false
27
+ };
28
+ }
29
+ if ("shouldBlockFn" in opts) {
30
+ return opts;
31
+ }
32
+ if (typeof opts === "function") {
33
+ const shouldBlock2 = Boolean(condition ?? true);
34
+ const _customBlockerFn2 = async () => {
35
+ if (shouldBlock2) return await opts();
36
+ return false;
37
+ };
38
+ return {
39
+ shouldBlockFn: _customBlockerFn2,
40
+ enableBeforeUnload: shouldBlock2,
41
+ withResolver: false
42
+ };
43
+ }
44
+ const shouldBlock = Boolean(opts.condition ?? true);
45
+ const fn = opts.blockerFn;
46
+ const _customBlockerFn = async () => {
47
+ if (shouldBlock && fn !== void 0) {
48
+ return await fn();
49
+ }
50
+ return shouldBlock;
51
+ };
52
+ return {
53
+ shouldBlockFn: _customBlockerFn,
54
+ enableBeforeUnload: shouldBlock,
55
+ withResolver: fn === void 0
56
+ };
57
+ }
58
+ function useBlocker(opts, condition) {
59
+ const {
60
+ shouldBlockFn,
61
+ enableBeforeUnload = true,
62
+ disabled = false,
63
+ withResolver = false
64
+ } = _resolveBlockerOpts(opts, condition);
65
+ const router = useRouter.useRouter();
66
+ const {
67
+ history
68
+ } = router;
69
+ const [resolver, setResolver] = Solid__namespace.createSignal({
70
+ status: "idle",
71
+ current: void 0,
72
+ next: void 0,
73
+ action: void 0,
74
+ proceed: void 0,
75
+ reset: void 0
76
+ });
77
+ Solid__namespace.createEffect(() => {
78
+ const blockerFnComposed = async (blockerFnArgs) => {
79
+ function getLocation(location) {
80
+ const parsedLocation = router.parseLocation(void 0, location);
81
+ const matchedRoutes = router.getMatchedRoutes(parsedLocation);
82
+ if (matchedRoutes.foundRoute === void 0) {
83
+ throw new Error(`No route found for location ${location.href}`);
84
+ }
85
+ return {
86
+ routeId: matchedRoutes.foundRoute.id,
87
+ fullPath: matchedRoutes.foundRoute.fullPath,
88
+ pathname: parsedLocation.pathname,
89
+ params: matchedRoutes.routeParams,
90
+ search: parsedLocation.search
91
+ };
92
+ }
93
+ const current = getLocation(blockerFnArgs.currentLocation);
94
+ const next = getLocation(blockerFnArgs.nextLocation);
95
+ const shouldBlock = await shouldBlockFn({
96
+ action: blockerFnArgs.action,
97
+ current,
98
+ next
99
+ });
100
+ if (!withResolver) {
101
+ return shouldBlock;
102
+ }
103
+ if (!shouldBlock) {
104
+ return false;
105
+ }
106
+ const promise = new Promise((resolve) => {
107
+ setResolver({
108
+ status: "blocked",
109
+ current,
110
+ next,
111
+ action: blockerFnArgs.action,
112
+ proceed: () => resolve(false),
113
+ reset: () => resolve(true)
114
+ });
115
+ });
116
+ const canNavigateAsync = await promise;
117
+ setResolver({
118
+ status: "idle",
119
+ current: void 0,
120
+ next: void 0,
121
+ action: void 0,
122
+ proceed: void 0,
123
+ reset: void 0
124
+ });
125
+ return canNavigateAsync;
126
+ };
127
+ return disabled ? void 0 : history.block({
128
+ blockerFn: blockerFnComposed,
129
+ enableBeforeUnload
130
+ });
131
+ });
132
+ return resolver;
133
+ }
134
+ const _resolvePromptBlockerArgs = (props) => {
135
+ if ("shouldBlockFn" in props) {
136
+ return {
137
+ ...props
138
+ };
139
+ }
140
+ const shouldBlock = Boolean(props.condition ?? true);
141
+ const fn = props.blockerFn;
142
+ const _customBlockerFn = async () => {
143
+ if (shouldBlock && fn !== void 0) {
144
+ return await fn();
145
+ }
146
+ return shouldBlock;
147
+ };
148
+ return {
149
+ shouldBlockFn: _customBlockerFn,
150
+ enableBeforeUnload: shouldBlock,
151
+ withResolver: fn === void 0
152
+ };
153
+ };
154
+ function Block(opts) {
155
+ const {
156
+ children,
157
+ ...rest
158
+ } = opts;
159
+ const args = _resolvePromptBlockerArgs(rest);
160
+ const resolver = useBlocker(args);
161
+ return children ? typeof children === "function" ? children(resolver) : children : null;
162
+ }
163
+ exports.Block = Block;
164
+ exports.useBlocker = useBlocker;
165
+ //# sourceMappingURL=useBlocker.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBlocker.cjs","sources":["../../src/useBlocker.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { useRouter } from './useRouter'\nimport type {\n BlockerFnArgs,\n HistoryAction,\n HistoryLocation,\n} from '@tanstack/history'\nimport type { AnyRoute, SolidNode } from './route'\nimport type { ParseRoute } from './routeInfo'\nimport type { AnyRouter, RegisteredRouter } from './router'\n\ninterface ShouldBlockFnLocation<\n out TRouteId,\n out TFullPath,\n out TAllParams,\n out TFullSearchSchema,\n> {\n routeId: TRouteId\n fullPath: TFullPath\n pathname: string\n params: TAllParams\n search: TFullSearchSchema\n}\n\ntype AnyShouldBlockFnLocation = ShouldBlockFnLocation<any, any, any, any>\ntype MakeShouldBlockFnLocationUnion<\n TRouter extends AnyRouter = RegisteredRouter,\n TRoute extends AnyRoute = ParseRoute<TRouter['routeTree']>,\n> = TRoute extends any\n ? ShouldBlockFnLocation<\n TRoute['id'],\n TRoute['fullPath'],\n TRoute['types']['allParams'],\n TRoute['types']['fullSearchSchema']\n >\n : never\n\ntype BlockerResolver<TRouter extends AnyRouter = RegisteredRouter> =\n | {\n status: 'blocked'\n current: MakeShouldBlockFnLocationUnion<TRouter>\n next: MakeShouldBlockFnLocationUnion<TRouter>\n action: HistoryAction\n proceed: () => void\n reset: () => void\n }\n | {\n status: 'idle'\n current: undefined\n next: undefined\n action: undefined\n proceed: undefined\n reset: undefined\n }\n\ntype ShouldBlockFnArgs<TRouter extends AnyRouter = RegisteredRouter> = {\n current: MakeShouldBlockFnLocationUnion<TRouter>\n next: MakeShouldBlockFnLocationUnion<TRouter>\n action: HistoryAction\n}\n\nexport type ShouldBlockFn<TRouter extends AnyRouter = RegisteredRouter> = (\n args: ShouldBlockFnArgs<TRouter>,\n) => boolean | Promise<boolean>\nexport type UseBlockerOpts<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n> = {\n shouldBlockFn: ShouldBlockFn<TRouter>\n enableBeforeUnload?: boolean | (() => boolean)\n disabled?: boolean\n withResolver?: TWithResolver\n}\n\ntype LegacyBlockerFn = () => Promise<any> | any\ntype LegacyBlockerOpts = {\n blockerFn?: LegacyBlockerFn\n condition?: boolean | any\n}\n\nfunction _resolveBlockerOpts(\n opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,\n condition?: boolean | any,\n): UseBlockerOpts {\n if (opts === undefined) {\n return {\n shouldBlockFn: () => true,\n withResolver: false,\n }\n }\n\n if ('shouldBlockFn' in opts) {\n return opts\n }\n\n if (typeof opts === 'function') {\n const shouldBlock = Boolean(condition ?? true)\n\n const _customBlockerFn = async () => {\n if (shouldBlock) return await opts()\n return false\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: false,\n }\n }\n\n const shouldBlock = Boolean(opts.condition ?? true)\n const fn = opts.blockerFn\n\n const _customBlockerFn = async () => {\n if (shouldBlock && fn !== undefined) {\n return await fn()\n }\n return shouldBlock\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: fn === undefined,\n }\n}\n\nexport function useBlocker<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = false,\n>(\n opts: UseBlockerOpts<TRouter, TWithResolver>,\n): TWithResolver extends true ? Solid.Accessor<BlockerResolver<TRouter>> : void\n\n/**\n * @deprecated Use the shouldBlockFn property instead\n */\nexport function useBlocker(\n blockerFnOrOpts?: LegacyBlockerOpts,\n): Solid.Accessor<BlockerResolver>\n\n/**\n * @deprecated Use the UseBlockerOpts object syntax instead\n */\nexport function useBlocker(\n blockerFn?: LegacyBlockerFn,\n condition?: boolean | any,\n): Solid.Accessor<BlockerResolver>\n\nexport function useBlocker(\n opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,\n condition?: boolean | any,\n): Solid.Accessor<BlockerResolver> | void {\n const {\n shouldBlockFn,\n enableBeforeUnload = true,\n disabled = false,\n withResolver = false,\n } = _resolveBlockerOpts(opts, condition)\n\n const router = useRouter()\n const { history } = router\n\n const [resolver, setResolver] = Solid.createSignal<BlockerResolver>({\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n })\n\n Solid.createEffect(() => {\n const blockerFnComposed = async (blockerFnArgs: BlockerFnArgs) => {\n function getLocation(\n location: HistoryLocation,\n ): AnyShouldBlockFnLocation {\n const parsedLocation = router.parseLocation(undefined, location)\n const matchedRoutes = router.getMatchedRoutes(parsedLocation)\n if (matchedRoutes.foundRoute === undefined) {\n throw new Error(`No route found for location ${location.href}`)\n }\n return {\n routeId: matchedRoutes.foundRoute.id,\n fullPath: matchedRoutes.foundRoute.fullPath,\n pathname: parsedLocation.pathname,\n params: matchedRoutes.routeParams,\n search: parsedLocation.search,\n }\n }\n\n const current = getLocation(blockerFnArgs.currentLocation)\n const next = getLocation(blockerFnArgs.nextLocation)\n\n const shouldBlock = await shouldBlockFn({\n action: blockerFnArgs.action,\n current,\n next,\n })\n if (!withResolver) {\n return shouldBlock\n }\n\n if (!shouldBlock) {\n return false\n }\n\n const promise = new Promise<boolean>((resolve) => {\n setResolver({\n status: 'blocked',\n current,\n next,\n action: blockerFnArgs.action,\n proceed: () => resolve(false),\n reset: () => resolve(true),\n })\n })\n\n const canNavigateAsync = await promise\n setResolver({\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n })\n\n return canNavigateAsync\n }\n\n return disabled\n ? undefined\n : history.block({ blockerFn: blockerFnComposed, enableBeforeUnload })\n })\n\n return resolver\n}\n\nconst _resolvePromptBlockerArgs = (\n props: PromptProps | LegacyPromptProps,\n): UseBlockerOpts => {\n if ('shouldBlockFn' in props) {\n return { ...props }\n }\n\n const shouldBlock = Boolean(props.condition ?? true)\n const fn = props.blockerFn\n\n const _customBlockerFn = async () => {\n if (shouldBlock && fn !== undefined) {\n return await fn()\n }\n return shouldBlock\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: fn === undefined,\n }\n}\n\nexport function Block<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n>(opts: PromptProps<TRouter, TWithResolver>): SolidNode\n\n/**\n * @deprecated Use the UseBlockerOpts property instead\n */\nexport function Block(opts: LegacyPromptProps): SolidNode\n\nexport function Block(opts: PromptProps | LegacyPromptProps): SolidNode {\n const { children, ...rest } = opts\n const args = _resolvePromptBlockerArgs(rest)\n\n const resolver = useBlocker(args)\n return children\n ? typeof children === 'function'\n ? children(resolver as any)\n : children\n : null\n}\n\ntype LegacyPromptProps = {\n blockerFn?: LegacyBlockerFn\n condition?: boolean | any\n children?: SolidNode | ((params: BlockerResolver) => SolidNode)\n}\n\ntype PromptProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n TParams = TWithResolver extends true ? BlockerResolver<TRouter> : void,\n> = UseBlockerOpts<TRouter, TWithResolver> & {\n children?: SolidNode | ((params: TParams) => SolidNode)\n}\n"],"names":["_resolveBlockerOpts","opts","condition","undefined","shouldBlockFn","withResolver","shouldBlock","Boolean","_customBlockerFn","enableBeforeUnload","fn","blockerFn","useBlocker","disabled","router","useRouter","history","resolver","setResolver","Solid","createSignal","status","current","next","action","proceed","reset","createEffect","blockerFnComposed","blockerFnArgs","getLocation","location","parsedLocation","parseLocation","matchedRoutes","getMatchedRoutes","foundRoute","Error","href","routeId","id","fullPath","pathname","params","routeParams","search","currentLocation","nextLocation","promise","Promise","resolve","canNavigateAsync","block","_resolvePromptBlockerArgs","props","Block","children","rest","args"],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { HistoryAction } from '@tanstack/history';
2
+ import { AnyRoute, SolidNode } from './route.cjs';
3
+ import { ParseRoute } from './routeInfo.cjs';
4
+ import { AnyRouter, RegisteredRouter } from './router.cjs';
5
+ import * as Solid from 'solid-js';
6
+ interface ShouldBlockFnLocation<out TRouteId, out TFullPath, out TAllParams, out TFullSearchSchema> {
7
+ routeId: TRouteId;
8
+ fullPath: TFullPath;
9
+ pathname: string;
10
+ params: TAllParams;
11
+ search: TFullSearchSchema;
12
+ }
13
+ type MakeShouldBlockFnLocationUnion<TRouter extends AnyRouter = RegisteredRouter, TRoute extends AnyRoute = ParseRoute<TRouter['routeTree']>> = TRoute extends any ? ShouldBlockFnLocation<TRoute['id'], TRoute['fullPath'], TRoute['types']['allParams'], TRoute['types']['fullSearchSchema']> : never;
14
+ type BlockerResolver<TRouter extends AnyRouter = RegisteredRouter> = {
15
+ status: 'blocked';
16
+ current: MakeShouldBlockFnLocationUnion<TRouter>;
17
+ next: MakeShouldBlockFnLocationUnion<TRouter>;
18
+ action: HistoryAction;
19
+ proceed: () => void;
20
+ reset: () => void;
21
+ } | {
22
+ status: 'idle';
23
+ current: undefined;
24
+ next: undefined;
25
+ action: undefined;
26
+ proceed: undefined;
27
+ reset: undefined;
28
+ };
29
+ type ShouldBlockFnArgs<TRouter extends AnyRouter = RegisteredRouter> = {
30
+ current: MakeShouldBlockFnLocationUnion<TRouter>;
31
+ next: MakeShouldBlockFnLocationUnion<TRouter>;
32
+ action: HistoryAction;
33
+ };
34
+ export type ShouldBlockFn<TRouter extends AnyRouter = RegisteredRouter> = (args: ShouldBlockFnArgs<TRouter>) => boolean | Promise<boolean>;
35
+ export type UseBlockerOpts<TRouter extends AnyRouter = RegisteredRouter, TWithResolver extends boolean = boolean> = {
36
+ shouldBlockFn: ShouldBlockFn<TRouter>;
37
+ enableBeforeUnload?: boolean | (() => boolean);
38
+ disabled?: boolean;
39
+ withResolver?: TWithResolver;
40
+ };
41
+ type LegacyBlockerFn = () => Promise<any> | any;
42
+ type LegacyBlockerOpts = {
43
+ blockerFn?: LegacyBlockerFn;
44
+ condition?: boolean | any;
45
+ };
46
+ export declare function useBlocker<TRouter extends AnyRouter = RegisteredRouter, TWithResolver extends boolean = false>(opts: UseBlockerOpts<TRouter, TWithResolver>): TWithResolver extends true ? Solid.Accessor<BlockerResolver<TRouter>> : void;
47
+ /**
48
+ * @deprecated Use the shouldBlockFn property instead
49
+ */
50
+ export declare function useBlocker(blockerFnOrOpts?: LegacyBlockerOpts): Solid.Accessor<BlockerResolver>;
51
+ /**
52
+ * @deprecated Use the UseBlockerOpts object syntax instead
53
+ */
54
+ export declare function useBlocker(blockerFn?: LegacyBlockerFn, condition?: boolean | any): Solid.Accessor<BlockerResolver>;
55
+ export declare function Block<TRouter extends AnyRouter = RegisteredRouter, TWithResolver extends boolean = boolean>(opts: PromptProps<TRouter, TWithResolver>): SolidNode;
56
+ /**
57
+ * @deprecated Use the UseBlockerOpts property instead
58
+ */
59
+ export declare function Block(opts: LegacyPromptProps): SolidNode;
60
+ type LegacyPromptProps = {
61
+ blockerFn?: LegacyBlockerFn;
62
+ condition?: boolean | any;
63
+ children?: SolidNode | ((params: BlockerResolver) => SolidNode);
64
+ };
65
+ type PromptProps<TRouter extends AnyRouter = RegisteredRouter, TWithResolver extends boolean = boolean, TParams = TWithResolver extends true ? BlockerResolver<TRouter> : void> = UseBlockerOpts<TRouter, TWithResolver> & {
66
+ children?: SolidNode | ((params: TParams) => SolidNode);
67
+ };
68
+ export {};
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const useRouterState = require("./useRouterState.cjs");
4
+ function useCanGoBack() {
5
+ return useRouterState.useRouterState({ select: (s) => s.location.state.__TSR_index !== 0 });
6
+ }
7
+ exports.useCanGoBack = useCanGoBack;
8
+ //# sourceMappingURL=useCanGoBack.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCanGoBack.cjs","sources":["../../src/useCanGoBack.ts"],"sourcesContent":["import { useRouterState } from './useRouterState'\n\nexport function useCanGoBack() {\n return useRouterState({ select: (s) => s.location.state.__TSR_index !== 0 })\n}\n"],"names":["useRouterState"],"mappings":";;;AAEO,SAAS,eAAe;AACtB,SAAAA,eAAA,eAAe,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,gBAAgB,GAAG;AAC7E;;"}
@@ -0,0 +1 @@
1
+ export declare function useCanGoBack(): import('solid-js').Accessor<boolean>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const useMatch = require("./useMatch.cjs");
4
+ function useLoaderData(opts) {
5
+ return useMatch.useMatch({
6
+ from: opts.from,
7
+ strict: opts.strict,
8
+ select: (s) => {
9
+ return opts.select ? opts.select(s.loaderData) : s.loaderData;
10
+ }
11
+ });
12
+ }
13
+ exports.useLoaderData = useLoaderData;
14
+ //# sourceMappingURL=useLoaderData.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLoaderData.cjs","sources":["../../src/useLoaderData.tsx"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type { Accessor } from 'solid-js'\nimport type { AnyRouter, RegisteredRouter } from './router'\nimport type { AllLoaderData, RouteById } from './routeInfo'\nimport type { StrictOrFrom } from './utils'\nimport type { Expand } from '@tanstack/router-core'\n\nexport interface UseLoaderDataBaseOptions<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TSelected,\n> {\n select?: (match: ResolveLoaderData<TRouter, TFrom, TStrict>) => TSelected\n}\n\nexport type UseLoaderDataOptions<\n TRouter extends AnyRouter,\n TFrom extends string | undefined,\n TStrict extends boolean,\n TSelected,\n> = StrictOrFrom<TRouter, TFrom, TStrict> &\n UseLoaderDataBaseOptions<TRouter, TFrom, TStrict, TSelected>\n\nexport type ResolveLoaderData<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n> = TStrict extends false\n ? AllLoaderData<TRouter['routeTree']>\n : Expand<RouteById<TRouter['routeTree'], TFrom>['types']['loaderData']>\n\nexport type UseLoaderDataResult<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TSelected,\n> = unknown extends TSelected\n ? ResolveLoaderData<TRouter, TFrom, TStrict>\n : TSelected\n\nexport type UseLoaderDataRoute<out TId> = <\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseLoaderDataBaseOptions<TRouter, TId, true, TSelected>,\n) => Accessor<UseLoaderDataResult<TRouter, TId, true, TSelected>>\n\nexport function useLoaderData<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string | undefined = undefined,\n TStrict extends boolean = true,\n TSelected = unknown,\n>(\n opts: UseLoaderDataOptions<TRouter, TFrom, TStrict, TSelected>,\n): Accessor<UseLoaderDataResult<TRouter, TFrom, TStrict, TSelected>> {\n return useMatch({\n from: opts.from!,\n strict: opts.strict,\n select: (s: any) => {\n return opts.select ? opts.select(s.loaderData) : s.loaderData\n },\n } as any) as any\n}\n"],"names":["useLoaderData","opts","useMatch","from","strict","select","s","loaderData"],"mappings":";;;AAgDO,SAASA,cAMdC,MACmE;AACnE,SAAOC,kBAAS;AAAA,IACdC,MAAMF,KAAKE;AAAAA,IACXC,QAAQH,KAAKG;AAAAA,IACbC,QAAQA,CAACC,MAAW;AAClB,aAAOL,KAAKI,SAASJ,KAAKI,OAAOC,EAAEC,UAAU,IAAID,EAAEC;AAAAA,IAAAA;AAAAA,EACrD,CACM;AACV;;"}
@@ -0,0 +1,13 @@
1
+ import { Accessor } from 'solid-js';
2
+ import { AnyRouter, RegisteredRouter } from './router.cjs';
3
+ import { AllLoaderData, RouteById } from './routeInfo.cjs';
4
+ import { StrictOrFrom } from './utils.cjs';
5
+ import { Expand } from '@tanstack/router-core';
6
+ export interface UseLoaderDataBaseOptions<TRouter extends AnyRouter, TFrom, TStrict extends boolean, TSelected> {
7
+ select?: (match: ResolveLoaderData<TRouter, TFrom, TStrict>) => TSelected;
8
+ }
9
+ export type UseLoaderDataOptions<TRouter extends AnyRouter, TFrom extends string | undefined, TStrict extends boolean, TSelected> = StrictOrFrom<TRouter, TFrom, TStrict> & UseLoaderDataBaseOptions<TRouter, TFrom, TStrict, TSelected>;
10
+ export type ResolveLoaderData<TRouter extends AnyRouter, TFrom, TStrict extends boolean> = TStrict extends false ? AllLoaderData<TRouter['routeTree']> : Expand<RouteById<TRouter['routeTree'], TFrom>['types']['loaderData']>;
11
+ export type UseLoaderDataResult<TRouter extends AnyRouter, TFrom, TStrict extends boolean, TSelected> = unknown extends TSelected ? ResolveLoaderData<TRouter, TFrom, TStrict> : TSelected;
12
+ export type UseLoaderDataRoute<out TId> = <TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown>(opts?: UseLoaderDataBaseOptions<TRouter, TId, true, TSelected>) => Accessor<UseLoaderDataResult<TRouter, TId, true, TSelected>>;
13
+ export declare function useLoaderData<TRouter extends AnyRouter = RegisteredRouter, const TFrom extends string | undefined = undefined, TStrict extends boolean = true, TSelected = unknown>(opts: UseLoaderDataOptions<TRouter, TFrom, TStrict, TSelected>): Accessor<UseLoaderDataResult<TRouter, TFrom, TStrict, TSelected>>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const useMatch = require("./useMatch.cjs");
4
+ function useLoaderDeps(opts) {
5
+ const {
6
+ select,
7
+ ...rest
8
+ } = opts;
9
+ return useMatch.useMatch({
10
+ ...rest,
11
+ select: (s) => {
12
+ return select ? select(s.loaderDeps) : s.loaderDeps;
13
+ }
14
+ });
15
+ }
16
+ exports.useLoaderDeps = useLoaderDeps;
17
+ //# sourceMappingURL=useLoaderDeps.cjs.map