@tanstack/react-router 1.121.0-alpha.22 → 1.121.0-alpha.28

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 (214) hide show
  1. package/dist/cjs/Asset.cjs +83 -16
  2. package/dist/cjs/Asset.cjs.map +1 -1
  3. package/dist/cjs/Asset.d.cts +2 -1
  4. package/dist/cjs/CatchBoundary.cjs.map +1 -1
  5. package/dist/cjs/ClientOnly.cjs.map +1 -1
  6. package/dist/cjs/ClientOnly.d.cts +1 -1
  7. package/dist/cjs/HeadContent.cjs +19 -17
  8. package/dist/cjs/HeadContent.cjs.map +1 -1
  9. package/dist/cjs/Match.cjs +61 -57
  10. package/dist/cjs/Match.cjs.map +1 -1
  11. package/dist/cjs/Matches.cjs +14 -16
  12. package/dist/cjs/Matches.cjs.map +1 -1
  13. package/dist/cjs/Matches.d.cts +2 -2
  14. package/dist/cjs/RouterProvider.cjs.map +1 -1
  15. package/dist/cjs/SafeFragment.cjs.map +1 -1
  16. package/dist/cjs/ScriptOnce.cjs +3 -10
  17. package/dist/cjs/ScriptOnce.cjs.map +1 -1
  18. package/dist/cjs/ScriptOnce.d.cts +1 -1
  19. package/dist/cjs/Scripts.cjs +7 -11
  20. package/dist/cjs/Scripts.cjs.map +1 -1
  21. package/dist/cjs/ScrollRestoration.cjs +3 -4
  22. package/dist/cjs/ScrollRestoration.cjs.map +1 -1
  23. package/dist/cjs/Transitioner.cjs +16 -15
  24. package/dist/cjs/Transitioner.cjs.map +1 -1
  25. package/dist/cjs/awaited.cjs.map +1 -1
  26. package/dist/cjs/fileRoute.cjs +8 -8
  27. package/dist/cjs/fileRoute.cjs.map +1 -1
  28. package/dist/cjs/index.cjs +0 -12
  29. package/dist/cjs/index.cjs.map +1 -1
  30. package/dist/cjs/index.d.cts +4 -8
  31. package/dist/cjs/lazyRouteComponent.cjs +3 -16
  32. package/dist/cjs/lazyRouteComponent.cjs.map +1 -1
  33. package/dist/cjs/lazyRouteComponent.d.cts +1 -1
  34. package/dist/cjs/link.cjs +106 -74
  35. package/dist/cjs/link.cjs.map +1 -1
  36. package/dist/cjs/link.d.cts +1 -5
  37. package/dist/cjs/matchContext.cjs.map +1 -1
  38. package/dist/cjs/not-found.cjs +2 -4
  39. package/dist/cjs/not-found.cjs.map +1 -1
  40. package/dist/cjs/renderRouteNotFound.cjs.map +1 -1
  41. package/dist/cjs/route.cjs +21 -21
  42. package/dist/cjs/route.cjs.map +1 -1
  43. package/dist/cjs/route.d.cts +14 -6
  44. package/dist/cjs/router.cjs.map +1 -1
  45. package/dist/cjs/routerContext.cjs.map +1 -1
  46. package/dist/cjs/scroll-restoration.cjs +9 -3
  47. package/dist/cjs/scroll-restoration.cjs.map +1 -1
  48. package/dist/cjs/ssr/RouterClient.cjs +25 -0
  49. package/dist/cjs/ssr/RouterClient.cjs.map +1 -0
  50. package/dist/cjs/ssr/RouterClient.d.cts +4 -0
  51. package/dist/cjs/ssr/RouterServer.cjs +9 -0
  52. package/dist/cjs/ssr/RouterServer.cjs.map +1 -0
  53. package/dist/cjs/ssr/RouterServer.d.cts +4 -0
  54. package/dist/cjs/ssr/client.cjs +12 -0
  55. package/dist/cjs/ssr/client.cjs.map +1 -0
  56. package/dist/cjs/ssr/client.d.cts +2 -0
  57. package/dist/cjs/ssr/defaultRenderHandler.cjs +15 -0
  58. package/dist/cjs/ssr/defaultRenderHandler.cjs.map +1 -0
  59. package/dist/cjs/ssr/defaultRenderHandler.d.cts +1 -0
  60. package/dist/cjs/ssr/defaultStreamHandler.cjs +16 -0
  61. package/dist/cjs/ssr/defaultStreamHandler.cjs.map +1 -0
  62. package/dist/cjs/ssr/defaultStreamHandler.d.cts +1 -0
  63. package/dist/cjs/ssr/renderRouterToStream.cjs +63 -0
  64. package/dist/cjs/ssr/renderRouterToStream.cjs.map +1 -0
  65. package/dist/cjs/ssr/renderRouterToStream.d.cts +8 -0
  66. package/dist/cjs/ssr/renderRouterToString.cjs +28 -0
  67. package/dist/cjs/ssr/renderRouterToString.cjs.map +1 -0
  68. package/dist/cjs/ssr/renderRouterToString.d.cts +7 -0
  69. package/dist/cjs/ssr/server.cjs +20 -0
  70. package/dist/cjs/ssr/server.cjs.map +1 -0
  71. package/dist/cjs/ssr/server.d.cts +6 -0
  72. package/dist/cjs/useBlocker.cjs.map +1 -1
  73. package/dist/cjs/useCanGoBack.cjs.map +1 -1
  74. package/dist/cjs/useLoaderData.cjs.map +1 -1
  75. package/dist/cjs/useLoaderDeps.cjs.map +1 -1
  76. package/dist/cjs/useLocation.cjs +1 -1
  77. package/dist/cjs/useLocation.cjs.map +1 -1
  78. package/dist/cjs/useMatch.cjs.map +1 -1
  79. package/dist/cjs/useNavigate.cjs +2 -2
  80. package/dist/cjs/useNavigate.cjs.map +1 -1
  81. package/dist/cjs/useParams.cjs.map +1 -1
  82. package/dist/cjs/useRouter.cjs +1 -1
  83. package/dist/cjs/useRouter.cjs.map +1 -1
  84. package/dist/cjs/useRouterState.cjs +3 -3
  85. package/dist/cjs/useRouterState.cjs.map +1 -1
  86. package/dist/cjs/useSearch.cjs.map +1 -1
  87. package/dist/cjs/utils.cjs +4 -10
  88. package/dist/cjs/utils.cjs.map +1 -1
  89. package/dist/cjs/utils.d.cts +1 -1
  90. package/dist/esm/Asset.d.ts +2 -1
  91. package/dist/esm/Asset.js +66 -16
  92. package/dist/esm/Asset.js.map +1 -1
  93. package/dist/esm/CatchBoundary.js.map +1 -1
  94. package/dist/esm/ClientOnly.d.ts +1 -1
  95. package/dist/esm/ClientOnly.js.map +1 -1
  96. package/dist/esm/HeadContent.js +19 -17
  97. package/dist/esm/HeadContent.js.map +1 -1
  98. package/dist/esm/Match.js +63 -59
  99. package/dist/esm/Match.js.map +1 -1
  100. package/dist/esm/Matches.d.ts +2 -2
  101. package/dist/esm/Matches.js +14 -16
  102. package/dist/esm/Matches.js.map +1 -1
  103. package/dist/esm/RouterProvider.js.map +1 -1
  104. package/dist/esm/SafeFragment.js.map +1 -1
  105. package/dist/esm/ScriptOnce.d.ts +1 -1
  106. package/dist/esm/ScriptOnce.js +3 -10
  107. package/dist/esm/ScriptOnce.js.map +1 -1
  108. package/dist/esm/Scripts.js +7 -11
  109. package/dist/esm/Scripts.js.map +1 -1
  110. package/dist/esm/ScrollRestoration.js +3 -4
  111. package/dist/esm/ScrollRestoration.js.map +1 -1
  112. package/dist/esm/Transitioner.js +16 -15
  113. package/dist/esm/Transitioner.js.map +1 -1
  114. package/dist/esm/awaited.js.map +1 -1
  115. package/dist/esm/fileRoute.js +8 -8
  116. package/dist/esm/fileRoute.js.map +1 -1
  117. package/dist/esm/index.d.ts +4 -8
  118. package/dist/esm/index.js +2 -8
  119. package/dist/esm/index.js.map +1 -1
  120. package/dist/esm/lazyRouteComponent.d.ts +1 -1
  121. package/dist/esm/lazyRouteComponent.js +2 -15
  122. package/dist/esm/lazyRouteComponent.js.map +1 -1
  123. package/dist/esm/link.d.ts +1 -5
  124. package/dist/esm/link.js +107 -75
  125. package/dist/esm/link.js.map +1 -1
  126. package/dist/esm/matchContext.js.map +1 -1
  127. package/dist/esm/not-found.js +2 -4
  128. package/dist/esm/not-found.js.map +1 -1
  129. package/dist/esm/renderRouteNotFound.js.map +1 -1
  130. package/dist/esm/route.d.ts +14 -6
  131. package/dist/esm/route.js +21 -21
  132. package/dist/esm/route.js.map +1 -1
  133. package/dist/esm/router.js.map +1 -1
  134. package/dist/esm/routerContext.js.map +1 -1
  135. package/dist/esm/scroll-restoration.js +9 -3
  136. package/dist/esm/scroll-restoration.js.map +1 -1
  137. package/dist/esm/ssr/RouterClient.d.ts +4 -0
  138. package/dist/esm/ssr/RouterClient.js +25 -0
  139. package/dist/esm/ssr/RouterClient.js.map +1 -0
  140. package/dist/esm/ssr/RouterServer.d.ts +4 -0
  141. package/dist/esm/ssr/RouterServer.js +9 -0
  142. package/dist/esm/ssr/RouterServer.js.map +1 -0
  143. package/dist/esm/ssr/client.d.ts +2 -0
  144. package/dist/esm/ssr/client.js +6 -0
  145. package/dist/esm/ssr/client.js.map +1 -0
  146. package/dist/esm/ssr/defaultRenderHandler.d.ts +1 -0
  147. package/dist/esm/ssr/defaultRenderHandler.js +15 -0
  148. package/dist/esm/ssr/defaultRenderHandler.js.map +1 -0
  149. package/dist/esm/ssr/defaultStreamHandler.d.ts +1 -0
  150. package/dist/esm/ssr/defaultStreamHandler.js +16 -0
  151. package/dist/esm/ssr/defaultStreamHandler.js.map +1 -0
  152. package/dist/esm/ssr/renderRouterToStream.d.ts +8 -0
  153. package/dist/esm/ssr/renderRouterToStream.js +63 -0
  154. package/dist/esm/ssr/renderRouterToStream.js.map +1 -0
  155. package/dist/esm/ssr/renderRouterToString.d.ts +7 -0
  156. package/dist/esm/ssr/renderRouterToString.js +28 -0
  157. package/dist/esm/ssr/renderRouterToString.js.map +1 -0
  158. package/dist/esm/ssr/server.d.ts +6 -0
  159. package/dist/esm/ssr/server.js +14 -0
  160. package/dist/esm/ssr/server.js.map +1 -0
  161. package/dist/esm/useBlocker.js.map +1 -1
  162. package/dist/esm/useCanGoBack.js.map +1 -1
  163. package/dist/esm/useLoaderData.js.map +1 -1
  164. package/dist/esm/useLoaderDeps.js.map +1 -1
  165. package/dist/esm/useLocation.js +1 -1
  166. package/dist/esm/useLocation.js.map +1 -1
  167. package/dist/esm/useMatch.js.map +1 -1
  168. package/dist/esm/useNavigate.js +2 -2
  169. package/dist/esm/useNavigate.js.map +1 -1
  170. package/dist/esm/useParams.js.map +1 -1
  171. package/dist/esm/useRouter.js +1 -1
  172. package/dist/esm/useRouter.js.map +1 -1
  173. package/dist/esm/useRouterState.js +3 -3
  174. package/dist/esm/useRouterState.js.map +1 -1
  175. package/dist/esm/useSearch.js.map +1 -1
  176. package/dist/esm/utils.d.ts +1 -1
  177. package/dist/esm/utils.js +4 -10
  178. package/dist/esm/utils.js.map +1 -1
  179. package/dist/llms/index.d.ts +3 -0
  180. package/dist/llms/index.js +35 -0
  181. package/dist/llms/rules/api.d.ts +2 -0
  182. package/dist/llms/rules/api.js +4326 -0
  183. package/dist/llms/rules/guide.d.ts +2 -0
  184. package/dist/llms/rules/guide.js +7096 -0
  185. package/dist/llms/rules/routing.d.ts +2 -0
  186. package/dist/llms/rules/routing.js +1981 -0
  187. package/dist/llms/rules/setup-and-architecture.d.ts +2 -0
  188. package/dist/llms/rules/setup-and-architecture.js +945 -0
  189. package/package.json +32 -6
  190. package/src/Asset.tsx +95 -16
  191. package/src/ClientOnly.tsx +1 -1
  192. package/src/HeadContent.tsx +16 -0
  193. package/src/Match.tsx +86 -63
  194. package/src/Matches.tsx +24 -17
  195. package/src/ScriptOnce.tsx +2 -14
  196. package/src/Transitioner.tsx +13 -14
  197. package/src/index.tsx +3 -21
  198. package/src/lazyRouteComponent.tsx +6 -31
  199. package/src/link.tsx +130 -99
  200. package/src/not-found.tsx +1 -1
  201. package/src/route.tsx +18 -9
  202. package/src/scroll-restoration.tsx +10 -3
  203. package/src/ssr/RouterClient.tsx +22 -0
  204. package/src/ssr/RouterServer.tsx +9 -0
  205. package/src/ssr/client.ts +2 -0
  206. package/src/ssr/defaultRenderHandler.tsx +12 -0
  207. package/src/ssr/defaultStreamHandler.tsx +13 -0
  208. package/src/ssr/renderRouterToStream.tsx +79 -0
  209. package/src/ssr/renderRouterToString.tsx +31 -0
  210. package/src/ssr/server.ts +6 -0
  211. package/src/utils.ts +6 -14
  212. package/dist/cjs/serializer.d.cts +0 -6
  213. package/dist/esm/serializer.d.ts +0 -6
  214. package/src/serializer.ts +0 -7
package/dist/esm/link.js CHANGED
@@ -4,7 +4,7 @@ import { flushSync } from "react-dom";
4
4
  import { preloadWarning, functionalUpdate, exactPathTest, removeTrailingSlash, deepEqual } from "@tanstack/router-core";
5
5
  import { useRouterState } from "./useRouterState.js";
6
6
  import { useRouter } from "./useRouter.js";
7
- import { useForwardedRef, useIntersectionObserver, useLayoutEffect } from "./utils.js";
7
+ import { useForwardedRef, useIntersectionObserver } from "./utils.js";
8
8
  import { useMatch } from "./useMatch.js";
9
9
  function useLinkProps(options, forwardedRef) {
10
10
  const router = useRouter();
@@ -13,8 +13,8 @@ function useLinkProps(options, forwardedRef) {
13
13
  const innerRef = useForwardedRef(forwardedRef);
14
14
  const {
15
15
  // custom props
16
- activeProps = () => ({ className: "active" }),
17
- inactiveProps = () => ({}),
16
+ activeProps,
17
+ inactiveProps,
18
18
  activeOptions,
19
19
  to,
20
20
  preload: userPreload,
@@ -36,9 +36,6 @@ function useLinkProps(options, forwardedRef) {
36
36
  onMouseLeave,
37
37
  onTouchStart,
38
38
  ignoreBlocker,
39
- ...rest
40
- } = options;
41
- const {
42
39
  // prevent these from being returned
43
40
  params: _params,
44
41
  search: _search,
@@ -46,11 +43,14 @@ function useLinkProps(options, forwardedRef) {
46
43
  state: _state,
47
44
  mask: _mask,
48
45
  reloadDocument: _reloadDocument,
46
+ unsafeRelative: _unsafeRelative,
47
+ from: _from,
48
+ _fromLocation,
49
49
  ...propsSafeToSpread
50
- } = rest;
50
+ } = options;
51
51
  const type = React.useMemo(() => {
52
52
  try {
53
- new URL(`${to}`);
53
+ new URL(to);
54
54
  return "external";
55
55
  } catch {
56
56
  }
@@ -60,27 +60,34 @@ function useLinkProps(options, forwardedRef) {
60
60
  select: (s) => s.location.search,
61
61
  structuralSharing: true
62
62
  });
63
- const nearestFrom = useMatch({
63
+ const from = useMatch({
64
64
  strict: false,
65
- select: (match) => match.fullPath
65
+ select: (match) => options.from ?? match.fullPath
66
66
  });
67
- const from = options.from ?? nearestFrom;
68
- options = { ...options, from };
69
67
  const next = React.useMemo(
70
- () => router.buildLocation(options),
68
+ () => router.buildLocation({ ...options, from }),
71
69
  // eslint-disable-next-line react-hooks/exhaustive-deps
72
- [router, options, currentSearch]
70
+ [
71
+ router,
72
+ currentSearch,
73
+ options._fromLocation,
74
+ from,
75
+ options.hash,
76
+ options.to,
77
+ options.search,
78
+ options.params,
79
+ options.state,
80
+ options.mask,
81
+ options.unsafeRelative
82
+ ]
73
83
  );
74
- const preload = React.useMemo(() => {
75
- if (options.reloadDocument) {
76
- return false;
77
- }
78
- return userPreload ?? router.options.defaultPreload;
79
- }, [router.options.defaultPreload, userPreload, options.reloadDocument]);
84
+ const isExternal = type === "external";
85
+ const preload = options.reloadDocument || isExternal ? false : userPreload ?? router.options.defaultPreload;
80
86
  const preloadDelay = userPreloadDelay ?? router.options.defaultPreloadDelay ?? 0;
81
87
  const isActive = useRouterState({
82
88
  select: (s) => {
83
- if (activeOptions == null ? void 0 : activeOptions.exact) {
89
+ if (isExternal) return false;
90
+ if (activeOptions?.exact) {
84
91
  const testExact = exactPathTest(
85
92
  s.location.pathname,
86
93
  next.pathname,
@@ -93,42 +100,62 @@ function useLinkProps(options, forwardedRef) {
93
100
  const currentPathSplit = removeTrailingSlash(
94
101
  s.location.pathname,
95
102
  router.basepath
96
- ).split("/");
103
+ );
97
104
  const nextPathSplit = removeTrailingSlash(
98
105
  next.pathname,
99
106
  router.basepath
100
- ).split("/");
101
- const pathIsFuzzyEqual = nextPathSplit.every(
102
- (d, i) => d === currentPathSplit[i]
103
107
  );
108
+ const pathIsFuzzyEqual = currentPathSplit.startsWith(nextPathSplit) && (currentPathSplit.length === nextPathSplit.length || currentPathSplit[nextPathSplit.length] === "/");
104
109
  if (!pathIsFuzzyEqual) {
105
110
  return false;
106
111
  }
107
112
  }
108
- if ((activeOptions == null ? void 0 : activeOptions.includeSearch) ?? true) {
113
+ if (activeOptions?.includeSearch ?? true) {
109
114
  const searchTest = deepEqual(s.location.search, next.search, {
110
- partial: !(activeOptions == null ? void 0 : activeOptions.exact),
111
- ignoreUndefined: !(activeOptions == null ? void 0 : activeOptions.explicitUndefined)
115
+ partial: !activeOptions?.exact,
116
+ ignoreUndefined: !activeOptions?.explicitUndefined
112
117
  });
113
118
  if (!searchTest) {
114
119
  return false;
115
120
  }
116
121
  }
117
- if (activeOptions == null ? void 0 : activeOptions.includeHash) {
122
+ if (activeOptions?.includeHash) {
118
123
  return s.location.hash === next.hash;
119
124
  }
120
125
  return true;
121
126
  }
122
127
  });
123
- const doPreload = React.useCallback(() => {
124
- router.preloadRoute(options).catch((err) => {
125
- console.warn(err);
126
- console.warn(preloadWarning);
127
- });
128
- }, [options, router]);
128
+ const doPreload = React.useCallback(
129
+ () => {
130
+ router.preloadRoute({ ...options, from }).catch((err) => {
131
+ console.warn(err);
132
+ console.warn(preloadWarning);
133
+ });
134
+ },
135
+ // eslint-disable-next-line react-hooks/exhaustive-deps
136
+ [
137
+ router,
138
+ options.to,
139
+ options._fromLocation,
140
+ from,
141
+ options.search,
142
+ options.hash,
143
+ options.params,
144
+ options.state,
145
+ options.mask,
146
+ options.unsafeRelative,
147
+ options.hashScrollIntoView,
148
+ options.href,
149
+ options.ignoreBlocker,
150
+ options.reloadDocument,
151
+ options.replace,
152
+ options.resetScroll,
153
+ options.viewTransition
154
+ ]
155
+ );
129
156
  const preloadViewportIoCallback = React.useCallback(
130
157
  (entry) => {
131
- if (entry == null ? void 0 : entry.isIntersecting) {
158
+ if (entry?.isIntersecting) {
132
159
  doPreload();
133
160
  }
134
161
  },
@@ -137,10 +164,10 @@ function useLinkProps(options, forwardedRef) {
137
164
  useIntersectionObserver(
138
165
  innerRef,
139
166
  preloadViewportIoCallback,
140
- { rootMargin: "100px" },
167
+ intersectionObserverOptions,
141
168
  { disabled: !!disabled || !(preload === "viewport") }
142
169
  );
143
- useLayoutEffect(() => {
170
+ React.useEffect(() => {
144
171
  if (hasRenderFetched.current) {
145
172
  return;
146
173
  }
@@ -149,7 +176,7 @@ function useLinkProps(options, forwardedRef) {
149
176
  hasRenderFetched.current = true;
150
177
  }
151
178
  }, [disabled, doPreload, preload]);
152
- if (type === "external") {
179
+ if (isExternal) {
153
180
  return {
154
181
  ...propsSafeToSpread,
155
182
  ref: innerRef,
@@ -177,8 +204,9 @@ function useLinkProps(options, forwardedRef) {
177
204
  unsub();
178
205
  setIsTransitioning(false);
179
206
  });
180
- return router.navigate({
207
+ router.navigate({
181
208
  ...options,
209
+ from,
182
210
  replace,
183
211
  resetScroll,
184
212
  hashScrollIntoView,
@@ -196,46 +224,38 @@ function useLinkProps(options, forwardedRef) {
196
224
  };
197
225
  const handleTouchStart = handleFocus;
198
226
  const handleEnter = (e) => {
199
- if (disabled) return;
200
- const eventTarget = e.target || {};
201
- if (preload) {
202
- if (eventTarget.preloadTimeout) {
227
+ if (disabled || !preload) return;
228
+ if (!preloadDelay) {
229
+ doPreload();
230
+ } else {
231
+ const eventTarget = e.target;
232
+ if (timeoutMap.has(eventTarget)) {
203
233
  return;
204
234
  }
205
- if (!preloadDelay) {
235
+ const id = setTimeout(() => {
236
+ timeoutMap.delete(eventTarget);
206
237
  doPreload();
207
- } else {
208
- eventTarget.preloadTimeout = setTimeout(() => {
209
- eventTarget.preloadTimeout = null;
210
- doPreload();
211
- }, preloadDelay);
212
- }
238
+ }, preloadDelay);
239
+ timeoutMap.set(eventTarget, id);
213
240
  }
214
241
  };
215
242
  const handleLeave = (e) => {
216
- if (disabled) return;
217
- const eventTarget = e.target || {};
218
- if (eventTarget.preloadTimeout) {
219
- clearTimeout(eventTarget.preloadTimeout);
220
- eventTarget.preloadTimeout = null;
243
+ if (disabled || !preload || !preloadDelay) return;
244
+ const eventTarget = e.target;
245
+ const id = timeoutMap.get(eventTarget);
246
+ if (id) {
247
+ clearTimeout(id);
248
+ timeoutMap.delete(eventTarget);
221
249
  }
222
250
  };
223
- const composeHandlers = (handlers) => (e) => {
224
- var _a;
225
- (_a = e.persist) == null ? void 0 : _a.call(e);
226
- handlers.filter(Boolean).forEach((handler) => {
227
- if (e.defaultPrevented) return;
228
- handler(e);
229
- });
230
- };
231
- const resolvedActiveProps = isActive ? functionalUpdate(activeProps, {}) ?? {} : {};
232
- const resolvedInactiveProps = isActive ? {} : functionalUpdate(inactiveProps, {});
251
+ const resolvedActiveProps = isActive ? functionalUpdate(activeProps, {}) ?? STATIC_ACTIVE_OBJECT : STATIC_EMPTY_OBJECT;
252
+ const resolvedInactiveProps = isActive ? STATIC_EMPTY_OBJECT : functionalUpdate(inactiveProps, {}) ?? STATIC_EMPTY_OBJECT;
233
253
  const resolvedClassName = [
234
254
  className,
235
255
  resolvedActiveProps.className,
236
256
  resolvedInactiveProps.className
237
257
  ].filter(Boolean).join(" ");
238
- const resolvedStyle = {
258
+ const resolvedStyle = (style || resolvedActiveProps.style || resolvedInactiveProps.style) && {
239
259
  ...style,
240
260
  ...resolvedActiveProps.style,
241
261
  ...resolvedInactiveProps.style
@@ -253,16 +273,28 @@ function useLinkProps(options, forwardedRef) {
253
273
  onTouchStart: composeHandlers([onTouchStart, handleTouchStart]),
254
274
  disabled: !!disabled,
255
275
  target,
256
- ...Object.keys(resolvedStyle).length && { style: resolvedStyle },
276
+ ...resolvedStyle && { style: resolvedStyle },
257
277
  ...resolvedClassName && { className: resolvedClassName },
258
- ...disabled && {
259
- role: "link",
260
- "aria-disabled": true
261
- },
262
- ...isActive && { "data-status": "active", "aria-current": "page" },
263
- ...isTransitioning && { "data-transitioning": "transitioning" }
278
+ ...disabled && STATIC_DISABLED_PROPS,
279
+ ...isActive && STATIC_ACTIVE_PROPS,
280
+ ...isTransitioning && STATIC_TRANSITIONING_PROPS
264
281
  };
265
282
  }
283
+ const STATIC_EMPTY_OBJECT = {};
284
+ const STATIC_ACTIVE_OBJECT = { className: "active" };
285
+ const STATIC_DISABLED_PROPS = { role: "link", "aria-disabled": true };
286
+ const STATIC_ACTIVE_PROPS = { "data-status": "active", "aria-current": "page" };
287
+ const STATIC_TRANSITIONING_PROPS = { "data-transitioning": "transitioning" };
288
+ const timeoutMap = /* @__PURE__ */ new WeakMap();
289
+ const intersectionObserverOptions = {
290
+ rootMargin: "100px"
291
+ };
292
+ const composeHandlers = (handlers) => (e) => {
293
+ handlers.filter(Boolean).forEach((handler) => {
294
+ if (e.defaultPrevented) return;
295
+ handler(e);
296
+ });
297
+ };
266
298
  function createLink(Comp) {
267
299
  return React.forwardRef(function CreatedLink(props, ref) {
268
300
  return /* @__PURE__ */ jsx(Link, { ...props, _asChild: Comp, ref });
@@ -279,7 +311,7 @@ const Link = React.forwardRef(
279
311
  const children = typeof rest.children === "function" ? rest.children({
280
312
  isActive: linkProps["data-status"] === "active"
281
313
  }) : rest.children;
282
- if (typeof _asChild === "undefined") {
314
+ if (_asChild === void 0) {
283
315
  delete linkProps.disabled;
284
316
  }
285
317
  return React.createElement(
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","sources":["../../src/link.tsx"],"sourcesContent":["import * as React from 'react'\nimport { flushSync } from 'react-dom'\nimport {\n deepEqual,\n exactPathTest,\n functionalUpdate,\n preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\n\nimport {\n useForwardedRef,\n useIntersectionObserver,\n useLayoutEffect,\n} from './utils'\n\nimport { useMatch } from './useMatch'\nimport type {\n AnyRouter,\n Constrain,\n LinkCurrentTargetElement,\n LinkOptions,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type { ReactNode } from 'react'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\n\nexport function useLinkProps<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n options: UseLinkPropsOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n forwardedRef?: React.ForwardedRef<Element>,\n): React.ComponentPropsWithRef<'a'> {\n const router = useRouter()\n const [isTransitioning, setIsTransitioning] = React.useState(false)\n const hasRenderFetched = React.useRef(false)\n const innerRef = useForwardedRef(forwardedRef)\n\n const {\n // custom props\n activeProps = () => ({ className: 'active' }),\n inactiveProps = () => ({}),\n activeOptions,\n to,\n preload: userPreload,\n preloadDelay: userPreloadDelay,\n hashScrollIntoView,\n replace,\n startTransition,\n resetScroll,\n viewTransition,\n // element props\n children,\n target,\n disabled,\n style,\n className,\n onClick,\n onFocus,\n onMouseEnter,\n onMouseLeave,\n onTouchStart,\n ignoreBlocker,\n ...rest\n } = options\n\n const {\n // prevent these from being returned\n params: _params,\n search: _search,\n hash: _hash,\n state: _state,\n mask: _mask,\n reloadDocument: _reloadDocument,\n ...propsSafeToSpread\n } = rest\n\n // If this link simply reloads the current route,\n // make sure it has a new key so it will trigger a data refresh\n\n // If this `to` is a valid external URL, return\n // null for LinkUtils\n\n const type: 'internal' | 'external' = React.useMemo(() => {\n try {\n new URL(`${to}`)\n return 'external'\n } catch {}\n return 'internal'\n }, [to])\n\n // subscribe to search params to re-build location if it changes\n const currentSearch = useRouterState({\n select: (s) => s.location.search,\n structuralSharing: true as any,\n })\n\n const nearestFrom = useMatch({\n strict: false,\n select: (match) => match.fullPath,\n })\n\n const from = options.from ?? nearestFrom\n\n // Use it as the default `from` location\n options = { ...options, from }\n\n const next = React.useMemo(\n () => router.buildLocation(options as any),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [router, options, currentSearch],\n )\n\n const preload = React.useMemo(() => {\n if (options.reloadDocument) {\n return false\n }\n return userPreload ?? router.options.defaultPreload\n }, [router.options.defaultPreload, userPreload, options.reloadDocument])\n const preloadDelay =\n userPreloadDelay ?? router.options.defaultPreloadDelay ?? 0\n\n const isActive = useRouterState({\n select: (s) => {\n if (activeOptions?.exact) {\n const testExact = exactPathTest(\n s.location.pathname,\n next.pathname,\n router.basepath,\n )\n if (!testExact) {\n return false\n }\n } else {\n const currentPathSplit = removeTrailingSlash(\n s.location.pathname,\n router.basepath,\n ).split('/')\n const nextPathSplit = removeTrailingSlash(\n next.pathname,\n router.basepath,\n ).split('/')\n\n const pathIsFuzzyEqual = nextPathSplit.every(\n (d, i) => d === currentPathSplit[i],\n )\n if (!pathIsFuzzyEqual) {\n return false\n }\n }\n\n if (activeOptions?.includeSearch ?? true) {\n const searchTest = deepEqual(s.location.search, next.search, {\n partial: !activeOptions?.exact,\n ignoreUndefined: !activeOptions?.explicitUndefined,\n })\n if (!searchTest) {\n return false\n }\n }\n\n if (activeOptions?.includeHash) {\n return s.location.hash === next.hash\n }\n return true\n },\n })\n\n const doPreload = React.useCallback(() => {\n router.preloadRoute(options as any).catch((err) => {\n console.warn(err)\n console.warn(preloadWarning)\n })\n }, [options, router])\n\n const preloadViewportIoCallback = React.useCallback(\n (entry: IntersectionObserverEntry | undefined) => {\n if (entry?.isIntersecting) {\n doPreload()\n }\n },\n [doPreload],\n )\n\n useIntersectionObserver(\n innerRef,\n preloadViewportIoCallback,\n { rootMargin: '100px' },\n { disabled: !!disabled || !(preload === 'viewport') },\n )\n\n useLayoutEffect(() => {\n if (hasRenderFetched.current) {\n return\n }\n if (!disabled && preload === 'render') {\n doPreload()\n hasRenderFetched.current = true\n }\n }, [disabled, doPreload, preload])\n\n if (type === 'external') {\n return {\n ...propsSafeToSpread,\n ref: innerRef as React.ComponentPropsWithRef<'a'>['ref'],\n type,\n href: to,\n ...(children && { children }),\n ...(target && { target }),\n ...(disabled && { disabled }),\n ...(style && { style }),\n ...(className && { className }),\n ...(onClick && { onClick }),\n ...(onFocus && { onFocus }),\n ...(onMouseEnter && { onMouseEnter }),\n ...(onMouseLeave && { onMouseLeave }),\n ...(onTouchStart && { onTouchStart }),\n }\n }\n\n // The click handler\n const handleClick = (e: MouseEvent) => {\n if (\n !disabled &&\n !isCtrlEvent(e) &&\n !e.defaultPrevented &&\n (!target || target === '_self') &&\n e.button === 0\n ) {\n e.preventDefault()\n\n flushSync(() => {\n setIsTransitioning(true)\n })\n\n const unsub = router.subscribe('onResolved', () => {\n unsub()\n setIsTransitioning(false)\n })\n\n // All is well? Navigate!\n // N.B. we don't call `router.commitLocation(next) here because we want to run `validateSearch` before committing\n return router.navigate({\n ...options,\n replace,\n resetScroll,\n hashScrollIntoView,\n startTransition,\n viewTransition,\n ignoreBlocker,\n })\n }\n }\n\n // The click handler\n const handleFocus = (_: MouseEvent) => {\n if (disabled) return\n if (preload) {\n doPreload()\n }\n }\n\n const handleTouchStart = handleFocus\n\n const handleEnter = (e: MouseEvent) => {\n if (disabled) return\n const eventTarget = (e.target || {}) as LinkCurrentTargetElement\n\n if (preload) {\n if (eventTarget.preloadTimeout) {\n return\n }\n\n if (!preloadDelay) {\n doPreload()\n } else {\n eventTarget.preloadTimeout = setTimeout(() => {\n eventTarget.preloadTimeout = null\n doPreload()\n }, preloadDelay)\n }\n }\n }\n\n const handleLeave = (e: MouseEvent) => {\n if (disabled) return\n const eventTarget = (e.target || {}) as LinkCurrentTargetElement\n\n if (eventTarget.preloadTimeout) {\n clearTimeout(eventTarget.preloadTimeout)\n eventTarget.preloadTimeout = null\n }\n }\n\n const composeHandlers =\n (handlers: Array<undefined | ((e: any) => void)>) =>\n (e: { persist?: () => void; defaultPrevented: boolean }) => {\n e.persist?.()\n handlers.filter(Boolean).forEach((handler) => {\n if (e.defaultPrevented) return\n handler!(e)\n })\n }\n\n // Get the active props\n const resolvedActiveProps: React.HTMLAttributes<HTMLAnchorElement> = isActive\n ? (functionalUpdate(activeProps as any, {}) ?? {})\n : {}\n\n // Get the inactive props\n const resolvedInactiveProps: React.HTMLAttributes<HTMLAnchorElement> =\n isActive ? {} : functionalUpdate(inactiveProps, {})\n\n const resolvedClassName = [\n className,\n resolvedActiveProps.className,\n resolvedInactiveProps.className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const resolvedStyle = {\n ...style,\n ...resolvedActiveProps.style,\n ...resolvedInactiveProps.style,\n }\n\n return {\n ...propsSafeToSpread,\n ...resolvedActiveProps,\n ...resolvedInactiveProps,\n href: disabled\n ? undefined\n : next.maskedLocation\n ? router.history.createHref(next.maskedLocation.href)\n : router.history.createHref(next.href),\n ref: innerRef as React.ComponentPropsWithRef<'a'>['ref'],\n onClick: composeHandlers([onClick, handleClick]),\n onFocus: composeHandlers([onFocus, handleFocus]),\n onMouseEnter: composeHandlers([onMouseEnter, handleEnter]),\n onMouseLeave: composeHandlers([onMouseLeave, handleLeave]),\n onTouchStart: composeHandlers([onTouchStart, handleTouchStart]),\n disabled: !!disabled,\n target,\n ...(Object.keys(resolvedStyle).length && { style: resolvedStyle }),\n ...(resolvedClassName && { className: resolvedClassName }),\n ...(disabled && {\n role: 'link',\n 'aria-disabled': true,\n }),\n ...(isActive && { 'data-status': 'active', 'aria-current': 'page' }),\n ...(isTransitioning && { 'data-transitioning': 'transitioning' }),\n }\n}\n\ntype UseLinkReactProps<TComp> = TComp extends keyof React.JSX.IntrinsicElements\n ? React.JSX.IntrinsicElements[TComp]\n : React.PropsWithoutRef<\n TComp extends React.ComponentType<infer TProps> ? TProps : never\n > &\n React.RefAttributes<\n TComp extends\n | React.FC<{ ref: React.Ref<infer TRef> }>\n | React.Component<{ ref: React.Ref<infer TRef> }>\n ? TRef\n : never\n >\n\nexport type UseLinkPropsOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<'a', TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n UseLinkReactProps<'a'>\n\nexport type ActiveLinkOptions<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n ActiveLinkOptionProps<TComp>\n\ntype ActiveLinkProps<TComp> = Partial<\n LinkComponentReactProps<TComp> & {\n [key: `data-${string}`]: unknown\n }\n>\n\nexport interface ActiveLinkOptionProps<TComp = 'a'> {\n /**\n * A function that returns additional props for the `active` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `className`'s are concatenated)\n */\n activeProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n /**\n * A function that returns additional props for the `inactive` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `className`'s are concatenated)\n */\n inactiveProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n}\n\nexport type LinkProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n LinkPropsChildren\n\nexport interface LinkPropsChildren {\n // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns\n children?:\n | React.ReactNode\n | ((state: {\n isActive: boolean\n isTransitioning: boolean\n }) => React.ReactNode)\n}\n\ntype LinkComponentReactProps<TComp> = Omit<\n UseLinkReactProps<TComp>,\n keyof CreateLinkProps\n>\n\nexport type LinkComponentProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkComponentReactProps<TComp> &\n LinkProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type CreateLinkProps = LinkProps<\n any,\n any,\n string,\n string,\n string,\n string\n>\n\nexport type LinkComponent<\n in out TComp,\n in out TDefaultFrom extends string = string,\n> = <\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = TDefaultFrom,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => React.ReactElement\n\nexport interface LinkComponentRoute<\n in out TDefaultFrom extends string = string,\n> {\n defaultFrom: TDefaultFrom\n <\n TRouter extends AnyRouter = RegisteredRouter,\n const TTo extends string | undefined = undefined,\n const TMaskTo extends string = '',\n >(\n props: LinkComponentProps<\n 'a',\n TRouter,\n this['defaultFrom'],\n TTo,\n this['defaultFrom'],\n TMaskTo\n >,\n ): React.ReactElement\n}\n\nexport function createLink<const TComp>(\n Comp: Constrain<TComp, any, (props: CreateLinkProps) => ReactNode>,\n): LinkComponent<TComp> {\n return React.forwardRef(function CreatedLink(props, ref) {\n return <Link {...(props as any)} _asChild={Comp} ref={ref} />\n }) as any\n}\n\nexport const Link: LinkComponent<'a'> = React.forwardRef<Element, any>(\n (props, ref) => {\n const { _asChild, ...rest } = props\n const {\n type: _type,\n ref: innerRef,\n ...linkProps\n } = useLinkProps(rest as any, ref)\n\n const children =\n typeof rest.children === 'function'\n ? rest.children({\n isActive: (linkProps as any)['data-status'] === 'active',\n })\n : rest.children\n\n if (typeof _asChild === 'undefined') {\n // the ReturnType of useLinkProps returns the correct type for a <a> element, not a general component that has a disabled prop\n // @ts-expect-error\n delete linkProps.disabled\n }\n\n return React.createElement(\n _asChild ? _asChild : 'a',\n {\n ...linkProps,\n ref: innerRef,\n },\n children,\n )\n },\n) as any\n\nfunction isCtrlEvent(e: MouseEvent) {\n return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\n}\n\nexport type LinkOptionsFnOptions<\n TOptions,\n TComp,\n TRouter extends AnyRouter = RegisteredRouter,\n> =\n TOptions extends ReadonlyArray<any>\n ? ValidateLinkOptionsArray<TRouter, TOptions, string, TComp>\n : ValidateLinkOptions<TRouter, TOptions, string, TComp>\n\nexport type LinkOptionsFn<TComp> = <\n const TOptions,\n TRouter extends AnyRouter = RegisteredRouter,\n>(\n options: LinkOptionsFnOptions<TOptions, TComp, TRouter>,\n) => TOptions\n\nexport const linkOptions: LinkOptionsFn<'a'> = (options) => {\n return options as any\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"link.js","sources":["../../src/link.tsx"],"sourcesContent":["import * as React from 'react'\nimport { flushSync } from 'react-dom'\nimport {\n deepEqual,\n exactPathTest,\n functionalUpdate,\n preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\n\nimport { useForwardedRef, useIntersectionObserver } from './utils'\n\nimport { useMatch } from './useMatch'\nimport type {\n AnyRouter,\n Constrain,\n LinkOptions,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type { ReactNode } from 'react'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\n\nexport function useLinkProps<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n options: UseLinkPropsOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n forwardedRef?: React.ForwardedRef<Element>,\n): React.ComponentPropsWithRef<'a'> {\n const router = useRouter()\n const [isTransitioning, setIsTransitioning] = React.useState(false)\n const hasRenderFetched = React.useRef(false)\n const innerRef = useForwardedRef(forwardedRef)\n\n const {\n // custom props\n activeProps,\n inactiveProps,\n activeOptions,\n to,\n preload: userPreload,\n preloadDelay: userPreloadDelay,\n hashScrollIntoView,\n replace,\n startTransition,\n resetScroll,\n viewTransition,\n // element props\n children,\n target,\n disabled,\n style,\n className,\n onClick,\n onFocus,\n onMouseEnter,\n onMouseLeave,\n onTouchStart,\n ignoreBlocker,\n // prevent these from being returned\n params: _params,\n search: _search,\n hash: _hash,\n state: _state,\n mask: _mask,\n reloadDocument: _reloadDocument,\n unsafeRelative: _unsafeRelative,\n from: _from,\n _fromLocation,\n ...propsSafeToSpread\n } = options\n\n // If this link simply reloads the current route,\n // make sure it has a new key so it will trigger a data refresh\n\n // If this `to` is a valid external URL, return\n // null for LinkUtils\n\n const type: 'internal' | 'external' = React.useMemo(() => {\n try {\n new URL(to as any)\n return 'external'\n } catch {}\n return 'internal'\n }, [to])\n\n // subscribe to search params to re-build location if it changes\n const currentSearch = useRouterState({\n select: (s) => s.location.search,\n structuralSharing: true as any,\n })\n\n const from = useMatch({\n strict: false,\n select: (match) => options.from ?? match.fullPath,\n })\n\n const next = React.useMemo(\n () => router.buildLocation({ ...options, from } as any),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n router,\n currentSearch,\n options._fromLocation,\n from,\n options.hash,\n options.to,\n options.search,\n options.params,\n options.state,\n options.mask,\n options.unsafeRelative,\n ],\n )\n\n const isExternal = type === 'external'\n\n const preload =\n options.reloadDocument || isExternal\n ? false\n : (userPreload ?? router.options.defaultPreload)\n const preloadDelay =\n userPreloadDelay ?? router.options.defaultPreloadDelay ?? 0\n\n const isActive = useRouterState({\n select: (s) => {\n if (isExternal) return false\n if (activeOptions?.exact) {\n const testExact = exactPathTest(\n s.location.pathname,\n next.pathname,\n router.basepath,\n )\n if (!testExact) {\n return false\n }\n } else {\n const currentPathSplit = removeTrailingSlash(\n s.location.pathname,\n router.basepath,\n )\n const nextPathSplit = removeTrailingSlash(\n next.pathname,\n router.basepath,\n )\n\n const pathIsFuzzyEqual =\n currentPathSplit.startsWith(nextPathSplit) &&\n (currentPathSplit.length === nextPathSplit.length ||\n currentPathSplit[nextPathSplit.length] === '/')\n\n if (!pathIsFuzzyEqual) {\n return false\n }\n }\n\n if (activeOptions?.includeSearch ?? true) {\n const searchTest = deepEqual(s.location.search, next.search, {\n partial: !activeOptions?.exact,\n ignoreUndefined: !activeOptions?.explicitUndefined,\n })\n if (!searchTest) {\n return false\n }\n }\n\n if (activeOptions?.includeHash) {\n return s.location.hash === next.hash\n }\n return true\n },\n })\n\n const doPreload = React.useCallback(\n () => {\n router.preloadRoute({ ...options, from } as any).catch((err) => {\n console.warn(err)\n console.warn(preloadWarning)\n })\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n router,\n options.to,\n options._fromLocation,\n from,\n options.search,\n options.hash,\n options.params,\n options.state,\n options.mask,\n options.unsafeRelative,\n options.hashScrollIntoView,\n options.href,\n options.ignoreBlocker,\n options.reloadDocument,\n options.replace,\n options.resetScroll,\n options.viewTransition,\n ],\n )\n\n const preloadViewportIoCallback = React.useCallback(\n (entry: IntersectionObserverEntry | undefined) => {\n if (entry?.isIntersecting) {\n doPreload()\n }\n },\n [doPreload],\n )\n\n useIntersectionObserver(\n innerRef,\n preloadViewportIoCallback,\n intersectionObserverOptions,\n { disabled: !!disabled || !(preload === 'viewport') },\n )\n\n React.useEffect(() => {\n if (hasRenderFetched.current) {\n return\n }\n if (!disabled && preload === 'render') {\n doPreload()\n hasRenderFetched.current = true\n }\n }, [disabled, doPreload, preload])\n\n if (isExternal) {\n return {\n ...propsSafeToSpread,\n ref: innerRef as React.ComponentPropsWithRef<'a'>['ref'],\n type,\n href: to,\n ...(children && { children }),\n ...(target && { target }),\n ...(disabled && { disabled }),\n ...(style && { style }),\n ...(className && { className }),\n ...(onClick && { onClick }),\n ...(onFocus && { onFocus }),\n ...(onMouseEnter && { onMouseEnter }),\n ...(onMouseLeave && { onMouseLeave }),\n ...(onTouchStart && { onTouchStart }),\n }\n }\n\n // The click handler\n const handleClick = (e: React.MouseEvent) => {\n if (\n !disabled &&\n !isCtrlEvent(e) &&\n !e.defaultPrevented &&\n (!target || target === '_self') &&\n e.button === 0\n ) {\n e.preventDefault()\n\n flushSync(() => {\n setIsTransitioning(true)\n })\n\n const unsub = router.subscribe('onResolved', () => {\n unsub()\n setIsTransitioning(false)\n })\n\n // All is well? Navigate!\n // N.B. we don't call `router.commitLocation(next) here because we want to run `validateSearch` before committing\n router.navigate({\n ...options,\n from,\n replace,\n resetScroll,\n hashScrollIntoView,\n startTransition,\n viewTransition,\n ignoreBlocker,\n })\n }\n }\n\n // The click handler\n const handleFocus = (_: React.MouseEvent) => {\n if (disabled) return\n if (preload) {\n doPreload()\n }\n }\n\n const handleTouchStart = handleFocus\n\n const handleEnter = (e: React.MouseEvent) => {\n if (disabled || !preload) return\n\n if (!preloadDelay) {\n doPreload()\n } else {\n const eventTarget = e.target\n if (timeoutMap.has(eventTarget)) {\n return\n }\n const id = setTimeout(() => {\n timeoutMap.delete(eventTarget)\n doPreload()\n }, preloadDelay)\n timeoutMap.set(eventTarget, id)\n }\n }\n\n const handleLeave = (e: React.MouseEvent) => {\n if (disabled || !preload || !preloadDelay) return\n const eventTarget = e.target\n const id = timeoutMap.get(eventTarget)\n if (id) {\n clearTimeout(id)\n timeoutMap.delete(eventTarget)\n }\n }\n\n // Get the active props\n const resolvedActiveProps: React.HTMLAttributes<HTMLAnchorElement> = isActive\n ? (functionalUpdate(activeProps as any, {}) ?? STATIC_ACTIVE_OBJECT)\n : STATIC_EMPTY_OBJECT\n\n // Get the inactive props\n const resolvedInactiveProps: React.HTMLAttributes<HTMLAnchorElement> =\n isActive\n ? STATIC_EMPTY_OBJECT\n : (functionalUpdate(inactiveProps, {}) ?? STATIC_EMPTY_OBJECT)\n\n const resolvedClassName = [\n className,\n resolvedActiveProps.className,\n resolvedInactiveProps.className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const resolvedStyle = (style ||\n resolvedActiveProps.style ||\n resolvedInactiveProps.style) && {\n ...style,\n ...resolvedActiveProps.style,\n ...resolvedInactiveProps.style,\n }\n\n return {\n ...propsSafeToSpread,\n ...resolvedActiveProps,\n ...resolvedInactiveProps,\n href: disabled\n ? undefined\n : next.maskedLocation\n ? router.history.createHref(next.maskedLocation.href)\n : router.history.createHref(next.href),\n ref: innerRef as React.ComponentPropsWithRef<'a'>['ref'],\n onClick: composeHandlers([onClick, handleClick]),\n onFocus: composeHandlers([onFocus, handleFocus]),\n onMouseEnter: composeHandlers([onMouseEnter, handleEnter]),\n onMouseLeave: composeHandlers([onMouseLeave, handleLeave]),\n onTouchStart: composeHandlers([onTouchStart, handleTouchStart]),\n disabled: !!disabled,\n target,\n ...(resolvedStyle && { style: resolvedStyle }),\n ...(resolvedClassName && { className: resolvedClassName }),\n ...(disabled && STATIC_DISABLED_PROPS),\n ...(isActive && STATIC_ACTIVE_PROPS),\n ...(isTransitioning && STATIC_TRANSITIONING_PROPS),\n }\n}\n\nconst STATIC_EMPTY_OBJECT = {}\nconst STATIC_ACTIVE_OBJECT = { className: 'active' }\nconst STATIC_DISABLED_PROPS = { role: 'link', 'aria-disabled': true }\nconst STATIC_ACTIVE_PROPS = { 'data-status': 'active', 'aria-current': 'page' }\nconst STATIC_TRANSITIONING_PROPS = { 'data-transitioning': 'transitioning' }\n\nconst timeoutMap = new WeakMap<EventTarget, ReturnType<typeof setTimeout>>()\n\nconst intersectionObserverOptions: IntersectionObserverInit = {\n rootMargin: '100px',\n}\n\nconst composeHandlers =\n (handlers: Array<undefined | React.EventHandler<any>>) =>\n (e: React.SyntheticEvent) => {\n handlers.filter(Boolean).forEach((handler) => {\n if (e.defaultPrevented) return\n handler!(e)\n })\n }\n\ntype UseLinkReactProps<TComp> = TComp extends keyof React.JSX.IntrinsicElements\n ? React.JSX.IntrinsicElements[TComp]\n : TComp extends React.ComponentType<any>\n ? React.ComponentPropsWithoutRef<TComp> &\n React.RefAttributes<React.ComponentRef<TComp>>\n : never\n\nexport type UseLinkPropsOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<'a', TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n UseLinkReactProps<'a'>\n\nexport type ActiveLinkOptions<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n ActiveLinkOptionProps<TComp>\n\ntype ActiveLinkProps<TComp> = Partial<\n LinkComponentReactProps<TComp> & {\n [key: `data-${string}`]: unknown\n }\n>\n\nexport interface ActiveLinkOptionProps<TComp = 'a'> {\n /**\n * A function that returns additional props for the `active` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `className`'s are concatenated)\n */\n activeProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n /**\n * A function that returns additional props for the `inactive` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `className`'s are concatenated)\n */\n inactiveProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n}\n\nexport type LinkProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n LinkPropsChildren\n\nexport interface LinkPropsChildren {\n // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns\n children?:\n | React.ReactNode\n | ((state: {\n isActive: boolean\n isTransitioning: boolean\n }) => React.ReactNode)\n}\n\ntype LinkComponentReactProps<TComp> = Omit<\n UseLinkReactProps<TComp>,\n keyof CreateLinkProps\n>\n\nexport type LinkComponentProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkComponentReactProps<TComp> &\n LinkProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type CreateLinkProps = LinkProps<\n any,\n any,\n string,\n string,\n string,\n string\n>\n\nexport type LinkComponent<\n in out TComp,\n in out TDefaultFrom extends string = string,\n> = <\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = TDefaultFrom,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => React.ReactElement\n\nexport interface LinkComponentRoute<\n in out TDefaultFrom extends string = string,\n> {\n defaultFrom: TDefaultFrom\n <\n TRouter extends AnyRouter = RegisteredRouter,\n const TTo extends string | undefined = undefined,\n const TMaskTo extends string = '',\n >(\n props: LinkComponentProps<\n 'a',\n TRouter,\n this['defaultFrom'],\n TTo,\n this['defaultFrom'],\n TMaskTo\n >,\n ): React.ReactElement\n}\n\nexport function createLink<const TComp>(\n Comp: Constrain<TComp, any, (props: CreateLinkProps) => ReactNode>,\n): LinkComponent<TComp> {\n return React.forwardRef(function CreatedLink(props, ref) {\n return <Link {...(props as any)} _asChild={Comp} ref={ref} />\n }) as any\n}\n\nexport const Link: LinkComponent<'a'> = React.forwardRef<Element, any>(\n (props, ref) => {\n const { _asChild, ...rest } = props\n const {\n type: _type,\n ref: innerRef,\n ...linkProps\n } = useLinkProps(rest as any, ref)\n\n const children =\n typeof rest.children === 'function'\n ? rest.children({\n isActive: (linkProps as any)['data-status'] === 'active',\n })\n : rest.children\n\n if (_asChild === undefined) {\n // the ReturnType of useLinkProps returns the correct type for a <a> element, not a general component that has a disabled prop\n // @ts-expect-error\n delete linkProps.disabled\n }\n\n return React.createElement(\n _asChild ? _asChild : 'a',\n {\n ...linkProps,\n ref: innerRef,\n },\n children,\n )\n },\n) as any\n\nfunction isCtrlEvent(e: React.MouseEvent) {\n return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\n}\n\nexport type LinkOptionsFnOptions<\n TOptions,\n TComp,\n TRouter extends AnyRouter = RegisteredRouter,\n> =\n TOptions extends ReadonlyArray<any>\n ? ValidateLinkOptionsArray<TRouter, TOptions, string, TComp>\n : ValidateLinkOptions<TRouter, TOptions, string, TComp>\n\nexport type LinkOptionsFn<TComp> = <\n const TOptions,\n TRouter extends AnyRouter = RegisteredRouter,\n>(\n options: LinkOptionsFnOptions<TOptions, TComp, TRouter>,\n) => TOptions\n\nexport const linkOptions: LinkOptionsFn<'a'> = (options) => {\n return options as any\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"matchContext.js","sources":["../../src/matchContext.tsx"],"sourcesContent":["import * as React from 'react'\n\nexport const matchContext = React.createContext<string | undefined>(undefined)\n\n// N.B. this only exists so we can conditionally call useContext on it when we are not interested in the nearest match\nexport const dummyMatchContext = React.createContext<string | undefined>(\n undefined,\n)\n"],"names":[],"mappings":";AAEa,MAAA,eAAe,MAAM,cAAkC,MAAS;AAGtE,MAAM,oBAAoB,MAAM;AAAA,EACrC;AACF;"}
1
+ {"version":3,"file":"matchContext.js","sources":["../../src/matchContext.tsx"],"sourcesContent":["import * as React from 'react'\n\nexport const matchContext = React.createContext<string | undefined>(undefined)\n\n// N.B. this only exists so we can conditionally call useContext on it when we are not interested in the nearest match\nexport const dummyMatchContext = React.createContext<string | undefined>(\n undefined,\n)\n"],"names":[],"mappings":";AAEO,MAAM,eAAe,MAAM,cAAkC,MAAS;AAGtE,MAAM,oBAAoB,MAAM;AAAA,EACrC;AACF;"}
@@ -11,17 +11,15 @@ function CatchNotFound(props) {
11
11
  {
12
12
  getResetKey: () => resetKey,
13
13
  onCatch: (error, errorInfo) => {
14
- var _a;
15
14
  if (isNotFound(error)) {
16
- (_a = props.onCatch) == null ? void 0 : _a.call(props, error, errorInfo);
15
+ props.onCatch?.(error, errorInfo);
17
16
  } else {
18
17
  throw error;
19
18
  }
20
19
  },
21
20
  errorComponent: ({ error }) => {
22
- var _a;
23
21
  if (isNotFound(error)) {
24
- return (_a = props.fallback) == null ? void 0 : _a.call(props, error);
22
+ return props.fallback?.(error);
25
23
  } else {
26
24
  throw error;
27
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"not-found.js","sources":["../../src/not-found.tsx"],"sourcesContent":["import * as React from 'react'\nimport { isNotFound } from '@tanstack/router-core'\nimport { CatchBoundary } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport type { ErrorInfo } from 'react'\nimport type { NotFoundError } from '@tanstack/router-core'\n\nexport function CatchNotFound(props: {\n fallback?: (error: NotFoundError) => React.ReactElement\n onCatch?: (error: Error, errorInfo: ErrorInfo) => void\n children: React.ReactNode\n}) {\n // TODO: Some way for the user to programmatically reset the not-found boundary?\n const resetKey = useRouterState({\n select: (s) => `not-found-${s.location.pathname}-${s.status}`,\n })\n\n return (\n <CatchBoundary\n getResetKey={() => resetKey}\n onCatch={(error, errorInfo) => {\n if (isNotFound(error)) {\n props.onCatch?.(error, errorInfo)\n } else {\n throw error\n }\n }}\n errorComponent={({ error }: { error: Error }) => {\n if (isNotFound(error)) {\n return props.fallback?.(error)\n } else {\n throw error\n }\n }}\n >\n {props.children}\n </CatchBoundary>\n )\n}\n\nexport function DefaultGlobalNotFound() {\n return <p>Not Found</p>\n}\n"],"names":[],"mappings":";;;;AAOO,SAAS,cAAc,OAI3B;AAED,QAAM,WAAW,eAAe;AAAA,IAC9B,QAAQ,CAAC,MAAM,aAAa,EAAE,SAAS,QAAQ,IAAI,EAAE,MAAM;AAAA,EAAA,CAC5D;AAGC,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAa,MAAM;AAAA,MACnB,SAAS,CAAC,OAAO,cAAc;;AACzB,YAAA,WAAW,KAAK,GAAG;AACf,sBAAA,YAAA,+BAAU,OAAO;AAAA,QAAS,OAC3B;AACC,gBAAA;AAAA,QAAA;AAAA,MAEV;AAAA,MACA,gBAAgB,CAAC,EAAE,YAA8B;;AAC3C,YAAA,WAAW,KAAK,GAAG;AACd,kBAAA,WAAM,aAAN,+BAAiB;AAAA,QAAK,OACxB;AACC,gBAAA;AAAA,QAAA;AAAA,MAEV;AAAA,MAEC,UAAM,MAAA;AAAA,IAAA;AAAA,EACT;AAEJ;AAEO,SAAS,wBAAwB;AAC/B,SAAA,oBAAC,OAAE,UAAS,YAAA,CAAA;AACrB;"}
1
+ {"version":3,"file":"not-found.js","sources":["../../src/not-found.tsx"],"sourcesContent":["import * as React from 'react'\nimport { isNotFound } from '@tanstack/router-core'\nimport { CatchBoundary } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport type { ErrorInfo } from 'react'\nimport type { NotFoundError } from '@tanstack/router-core'\n\nexport function CatchNotFound(props: {\n fallback?: (error: NotFoundError) => React.ReactElement\n onCatch?: (error: Error, errorInfo: ErrorInfo) => void\n children: React.ReactNode\n}) {\n // TODO: Some way for the user to programmatically reset the not-found boundary?\n const resetKey = useRouterState({\n select: (s) => `not-found-${s.location.pathname}-${s.status}`,\n })\n\n return (\n <CatchBoundary\n getResetKey={() => resetKey}\n onCatch={(error, errorInfo) => {\n if (isNotFound(error)) {\n props.onCatch?.(error, errorInfo)\n } else {\n throw error\n }\n }}\n errorComponent={({ error }) => {\n if (isNotFound(error)) {\n return props.fallback?.(error)\n } else {\n throw error\n }\n }}\n >\n {props.children}\n </CatchBoundary>\n )\n}\n\nexport function DefaultGlobalNotFound() {\n return <p>Not Found</p>\n}\n"],"names":[],"mappings":";;;;AAOO,SAAS,cAAc,OAI3B;AAED,QAAM,WAAW,eAAe;AAAA,IAC9B,QAAQ,CAAC,MAAM,aAAa,EAAE,SAAS,QAAQ,IAAI,EAAE,MAAM;AAAA,EAAA,CAC5D;AAED,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAa,MAAM;AAAA,MACnB,SAAS,CAAC,OAAO,cAAc;AAC7B,YAAI,WAAW,KAAK,GAAG;AACrB,gBAAM,UAAU,OAAO,SAAS;AAAA,QAClC,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA,gBAAgB,CAAC,EAAE,YAAY;AAC7B,YAAI,WAAW,KAAK,GAAG;AACrB,iBAAO,MAAM,WAAW,KAAK;AAAA,QAC/B,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEC,UAAA,MAAM;AAAA,IAAA;AAAA,EAAA;AAGb;AAEO,SAAS,wBAAwB;AACtC,SAAO,oBAAC,OAAE,UAAA,YAAA,CAAS;AACrB;"}
@@ -1 +1 @@
1
- {"version":3,"file":"renderRouteNotFound.js","sources":["../../src/renderRouteNotFound.tsx"],"sourcesContent":["import * as React from 'react'\nimport warning from 'tiny-warning'\nimport { DefaultGlobalNotFound } from './not-found'\nimport type { AnyRoute, AnyRouter } from '@tanstack/router-core'\n\nexport function renderRouteNotFound(\n router: AnyRouter,\n route: AnyRoute,\n data: any,\n) {\n if (!route.options.notFoundComponent) {\n if (router.options.defaultNotFoundComponent) {\n return <router.options.defaultNotFoundComponent data={data} />\n }\n\n if (process.env.NODE_ENV === 'development') {\n warning(\n route.options.notFoundComponent,\n `A notFoundError was encountered on the route with ID \"${route.id}\", but a notFoundComponent option was not configured, nor was a router level defaultNotFoundComponent configured. Consider configuring at least one of these to avoid TanStack Router's overly generic defaultNotFoundComponent (<div>Not Found<div>)`,\n )\n }\n\n return <DefaultGlobalNotFound />\n }\n\n return <route.options.notFoundComponent data={data} />\n}\n"],"names":[],"mappings":";;;AAKgB,SAAA,oBACd,QACA,OACA,MACA;AACI,MAAA,CAAC,MAAM,QAAQ,mBAAmB;AAChC,QAAA,OAAO,QAAQ,0BAA0B;AAC3C,aAAQ,oBAAA,OAAO,QAAQ,0BAAf,EAAwC,KAAY,CAAA;AAAA,IAAA;AAG1D,QAAA,QAAQ,IAAI,aAAa,eAAe;AAC1C;AAAA,QACE,MAAM,QAAQ;AAAA,QACd,yDAAyD,MAAM,EAAE;AAAA,MACnE;AAAA,IAAA;AAGF,+BAAQ,uBAAsB,EAAA;AAAA,EAAA;AAGhC,SAAQ,oBAAA,MAAM,QAAQ,mBAAd,EAAgC,KAAY,CAAA;AACtD;"}
1
+ {"version":3,"file":"renderRouteNotFound.js","sources":["../../src/renderRouteNotFound.tsx"],"sourcesContent":["import * as React from 'react'\nimport warning from 'tiny-warning'\nimport { DefaultGlobalNotFound } from './not-found'\nimport type { AnyRoute, AnyRouter } from '@tanstack/router-core'\n\nexport function renderRouteNotFound(\n router: AnyRouter,\n route: AnyRoute,\n data: any,\n) {\n if (!route.options.notFoundComponent) {\n if (router.options.defaultNotFoundComponent) {\n return <router.options.defaultNotFoundComponent data={data} />\n }\n\n if (process.env.NODE_ENV === 'development') {\n warning(\n route.options.notFoundComponent,\n `A notFoundError was encountered on the route with ID \"${route.id}\", but a notFoundComponent option was not configured, nor was a router level defaultNotFoundComponent configured. Consider configuring at least one of these to avoid TanStack Router's overly generic defaultNotFoundComponent (<div>Not Found<div>)`,\n )\n }\n\n return <DefaultGlobalNotFound />\n }\n\n return <route.options.notFoundComponent data={data} />\n}\n"],"names":[],"mappings":";;;AAKO,SAAS,oBACd,QACA,OACA,MACA;AACA,MAAI,CAAC,MAAM,QAAQ,mBAAmB;AACpC,QAAI,OAAO,QAAQ,0BAA0B;AAC3C,aAAO,oBAAC,OAAO,QAAQ,0BAAf,EAAwC,KAAA,CAAY;AAAA,IAC9D;AAEA,QAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C;AAAA,QACE,MAAM,QAAQ;AAAA,QACd,yDAAyD,MAAM,EAAE;AAAA,MAAA;AAAA,IAErE;AAEA,+BAAQ,uBAAA,EAAsB;AAAA,EAChC;AAEA,SAAO,oBAAC,MAAM,QAAQ,mBAAd,EAAgC,KAAA,CAAY;AACtD;"}
@@ -14,6 +14,11 @@ declare module '@tanstack/router-core' {
14
14
  notFoundComponent?: NotFoundRouteComponent;
15
15
  pendingComponent?: RouteComponent;
16
16
  }
17
+ interface RootRouteOptionsExtensions {
18
+ shellComponent?: ({ children, }: {
19
+ children: React.ReactNode;
20
+ }) => React.ReactNode;
21
+ }
17
22
  interface RouteExtensions<in out TId extends string, in out TFullPath extends string> {
18
23
  useMatch: UseMatchRoute<TId>;
19
24
  useRouteContext: UseRouteContextRoute<TId>;
@@ -82,14 +87,17 @@ export declare function createRootRoute<TSearchValidator = undefined, TRouterCon
82
87
  export declare function createRouteMask<TRouteTree extends AnyRoute, TFrom extends string, TTo extends string>(opts: {
83
88
  routeTree: TRouteTree;
84
89
  } & ToMaskOptions<RouterCore<TRouteTree, 'never', boolean>, TFrom, TTo>): RouteMask<TRouteTree>;
85
- export type ReactNode = any;
86
- export type SyncRouteComponent<TProps> = ((props: TProps) => ReactNode) | React.LazyExoticComponent<(props: TProps) => ReactNode>;
87
- export type AsyncRouteComponent<TProps> = SyncRouteComponent<TProps> & {
90
+ export interface DefaultRouteTypes<TProps> {
91
+ component: ((props: TProps) => any) | React.LazyExoticComponent<(props: TProps) => any>;
92
+ }
93
+ export interface RouteTypes<TProps> extends DefaultRouteTypes<TProps> {
94
+ }
95
+ export type AsyncRouteComponent<TProps> = RouteTypes<TProps>['component'] & {
88
96
  preload?: () => Promise<void>;
89
97
  };
90
- export type RouteComponent<TProps = any> = AsyncRouteComponent<TProps>;
91
- export type ErrorRouteComponent = RouteComponent<ErrorComponentProps>;
92
- export type NotFoundRouteComponent = SyncRouteComponent<NotFoundRouteProps>;
98
+ export type RouteComponent = AsyncRouteComponent<{}>;
99
+ export type ErrorRouteComponent = AsyncRouteComponent<ErrorComponentProps>;
100
+ export type NotFoundRouteComponent = RouteTypes<NotFoundRouteProps>['component'];
93
101
  export declare class NotFoundRoute<TParentRoute extends AnyRootRoute, TRouterContext = AnyContext, TRouteContextFn = AnyContext, TBeforeLoadFn = AnyContext, TSearchValidator = undefined, TLoaderDeps extends Record<string, any> = {}, TLoaderFn = undefined, TChildren = unknown> extends Route<TParentRoute, '/404', '/404', '404', '404', TSearchValidator, {}, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren> {
94
102
  constructor(options: Omit<RouteOptions<TParentRoute, string, string, string, string, TSearchValidator, {}, TLoaderDeps, TLoaderFn, TRouterContext, TRouteContextFn, TBeforeLoadFn>, 'caseSensitive' | 'parseParams' | 'stringifyParams' | 'path' | 'id' | 'params'>);
95
103
  }
package/dist/esm/route.js CHANGED
@@ -20,28 +20,28 @@ class RouteApi extends BaseRouteApi {
20
20
  super({ id });
21
21
  this.useMatch = (opts) => {
22
22
  return useMatch({
23
- select: opts == null ? void 0 : opts.select,
23
+ select: opts?.select,
24
24
  from: this.id,
25
- structuralSharing: opts == null ? void 0 : opts.structuralSharing
25
+ structuralSharing: opts?.structuralSharing
26
26
  });
27
27
  };
28
28
  this.useRouteContext = (opts) => {
29
29
  return useMatch({
30
30
  from: this.id,
31
- select: (d) => (opts == null ? void 0 : opts.select) ? opts.select(d.context) : d.context
31
+ select: (d) => opts?.select ? opts.select(d.context) : d.context
32
32
  });
33
33
  };
34
34
  this.useSearch = (opts) => {
35
35
  return useSearch({
36
- select: opts == null ? void 0 : opts.select,
37
- structuralSharing: opts == null ? void 0 : opts.structuralSharing,
36
+ select: opts?.select,
37
+ structuralSharing: opts?.structuralSharing,
38
38
  from: this.id
39
39
  });
40
40
  };
41
41
  this.useParams = (opts) => {
42
42
  return useParams({
43
- select: opts == null ? void 0 : opts.select,
44
- structuralSharing: opts == null ? void 0 : opts.structuralSharing,
43
+ select: opts?.select,
44
+ structuralSharing: opts?.structuralSharing,
45
45
  from: this.id
46
46
  });
47
47
  };
@@ -73,29 +73,29 @@ class Route extends BaseRoute {
73
73
  super(options);
74
74
  this.useMatch = (opts) => {
75
75
  return useMatch({
76
- select: opts == null ? void 0 : opts.select,
76
+ select: opts?.select,
77
77
  from: this.id,
78
- structuralSharing: opts == null ? void 0 : opts.structuralSharing
78
+ structuralSharing: opts?.structuralSharing
79
79
  });
80
80
  };
81
81
  this.useRouteContext = (opts) => {
82
82
  return useMatch({
83
83
  ...opts,
84
84
  from: this.id,
85
- select: (d) => (opts == null ? void 0 : opts.select) ? opts.select(d.context) : d.context
85
+ select: (d) => opts?.select ? opts.select(d.context) : d.context
86
86
  });
87
87
  };
88
88
  this.useSearch = (opts) => {
89
89
  return useSearch({
90
- select: opts == null ? void 0 : opts.select,
91
- structuralSharing: opts == null ? void 0 : opts.structuralSharing,
90
+ select: opts?.select,
91
+ structuralSharing: opts?.structuralSharing,
92
92
  from: this.id
93
93
  });
94
94
  };
95
95
  this.useParams = (opts) => {
96
96
  return useParams({
97
- select: opts == null ? void 0 : opts.select,
98
- structuralSharing: opts == null ? void 0 : opts.structuralSharing,
97
+ select: opts?.select,
98
+ structuralSharing: opts?.structuralSharing,
99
99
  from: this.id
100
100
  });
101
101
  };
@@ -133,29 +133,29 @@ class RootRoute extends BaseRootRoute {
133
133
  super(options);
134
134
  this.useMatch = (opts) => {
135
135
  return useMatch({
136
- select: opts == null ? void 0 : opts.select,
136
+ select: opts?.select,
137
137
  from: this.id,
138
- structuralSharing: opts == null ? void 0 : opts.structuralSharing
138
+ structuralSharing: opts?.structuralSharing
139
139
  });
140
140
  };
141
141
  this.useRouteContext = (opts) => {
142
142
  return useMatch({
143
143
  ...opts,
144
144
  from: this.id,
145
- select: (d) => (opts == null ? void 0 : opts.select) ? opts.select(d.context) : d.context
145
+ select: (d) => opts?.select ? opts.select(d.context) : d.context
146
146
  });
147
147
  };
148
148
  this.useSearch = (opts) => {
149
149
  return useSearch({
150
- select: opts == null ? void 0 : opts.select,
151
- structuralSharing: opts == null ? void 0 : opts.structuralSharing,
150
+ select: opts?.select,
151
+ structuralSharing: opts?.structuralSharing,
152
152
  from: this.id
153
153
  });
154
154
  };
155
155
  this.useParams = (opts) => {
156
156
  return useParams({
157
- select: opts == null ? void 0 : opts.select,
158
- structuralSharing: opts == null ? void 0 : opts.structuralSharing,
157
+ select: opts?.select,
158
+ structuralSharing: opts?.structuralSharing,
159
159
  from: this.id
160
160
  });
161
161
  };