@tanstack/solid-router 1.167.0 → 1.167.2

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 (200) hide show
  1. package/dist/cjs/Asset.cjs +84 -127
  2. package/dist/cjs/Asset.cjs.map +1 -1
  3. package/dist/cjs/CatchBoundary.cjs +50 -68
  4. package/dist/cjs/CatchBoundary.cjs.map +1 -1
  5. package/dist/cjs/ClientOnly.cjs +61 -39
  6. package/dist/cjs/ClientOnly.cjs.map +1 -1
  7. package/dist/cjs/HeadContent.cjs +25 -19
  8. package/dist/cjs/HeadContent.cjs.map +1 -1
  9. package/dist/cjs/HeadContent.dev.cjs +38 -33
  10. package/dist/cjs/HeadContent.dev.cjs.map +1 -1
  11. package/dist/cjs/Match.cjs +330 -398
  12. package/dist/cjs/Match.cjs.map +1 -1
  13. package/dist/cjs/Matches.cjs +109 -151
  14. package/dist/cjs/Matches.cjs.map +1 -1
  15. package/dist/cjs/RouterProvider.cjs +28 -40
  16. package/dist/cjs/RouterProvider.cjs.map +1 -1
  17. package/dist/cjs/SafeFragment.cjs +7 -5
  18. package/dist/cjs/SafeFragment.cjs.map +1 -1
  19. package/dist/cjs/ScriptOnce.cjs +18 -20
  20. package/dist/cjs/ScriptOnce.cjs.map +1 -1
  21. package/dist/cjs/Scripts.cjs +41 -54
  22. package/dist/cjs/Scripts.cjs.map +1 -1
  23. package/dist/cjs/ScrollRestoration.cjs +26 -28
  24. package/dist/cjs/ScrollRestoration.cjs.map +1 -1
  25. package/dist/cjs/Transitioner.cjs +94 -129
  26. package/dist/cjs/Transitioner.cjs.map +1 -1
  27. package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  28. package/dist/cjs/awaited.cjs +24 -51
  29. package/dist/cjs/awaited.cjs.map +1 -1
  30. package/dist/cjs/fileRoute.cjs +96 -91
  31. package/dist/cjs/fileRoute.cjs.map +1 -1
  32. package/dist/cjs/headContentUtils.cjs +132 -170
  33. package/dist/cjs/headContentUtils.cjs.map +1 -1
  34. package/dist/cjs/index.cjs +245 -176
  35. package/dist/cjs/index.dev.cjs +245 -176
  36. package/dist/cjs/lazyRouteComponent.cjs +48 -54
  37. package/dist/cjs/lazyRouteComponent.cjs.map +1 -1
  38. package/dist/cjs/link.cjs +304 -331
  39. package/dist/cjs/link.cjs.map +1 -1
  40. package/dist/cjs/matchContext.cjs +9 -23
  41. package/dist/cjs/matchContext.cjs.map +1 -1
  42. package/dist/cjs/not-found.cjs +26 -34
  43. package/dist/cjs/not-found.cjs.map +1 -1
  44. package/dist/cjs/renderRouteNotFound.cjs +23 -16
  45. package/dist/cjs/renderRouteNotFound.cjs.map +1 -1
  46. package/dist/cjs/route.cjs +200 -215
  47. package/dist/cjs/route.cjs.map +1 -1
  48. package/dist/cjs/router.cjs +18 -16
  49. package/dist/cjs/router.cjs.map +1 -1
  50. package/dist/cjs/routerContext.cjs +8 -22
  51. package/dist/cjs/routerContext.cjs.map +1 -1
  52. package/dist/cjs/scroll-restoration.cjs +25 -35
  53. package/dist/cjs/scroll-restoration.cjs.map +1 -1
  54. package/dist/cjs/ssr/RouterClient.cjs +31 -42
  55. package/dist/cjs/ssr/RouterClient.cjs.map +1 -1
  56. package/dist/cjs/ssr/RouterServer.cjs +44 -51
  57. package/dist/cjs/ssr/RouterServer.cjs.map +1 -1
  58. package/dist/cjs/ssr/client.cjs +2 -4
  59. package/dist/cjs/ssr/defaultRenderHandler.cjs +12 -16
  60. package/dist/cjs/ssr/defaultRenderHandler.cjs.map +1 -1
  61. package/dist/cjs/ssr/defaultStreamHandler.cjs +13 -18
  62. package/dist/cjs/ssr/defaultStreamHandler.cjs.map +1 -1
  63. package/dist/cjs/ssr/renderRouterToStream.cjs +27 -55
  64. package/dist/cjs/ssr/renderRouterToStream.cjs.map +1 -1
  65. package/dist/cjs/ssr/renderRouterToString.cjs +33 -57
  66. package/dist/cjs/ssr/renderRouterToString.cjs.map +1 -1
  67. package/dist/cjs/ssr/server.cjs +18 -18
  68. package/dist/cjs/useBlocker.cjs +138 -173
  69. package/dist/cjs/useBlocker.cjs.map +1 -1
  70. package/dist/cjs/useBlocker.d.cts +8 -5
  71. package/dist/cjs/useCanGoBack.cjs +6 -5
  72. package/dist/cjs/useCanGoBack.cjs.map +1 -1
  73. package/dist/cjs/useLoaderData.cjs +12 -11
  74. package/dist/cjs/useLoaderData.cjs.map +1 -1
  75. package/dist/cjs/useLoaderDeps.cjs +12 -14
  76. package/dist/cjs/useLoaderDeps.cjs.map +1 -1
  77. package/dist/cjs/useLocation.cjs +6 -7
  78. package/dist/cjs/useLocation.cjs.map +1 -1
  79. package/dist/cjs/useMatch.cjs +27 -49
  80. package/dist/cjs/useMatch.cjs.map +1 -1
  81. package/dist/cjs/useNavigate.cjs +20 -38
  82. package/dist/cjs/useNavigate.cjs.map +1 -1
  83. package/dist/cjs/useParams.cjs +14 -13
  84. package/dist/cjs/useParams.cjs.map +1 -1
  85. package/dist/cjs/useRouteContext.cjs +9 -8
  86. package/dist/cjs/useRouteContext.cjs.map +1 -1
  87. package/dist/cjs/useRouter.cjs +13 -26
  88. package/dist/cjs/useRouter.cjs.map +1 -1
  89. package/dist/cjs/useRouterState.cjs +29 -37
  90. package/dist/cjs/useRouterState.cjs.map +1 -1
  91. package/dist/cjs/useSearch.cjs +13 -12
  92. package/dist/cjs/useSearch.cjs.map +1 -1
  93. package/dist/cjs/utils.cjs +58 -51
  94. package/dist/cjs/utils.cjs.map +1 -1
  95. package/dist/esm/Asset.js +82 -126
  96. package/dist/esm/Asset.js.map +1 -1
  97. package/dist/esm/CatchBoundary.js +46 -50
  98. package/dist/esm/CatchBoundary.js.map +1 -1
  99. package/dist/esm/ClientOnly.js +58 -22
  100. package/dist/esm/ClientOnly.js.map +1 -1
  101. package/dist/esm/HeadContent.dev.js +36 -32
  102. package/dist/esm/HeadContent.dev.js.map +1 -1
  103. package/dist/esm/HeadContent.js +23 -18
  104. package/dist/esm/HeadContent.js.map +1 -1
  105. package/dist/esm/Match.js +322 -378
  106. package/dist/esm/Match.js.map +1 -1
  107. package/dist/esm/Matches.js +102 -135
  108. package/dist/esm/Matches.js.map +1 -1
  109. package/dist/esm/RouterProvider.js +25 -39
  110. package/dist/esm/RouterProvider.js.map +1 -1
  111. package/dist/esm/SafeFragment.js +6 -5
  112. package/dist/esm/SafeFragment.js.map +1 -1
  113. package/dist/esm/ScriptOnce.js +16 -19
  114. package/dist/esm/ScriptOnce.js.map +1 -1
  115. package/dist/esm/Scripts.js +40 -54
  116. package/dist/esm/Scripts.js.map +1 -1
  117. package/dist/esm/ScrollRestoration.js +25 -29
  118. package/dist/esm/ScrollRestoration.js.map +1 -1
  119. package/dist/esm/Transitioner.js +90 -110
  120. package/dist/esm/Transitioner.js.map +1 -1
  121. package/dist/esm/awaited.js +21 -34
  122. package/dist/esm/awaited.js.map +1 -1
  123. package/dist/esm/fileRoute.js +90 -92
  124. package/dist/esm/fileRoute.js.map +1 -1
  125. package/dist/esm/headContentUtils.js +129 -152
  126. package/dist/esm/headContentUtils.js.map +1 -1
  127. package/dist/esm/index.dev.js +15 -115
  128. package/dist/esm/index.js +17 -116
  129. package/dist/esm/lazyRouteComponent.js +47 -54
  130. package/dist/esm/lazyRouteComponent.js.map +1 -1
  131. package/dist/esm/link.js +299 -314
  132. package/dist/esm/link.js.map +1 -1
  133. package/dist/esm/matchContext.js +7 -7
  134. package/dist/esm/matchContext.js.map +1 -1
  135. package/dist/esm/not-found.js +23 -33
  136. package/dist/esm/not-found.js.map +1 -1
  137. package/dist/esm/renderRouteNotFound.js +20 -15
  138. package/dist/esm/renderRouteNotFound.js.map +1 -1
  139. package/dist/esm/route.js +193 -218
  140. package/dist/esm/route.js.map +1 -1
  141. package/dist/esm/router.js +17 -17
  142. package/dist/esm/router.js.map +1 -1
  143. package/dist/esm/routerContext.js +6 -5
  144. package/dist/esm/routerContext.js.map +1 -1
  145. package/dist/esm/scroll-restoration.js +23 -34
  146. package/dist/esm/scroll-restoration.js.map +1 -1
  147. package/dist/esm/ssr/RouterClient.js +29 -41
  148. package/dist/esm/ssr/RouterClient.js.map +1 -1
  149. package/dist/esm/ssr/RouterServer.js +40 -48
  150. package/dist/esm/ssr/RouterServer.js.map +1 -1
  151. package/dist/esm/ssr/client.js +1 -4
  152. package/dist/esm/ssr/defaultRenderHandler.js +11 -15
  153. package/dist/esm/ssr/defaultRenderHandler.js.map +1 -1
  154. package/dist/esm/ssr/defaultStreamHandler.js +12 -17
  155. package/dist/esm/ssr/defaultStreamHandler.js.map +1 -1
  156. package/dist/esm/ssr/renderRouterToStream.js +24 -37
  157. package/dist/esm/ssr/renderRouterToStream.js.map +1 -1
  158. package/dist/esm/ssr/renderRouterToString.js +31 -40
  159. package/dist/esm/ssr/renderRouterToString.js.map +1 -1
  160. package/dist/esm/ssr/server.js +3 -10
  161. package/dist/esm/useBlocker.d.ts +8 -5
  162. package/dist/esm/useBlocker.js +134 -155
  163. package/dist/esm/useBlocker.js.map +1 -1
  164. package/dist/esm/useCanGoBack.js +6 -5
  165. package/dist/esm/useCanGoBack.js.map +1 -1
  166. package/dist/esm/useLoaderData.js +12 -11
  167. package/dist/esm/useLoaderData.js.map +1 -1
  168. package/dist/esm/useLoaderDeps.js +12 -14
  169. package/dist/esm/useLoaderDeps.js.map +1 -1
  170. package/dist/esm/useLocation.js +6 -7
  171. package/dist/esm/useLocation.js.map +1 -1
  172. package/dist/esm/useMatch.js +23 -31
  173. package/dist/esm/useMatch.js.map +1 -1
  174. package/dist/esm/useNavigate.js +18 -22
  175. package/dist/esm/useNavigate.js.map +1 -1
  176. package/dist/esm/useParams.js +14 -13
  177. package/dist/esm/useParams.js.map +1 -1
  178. package/dist/esm/useRouteContext.js +9 -8
  179. package/dist/esm/useRouteContext.js.map +1 -1
  180. package/dist/esm/useRouter.js +9 -8
  181. package/dist/esm/useRouter.js.map +1 -1
  182. package/dist/esm/useRouterState.js +28 -37
  183. package/dist/esm/useRouterState.js.map +1 -1
  184. package/dist/esm/useSearch.js +13 -12
  185. package/dist/esm/useSearch.js.map +1 -1
  186. package/dist/esm/utils.js +56 -35
  187. package/dist/esm/utils.js.map +1 -1
  188. package/dist/source/useBlocker.d.ts +8 -5
  189. package/dist/source/useBlocker.jsx +2 -2
  190. package/dist/source/useBlocker.jsx.map +1 -1
  191. package/package.json +3 -3
  192. package/src/useBlocker.tsx +15 -10
  193. package/dist/cjs/index.cjs.map +0 -1
  194. package/dist/cjs/index.dev.cjs.map +0 -1
  195. package/dist/cjs/ssr/client.cjs.map +0 -1
  196. package/dist/cjs/ssr/server.cjs.map +0 -1
  197. package/dist/esm/index.dev.js.map +0 -1
  198. package/dist/esm/index.js.map +0 -1
  199. package/dist/esm/ssr/client.js.map +0 -1
  200. package/dist/esm/ssr/server.js.map +0 -1
package/dist/esm/link.js CHANGED
@@ -1,326 +1,311 @@
1
- import { createComponent, mergeProps, template, spread, insert, Dynamic, memo } from "solid-js/web";
1
+ import { useHydrated } from "./ClientOnly.js";
2
+ import { useRouter } from "./useRouter.js";
3
+ import { useRouterState } from "./useRouterState.js";
4
+ import { useIntersectionObserver } from "./utils.js";
5
+ import { deepEqual, exactPathTest, functionalUpdate, isDangerousProtocol, preloadWarning, removeTrailingSlash } from "@tanstack/router-core";
6
+ import { Dynamic, createComponent, insert, memo, mergeProps, spread, template } from "solid-js/web";
2
7
  import * as Solid from "solid-js";
3
8
  import { mergeRefs } from "@solid-primitives/refs";
4
- import { isDangerousProtocol, exactPathTest, removeTrailingSlash, deepEqual, functionalUpdate, preloadWarning } from "@tanstack/router-core";
5
9
  import { isServer } from "@tanstack/router-core/isServer";
6
- import { useRouterState } from "./useRouterState.js";
7
- import { useRouter } from "./useRouter.js";
8
- import { useIntersectionObserver } from "./utils.js";
9
- import { useHydrated } from "./ClientOnly.js";
10
+ //#region src/link.tsx
10
11
  var _tmpl$ = /* @__PURE__ */ template(`<svg><a>`);
11
- const timeoutMap = /* @__PURE__ */ new WeakMap();
12
+ var timeoutMap = /* @__PURE__ */ new WeakMap();
12
13
  function useLinkProps(options) {
13
- const router = useRouter();
14
- const [isTransitioning, setIsTransitioning] = Solid.createSignal(false);
15
- const shouldHydrateHash = !isServer && !!router.options.ssr;
16
- const hasHydrated = useHydrated();
17
- let hasRenderFetched = false;
18
- const [local, rest] = Solid.splitProps(Solid.mergeProps({
19
- activeProps: () => ({
20
- class: "active"
21
- }),
22
- inactiveProps: () => ({})
23
- }, options), ["activeProps", "inactiveProps", "activeOptions", "to", "preload", "preloadDelay", "hashScrollIntoView", "replace", "startTransition", "resetScroll", "viewTransition", "target", "disabled", "style", "class", "onClick", "onBlur", "onFocus", "onMouseEnter", "onMouseLeave", "onMouseOver", "onMouseOut", "onTouchStart", "ignoreBlocker"]);
24
- const [_, propsSafeToSpread] = Solid.splitProps(rest, ["params", "search", "hash", "state", "mask", "reloadDocument", "unsafeRelative"]);
25
- const currentLocation = useRouterState({
26
- select: (s) => s.location
27
- });
28
- const buildLocationKey = useRouterState({
29
- select: (s) => {
30
- const leaf = s.matches[s.matches.length - 1];
31
- return {
32
- search: leaf?.search,
33
- hash: s.location.hash,
34
- path: leaf?.pathname
35
- // path + params
36
- };
37
- }
38
- });
39
- const from = options.from;
40
- const _options = () => {
41
- return {
42
- ...options,
43
- from
44
- };
45
- };
46
- const next = Solid.createMemo(() => {
47
- buildLocationKey();
48
- return router.buildLocation(_options());
49
- });
50
- const hrefOption = Solid.createMemo(() => {
51
- if (_options().disabled) return void 0;
52
- const location = next().maskedLocation ?? next();
53
- const publicHref = location.publicHref;
54
- const external = location.external;
55
- if (external) {
56
- return {
57
- href: publicHref,
58
- external: true
59
- };
60
- }
61
- return {
62
- href: router.history.createHref(publicHref) || "/",
63
- external: false
64
- };
65
- });
66
- const externalLink = Solid.createMemo(() => {
67
- const _href = hrefOption();
68
- if (_href?.external) {
69
- if (isDangerousProtocol(_href.href, router.protocolAllowlist)) {
70
- if (process.env.NODE_ENV !== "production") {
71
- console.warn(`Blocked Link with dangerous protocol: ${_href.href}`);
72
- }
73
- return void 0;
74
- }
75
- return _href.href;
76
- }
77
- const to = _options().to;
78
- const isSafeInternal = typeof to === "string" && to.charCodeAt(0) === 47 && // '/'
79
- to.charCodeAt(1) !== 47;
80
- if (isSafeInternal) return void 0;
81
- try {
82
- new URL(to);
83
- if (isDangerousProtocol(to, router.protocolAllowlist)) {
84
- if (process.env.NODE_ENV !== "production") {
85
- console.warn(`Blocked Link with dangerous protocol: ${to}`);
86
- }
87
- return void 0;
88
- }
89
- return to;
90
- } catch {
91
- }
92
- return void 0;
93
- });
94
- const preload = Solid.createMemo(() => {
95
- if (_options().reloadDocument || externalLink()) {
96
- return false;
97
- }
98
- return local.preload ?? router.options.defaultPreload;
99
- });
100
- const preloadDelay = () => local.preloadDelay ?? router.options.defaultPreloadDelay ?? 0;
101
- const isActive = Solid.createMemo(() => {
102
- if (externalLink()) return false;
103
- if (local.activeOptions?.exact) {
104
- const testExact = exactPathTest(currentLocation().pathname, next().pathname, router.basepath);
105
- if (!testExact) {
106
- return false;
107
- }
108
- } else {
109
- const currentPathSplit = removeTrailingSlash(currentLocation().pathname, router.basepath).split("/");
110
- const nextPathSplit = removeTrailingSlash(next()?.pathname, router.basepath)?.split("/");
111
- const pathIsFuzzyEqual = nextPathSplit?.every((d, i) => d === currentPathSplit[i]);
112
- if (!pathIsFuzzyEqual) {
113
- return false;
114
- }
115
- }
116
- if (local.activeOptions?.includeSearch ?? true) {
117
- const searchTest = deepEqual(currentLocation().search, next().search, {
118
- partial: !local.activeOptions?.exact,
119
- ignoreUndefined: !local.activeOptions?.explicitUndefined
120
- });
121
- if (!searchTest) {
122
- return false;
123
- }
124
- }
125
- if (local.activeOptions?.includeHash) {
126
- const currentHash = shouldHydrateHash && !hasHydrated() ? "" : currentLocation().hash;
127
- return currentHash === next().hash;
128
- }
129
- return true;
130
- });
131
- const doPreload = () => router.preloadRoute(_options()).catch((err) => {
132
- console.warn(err);
133
- console.warn(preloadWarning);
134
- });
135
- const preloadViewportIoCallback = (entry) => {
136
- if (entry?.isIntersecting) {
137
- doPreload();
138
- }
139
- };
140
- const [ref, setRef] = Solid.createSignal(null);
141
- useIntersectionObserver(ref, preloadViewportIoCallback, {
142
- rootMargin: "100px"
143
- }, {
144
- disabled: !!local.disabled || !(preload() === "viewport")
145
- });
146
- Solid.createEffect(() => {
147
- if (hasRenderFetched) {
148
- return;
149
- }
150
- if (!local.disabled && preload() === "render") {
151
- doPreload();
152
- hasRenderFetched = true;
153
- }
154
- });
155
- if (externalLink()) {
156
- return Solid.mergeProps(propsSafeToSpread, {
157
- ref: mergeRefs(setRef, _options().ref),
158
- href: externalLink()
159
- }, Solid.splitProps(local, ["target", "disabled", "style", "class", "onClick", "onBlur", "onFocus", "onMouseEnter", "onMouseLeave", "onMouseOut", "onMouseOver", "onTouchStart"])[0]);
160
- }
161
- const handleClick = (e) => {
162
- const elementTarget = e.currentTarget.getAttribute("target");
163
- const effectiveTarget = local.target !== void 0 ? local.target : elementTarget;
164
- if (!local.disabled && !isCtrlEvent(e) && !e.defaultPrevented && (!effectiveTarget || effectiveTarget === "_self") && e.button === 0) {
165
- e.preventDefault();
166
- setIsTransitioning(true);
167
- const unsub = router.subscribe("onResolved", () => {
168
- unsub();
169
- setIsTransitioning(false);
170
- });
171
- router.navigate({
172
- ..._options(),
173
- replace: local.replace,
174
- resetScroll: local.resetScroll,
175
- hashScrollIntoView: local.hashScrollIntoView,
176
- startTransition: local.startTransition,
177
- viewTransition: local.viewTransition,
178
- ignoreBlocker: local.ignoreBlocker
179
- });
180
- }
181
- };
182
- const enqueueIntentPreload = (e) => {
183
- if (local.disabled || preload() !== "intent") return;
184
- if (!preloadDelay()) {
185
- doPreload();
186
- return;
187
- }
188
- const eventTarget = e.currentTarget || e.target;
189
- if (!eventTarget || timeoutMap.has(eventTarget)) return;
190
- timeoutMap.set(eventTarget, setTimeout(() => {
191
- timeoutMap.delete(eventTarget);
192
- doPreload();
193
- }, preloadDelay()));
194
- };
195
- const handleTouchStart = (_2) => {
196
- if (local.disabled || preload() !== "intent") return;
197
- doPreload();
198
- };
199
- const handleLeave = (e) => {
200
- if (local.disabled) return;
201
- const eventTarget = e.currentTarget || e.target;
202
- if (eventTarget) {
203
- const id = timeoutMap.get(eventTarget);
204
- clearTimeout(id);
205
- timeoutMap.delete(eventTarget);
206
- }
207
- };
208
- function callHandler(event, handler) {
209
- if (handler) {
210
- if (typeof handler === "function") {
211
- handler(event);
212
- } else {
213
- handler[0](handler[1], event);
214
- }
215
- }
216
- return event.defaultPrevented;
217
- }
218
- function composeEventHandlers(handlers) {
219
- return (event) => {
220
- for (const handler of handlers) {
221
- callHandler(event, handler);
222
- }
223
- };
224
- }
225
- const resolvedActiveProps = () => isActive() ? functionalUpdate(local.activeProps, {}) ?? {} : {};
226
- const resolvedInactiveProps = () => isActive() ? {} : functionalUpdate(local.inactiveProps, {});
227
- const resolvedClassName = () => [local.class, resolvedActiveProps().class, resolvedInactiveProps().class].filter(Boolean).join(" ");
228
- const resolvedStyle = () => ({
229
- ...local.style,
230
- ...resolvedActiveProps().style,
231
- ...resolvedInactiveProps().style
232
- });
233
- return Solid.mergeProps(propsSafeToSpread, resolvedActiveProps, resolvedInactiveProps, () => {
234
- return {
235
- href: hrefOption()?.href,
236
- ref: mergeRefs(setRef, _options().ref),
237
- onClick: composeEventHandlers([local.onClick, handleClick]),
238
- onBlur: composeEventHandlers([local.onBlur, handleLeave]),
239
- onFocus: composeEventHandlers([local.onFocus, enqueueIntentPreload]),
240
- onMouseEnter: composeEventHandlers([local.onMouseEnter, enqueueIntentPreload]),
241
- onMouseOver: composeEventHandlers([local.onMouseOver, enqueueIntentPreload]),
242
- onMouseLeave: composeEventHandlers([local.onMouseLeave, handleLeave]),
243
- onMouseOut: composeEventHandlers([local.onMouseOut, handleLeave]),
244
- onTouchStart: composeEventHandlers([local.onTouchStart, handleTouchStart]),
245
- disabled: !!local.disabled,
246
- target: local.target,
247
- ...(() => {
248
- const s = resolvedStyle();
249
- return Object.keys(s).length ? {
250
- style: s
251
- } : {};
252
- })(),
253
- ...(() => {
254
- const c = resolvedClassName();
255
- return c ? {
256
- class: c
257
- } : {};
258
- })(),
259
- ...local.disabled && {
260
- role: "link",
261
- "aria-disabled": true
262
- },
263
- ...isActive() && {
264
- "data-status": "active",
265
- "aria-current": "page"
266
- },
267
- ...isTransitioning() && {
268
- "data-transitioning": "transitioning"
269
- }
270
- };
271
- });
14
+ const router = useRouter();
15
+ const [isTransitioning, setIsTransitioning] = Solid.createSignal(false);
16
+ const shouldHydrateHash = !isServer && !!router.options.ssr;
17
+ const hasHydrated = useHydrated();
18
+ let hasRenderFetched = false;
19
+ const [local, rest] = Solid.splitProps(Solid.mergeProps({
20
+ activeProps: () => ({ class: "active" }),
21
+ inactiveProps: () => ({})
22
+ }, options), [
23
+ "activeProps",
24
+ "inactiveProps",
25
+ "activeOptions",
26
+ "to",
27
+ "preload",
28
+ "preloadDelay",
29
+ "hashScrollIntoView",
30
+ "replace",
31
+ "startTransition",
32
+ "resetScroll",
33
+ "viewTransition",
34
+ "target",
35
+ "disabled",
36
+ "style",
37
+ "class",
38
+ "onClick",
39
+ "onBlur",
40
+ "onFocus",
41
+ "onMouseEnter",
42
+ "onMouseLeave",
43
+ "onMouseOver",
44
+ "onMouseOut",
45
+ "onTouchStart",
46
+ "ignoreBlocker"
47
+ ]);
48
+ const [_, propsSafeToSpread] = Solid.splitProps(rest, [
49
+ "params",
50
+ "search",
51
+ "hash",
52
+ "state",
53
+ "mask",
54
+ "reloadDocument",
55
+ "unsafeRelative"
56
+ ]);
57
+ const currentLocation = useRouterState({ select: (s) => s.location });
58
+ const buildLocationKey = useRouterState({ select: (s) => {
59
+ const leaf = s.matches[s.matches.length - 1];
60
+ return {
61
+ search: leaf?.search,
62
+ hash: s.location.hash,
63
+ path: leaf?.pathname
64
+ };
65
+ } });
66
+ const from = options.from;
67
+ const _options = () => {
68
+ return {
69
+ ...options,
70
+ from
71
+ };
72
+ };
73
+ const next = Solid.createMemo(() => {
74
+ buildLocationKey();
75
+ return router.buildLocation(_options());
76
+ });
77
+ const hrefOption = Solid.createMemo(() => {
78
+ if (_options().disabled) return void 0;
79
+ const location = next().maskedLocation ?? next();
80
+ const publicHref = location.publicHref;
81
+ if (location.external) return {
82
+ href: publicHref,
83
+ external: true
84
+ };
85
+ return {
86
+ href: router.history.createHref(publicHref) || "/",
87
+ external: false
88
+ };
89
+ });
90
+ const externalLink = Solid.createMemo(() => {
91
+ const _href = hrefOption();
92
+ if (_href?.external) {
93
+ if (isDangerousProtocol(_href.href, router.protocolAllowlist)) {
94
+ if (process.env.NODE_ENV !== "production") console.warn(`Blocked Link with dangerous protocol: ${_href.href}`);
95
+ return;
96
+ }
97
+ return _href.href;
98
+ }
99
+ const to = _options().to;
100
+ if (typeof to === "string" && to.charCodeAt(0) === 47 && to.charCodeAt(1) !== 47) return void 0;
101
+ try {
102
+ new URL(to);
103
+ if (isDangerousProtocol(to, router.protocolAllowlist)) {
104
+ if (process.env.NODE_ENV !== "production") console.warn(`Blocked Link with dangerous protocol: ${to}`);
105
+ return;
106
+ }
107
+ return to;
108
+ } catch {}
109
+ });
110
+ const preload = Solid.createMemo(() => {
111
+ if (_options().reloadDocument || externalLink()) return false;
112
+ return local.preload ?? router.options.defaultPreload;
113
+ });
114
+ const preloadDelay = () => local.preloadDelay ?? router.options.defaultPreloadDelay ?? 0;
115
+ const isActive = Solid.createMemo(() => {
116
+ if (externalLink()) return false;
117
+ if (local.activeOptions?.exact) {
118
+ if (!exactPathTest(currentLocation().pathname, next().pathname, router.basepath)) return false;
119
+ } else {
120
+ const currentPathSplit = removeTrailingSlash(currentLocation().pathname, router.basepath).split("/");
121
+ if (!(removeTrailingSlash(next()?.pathname, router.basepath)?.split("/"))?.every((d, i) => d === currentPathSplit[i])) return false;
122
+ }
123
+ if (local.activeOptions?.includeSearch ?? true) {
124
+ if (!deepEqual(currentLocation().search, next().search, {
125
+ partial: !local.activeOptions?.exact,
126
+ ignoreUndefined: !local.activeOptions?.explicitUndefined
127
+ })) return false;
128
+ }
129
+ if (local.activeOptions?.includeHash) return (shouldHydrateHash && !hasHydrated() ? "" : currentLocation().hash) === next().hash;
130
+ return true;
131
+ });
132
+ const doPreload = () => router.preloadRoute(_options()).catch((err) => {
133
+ console.warn(err);
134
+ console.warn(preloadWarning);
135
+ });
136
+ const preloadViewportIoCallback = (entry) => {
137
+ if (entry?.isIntersecting) doPreload();
138
+ };
139
+ const [ref, setRef] = Solid.createSignal(null);
140
+ useIntersectionObserver(ref, preloadViewportIoCallback, { rootMargin: "100px" }, { disabled: !!local.disabled || !(preload() === "viewport") });
141
+ Solid.createEffect(() => {
142
+ if (hasRenderFetched) return;
143
+ if (!local.disabled && preload() === "render") {
144
+ doPreload();
145
+ hasRenderFetched = true;
146
+ }
147
+ });
148
+ if (externalLink()) return Solid.mergeProps(propsSafeToSpread, {
149
+ ref: mergeRefs(setRef, _options().ref),
150
+ href: externalLink()
151
+ }, Solid.splitProps(local, [
152
+ "target",
153
+ "disabled",
154
+ "style",
155
+ "class",
156
+ "onClick",
157
+ "onBlur",
158
+ "onFocus",
159
+ "onMouseEnter",
160
+ "onMouseLeave",
161
+ "onMouseOut",
162
+ "onMouseOver",
163
+ "onTouchStart"
164
+ ])[0]);
165
+ const handleClick = (e) => {
166
+ const elementTarget = e.currentTarget.getAttribute("target");
167
+ const effectiveTarget = local.target !== void 0 ? local.target : elementTarget;
168
+ if (!local.disabled && !isCtrlEvent(e) && !e.defaultPrevented && (!effectiveTarget || effectiveTarget === "_self") && e.button === 0) {
169
+ e.preventDefault();
170
+ setIsTransitioning(true);
171
+ const unsub = router.subscribe("onResolved", () => {
172
+ unsub();
173
+ setIsTransitioning(false);
174
+ });
175
+ router.navigate({
176
+ ..._options(),
177
+ replace: local.replace,
178
+ resetScroll: local.resetScroll,
179
+ hashScrollIntoView: local.hashScrollIntoView,
180
+ startTransition: local.startTransition,
181
+ viewTransition: local.viewTransition,
182
+ ignoreBlocker: local.ignoreBlocker
183
+ });
184
+ }
185
+ };
186
+ const enqueueIntentPreload = (e) => {
187
+ if (local.disabled || preload() !== "intent") return;
188
+ if (!preloadDelay()) {
189
+ doPreload();
190
+ return;
191
+ }
192
+ const eventTarget = e.currentTarget || e.target;
193
+ if (!eventTarget || timeoutMap.has(eventTarget)) return;
194
+ timeoutMap.set(eventTarget, setTimeout(() => {
195
+ timeoutMap.delete(eventTarget);
196
+ doPreload();
197
+ }, preloadDelay()));
198
+ };
199
+ const handleTouchStart = (_) => {
200
+ if (local.disabled || preload() !== "intent") return;
201
+ doPreload();
202
+ };
203
+ const handleLeave = (e) => {
204
+ if (local.disabled) return;
205
+ const eventTarget = e.currentTarget || e.target;
206
+ if (eventTarget) {
207
+ const id = timeoutMap.get(eventTarget);
208
+ clearTimeout(id);
209
+ timeoutMap.delete(eventTarget);
210
+ }
211
+ };
212
+ /** Call a JSX.EventHandlerUnion with the event. */
213
+ function callHandler(event, handler) {
214
+ if (handler) if (typeof handler === "function") handler(event);
215
+ else handler[0](handler[1], event);
216
+ return event.defaultPrevented;
217
+ }
218
+ function composeEventHandlers(handlers) {
219
+ return (event) => {
220
+ for (const handler of handlers) callHandler(event, handler);
221
+ };
222
+ }
223
+ const resolvedActiveProps = () => isActive() ? functionalUpdate(local.activeProps, {}) ?? {} : {};
224
+ const resolvedInactiveProps = () => isActive() ? {} : functionalUpdate(local.inactiveProps, {});
225
+ const resolvedClassName = () => [
226
+ local.class,
227
+ resolvedActiveProps().class,
228
+ resolvedInactiveProps().class
229
+ ].filter(Boolean).join(" ");
230
+ const resolvedStyle = () => ({
231
+ ...local.style,
232
+ ...resolvedActiveProps().style,
233
+ ...resolvedInactiveProps().style
234
+ });
235
+ return Solid.mergeProps(propsSafeToSpread, resolvedActiveProps, resolvedInactiveProps, () => {
236
+ return {
237
+ href: hrefOption()?.href,
238
+ ref: mergeRefs(setRef, _options().ref),
239
+ onClick: composeEventHandlers([local.onClick, handleClick]),
240
+ onBlur: composeEventHandlers([local.onBlur, handleLeave]),
241
+ onFocus: composeEventHandlers([local.onFocus, enqueueIntentPreload]),
242
+ onMouseEnter: composeEventHandlers([local.onMouseEnter, enqueueIntentPreload]),
243
+ onMouseOver: composeEventHandlers([local.onMouseOver, enqueueIntentPreload]),
244
+ onMouseLeave: composeEventHandlers([local.onMouseLeave, handleLeave]),
245
+ onMouseOut: composeEventHandlers([local.onMouseOut, handleLeave]),
246
+ onTouchStart: composeEventHandlers([local.onTouchStart, handleTouchStart]),
247
+ disabled: !!local.disabled,
248
+ target: local.target,
249
+ ...(() => {
250
+ const s = resolvedStyle();
251
+ return Object.keys(s).length ? { style: s } : {};
252
+ })(),
253
+ ...(() => {
254
+ const c = resolvedClassName();
255
+ return c ? { class: c } : {};
256
+ })(),
257
+ ...local.disabled && {
258
+ role: "link",
259
+ "aria-disabled": true
260
+ },
261
+ ...isActive() && {
262
+ "data-status": "active",
263
+ "aria-current": "page"
264
+ },
265
+ ...isTransitioning() && { "data-transitioning": "transitioning" }
266
+ };
267
+ });
272
268
  }
273
269
  function createLink(Comp) {
274
- return (props) => createComponent(Link, mergeProps(props, {
275
- _asChild: Comp
276
- }));
270
+ return (props) => createComponent(Link, mergeProps(props, { _asChild: Comp }));
277
271
  }
278
- const Link = (props) => {
279
- const [local, rest] = Solid.splitProps(props, ["_asChild", "children"]);
280
- const [_, linkProps] = Solid.splitProps(useLinkProps(rest), ["type"]);
281
- const children = Solid.createMemo(() => {
282
- const ch = local.children;
283
- if (typeof ch === "function") {
284
- return ch({
285
- get isActive() {
286
- return linkProps["data-status"] === "active";
287
- },
288
- get isTransitioning() {
289
- return linkProps["data-transitioning"] === "transitioning";
290
- }
291
- });
292
- }
293
- return ch;
294
- });
295
- if (local._asChild === "svg") {
296
- const [_2, svgLinkProps] = Solid.splitProps(linkProps, ["class"]);
297
- return (() => {
298
- var _el$ = _tmpl$(), _el$2 = _el$.firstChild;
299
- spread(_el$2, svgLinkProps, false, true);
300
- insert(_el$2, children);
301
- return _el$;
302
- })();
303
- }
304
- return createComponent(Dynamic, mergeProps({
305
- get component() {
306
- return memo(() => !!local._asChild)() ? local._asChild : "a";
307
- }
308
- }, linkProps, {
309
- get children() {
310
- return children();
311
- }
312
- }));
272
+ var Link = (props) => {
273
+ const [local, rest] = Solid.splitProps(props, ["_asChild", "children"]);
274
+ const [_, linkProps] = Solid.splitProps(useLinkProps(rest), ["type"]);
275
+ const children = Solid.createMemo(() => {
276
+ const ch = local.children;
277
+ if (typeof ch === "function") return ch({
278
+ get isActive() {
279
+ return linkProps["data-status"] === "active";
280
+ },
281
+ get isTransitioning() {
282
+ return linkProps["data-transitioning"] === "transitioning";
283
+ }
284
+ });
285
+ return ch;
286
+ });
287
+ if (local._asChild === "svg") {
288
+ const [_, svgLinkProps] = Solid.splitProps(linkProps, ["class"]);
289
+ return (() => {
290
+ var _el$ = _tmpl$(), _el$2 = _el$.firstChild;
291
+ spread(_el$2, svgLinkProps, false, true);
292
+ insert(_el$2, children);
293
+ return _el$;
294
+ })();
295
+ }
296
+ return createComponent(Dynamic, mergeProps({ get component() {
297
+ return memo(() => !!local._asChild)() ? local._asChild : "a";
298
+ } }, linkProps, { get children() {
299
+ return children();
300
+ } }));
313
301
  };
314
302
  function isCtrlEvent(e) {
315
- return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey);
303
+ return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey);
316
304
  }
317
- const linkOptions = (options) => {
318
- return options;
319
- };
320
- export {
321
- Link,
322
- createLink,
323
- linkOptions,
324
- useLinkProps
305
+ var linkOptions = (options) => {
306
+ return options;
325
307
  };
326
- //# sourceMappingURL=link.js.map
308
+ //#endregion
309
+ export { Link, createLink, linkOptions, useLinkProps };
310
+
311
+ //# sourceMappingURL=link.js.map