@tanstack/vue-router 1.141.2 → 1.141.6

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 (56) hide show
  1. package/dist/esm/CatchBoundary.d.ts +4 -2
  2. package/dist/esm/CatchBoundary.js +29 -28
  3. package/dist/esm/CatchBoundary.js.map +1 -1
  4. package/dist/esm/ClientOnly.js +33 -0
  5. package/dist/esm/ClientOnly.js.map +1 -0
  6. package/dist/esm/Match.js +66 -39
  7. package/dist/esm/Match.js.map +1 -1
  8. package/dist/esm/ScriptOnce.js +1 -3
  9. package/dist/esm/ScriptOnce.js.map +1 -1
  10. package/dist/esm/Scripts.js +0 -9
  11. package/dist/esm/Scripts.js.map +1 -1
  12. package/dist/esm/Transitioner.js +20 -6
  13. package/dist/esm/Transitioner.js.map +1 -1
  14. package/dist/esm/index.d.ts +2 -1
  15. package/dist/esm/index.js +2 -0
  16. package/dist/esm/index.js.map +1 -1
  17. package/dist/esm/lazyRouteComponent.d.ts +0 -6
  18. package/dist/esm/lazyRouteComponent.js +5 -24
  19. package/dist/esm/lazyRouteComponent.js.map +1 -1
  20. package/dist/esm/link.d.ts +4 -0
  21. package/dist/esm/link.js.map +1 -1
  22. package/dist/esm/route.d.ts +6 -1
  23. package/dist/esm/route.js +25 -0
  24. package/dist/esm/route.js.map +1 -1
  25. package/dist/source/CatchBoundary.d.ts +4 -2
  26. package/dist/source/CatchBoundary.jsx +23 -22
  27. package/dist/source/CatchBoundary.jsx.map +1 -1
  28. package/dist/source/Match.jsx +90 -63
  29. package/dist/source/Match.jsx.map +1 -1
  30. package/dist/source/ScriptOnce.jsx +2 -2
  31. package/dist/source/ScriptOnce.jsx.map +1 -1
  32. package/dist/source/Scripts.jsx +0 -9
  33. package/dist/source/Scripts.jsx.map +1 -1
  34. package/dist/source/Transitioner.jsx +23 -16
  35. package/dist/source/Transitioner.jsx.map +1 -1
  36. package/dist/source/index.d.ts +2 -1
  37. package/dist/source/index.jsx +1 -0
  38. package/dist/source/index.jsx.map +1 -1
  39. package/dist/source/lazyRouteComponent.d.ts +0 -6
  40. package/dist/source/lazyRouteComponent.jsx +3 -23
  41. package/dist/source/lazyRouteComponent.jsx.map +1 -1
  42. package/dist/source/link.d.ts +4 -0
  43. package/dist/source/link.jsx.map +1 -1
  44. package/dist/source/route.d.ts +6 -1
  45. package/dist/source/route.js +13 -0
  46. package/dist/source/route.js.map +1 -1
  47. package/package.json +2 -2
  48. package/src/CatchBoundary.tsx +35 -32
  49. package/src/Match.tsx +115 -73
  50. package/src/ScriptOnce.tsx +1 -3
  51. package/src/Scripts.tsx +0 -11
  52. package/src/Transitioner.tsx +31 -17
  53. package/src/index.tsx +2 -0
  54. package/src/lazyRouteComponent.tsx +10 -32
  55. package/src/link.tsx +20 -0
  56. package/src/route.ts +33 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Transitioner.js","sources":["../../src/Transitioner.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport {\n getLocationChangeInfo,\n handleHashScroll,\n trimPathRight,\n} from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport { useRouterState } from './useRouterState'\nimport { usePrevious } from './utils'\n\n// Track mount state per router to avoid double-loading\nlet mountLoadForRouter = { router: null as any, mounted: false }\n\n/**\n * Composable that sets up router transition logic.\n * This is called from MatchesContent to set up:\n * - router.startTransition\n * - router.startViewTransition\n * - History subscription\n * - Router event watchers\n *\n * Must be called during component setup phase.\n */\nexport function useTransitionerSetup() {\n const router = useRouter()\n\n // Skip on server - no transitions needed\n if (router.isServer) {\n return\n }\n\n const isLoading = useRouterState({\n select: ({ isLoading }) => isLoading,\n })\n\n // Track if we're in a transition - using a ref to track async transitions\n const isTransitioning = Vue.ref(false)\n\n // Track pending state changes\n const hasPendingMatches = useRouterState({\n select: (s) => s.matches.some((d) => d.status === 'pending'),\n })\n\n const previousIsLoading = usePrevious(() => isLoading.value)\n\n const isAnyPending = Vue.computed(\n () => isLoading.value || isTransitioning.value || hasPendingMatches.value,\n )\n const previousIsAnyPending = usePrevious(() => isAnyPending.value)\n\n const isPagePending = Vue.computed(\n () => isLoading.value || hasPendingMatches.value,\n )\n const previousIsPagePending = usePrevious(() => isPagePending.value)\n\n // Implement startTransition similar to React/Solid\n // Vue doesn't have a native useTransition like React 18, so we simulate it\n // We also update the router state's isTransitioning flag so useMatch can check it\n router.startTransition = (fn: () => void | Promise<void>) => {\n isTransitioning.value = true\n // Also update the router state so useMatch knows we're transitioning\n try {\n router.__store.setState((s) => ({ ...s, isTransitioning: true }))\n } catch {\n // Ignore errors if component is unmounted\n }\n\n // Helper to end the transition\n const endTransition = () => {\n // Use nextTick to ensure Vue has processed all reactive updates\n Vue.nextTick(() => {\n try {\n isTransitioning.value = false\n router.__store.setState((s) => ({ ...s, isTransitioning: false }))\n } catch {\n // Ignore errors if component is unmounted\n }\n })\n }\n\n // Execute the function synchronously\n // The function internally may call startViewTransition which schedules async work\n // via document.startViewTransition, but we don't need to wait for it here\n // because Vue's reactivity will trigger re-renders when state changes\n fn()\n\n // End the transition on next tick to allow Vue to process reactive updates\n endTransition()\n }\n\n // For Vue, we need to completely override startViewTransition because Vue's\n // async rendering doesn't work well with the View Transitions API's requirement\n // for synchronous DOM updates. The browser expects the DOM to be updated\n // when the callback promise resolves, but Vue updates asynchronously.\n //\n // Our approach: Skip the actual view transition animation but still update state.\n // This ensures navigation works correctly even without the visual transition.\n // In the future, we could explore using viewTransition.captured like vue-view-transitions does.\n router.startViewTransition = (fn: () => Promise<void>) => {\n // Just run the callback directly without wrapping in document.startViewTransition\n // This ensures the state updates happen and Vue can render them normally\n fn()\n }\n\n // Subscribe to location changes\n // and try to load the new location\n let unsubscribe: (() => void) | undefined\n\n Vue.onMounted(() => {\n unsubscribe = router.history.subscribe(router.load)\n\n const nextLocation = router.buildLocation({\n to: router.latestLocation.pathname,\n search: true,\n params: true,\n hash: true,\n state: true,\n _includeValidateSearch: true,\n })\n\n if (\n trimPathRight(router.latestLocation.href) !==\n trimPathRight(nextLocation.href)\n ) {\n router.commitLocation({ ...nextLocation, replace: true })\n }\n })\n\n // Track if component is mounted to prevent updates after unmount\n const isMounted = Vue.ref(false)\n\n Vue.onMounted(() => {\n isMounted.value = true\n })\n\n Vue.onUnmounted(() => {\n isMounted.value = false\n if (unsubscribe) {\n unsubscribe()\n }\n })\n\n // Try to load the initial location\n Vue.onMounted(() => {\n if (\n (typeof window !== 'undefined' && router.ssr) ||\n (mountLoadForRouter.router === router && mountLoadForRouter.mounted)\n ) {\n return\n }\n mountLoadForRouter = { router, mounted: true }\n const tryLoad = async () => {\n try {\n await router.load()\n } catch (err) {\n console.error(err)\n }\n }\n tryLoad()\n })\n\n // Setup watchers for emitting events\n // All watchers check isMounted to prevent updates after unmount\n Vue.watch(\n () => isLoading.value,\n (newValue) => {\n if (!isMounted.value) return\n try {\n if (previousIsLoading.value.previous && !newValue) {\n router.emit({\n type: 'onLoad',\n ...getLocationChangeInfo(router.state),\n })\n }\n } catch {\n // Ignore errors if component is unmounted\n }\n },\n )\n\n Vue.watch(isPagePending, (newValue) => {\n if (!isMounted.value) return\n try {\n // emit onBeforeRouteMount\n if (previousIsPagePending.value.previous && !newValue) {\n router.emit({\n type: 'onBeforeRouteMount',\n ...getLocationChangeInfo(router.state),\n })\n }\n } catch {\n // Ignore errors if component is unmounted\n }\n })\n\n Vue.watch(isAnyPending, (newValue) => {\n if (!isMounted.value) return\n try {\n // The router was pending and now it's not\n if (previousIsAnyPending.value.previous && !newValue) {\n const changeInfo = getLocationChangeInfo(router.state)\n router.emit({\n type: 'onResolved',\n ...changeInfo,\n })\n\n router.__store.setState((s) => ({\n ...s,\n status: 'idle',\n resolvedLocation: s.location,\n }))\n\n if (changeInfo.hrefChanged) {\n handleHashScroll(router)\n }\n }\n } catch {\n // Ignore errors if component is unmounted\n }\n })\n}\n\n/**\n * @deprecated Use useTransitionerSetup() composable instead.\n * This component is kept for backwards compatibility but the setup logic\n * has been moved to useTransitionerSetup() for better SSR hydration.\n */\nexport const Transitioner = Vue.defineComponent({\n name: 'Transitioner',\n setup() {\n useTransitionerSetup()\n return () => null\n },\n})\n"],"names":["mountLoadForRouter","router","mounted","useTransitionerSetup","useRouter","isServer","isLoading","useRouterState","select","isTransitioning","Vue","ref","hasPendingMatches","s","matches","some","d","status","previousIsLoading","usePrevious","value","isAnyPending","computed","previousIsAnyPending","isPagePending","previousIsPagePending","startTransition","fn","__store","setState","endTransition","nextTick","startViewTransition","unsubscribe","onMounted","history","subscribe","load","nextLocation","buildLocation","to","latestLocation","pathname","search","params","hash","state","_includeValidateSearch","trimPathRight","href","commitLocation","replace","isMounted","onUnmounted","window","ssr","tryLoad","err","console","error","watch","newValue","previous","emit","type","getLocationChangeInfo","changeInfo","resolvedLocation","location","hrefChanged","handleHashScroll","defineComponent","name","setup"],"mappings":"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"}
1
+ {"version":3,"file":"Transitioner.js","sources":["../../src/Transitioner.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport {\n getLocationChangeInfo,\n handleHashScroll,\n trimPathRight,\n} from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport { useRouterState } from './useRouterState'\nimport { usePrevious } from './utils'\n\n// Track mount state per router to avoid double-loading\nlet mountLoadForRouter = { router: null as any, mounted: false }\n\n/**\n * Composable that sets up router transition logic.\n * This is called from MatchesContent to set up:\n * - router.startTransition\n * - router.startViewTransition\n * - History subscription\n * - Router event watchers\n *\n * Must be called during component setup phase.\n */\nexport function useTransitionerSetup() {\n const router = useRouter()\n\n // Skip on server - no transitions needed\n if (router.isServer) {\n return\n }\n\n const isLoading = useRouterState({\n select: ({ isLoading }) => isLoading,\n })\n\n // Track if we're in a transition - using a ref to track async transitions\n const isTransitioning = Vue.ref(false)\n\n // Track pending state changes\n const hasPendingMatches = useRouterState({\n select: (s) => s.matches.some((d) => d.status === 'pending'),\n })\n\n const previousIsLoading = usePrevious(() => isLoading.value)\n\n const isAnyPending = Vue.computed(\n () => isLoading.value || isTransitioning.value || hasPendingMatches.value,\n )\n const previousIsAnyPending = usePrevious(() => isAnyPending.value)\n\n const isPagePending = Vue.computed(\n () => isLoading.value || hasPendingMatches.value,\n )\n const previousIsPagePending = usePrevious(() => isPagePending.value)\n\n // Implement startTransition similar to React/Solid\n // Vue doesn't have a native useTransition like React 18, so we simulate it\n // We also update the router state's isTransitioning flag so useMatch can check it\n router.startTransition = (fn: () => void | Promise<void>) => {\n isTransitioning.value = true\n // Also update the router state so useMatch knows we're transitioning\n try {\n router.__store.setState((s) => ({ ...s, isTransitioning: true }))\n } catch {\n // Ignore errors if component is unmounted\n }\n\n // Helper to end the transition\n const endTransition = () => {\n // Use nextTick to ensure Vue has processed all reactive updates\n Vue.nextTick(() => {\n try {\n isTransitioning.value = false\n router.__store.setState((s) => ({ ...s, isTransitioning: false }))\n } catch {\n // Ignore errors if component is unmounted\n }\n })\n }\n\n // Execute the function synchronously\n // The function internally may call startViewTransition which schedules async work\n // via document.startViewTransition, but we don't need to wait for it here\n // because Vue's reactivity will trigger re-renders when state changes\n fn()\n\n // End the transition on next tick to allow Vue to process reactive updates\n endTransition()\n }\n\n // Vue updates DOM asynchronously (next tick). The View Transitions API expects the\n // update callback promise to resolve only after the DOM has been updated.\n // Wrap the router-core implementation to await a Vue flush before resolving.\n const originalStartViewTransition:\n | undefined\n | ((fn: () => Promise<void>) => void) =\n (router as any).__tsrOriginalStartViewTransition ??\n router.startViewTransition\n\n ;(router as any).__tsrOriginalStartViewTransition =\n originalStartViewTransition\n\n router.startViewTransition = (fn: () => Promise<void>) => {\n return originalStartViewTransition?.(async () => {\n await fn()\n await Vue.nextTick()\n })\n }\n\n // Subscribe to location changes\n // and try to load the new location\n let unsubscribe: (() => void) | undefined\n\n Vue.onMounted(() => {\n unsubscribe = router.history.subscribe(router.load)\n\n const nextLocation = router.buildLocation({\n to: router.latestLocation.pathname,\n search: true,\n params: true,\n hash: true,\n state: true,\n _includeValidateSearch: true,\n })\n\n if (\n trimPathRight(router.latestLocation.href) !==\n trimPathRight(nextLocation.href)\n ) {\n router.commitLocation({ ...nextLocation, replace: true })\n }\n })\n\n // Track if component is mounted to prevent updates after unmount\n const isMounted = Vue.ref(false)\n\n Vue.onMounted(() => {\n isMounted.value = true\n if (!isAnyPending.value) {\n router.__store.setState((s) =>\n s.status === 'pending'\n ? { ...s, status: 'idle', resolvedLocation: s.location }\n : s,\n )\n }\n })\n\n Vue.onUnmounted(() => {\n isMounted.value = false\n if (unsubscribe) {\n unsubscribe()\n }\n })\n\n // Try to load the initial location\n Vue.onMounted(() => {\n if (\n (typeof window !== 'undefined' && router.ssr) ||\n (mountLoadForRouter.router === router && mountLoadForRouter.mounted)\n ) {\n return\n }\n mountLoadForRouter = { router, mounted: true }\n const tryLoad = async () => {\n try {\n await router.load()\n } catch (err) {\n console.error(err)\n }\n }\n tryLoad()\n })\n\n // Setup watchers for emitting events\n // All watchers check isMounted to prevent updates after unmount\n Vue.watch(\n () => isLoading.value,\n (newValue) => {\n if (!isMounted.value) return\n try {\n if (previousIsLoading.value.previous && !newValue) {\n router.emit({\n type: 'onLoad',\n ...getLocationChangeInfo(router.state),\n })\n }\n } catch {\n // Ignore errors if component is unmounted\n }\n },\n )\n\n Vue.watch(isPagePending, (newValue) => {\n if (!isMounted.value) return\n try {\n // emit onBeforeRouteMount\n if (previousIsPagePending.value.previous && !newValue) {\n router.emit({\n type: 'onBeforeRouteMount',\n ...getLocationChangeInfo(router.state),\n })\n }\n } catch {\n // Ignore errors if component is unmounted\n }\n })\n\n Vue.watch(isAnyPending, (newValue) => {\n if (!isMounted.value) return\n try {\n if (!newValue && router.__store.state.status === 'pending') {\n router.__store.setState((s) => ({\n ...s,\n status: 'idle',\n resolvedLocation: s.location,\n }))\n }\n\n // The router was pending and now it's not\n if (previousIsAnyPending.value.previous && !newValue) {\n const changeInfo = getLocationChangeInfo(router.state)\n router.emit({\n type: 'onResolved',\n ...changeInfo,\n })\n\n if (changeInfo.hrefChanged) {\n handleHashScroll(router)\n }\n }\n } catch {\n // Ignore errors if component is unmounted\n }\n })\n}\n\n/**\n * @deprecated Use useTransitionerSetup() composable instead.\n * This component is kept for backwards compatibility but the setup logic\n * has been moved to useTransitionerSetup() for better SSR hydration.\n */\nexport const Transitioner = Vue.defineComponent({\n name: 'Transitioner',\n setup() {\n useTransitionerSetup()\n return () => null\n },\n})\n"],"names":["mountLoadForRouter","router","mounted","useTransitionerSetup","useRouter","isServer","isLoading","useRouterState","select","isTransitioning","Vue","ref","hasPendingMatches","s","matches","some","d","status","previousIsLoading","usePrevious","value","isAnyPending","computed","previousIsAnyPending","isPagePending","previousIsPagePending","startTransition","fn","__store","setState","endTransition","nextTick","originalStartViewTransition","__tsrOriginalStartViewTransition","startViewTransition","unsubscribe","onMounted","history","subscribe","load","nextLocation","buildLocation","to","latestLocation","pathname","search","params","hash","state","_includeValidateSearch","trimPathRight","href","commitLocation","replace","isMounted","resolvedLocation","location","onUnmounted","window","ssr","tryLoad","err","console","error","watch","newValue","previous","emit","type","getLocationChangeInfo","changeInfo","hrefChanged","handleHashScroll","defineComponent","name","setup"],"mappings":"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"}
@@ -10,7 +10,7 @@ export * from './history.js';
10
10
  export { lazyRouteComponent } from './lazyRouteComponent.js';
11
11
  export { useLinkProps, createLink, Link, linkOptions } from './link.js';
12
12
  export type { InferDescendantToPaths, RelativeToPath, RelativeToParentPath, RelativeToCurrentPath, AbsoluteToPath, RelativeToPathAutoComplete, NavigateOptions, ToOptions, ToMaskOptions, ToSubOptions, ResolveRoute, SearchParamOptions, PathParamOptions, ToPathOption, LinkOptions, MakeOptionalPathParams, FileRouteTypes, RouteContextParameter, BeforeLoadContextParameter, ResolveAllContext, ResolveAllParamsFromParent, ResolveFullSearchSchema, ResolveFullSearchSchemaInput, RouteIds, NavigateFn, BuildLocationFn, FullSearchSchemaOption, MakeRemountDepsOptionsUnion, RemountDepsOptions, ResolveFullPath, AnyRouteWithContext, AnyRouterWithContext, CommitLocationOptions, MatchLocation, UseNavigateResult, AnyRedirect, Redirect, RedirectOptions, ResolvedRedirect, MakeRouteMatch, MakeRouteMatchUnion, RouteMatch, AnyRouteMatch, RouteContextFn, RouteContextOptions, BeforeLoadContextOptions, ContextOptions, RouteOptions, FileBaseRouteOptions, BaseRouteOptions, UpdatableRouteOptions, RouteLoaderFn, LoaderFnContext, LazyRouteOptions, AnyRouter, RegisteredRouter, RouterContextOptions, ControllablePromise, InjectedHtmlEntry, RouterOptions, RouterState, ListenerFn, BuildNextOptions, RouterConstructorOptions, RouterEvents, RouterEvent, RouterListener, RouteConstraints, RouteMask, MatchRouteOptions, CreateLazyFileRoute, } from '@tanstack/router-core';
13
- export type { UseLinkPropsOptions, ActiveLinkOptions, LinkProps, LinkComponent, LinkComponentProps, CreateLinkProps, } from './link.js';
13
+ export type { UseLinkPropsOptions, ActiveLinkOptions, LinkProps, LinkComponent, LinkComponentRoute, LinkComponentProps, CreateLinkProps, } from './link.js';
14
14
  export { Matches, useMatchRoute, MatchRoute, useMatches, useParentMatches, useChildMatches, } from './Matches.js';
15
15
  export type { UseMatchRouteOptions, MakeMatchRouteOptions } from './Matches.js';
16
16
  export { matchContext } from './matchContext.js';
@@ -51,3 +51,4 @@ export { Body } from './Body.js';
51
51
  export { Html } from './Html.js';
52
52
  export { composeRewrites } from '@tanstack/router-core';
53
53
  export type { LocationRewrite, LocationRewriteFunction, } from '@tanstack/router-core';
54
+ export { ClientOnly } from './ClientOnly.js';
package/dist/esm/index.js CHANGED
@@ -33,6 +33,7 @@ import { HeadContent } from "./HeadContent.js";
33
33
  import { Scripts } from "./Scripts.js";
34
34
  import { Body } from "./Body.js";
35
35
  import { Html } from "./Html.js";
36
+ import { ClientOnly } from "./ClientOnly.js";
36
37
  export {
37
38
  Asset,
38
39
  Await,
@@ -40,6 +41,7 @@ export {
40
41
  Body,
41
42
  CatchBoundary,
42
43
  CatchNotFound,
44
+ ClientOnly,
43
45
  DefaultGlobalNotFound,
44
46
  ErrorComponent,
45
47
  FileRoute,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,8 +1,2 @@
1
1
  import { AsyncRouteComponent } from './route.js';
2
- import * as Vue from 'vue';
3
- export declare function ClientOnly(props: {
4
- children?: any;
5
- fallback?: Vue.VNode;
6
- }): () => any;
7
- export declare function useHydrated(): Vue.Ref<boolean, boolean> | Vue.ComputedRef<boolean>;
8
2
  export declare function lazyRouteComponent<T extends Record<string, any>, TKey extends keyof T = 'default'>(importer: () => Promise<T>, exportName?: TKey, ssr?: () => boolean): T[TKey] extends (props: infer TProps) => any ? AsyncRouteComponent<TProps> : never;
@@ -1,28 +1,10 @@
1
1
  import * as Vue from "vue";
2
2
  import { Outlet } from "./Match.js";
3
+ import { ClientOnly } from "./ClientOnly.js";
3
4
  function isModuleNotFoundError(error) {
4
5
  if (typeof error?.message !== "string") return false;
5
6
  return error.message.startsWith("Failed to fetch dynamically imported module") || error.message.startsWith("error loading dynamically imported module") || error.message.startsWith("Importing a module script failed");
6
7
  }
7
- function ClientOnly(props) {
8
- const hydrated = useHydrated();
9
- return () => {
10
- if (hydrated.value) {
11
- return props.children;
12
- }
13
- return props.fallback || null;
14
- };
15
- }
16
- function useHydrated() {
17
- const hydrated = Vue.ref(false);
18
- if (typeof window === "undefined") {
19
- return Vue.computed(() => false);
20
- }
21
- Vue.onMounted(() => {
22
- hydrated.value = true;
23
- });
24
- return hydrated;
25
- }
26
8
  function lazyRouteComponent(importer, exportName, ssr) {
27
9
  let loadPromise;
28
10
  let comp = null;
@@ -87,8 +69,9 @@ function lazyRouteComponent(importer, exportName, ssr) {
87
69
  }
88
70
  if (ssr?.() === false) {
89
71
  return Vue.h(ClientOnly, {
90
- fallback: Vue.h(Outlet),
91
- children: Vue.h(component.value, props)
72
+ fallback: Vue.h(Outlet)
73
+ }, {
74
+ default: () => Vue.h(component.value, props)
92
75
  });
93
76
  }
94
77
  return Vue.h(component.value, props);
@@ -99,8 +82,6 @@ function lazyRouteComponent(importer, exportName, ssr) {
99
82
  return lazyComp;
100
83
  }
101
84
  export {
102
- ClientOnly,
103
- lazyRouteComponent,
104
- useHydrated
85
+ lazyRouteComponent
105
86
  };
106
87
  //# sourceMappingURL=lazyRouteComponent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lazyRouteComponent.js","sources":["../../src/lazyRouteComponent.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { Outlet } from './Match'\nimport type { AsyncRouteComponent } from './route'\n\n// If the load fails due to module not found, it may mean a new version of\n// the build was deployed and the user's browser is still using an old version.\n// If this happens, the old version in the user's browser would have an outdated\n// URL to the lazy module.\n// In that case, we want to attempt one window refresh to get the latest.\nfunction isModuleNotFoundError(error: any): boolean {\n // chrome: \"Failed to fetch dynamically imported module: http://localhost:5173/src/routes/posts.index.tsx?tsr-split\"\n // firefox: \"error loading dynamically imported module: http://localhost:5173/src/routes/posts.index.tsx?tsr-split\"\n // safari: \"Importing a module script failed.\"\n if (typeof error?.message !== 'string') return false\n return (\n error.message.startsWith('Failed to fetch dynamically imported module') ||\n error.message.startsWith('error loading dynamically imported module') ||\n error.message.startsWith('Importing a module script failed')\n )\n}\n\nexport function ClientOnly(props: { children?: any; fallback?: Vue.VNode }) {\n const hydrated = useHydrated()\n\n return () => {\n if (hydrated.value) {\n return props.children\n }\n return props.fallback || null\n }\n}\n\nexport function useHydrated() {\n // Only hydrate on client-side, never on server\n const hydrated = Vue.ref(false)\n\n // If on server, return false\n if (typeof window === 'undefined') {\n return Vue.computed(() => false)\n }\n\n // On client, set to true once mounted\n Vue.onMounted(() => {\n hydrated.value = true\n })\n\n return hydrated\n}\n\nexport function lazyRouteComponent<\n T extends Record<string, any>,\n TKey extends keyof T = 'default',\n>(\n importer: () => Promise<T>,\n exportName?: TKey,\n ssr?: () => boolean,\n): T[TKey] extends (props: infer TProps) => any\n ? AsyncRouteComponent<TProps>\n : never {\n let loadPromise: Promise<any> | undefined\n let comp: T[TKey] | T['default'] | null = null\n let error: any = null\n let attemptedReload = false\n\n const load = () => {\n // If we're on the server and SSR is disabled for this component\n if (typeof document === 'undefined' && ssr?.() === false) {\n comp = (() => null) as any\n return Promise.resolve(comp)\n }\n\n // Use existing promise or create new one\n if (!loadPromise) {\n loadPromise = importer()\n .then((res) => {\n loadPromise = undefined\n comp = res[exportName ?? 'default']\n return comp\n })\n .catch((err) => {\n error = err\n loadPromise = undefined\n\n // If it's a module not found error, we'll try to handle it in the component\n if (isModuleNotFoundError(error)) {\n return null\n }\n\n throw err\n })\n }\n\n return loadPromise\n }\n\n // Create a lazy component wrapper using defineComponent so it works in Vue SFC templates\n const lazyComp = Vue.defineComponent({\n name: 'LazyRouteComponent',\n setup(props: any) {\n // Create refs to track component state\n // Use shallowRef for component to avoid making it reactive (Vue warning)\n const component = Vue.shallowRef<any>(comp ? Vue.markRaw(comp) : comp)\n const errorState = Vue.ref<any>(error)\n const loading = Vue.ref(!component.value && !errorState.value)\n\n // Setup effect to load the component when this component is used\n Vue.onMounted(() => {\n if (!component.value && !errorState.value) {\n loading.value = true\n\n load()\n .then((result) => {\n // Use markRaw to prevent Vue from making the component reactive\n component.value = result ? Vue.markRaw(result) : result\n loading.value = false\n })\n .catch((err) => {\n errorState.value = err\n loading.value = false\n })\n }\n })\n\n // Handle module not found error with reload attempt\n if (\n errorState.value &&\n isModuleNotFoundError(errorState.value) &&\n !attemptedReload\n ) {\n if (\n typeof window !== 'undefined' &&\n typeof sessionStorage !== 'undefined'\n ) {\n // Try to reload once on module not found error\n const storageKey = `tanstack_router_reload:${errorState.value.message}`\n if (!sessionStorage.getItem(storageKey)) {\n sessionStorage.setItem(storageKey, '1')\n attemptedReload = true\n window.location.reload()\n return () => null // Return empty while reloading\n }\n }\n }\n\n // If we have a non-module-not-found error, throw it\n if (errorState.value && !isModuleNotFoundError(errorState.value)) {\n throw errorState.value\n }\n\n // Return a render function\n return () => {\n // If we're still loading or don't have a component yet, use a suspense pattern\n if (loading.value || !component.value) {\n return Vue.h('div', null) // Empty div while loading\n }\n\n // If SSR is disabled for this component\n if (ssr?.() === false) {\n return Vue.h(ClientOnly, {\n fallback: Vue.h(Outlet),\n children: Vue.h(component.value, props),\n })\n }\n\n // Regular render with the loaded component\n return Vue.h(component.value, props)\n }\n },\n })\n\n // Add preload method\n ;(lazyComp as any).preload = load\n\n return lazyComp as any\n}\n"],"names":["isModuleNotFoundError","error","message","startsWith","ClientOnly","props","hydrated","useHydrated","value","children","fallback","Vue","ref","window","computed","onMounted","lazyRouteComponent","importer","exportName","ssr","loadPromise","comp","attemptedReload","load","document","Promise","resolve","then","res","undefined","catch","err","lazyComp","defineComponent","name","setup","component","shallowRef","markRaw","errorState","loading","result","sessionStorage","storageKey","getItem","setItem","location","reload","h","Outlet","preload"],"mappings":"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"}
1
+ {"version":3,"file":"lazyRouteComponent.js","sources":["../../src/lazyRouteComponent.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { Outlet } from './Match'\nimport { ClientOnly } from './ClientOnly'\nimport type { AsyncRouteComponent } from './route'\n\n// If the load fails due to module not found, it may mean a new version of\n// the build was deployed and the user's browser is still using an old version.\n// If this happens, the old version in the user's browser would have an outdated\n// URL to the lazy module.\n// In that case, we want to attempt one window refresh to get the latest.\nfunction isModuleNotFoundError(error: any): boolean {\n // chrome: \"Failed to fetch dynamically imported module: http://localhost:5173/src/routes/posts.index.tsx?tsr-split\"\n // firefox: \"error loading dynamically imported module: http://localhost:5173/src/routes/posts.index.tsx?tsr-split\"\n // safari: \"Importing a module script failed.\"\n if (typeof error?.message !== 'string') return false\n return (\n error.message.startsWith('Failed to fetch dynamically imported module') ||\n error.message.startsWith('error loading dynamically imported module') ||\n error.message.startsWith('Importing a module script failed')\n )\n}\n\nexport function lazyRouteComponent<\n T extends Record<string, any>,\n TKey extends keyof T = 'default',\n>(\n importer: () => Promise<T>,\n exportName?: TKey,\n ssr?: () => boolean,\n): T[TKey] extends (props: infer TProps) => any\n ? AsyncRouteComponent<TProps>\n : never {\n let loadPromise: Promise<any> | undefined\n let comp: T[TKey] | T['default'] | null = null\n let error: any = null\n let attemptedReload = false\n\n const load = () => {\n // If we're on the server and SSR is disabled for this component\n if (typeof document === 'undefined' && ssr?.() === false) {\n comp = (() => null) as any\n return Promise.resolve(comp)\n }\n\n // Use existing promise or create new one\n if (!loadPromise) {\n loadPromise = importer()\n .then((res) => {\n loadPromise = undefined\n comp = res[exportName ?? 'default']\n return comp\n })\n .catch((err) => {\n error = err\n loadPromise = undefined\n\n // If it's a module not found error, we'll try to handle it in the component\n if (isModuleNotFoundError(error)) {\n return null\n }\n\n throw err\n })\n }\n\n return loadPromise\n }\n\n // Create a lazy component wrapper using defineComponent so it works in Vue SFC templates\n const lazyComp = Vue.defineComponent({\n name: 'LazyRouteComponent',\n setup(props: any) {\n // Create refs to track component state\n // Use shallowRef for component to avoid making it reactive (Vue warning)\n const component = Vue.shallowRef<any>(comp ? Vue.markRaw(comp) : comp)\n const errorState = Vue.ref<any>(error)\n const loading = Vue.ref(!component.value && !errorState.value)\n\n // Setup effect to load the component when this component is used\n Vue.onMounted(() => {\n if (!component.value && !errorState.value) {\n loading.value = true\n\n load()\n .then((result) => {\n // Use markRaw to prevent Vue from making the component reactive\n component.value = result ? Vue.markRaw(result) : result\n loading.value = false\n })\n .catch((err) => {\n errorState.value = err\n loading.value = false\n })\n }\n })\n\n // Handle module not found error with reload attempt\n if (\n errorState.value &&\n isModuleNotFoundError(errorState.value) &&\n !attemptedReload\n ) {\n if (\n typeof window !== 'undefined' &&\n typeof sessionStorage !== 'undefined'\n ) {\n // Try to reload once on module not found error\n const storageKey = `tanstack_router_reload:${errorState.value.message}`\n if (!sessionStorage.getItem(storageKey)) {\n sessionStorage.setItem(storageKey, '1')\n attemptedReload = true\n window.location.reload()\n return () => null // Return empty while reloading\n }\n }\n }\n\n // If we have a non-module-not-found error, throw it\n if (errorState.value && !isModuleNotFoundError(errorState.value)) {\n throw errorState.value\n }\n\n // Return a render function\n return () => {\n // If we're still loading or don't have a component yet, use a suspense pattern\n if (loading.value || !component.value) {\n return Vue.h('div', null) // Empty div while loading\n }\n\n // If SSR is disabled for this component\n if (ssr?.() === false) {\n return Vue.h(\n ClientOnly,\n {\n fallback: Vue.h(Outlet),\n },\n {\n default: () => Vue.h(component.value, props),\n },\n )\n }\n\n // Regular render with the loaded component\n return Vue.h(component.value, props)\n }\n },\n })\n\n // Add preload method\n ;(lazyComp as any).preload = load\n\n return lazyComp as any\n}\n"],"names":["isModuleNotFoundError","error","message","startsWith","lazyRouteComponent","importer","exportName","ssr","loadPromise","comp","attemptedReload","load","document","Promise","resolve","then","res","undefined","catch","err","lazyComp","Vue","defineComponent","name","setup","props","component","shallowRef","markRaw","errorState","ref","loading","value","onMounted","result","window","sessionStorage","storageKey","getItem","setItem","location","reload","h","ClientOnly","fallback","Outlet","default","preload"],"mappings":"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"}
@@ -48,6 +48,10 @@ type LinkComponentVueProps<TComp> = TComp extends keyof HTMLElementTagNameMap ?
48
48
  export type LinkComponentProps<TComp = 'a', TRouter extends AnyRouter = RegisteredRouter, TFrom extends string = string, TTo extends string | undefined = '.', TMaskFrom extends string = TFrom, TMaskTo extends string = '.'> = LinkComponentVueProps<TComp> & LinkProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>;
49
49
  export type CreateLinkProps = LinkProps<any, any, string, string, string, string>;
50
50
  export type LinkComponent<TComp> = <TRouter extends AnyRouter = RegisteredRouter, const TFrom extends string = string, const TTo extends string | undefined = undefined, const TMaskFrom extends string = TFrom, const TMaskTo extends string = ''>(props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>) => Vue.VNode;
51
+ export interface LinkComponentRoute<in out TDefaultFrom extends string = string> {
52
+ defaultFrom: TDefaultFrom;
53
+ <TRouter extends AnyRouter = RegisteredRouter, const TTo extends string | undefined = undefined, const TMaskTo extends string = ''>(props: LinkComponentProps<'a', TRouter, this['defaultFrom'], TTo, this['defaultFrom'], TMaskTo>): Vue.VNode;
54
+ }
51
55
  export declare function createLink<const TComp>(Comp: Constrain<TComp, any, (props: CreateLinkProps) => Vue.VNode>): LinkComponent<TComp>;
52
56
  /**
53
57
  * Link component with proper TypeScript generics support
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","sources":["../../src/link.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport {\n deepEqual,\n exactPathTest,\n preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\n\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { useIntersectionObserver } from './utils'\nimport { useMatches } from './Matches'\n\nimport type {\n AnyRouter,\n Constrain,\n LinkCurrentTargetElement,\n LinkOptions,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\n\n// Type definitions to replace missing Vue JSX types\ntype EventHandler<TEvent = Event> = (e: TEvent) => void\ninterface HTMLAttributes {\n class?: string\n style?: Record<string, string | number>\n onClick?: EventHandler<MouseEvent>\n onFocus?: EventHandler<FocusEvent>\n // Vue 3's h() function expects lowercase event names after 'on' prefix\n onMouseenter?: EventHandler<MouseEvent>\n onMouseleave?: EventHandler<MouseEvent>\n onMouseover?: EventHandler<MouseEvent>\n onMouseout?: EventHandler<MouseEvent>\n onTouchstart?: EventHandler<TouchEvent>\n // Also accept the camelCase versions for external API compatibility\n onMouseEnter?: EventHandler<MouseEvent>\n onMouseLeave?: EventHandler<MouseEvent>\n onMouseOver?: EventHandler<MouseEvent>\n onMouseOut?: EventHandler<MouseEvent>\n onTouchStart?: EventHandler<TouchEvent>\n [key: string]: any\n}\n\ninterface StyledProps {\n class?: string\n style?: Record<string, string | number>\n [key: string]: any\n}\n\nexport function useLinkProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '',\n>(\n options: UseLinkPropsOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n): HTMLAttributes {\n const router = useRouter()\n const isTransitioning = Vue.ref(false)\n let hasRenderFetched = false\n\n // Ensure router is defined before proceeding\n if (!router) {\n console.warn('useRouter must be used inside a <RouterProvider> component!')\n return {}\n }\n\n // Determine if the link is external or internal\n const type = Vue.computed(() => {\n try {\n new URL(`${options.to}`)\n return 'external'\n } catch {\n return 'internal'\n }\n })\n\n const currentSearch = useRouterState({\n select: (s) => s.location.searchStr,\n })\n\n // when `from` is not supplied, use the leaf route of the current matches as the `from` location\n const from = useMatches({\n select: (matches) => options.from ?? matches[matches.length - 1]?.fullPath,\n })\n\n const _options = Vue.computed(() => ({\n ...options,\n from: from.value,\n }))\n\n const next = Vue.computed(() => {\n // Depend on search to rebuild when search changes\n currentSearch.value\n return router.buildLocation(_options.value as any)\n })\n\n const preload = Vue.computed(() => {\n if (_options.value.reloadDocument) {\n return false\n }\n return options.preload ?? router.options.defaultPreload\n })\n\n const preloadDelay = Vue.computed(\n () => options.preloadDelay ?? router.options.defaultPreloadDelay ?? 0,\n )\n\n const isActive = useRouterState({\n select: (s) => {\n const activeOptions = options.activeOptions\n if (activeOptions?.exact) {\n const testExact = exactPathTest(\n s.location.pathname,\n next.value.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.value?.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.value.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.value.hash\n }\n return true\n },\n })\n\n const doPreload = () =>\n router.preloadRoute(_options.value as any).catch((err: any) => {\n console.warn(err)\n console.warn(preloadWarning)\n })\n\n const preloadViewportIoCallback = (\n entry: IntersectionObserverEntry | undefined,\n ) => {\n if (entry?.isIntersecting) {\n doPreload()\n }\n }\n\n const ref = Vue.ref<Element | null>(null)\n\n useIntersectionObserver(\n ref,\n preloadViewportIoCallback,\n { rootMargin: '100px' },\n { disabled: () => !!options.disabled || !(preload.value === 'viewport') },\n )\n\n Vue.effect(() => {\n if (hasRenderFetched) {\n return\n }\n if (!options.disabled && preload.value === 'render') {\n doPreload()\n hasRenderFetched = true\n }\n })\n\n // Create safe props that can be spread\n const getPropsSafeToSpread = () => {\n const result: Record<string, any> = {}\n for (const key in options) {\n if (\n ![\n 'activeProps',\n 'inactiveProps',\n 'activeOptions',\n 'to',\n 'preload',\n 'preloadDelay',\n 'hashScrollIntoView',\n 'replace',\n 'startTransition',\n 'resetScroll',\n 'viewTransition',\n 'children',\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\n 'onFocus',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseOver',\n 'onMouseOut',\n 'onTouchStart',\n 'ignoreBlocker',\n 'params',\n 'search',\n 'hash',\n 'state',\n 'mask',\n 'reloadDocument',\n '_asChild',\n 'from',\n 'additionalProps',\n ].includes(key)\n ) {\n result[key] = options[key]\n }\n }\n return result\n }\n\n if (type.value === 'external') {\n // External links just have simple props\n const externalProps: HTMLAttributes = {\n ...getPropsSafeToSpread(),\n ref,\n href: options.to,\n target: options.target,\n disabled: options.disabled,\n style: options.style,\n class: options.class,\n onClick: options.onClick,\n onFocus: options.onFocus,\n onMouseEnter: options.onMouseEnter,\n onMouseLeave: options.onMouseLeave,\n onMouseOver: options.onMouseOver,\n onMouseOut: options.onMouseOut,\n onTouchStart: options.onTouchStart,\n }\n\n // Remove undefined values\n Object.keys(externalProps).forEach((key) => {\n if (externalProps[key] === undefined) {\n delete externalProps[key]\n }\n })\n\n return externalProps\n }\n\n // The click handler\n const handleClick = (e: MouseEvent): void => {\n // Check actual element's target attribute as fallback\n const elementTarget = (\n e.currentTarget as HTMLAnchorElement | SVGAElement\n )?.getAttribute('target')\n const effectiveTarget =\n options.target !== undefined ? options.target : elementTarget\n\n if (\n !options.disabled &&\n !isCtrlEvent(e) &&\n !e.defaultPrevented &&\n (!effectiveTarget || effectiveTarget === '_self') &&\n e.button === 0\n ) {\n // Don't prevent default or handle navigation if reloadDocument is true\n if (_options.value.reloadDocument) {\n return\n }\n\n e.preventDefault()\n\n isTransitioning.value = true\n\n const unsub = router.subscribe('onResolved', () => {\n unsub()\n isTransitioning.value = false\n })\n\n // All is well? Navigate!\n router.navigate({\n ..._options.value,\n replace: options.replace,\n resetScroll: options.resetScroll,\n hashScrollIntoView: options.hashScrollIntoView,\n startTransition: options.startTransition,\n viewTransition: options.viewTransition,\n ignoreBlocker: options.ignoreBlocker,\n } as any)\n }\n }\n\n // The focus handler\n const handleFocus = (_: FocusEvent) => {\n if (options.disabled) return\n if (preload.value) {\n doPreload()\n }\n }\n\n const handleTouchStart = (_: TouchEvent) => {\n if (options.disabled) return\n if (preload.value) {\n doPreload()\n }\n }\n\n const handleEnter = (e: MouseEvent) => {\n if (options.disabled) return\n // Use currentTarget (the element with the handler) instead of target (which may be a child)\n const eventTarget = (e.currentTarget ||\n e.target ||\n {}) as LinkCurrentTargetElement\n\n if (preload.value) {\n if (eventTarget.preloadTimeout) {\n return\n }\n\n eventTarget.preloadTimeout = setTimeout(() => {\n eventTarget.preloadTimeout = null\n doPreload()\n }, preloadDelay.value)\n }\n }\n\n const handleLeave = (e: MouseEvent) => {\n if (options.disabled) return\n // Use currentTarget (the element with the handler) instead of target (which may be a child)\n const eventTarget = (e.currentTarget ||\n e.target ||\n {}) as LinkCurrentTargetElement\n\n if (eventTarget.preloadTimeout) {\n clearTimeout(eventTarget.preloadTimeout)\n eventTarget.preloadTimeout = null\n }\n }\n\n // Helper to compose event handlers - with explicit return type and better type handling\n function composeEventHandlers<T extends Event>(\n handlers: Array<EventHandler<T> | undefined>,\n ): (e: T) => void {\n return (event: T) => {\n for (const handler of handlers) {\n if (handler) {\n handler(event)\n }\n }\n }\n }\n\n // Get the active and inactive props\n const resolvedActiveProps = Vue.computed<StyledProps>(() => {\n const activeProps = options.activeProps || (() => ({ class: 'active' }))\n const props = isActive.value\n ? typeof activeProps === 'function'\n ? activeProps()\n : activeProps\n : {}\n\n return props || { class: undefined, style: undefined }\n })\n\n const resolvedInactiveProps = Vue.computed<StyledProps>(() => {\n const inactiveProps = options.inactiveProps || (() => ({}))\n const props = isActive.value\n ? {}\n : typeof inactiveProps === 'function'\n ? inactiveProps()\n : inactiveProps\n\n return props || { class: undefined, style: undefined }\n })\n\n const resolvedClassName = Vue.computed(() => {\n const classes = [\n options.class,\n resolvedActiveProps.value?.class,\n resolvedInactiveProps.value?.class,\n ].filter(Boolean)\n return classes.length ? classes.join(' ') : undefined\n })\n\n const resolvedStyle = Vue.computed(() => {\n const result: Record<string, string | number> = {}\n\n // Merge styles from all sources\n if (options.style) {\n Object.assign(result, options.style)\n }\n\n if (resolvedActiveProps.value?.style) {\n Object.assign(result, resolvedActiveProps.value.style)\n }\n\n if (resolvedInactiveProps.value?.style) {\n Object.assign(result, resolvedInactiveProps.value.style)\n }\n\n return Object.keys(result).length > 0 ? result : undefined\n })\n\n const href = Vue.computed(() => {\n if (options.disabled) {\n return undefined\n }\n const nextLocation = next.value\n const maskedLocation = nextLocation?.maskedLocation\n\n let hrefValue: string\n if (maskedLocation) {\n hrefValue = maskedLocation.url.href\n } else {\n hrefValue = nextLocation?.url.href\n }\n\n // Handle origin stripping like Solid does\n if (router.origin && hrefValue?.startsWith(router.origin)) {\n hrefValue = router.history.createHref(\n hrefValue.replace(router.origin, ''),\n )\n }\n\n return hrefValue\n })\n\n // Create static event handlers that don't change between renders\n const staticEventHandlers = {\n onClick: composeEventHandlers<MouseEvent>([\n options.onClick,\n handleClick,\n ]) as any,\n onFocus: composeEventHandlers<FocusEvent>([\n options.onFocus,\n handleFocus,\n ]) as any,\n onMouseenter: composeEventHandlers<MouseEvent>([\n options.onMouseEnter,\n handleEnter,\n ]) as any,\n onMouseover: composeEventHandlers<MouseEvent>([\n options.onMouseOver,\n handleEnter,\n ]) as any,\n onMouseleave: composeEventHandlers<MouseEvent>([\n options.onMouseLeave,\n handleLeave,\n ]) as any,\n onMouseout: composeEventHandlers<MouseEvent>([\n options.onMouseOut,\n handleLeave,\n ]) as any,\n onTouchstart: composeEventHandlers<TouchEvent>([\n options.onTouchStart,\n handleTouchStart,\n ]) as any,\n }\n\n // Compute all props synchronously to avoid hydration mismatches\n // Using Vue.computed ensures props are calculated at render time, not after\n const computedProps = Vue.computed<HTMLAttributes>(() => {\n const result: HTMLAttributes = {\n ...getPropsSafeToSpread(),\n href: href.value,\n ref,\n ...staticEventHandlers,\n disabled: !!options.disabled,\n target: options.target,\n }\n\n // Add style if present\n if (resolvedStyle.value) {\n result.style = resolvedStyle.value\n }\n\n // Add class if present\n if (resolvedClassName.value) {\n result.class = resolvedClassName.value\n }\n\n // Add disabled props\n if (options.disabled) {\n result.role = 'link'\n result['aria-disabled'] = true\n }\n\n // Add active status\n if (isActive.value) {\n result['data-status'] = 'active'\n result['aria-current'] = 'page'\n }\n\n // Add transitioning status\n if (isTransitioning.value) {\n result['data-transitioning'] = 'transitioning'\n }\n\n // Merge active/inactive props (excluding class and style which are handled above)\n const activeP = resolvedActiveProps.value\n const inactiveP = resolvedInactiveProps.value\n\n for (const key of Object.keys(activeP)) {\n if (key !== 'class' && key !== 'style') {\n result[key] = activeP[key]\n }\n }\n for (const key of Object.keys(inactiveP)) {\n if (key !== 'class' && key !== 'style') {\n result[key] = inactiveP[key]\n }\n }\n\n return result\n })\n\n // Return the computed ref itself - callers should access .value\n return computedProps as unknown as HTMLAttributes\n}\n\n// Type definitions\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 HTMLAttributes\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 HTMLAttributes & {\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, `class`'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, `class`'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 | Vue.VNode\n | ((state: { isActive: boolean; isTransitioning: boolean }) => Vue.VNode)\n}\n\ntype LinkComponentVueProps<TComp> = TComp extends keyof HTMLElementTagNameMap\n ? Omit<HTMLAttributes, keyof CreateLinkProps>\n : TComp extends Vue.Component\n ? Record<string, any>\n : Record<string, any>\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> = LinkComponentVueProps<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<TComp> = <\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 props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => Vue.VNode\n\nexport function createLink<const TComp>(\n Comp: Constrain<TComp, any, (props: CreateLinkProps) => Vue.VNode>,\n): LinkComponent<TComp> {\n return Vue.defineComponent({\n name: 'CreatedLink',\n inheritAttrs: false,\n setup(_, { attrs, slots }) {\n return () => Vue.h(Link, { ...attrs, _asChild: Comp }, slots)\n },\n }) as any\n}\n\nconst LinkImpl = Vue.defineComponent({\n name: 'Link',\n inheritAttrs: false,\n props: [\n '_asChild',\n 'to',\n 'preload',\n 'preloadDelay',\n 'activeProps',\n 'inactiveProps',\n 'activeOptions',\n 'from',\n 'search',\n 'params',\n 'hash',\n 'state',\n 'mask',\n 'reloadDocument',\n 'disabled',\n 'additionalProps',\n 'viewTransition',\n 'resetScroll',\n 'startTransition',\n 'hashScrollIntoView',\n 'replace',\n 'ignoreBlocker',\n 'target',\n ],\n setup(props, { attrs, slots }) {\n // Call useLinkProps ONCE during setup with combined props and attrs\n // The returned object is a computed ref that updates reactively\n const allProps = { ...props, ...attrs }\n const linkPropsComputed = useLinkProps(\n allProps as any,\n ) as unknown as Vue.ComputedRef<HTMLAttributes>\n\n return () => {\n const Component = props._asChild || 'a'\n\n // Access the computed value to get fresh props each render\n const linkProps = linkPropsComputed.value\n\n const isActive = linkProps['data-status'] === 'active'\n const isTransitioning =\n linkProps['data-transitioning'] === 'transitioning'\n\n // Create the slot content or empty array if no default slot\n const slotContent = slots.default\n ? slots.default({\n isActive,\n isTransitioning,\n })\n : []\n\n // Special handling for SVG links - wrap an <a> inside the SVG\n if (Component === 'svg') {\n // Create props without class for svg link\n const svgLinkProps = { ...linkProps }\n delete (svgLinkProps as any).class\n return Vue.h('svg', {}, [Vue.h('a', svgLinkProps, slotContent)])\n }\n\n // For custom functional components (non-string), pass children as a prop\n // since they may expect children as a prop like in Solid\n if (typeof Component !== 'string') {\n return Vue.h(\n Component,\n { ...linkProps, children: slotContent },\n slotContent,\n )\n }\n\n // Return the component with props and children\n return Vue.h(Component, linkProps, slotContent)\n }\n },\n})\n\n/**\n * Link component with proper TypeScript generics support\n */\nexport const Link = LinkImpl as unknown as {\n <\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 >(\n props: LinkComponentProps<'a', TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): Vue.VNode\n}\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":["useLinkProps","options","router","useRouter","isTransitioning","Vue","ref","hasRenderFetched","console","warn","type","computed","URL","to","currentSearch","useRouterState","select","s","location","searchStr","from","useMatches","matches","length","fullPath","_options","value","next","buildLocation","preload","reloadDocument","defaultPreload","preloadDelay","defaultPreloadDelay","isActive","activeOptions","exact","testExact","exactPathTest","pathname","basepath","currentPathSplit","removeTrailingSlash","split","nextPathSplit","pathIsFuzzyEqual","every","d","i","includeSearch","searchTest","deepEqual","search","partial","ignoreUndefined","explicitUndefined","includeHash","hash","doPreload","preloadRoute","catch","err","preloadWarning","preloadViewportIoCallback","entry","isIntersecting","useIntersectionObserver","rootMargin","disabled","effect","getPropsSafeToSpread","result","key","includes","externalProps","href","target","style","class","onClick","onFocus","onMouseEnter","onMouseLeave","onMouseOver","onMouseOut","onTouchStart","Object","keys","forEach","undefined","handleClick","e","elementTarget","currentTarget","getAttribute","effectiveTarget","isCtrlEvent","defaultPrevented","button","preventDefault","unsub","subscribe","navigate","replace","resetScroll","hashScrollIntoView","startTransition","viewTransition","ignoreBlocker","handleFocus","_","handleTouchStart","handleEnter","eventTarget","preloadTimeout","setTimeout","handleLeave","clearTimeout","composeEventHandlers","handlers","event","handler","resolvedActiveProps","activeProps","props","resolvedInactiveProps","inactiveProps","resolvedClassName","classes","filter","Boolean","join","resolvedStyle","assign","nextLocation","maskedLocation","hrefValue","url","origin","startsWith","history","createHref","staticEventHandlers","onMouseenter","onMouseover","onMouseleave","onMouseout","onTouchstart","computedProps","role","activeP","inactiveP","createLink","Comp","defineComponent","name","inheritAttrs","setup","attrs","slots","h","Link","_asChild","LinkImpl","allProps","linkPropsComputed","Component","linkProps","slotContent","default","svgLinkProps","children","metaKey","altKey","ctrlKey","shiftKey","linkOptions"],"mappings":"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"}
1
+ {"version":3,"file":"link.js","sources":["../../src/link.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport {\n deepEqual,\n exactPathTest,\n preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\n\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { useIntersectionObserver } from './utils'\nimport { useMatches } from './Matches'\n\nimport type {\n AnyRouter,\n Constrain,\n LinkCurrentTargetElement,\n LinkOptions,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\n\n// Type definitions to replace missing Vue JSX types\ntype EventHandler<TEvent = Event> = (e: TEvent) => void\ninterface HTMLAttributes {\n class?: string\n style?: Record<string, string | number>\n onClick?: EventHandler<MouseEvent>\n onFocus?: EventHandler<FocusEvent>\n // Vue 3's h() function expects lowercase event names after 'on' prefix\n onMouseenter?: EventHandler<MouseEvent>\n onMouseleave?: EventHandler<MouseEvent>\n onMouseover?: EventHandler<MouseEvent>\n onMouseout?: EventHandler<MouseEvent>\n onTouchstart?: EventHandler<TouchEvent>\n // Also accept the camelCase versions for external API compatibility\n onMouseEnter?: EventHandler<MouseEvent>\n onMouseLeave?: EventHandler<MouseEvent>\n onMouseOver?: EventHandler<MouseEvent>\n onMouseOut?: EventHandler<MouseEvent>\n onTouchStart?: EventHandler<TouchEvent>\n [key: string]: any\n}\n\ninterface StyledProps {\n class?: string\n style?: Record<string, string | number>\n [key: string]: any\n}\n\nexport function useLinkProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '',\n>(\n options: UseLinkPropsOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n): HTMLAttributes {\n const router = useRouter()\n const isTransitioning = Vue.ref(false)\n let hasRenderFetched = false\n\n // Ensure router is defined before proceeding\n if (!router) {\n console.warn('useRouter must be used inside a <RouterProvider> component!')\n return {}\n }\n\n // Determine if the link is external or internal\n const type = Vue.computed(() => {\n try {\n new URL(`${options.to}`)\n return 'external'\n } catch {\n return 'internal'\n }\n })\n\n const currentSearch = useRouterState({\n select: (s) => s.location.searchStr,\n })\n\n // when `from` is not supplied, use the leaf route of the current matches as the `from` location\n const from = useMatches({\n select: (matches) => options.from ?? matches[matches.length - 1]?.fullPath,\n })\n\n const _options = Vue.computed(() => ({\n ...options,\n from: from.value,\n }))\n\n const next = Vue.computed(() => {\n // Depend on search to rebuild when search changes\n currentSearch.value\n return router.buildLocation(_options.value as any)\n })\n\n const preload = Vue.computed(() => {\n if (_options.value.reloadDocument) {\n return false\n }\n return options.preload ?? router.options.defaultPreload\n })\n\n const preloadDelay = Vue.computed(\n () => options.preloadDelay ?? router.options.defaultPreloadDelay ?? 0,\n )\n\n const isActive = useRouterState({\n select: (s) => {\n const activeOptions = options.activeOptions\n if (activeOptions?.exact) {\n const testExact = exactPathTest(\n s.location.pathname,\n next.value.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.value?.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.value.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.value.hash\n }\n return true\n },\n })\n\n const doPreload = () =>\n router.preloadRoute(_options.value as any).catch((err: any) => {\n console.warn(err)\n console.warn(preloadWarning)\n })\n\n const preloadViewportIoCallback = (\n entry: IntersectionObserverEntry | undefined,\n ) => {\n if (entry?.isIntersecting) {\n doPreload()\n }\n }\n\n const ref = Vue.ref<Element | null>(null)\n\n useIntersectionObserver(\n ref,\n preloadViewportIoCallback,\n { rootMargin: '100px' },\n { disabled: () => !!options.disabled || !(preload.value === 'viewport') },\n )\n\n Vue.effect(() => {\n if (hasRenderFetched) {\n return\n }\n if (!options.disabled && preload.value === 'render') {\n doPreload()\n hasRenderFetched = true\n }\n })\n\n // Create safe props that can be spread\n const getPropsSafeToSpread = () => {\n const result: Record<string, any> = {}\n for (const key in options) {\n if (\n ![\n 'activeProps',\n 'inactiveProps',\n 'activeOptions',\n 'to',\n 'preload',\n 'preloadDelay',\n 'hashScrollIntoView',\n 'replace',\n 'startTransition',\n 'resetScroll',\n 'viewTransition',\n 'children',\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\n 'onFocus',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseOver',\n 'onMouseOut',\n 'onTouchStart',\n 'ignoreBlocker',\n 'params',\n 'search',\n 'hash',\n 'state',\n 'mask',\n 'reloadDocument',\n '_asChild',\n 'from',\n 'additionalProps',\n ].includes(key)\n ) {\n result[key] = options[key]\n }\n }\n return result\n }\n\n if (type.value === 'external') {\n // External links just have simple props\n const externalProps: HTMLAttributes = {\n ...getPropsSafeToSpread(),\n ref,\n href: options.to,\n target: options.target,\n disabled: options.disabled,\n style: options.style,\n class: options.class,\n onClick: options.onClick,\n onFocus: options.onFocus,\n onMouseEnter: options.onMouseEnter,\n onMouseLeave: options.onMouseLeave,\n onMouseOver: options.onMouseOver,\n onMouseOut: options.onMouseOut,\n onTouchStart: options.onTouchStart,\n }\n\n // Remove undefined values\n Object.keys(externalProps).forEach((key) => {\n if (externalProps[key] === undefined) {\n delete externalProps[key]\n }\n })\n\n return externalProps\n }\n\n // The click handler\n const handleClick = (e: MouseEvent): void => {\n // Check actual element's target attribute as fallback\n const elementTarget = (\n e.currentTarget as HTMLAnchorElement | SVGAElement\n )?.getAttribute('target')\n const effectiveTarget =\n options.target !== undefined ? options.target : elementTarget\n\n if (\n !options.disabled &&\n !isCtrlEvent(e) &&\n !e.defaultPrevented &&\n (!effectiveTarget || effectiveTarget === '_self') &&\n e.button === 0\n ) {\n // Don't prevent default or handle navigation if reloadDocument is true\n if (_options.value.reloadDocument) {\n return\n }\n\n e.preventDefault()\n\n isTransitioning.value = true\n\n const unsub = router.subscribe('onResolved', () => {\n unsub()\n isTransitioning.value = false\n })\n\n // All is well? Navigate!\n router.navigate({\n ..._options.value,\n replace: options.replace,\n resetScroll: options.resetScroll,\n hashScrollIntoView: options.hashScrollIntoView,\n startTransition: options.startTransition,\n viewTransition: options.viewTransition,\n ignoreBlocker: options.ignoreBlocker,\n } as any)\n }\n }\n\n // The focus handler\n const handleFocus = (_: FocusEvent) => {\n if (options.disabled) return\n if (preload.value) {\n doPreload()\n }\n }\n\n const handleTouchStart = (_: TouchEvent) => {\n if (options.disabled) return\n if (preload.value) {\n doPreload()\n }\n }\n\n const handleEnter = (e: MouseEvent) => {\n if (options.disabled) return\n // Use currentTarget (the element with the handler) instead of target (which may be a child)\n const eventTarget = (e.currentTarget ||\n e.target ||\n {}) as LinkCurrentTargetElement\n\n if (preload.value) {\n if (eventTarget.preloadTimeout) {\n return\n }\n\n eventTarget.preloadTimeout = setTimeout(() => {\n eventTarget.preloadTimeout = null\n doPreload()\n }, preloadDelay.value)\n }\n }\n\n const handleLeave = (e: MouseEvent) => {\n if (options.disabled) return\n // Use currentTarget (the element with the handler) instead of target (which may be a child)\n const eventTarget = (e.currentTarget ||\n e.target ||\n {}) as LinkCurrentTargetElement\n\n if (eventTarget.preloadTimeout) {\n clearTimeout(eventTarget.preloadTimeout)\n eventTarget.preloadTimeout = null\n }\n }\n\n // Helper to compose event handlers - with explicit return type and better type handling\n function composeEventHandlers<T extends Event>(\n handlers: Array<EventHandler<T> | undefined>,\n ): (e: T) => void {\n return (event: T) => {\n for (const handler of handlers) {\n if (handler) {\n handler(event)\n }\n }\n }\n }\n\n // Get the active and inactive props\n const resolvedActiveProps = Vue.computed<StyledProps>(() => {\n const activeProps = options.activeProps || (() => ({ class: 'active' }))\n const props = isActive.value\n ? typeof activeProps === 'function'\n ? activeProps()\n : activeProps\n : {}\n\n return props || { class: undefined, style: undefined }\n })\n\n const resolvedInactiveProps = Vue.computed<StyledProps>(() => {\n const inactiveProps = options.inactiveProps || (() => ({}))\n const props = isActive.value\n ? {}\n : typeof inactiveProps === 'function'\n ? inactiveProps()\n : inactiveProps\n\n return props || { class: undefined, style: undefined }\n })\n\n const resolvedClassName = Vue.computed(() => {\n const classes = [\n options.class,\n resolvedActiveProps.value?.class,\n resolvedInactiveProps.value?.class,\n ].filter(Boolean)\n return classes.length ? classes.join(' ') : undefined\n })\n\n const resolvedStyle = Vue.computed(() => {\n const result: Record<string, string | number> = {}\n\n // Merge styles from all sources\n if (options.style) {\n Object.assign(result, options.style)\n }\n\n if (resolvedActiveProps.value?.style) {\n Object.assign(result, resolvedActiveProps.value.style)\n }\n\n if (resolvedInactiveProps.value?.style) {\n Object.assign(result, resolvedInactiveProps.value.style)\n }\n\n return Object.keys(result).length > 0 ? result : undefined\n })\n\n const href = Vue.computed(() => {\n if (options.disabled) {\n return undefined\n }\n const nextLocation = next.value\n const maskedLocation = nextLocation?.maskedLocation\n\n let hrefValue: string\n if (maskedLocation) {\n hrefValue = maskedLocation.url.href\n } else {\n hrefValue = nextLocation?.url.href\n }\n\n // Handle origin stripping like Solid does\n if (router.origin && hrefValue?.startsWith(router.origin)) {\n hrefValue = router.history.createHref(\n hrefValue.replace(router.origin, ''),\n )\n }\n\n return hrefValue\n })\n\n // Create static event handlers that don't change between renders\n const staticEventHandlers = {\n onClick: composeEventHandlers<MouseEvent>([\n options.onClick,\n handleClick,\n ]) as any,\n onFocus: composeEventHandlers<FocusEvent>([\n options.onFocus,\n handleFocus,\n ]) as any,\n onMouseenter: composeEventHandlers<MouseEvent>([\n options.onMouseEnter,\n handleEnter,\n ]) as any,\n onMouseover: composeEventHandlers<MouseEvent>([\n options.onMouseOver,\n handleEnter,\n ]) as any,\n onMouseleave: composeEventHandlers<MouseEvent>([\n options.onMouseLeave,\n handleLeave,\n ]) as any,\n onMouseout: composeEventHandlers<MouseEvent>([\n options.onMouseOut,\n handleLeave,\n ]) as any,\n onTouchstart: composeEventHandlers<TouchEvent>([\n options.onTouchStart,\n handleTouchStart,\n ]) as any,\n }\n\n // Compute all props synchronously to avoid hydration mismatches\n // Using Vue.computed ensures props are calculated at render time, not after\n const computedProps = Vue.computed<HTMLAttributes>(() => {\n const result: HTMLAttributes = {\n ...getPropsSafeToSpread(),\n href: href.value,\n ref,\n ...staticEventHandlers,\n disabled: !!options.disabled,\n target: options.target,\n }\n\n // Add style if present\n if (resolvedStyle.value) {\n result.style = resolvedStyle.value\n }\n\n // Add class if present\n if (resolvedClassName.value) {\n result.class = resolvedClassName.value\n }\n\n // Add disabled props\n if (options.disabled) {\n result.role = 'link'\n result['aria-disabled'] = true\n }\n\n // Add active status\n if (isActive.value) {\n result['data-status'] = 'active'\n result['aria-current'] = 'page'\n }\n\n // Add transitioning status\n if (isTransitioning.value) {\n result['data-transitioning'] = 'transitioning'\n }\n\n // Merge active/inactive props (excluding class and style which are handled above)\n const activeP = resolvedActiveProps.value\n const inactiveP = resolvedInactiveProps.value\n\n for (const key of Object.keys(activeP)) {\n if (key !== 'class' && key !== 'style') {\n result[key] = activeP[key]\n }\n }\n for (const key of Object.keys(inactiveP)) {\n if (key !== 'class' && key !== 'style') {\n result[key] = inactiveP[key]\n }\n }\n\n return result\n })\n\n // Return the computed ref itself - callers should access .value\n return computedProps as unknown as HTMLAttributes\n}\n\n// Type definitions\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 HTMLAttributes\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 HTMLAttributes & {\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, `class`'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, `class`'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 | Vue.VNode\n | ((state: { isActive: boolean; isTransitioning: boolean }) => Vue.VNode)\n}\n\ntype LinkComponentVueProps<TComp> = TComp extends keyof HTMLElementTagNameMap\n ? Omit<HTMLAttributes, keyof CreateLinkProps>\n : TComp extends Vue.Component\n ? Record<string, any>\n : Record<string, any>\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> = LinkComponentVueProps<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<TComp> = <\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 props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => Vue.VNode\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 ): Vue.VNode\n}\n\nexport function createLink<const TComp>(\n Comp: Constrain<TComp, any, (props: CreateLinkProps) => Vue.VNode>,\n): LinkComponent<TComp> {\n return Vue.defineComponent({\n name: 'CreatedLink',\n inheritAttrs: false,\n setup(_, { attrs, slots }) {\n return () => Vue.h(Link, { ...attrs, _asChild: Comp }, slots)\n },\n }) as any\n}\n\nconst LinkImpl = Vue.defineComponent({\n name: 'Link',\n inheritAttrs: false,\n props: [\n '_asChild',\n 'to',\n 'preload',\n 'preloadDelay',\n 'activeProps',\n 'inactiveProps',\n 'activeOptions',\n 'from',\n 'search',\n 'params',\n 'hash',\n 'state',\n 'mask',\n 'reloadDocument',\n 'disabled',\n 'additionalProps',\n 'viewTransition',\n 'resetScroll',\n 'startTransition',\n 'hashScrollIntoView',\n 'replace',\n 'ignoreBlocker',\n 'target',\n ],\n setup(props, { attrs, slots }) {\n // Call useLinkProps ONCE during setup with combined props and attrs\n // The returned object is a computed ref that updates reactively\n const allProps = { ...props, ...attrs }\n const linkPropsComputed = useLinkProps(\n allProps as any,\n ) as unknown as Vue.ComputedRef<HTMLAttributes>\n\n return () => {\n const Component = props._asChild || 'a'\n\n // Access the computed value to get fresh props each render\n const linkProps = linkPropsComputed.value\n\n const isActive = linkProps['data-status'] === 'active'\n const isTransitioning =\n linkProps['data-transitioning'] === 'transitioning'\n\n // Create the slot content or empty array if no default slot\n const slotContent = slots.default\n ? slots.default({\n isActive,\n isTransitioning,\n })\n : []\n\n // Special handling for SVG links - wrap an <a> inside the SVG\n if (Component === 'svg') {\n // Create props without class for svg link\n const svgLinkProps = { ...linkProps }\n delete (svgLinkProps as any).class\n return Vue.h('svg', {}, [Vue.h('a', svgLinkProps, slotContent)])\n }\n\n // For custom functional components (non-string), pass children as a prop\n // since they may expect children as a prop like in Solid\n if (typeof Component !== 'string') {\n return Vue.h(\n Component,\n { ...linkProps, children: slotContent },\n slotContent,\n )\n }\n\n // Return the component with props and children\n return Vue.h(Component, linkProps, slotContent)\n }\n },\n})\n\n/**\n * Link component with proper TypeScript generics support\n */\nexport const Link = LinkImpl as unknown as {\n <\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 >(\n props: LinkComponentProps<'a', TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): Vue.VNode\n}\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":["useLinkProps","options","router","useRouter","isTransitioning","Vue","ref","hasRenderFetched","console","warn","type","computed","URL","to","currentSearch","useRouterState","select","s","location","searchStr","from","useMatches","matches","length","fullPath","_options","value","next","buildLocation","preload","reloadDocument","defaultPreload","preloadDelay","defaultPreloadDelay","isActive","activeOptions","exact","testExact","exactPathTest","pathname","basepath","currentPathSplit","removeTrailingSlash","split","nextPathSplit","pathIsFuzzyEqual","every","d","i","includeSearch","searchTest","deepEqual","search","partial","ignoreUndefined","explicitUndefined","includeHash","hash","doPreload","preloadRoute","catch","err","preloadWarning","preloadViewportIoCallback","entry","isIntersecting","useIntersectionObserver","rootMargin","disabled","effect","getPropsSafeToSpread","result","key","includes","externalProps","href","target","style","class","onClick","onFocus","onMouseEnter","onMouseLeave","onMouseOver","onMouseOut","onTouchStart","Object","keys","forEach","undefined","handleClick","e","elementTarget","currentTarget","getAttribute","effectiveTarget","isCtrlEvent","defaultPrevented","button","preventDefault","unsub","subscribe","navigate","replace","resetScroll","hashScrollIntoView","startTransition","viewTransition","ignoreBlocker","handleFocus","_","handleTouchStart","handleEnter","eventTarget","preloadTimeout","setTimeout","handleLeave","clearTimeout","composeEventHandlers","handlers","event","handler","resolvedActiveProps","activeProps","props","resolvedInactiveProps","inactiveProps","resolvedClassName","classes","filter","Boolean","join","resolvedStyle","assign","nextLocation","maskedLocation","hrefValue","url","origin","startsWith","history","createHref","staticEventHandlers","onMouseenter","onMouseover","onMouseleave","onMouseout","onTouchstart","computedProps","role","activeP","inactiveP","createLink","Comp","defineComponent","name","inheritAttrs","setup","attrs","slots","h","Link","_asChild","LinkImpl","allProps","linkPropsComputed","Component","linkProps","slotContent","default","svgLinkProps","children","metaKey","altKey","ctrlKey","shiftKey","linkOptions"],"mappings":"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"}
@@ -5,7 +5,8 @@ import { UseLoaderDepsRoute } from './useLoaderDeps.js';
5
5
  import { UseParamsRoute } from './useParams.js';
6
6
  import { UseSearchRoute } from './useSearch.js';
7
7
  import { UseRouteContextRoute } from './useRouteContext.js';
8
- import type * as Vue from 'vue';
8
+ import { LinkComponentRoute } from './link.js';
9
+ import * as Vue from 'vue';
9
10
  type VueSFC = {
10
11
  readonly __name?: string;
11
12
  setup?: (...args: Array<any>) => any;
@@ -26,6 +27,7 @@ declare module '@tanstack/router-core' {
26
27
  useLoaderDeps: UseLoaderDepsRoute<TId>;
27
28
  useLoaderData: UseLoaderDataRoute<TId>;
28
29
  useNavigate: () => UseNavigateResult<TFullPath>;
30
+ Link: LinkComponentRoute<TFullPath>;
29
31
  }
30
32
  }
31
33
  export declare function getRouteApi<const TId, TRouter extends AnyRouter = RegisteredRouter>(id: ConstrainLiteral<TId, RouteIds<TRouter['routeTree']>>): RouteApi<TId, TRouter>;
@@ -44,6 +46,7 @@ export declare class RouteApi<TId, TRouter extends AnyRouter = RegisteredRouter>
44
46
  useLoaderData: UseLoaderDataRoute<TId>;
45
47
  useNavigate: () => UseNavigateResult<RouteTypesById<TRouter, TId>["fullPath"]>;
46
48
  notFound: (opts?: NotFoundError) => NotFoundError;
49
+ Link: LinkComponentRoute<RouteTypesById<TRouter, TId>['fullPath']>;
47
50
  }
48
51
  export declare class Route<in out TRegister = unknown, in out TParentRoute extends RouteConstraints['TParentRoute'] = AnyRoute, in out TPath extends RouteConstraints['TPath'] = '/', in out TFullPath extends RouteConstraints['TFullPath'] = ResolveFullPath<TParentRoute, TPath>, in out TCustomId extends RouteConstraints['TCustomId'] = string, in out TId extends RouteConstraints['TId'] = ResolveId<TParentRoute, TCustomId, TPath>, in out TSearchValidator = undefined, in out TParams = ResolveParams<TPath>, in out TRouterContext = AnyContext, in out TRouteContextFn = AnyContext, in out TBeforeLoadFn = AnyContext, in out TLoaderDeps extends Record<string, any> = {}, in out TLoaderFn = undefined, in out TChildren = unknown, in out TFileRouteTypes = unknown, in out TSSR = unknown, in out TMiddlewares = unknown, in out THandlers = undefined> extends BaseRoute<TRegister, TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, TFileRouteTypes, TSSR, TMiddlewares, THandlers> implements RouteCore<TRegister, TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, TFileRouteTypes, TSSR, TMiddlewares, THandlers> {
49
52
  /**
@@ -57,6 +60,7 @@ export declare class Route<in out TRegister = unknown, in out TParentRoute exten
57
60
  useLoaderDeps: UseLoaderDepsRoute<TId>;
58
61
  useLoaderData: UseLoaderDataRoute<TId>;
59
62
  useNavigate: () => UseNavigateResult<TFullPath>;
63
+ Link: LinkComponentRoute<TFullPath>;
60
64
  }
61
65
  export declare function createRoute<TRegister = unknown, TParentRoute extends RouteConstraints['TParentRoute'] = AnyRoute, TPath extends RouteConstraints['TPath'] = '/', TFullPath extends RouteConstraints['TFullPath'] = ResolveFullPath<TParentRoute, TPath>, TCustomId extends RouteConstraints['TCustomId'] = string, TId extends RouteConstraints['TId'] = ResolveId<TParentRoute, TCustomId, TPath>, TSearchValidator = undefined, TParams = ResolveParams<TPath>, TRouteContextFn = AnyContext, TBeforeLoadFn = AnyContext, TLoaderDeps extends Record<string, any> = {}, TLoaderFn = undefined, TChildren = unknown, TSSR = unknown, THandlers = undefined>(options: RouteOptions<TRegister, TParentRoute, TId, TCustomId, TFullPath, TPath, TSearchValidator, TParams, TLoaderDeps, TLoaderFn, AnyContext, TRouteContextFn, TBeforeLoadFn, TSSR, THandlers>): Route<TRegister, TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, AnyContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, unknown, TSSR, THandlers>;
62
66
  export type AnyRootRoute = RootRoute<any, any, any, any, any, any, any, any, any, any>;
@@ -77,6 +81,7 @@ export declare class RootRoute<in out TRegister = Register, in out TSearchValida
77
81
  useLoaderDeps: UseLoaderDepsRoute<RootRouteId>;
78
82
  useLoaderData: UseLoaderDataRoute<RootRouteId>;
79
83
  useNavigate: () => UseNavigateResult<"/">;
84
+ Link: LinkComponentRoute<'/'>;
80
85
  }
81
86
  export declare function createRouteMask<TRouteTree extends AnyRoute, TFrom extends string, TTo extends string>(opts: {
82
87
  routeTree: TRouteTree;
package/dist/esm/route.js CHANGED
@@ -1,4 +1,6 @@
1
1
  import { BaseRouteApi, notFound, BaseRoute, BaseRootRoute } from "@tanstack/router-core";
2
+ import * as Vue from "vue";
3
+ import { Link } from "./link.js";
2
4
  import { useLoaderData } from "./useLoaderData.js";
3
5
  import { useLoaderDeps } from "./useLoaderDeps.js";
4
6
  import { useParams } from "./useParams.js";
@@ -52,6 +54,15 @@ class RouteApi extends BaseRouteApi {
52
54
  this.notFound = (opts) => {
53
55
  return notFound({ routeId: this.id, ...opts });
54
56
  };
57
+ this.Link = ((props, ctx) => {
58
+ const router = useRouter();
59
+ const fullPath = router.routesById[this.id].fullPath;
60
+ return Vue.h(
61
+ Link,
62
+ { from: fullPath, ...props },
63
+ ctx?.slots
64
+ );
65
+ });
55
66
  }
56
67
  }
57
68
  class Route extends BaseRoute {
@@ -94,6 +105,13 @@ class Route extends BaseRoute {
94
105
  this.useNavigate = () => {
95
106
  return useNavigate({ from: this.fullPath });
96
107
  };
108
+ this.Link = ((props, ctx) => {
109
+ return Vue.h(
110
+ Link,
111
+ { from: this.fullPath, ...props },
112
+ ctx?.slots
113
+ );
114
+ });
97
115
  }
98
116
  }
99
117
  function createRoute(options) {
@@ -145,6 +163,13 @@ class RootRoute extends BaseRootRoute {
145
163
  this.useNavigate = () => {
146
164
  return useNavigate({ from: this.fullPath });
147
165
  };
166
+ this.Link = ((props, ctx) => {
167
+ return Vue.h(
168
+ Link,
169
+ { from: this.fullPath, ...props },
170
+ ctx?.slots
171
+ );
172
+ });
148
173
  }
149
174
  }
150
175
  function createRouteMask(opts) {
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sources":["../../src/route.ts"],"sourcesContent":["import {\n BaseRootRoute,\n BaseRoute,\n BaseRouteApi,\n notFound,\n} from '@tanstack/router-core'\nimport { useLoaderData } from './useLoaderData'\nimport { useLoaderDeps } from './useLoaderDeps'\nimport { useParams } from './useParams'\nimport { useSearch } from './useSearch'\nimport { useNavigate } from './useNavigate'\nimport { useMatch } from './useMatch'\nimport { useRouter } from './useRouter'\nimport type {\n AnyContext,\n AnyRoute,\n AnyRouter,\n ConstrainLiteral,\n ErrorComponentProps,\n NotFoundError,\n NotFoundRouteProps,\n Register,\n RegisteredRouter,\n ResolveFullPath,\n ResolveId,\n ResolveParams,\n RootRoute as RootRouteCore,\n RootRouteId,\n RootRouteOptions,\n RouteConstraints,\n Route as RouteCore,\n RouteIds,\n RouteMask,\n RouteOptions,\n RouteTypesById,\n RouterCore,\n ToMaskOptions,\n UseNavigateResult,\n} from '@tanstack/router-core'\nimport type { UseLoaderDataRoute } from './useLoaderData'\nimport type { UseMatchRoute } from './useMatch'\nimport type { UseLoaderDepsRoute } from './useLoaderDeps'\nimport type { UseParamsRoute } from './useParams'\nimport type { UseSearchRoute } from './useSearch'\nimport type * as Vue from 'vue'\nimport type { UseRouteContextRoute } from './useRouteContext'\n\n// Structural type for Vue SFC components (.vue files)\n// Uses structural matching to accept Vue components without breaking\n// TypeScript inference for inline function components\ntype VueSFC = {\n readonly __name?: string\n setup?: (...args: Array<any>) => any\n render?: Function\n}\n\ndeclare module '@tanstack/router-core' {\n export interface UpdatableRouteOptionsExtensions {\n component?: RouteComponent | VueSFC\n errorComponent?: false | null | undefined | ErrorRouteComponent | VueSFC\n notFoundComponent?: NotFoundRouteComponent | VueSFC\n pendingComponent?: RouteComponent | VueSFC\n }\n\n export interface RouteExtensions<\n in out TId extends string,\n in out TFullPath extends string,\n > {\n useMatch: UseMatchRoute<TId>\n useRouteContext: UseRouteContextRoute<TId>\n useSearch: UseSearchRoute<TId>\n useParams: UseParamsRoute<TId>\n useLoaderDeps: UseLoaderDepsRoute<TId>\n useLoaderData: UseLoaderDataRoute<TId>\n useNavigate: () => UseNavigateResult<TFullPath>\n }\n}\n\nexport function getRouteApi<\n const TId,\n TRouter extends AnyRouter = RegisteredRouter,\n>(id: ConstrainLiteral<TId, RouteIds<TRouter['routeTree']>>) {\n return new RouteApi<TId, TRouter>({ id })\n}\n\nexport class RouteApi<\n TId,\n TRouter extends AnyRouter = RegisteredRouter,\n> extends BaseRouteApi<TId, TRouter> {\n /**\n * @deprecated Use the `getRouteApi` function instead.\n */\n constructor({ id }: { id: TId }) {\n super({ id })\n }\n\n useMatch: UseMatchRoute<TId> = (opts) => {\n return useMatch({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useRouteContext: UseRouteContextRoute<TId> = (opts) => {\n return useMatch({\n from: this.id as any,\n select: (d) => (opts?.select ? opts.select(d.context) : d.context),\n }) as any\n }\n\n useSearch: UseSearchRoute<TId> = (opts) => {\n return useSearch({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useParams: UseParamsRoute<TId> = (opts) => {\n return useParams({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useLoaderDeps: UseLoaderDepsRoute<TId> = (opts) => {\n return useLoaderDeps({ ...opts, from: this.id, strict: false } as any)\n }\n\n useLoaderData: UseLoaderDataRoute<TId> = (opts) => {\n return useLoaderData({ ...opts, from: this.id, strict: false } as any)\n }\n\n useNavigate = (): UseNavigateResult<\n RouteTypesById<TRouter, TId>['fullPath']\n > => {\n const router = useRouter()\n return useNavigate({ from: router.routesById[this.id as string].fullPath })\n }\n\n notFound = (opts?: NotFoundError) => {\n return notFound({ routeId: this.id as string, ...opts })\n }\n}\n\nexport class Route<\n in out TRegister = unknown,\n in out TParentRoute extends RouteConstraints['TParentRoute'] = AnyRoute,\n in out TPath extends RouteConstraints['TPath'] = '/',\n in out TFullPath extends RouteConstraints['TFullPath'] = ResolveFullPath<\n TParentRoute,\n TPath\n >,\n in out TCustomId extends RouteConstraints['TCustomId'] = string,\n in out TId extends RouteConstraints['TId'] = ResolveId<\n TParentRoute,\n TCustomId,\n TPath\n >,\n in out TSearchValidator = undefined,\n in out TParams = ResolveParams<TPath>,\n in out TRouterContext = AnyContext,\n in out TRouteContextFn = AnyContext,\n in out TBeforeLoadFn = AnyContext,\n in out TLoaderDeps extends Record<string, any> = {},\n in out TLoaderFn = undefined,\n in out TChildren = unknown,\n in out TFileRouteTypes = unknown,\n in out TSSR = unknown,\n in out TMiddlewares = unknown,\n in out THandlers = undefined,\n >\n extends BaseRoute<\n TRegister,\n TParentRoute,\n TPath,\n TFullPath,\n TCustomId,\n TId,\n TSearchValidator,\n TParams,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n TFileRouteTypes,\n TSSR,\n TMiddlewares,\n THandlers\n >\n implements\n RouteCore<\n TRegister,\n TParentRoute,\n TPath,\n TFullPath,\n TCustomId,\n TId,\n TSearchValidator,\n TParams,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n TFileRouteTypes,\n TSSR,\n TMiddlewares,\n THandlers\n >\n{\n /**\n * @deprecated Use the `createRoute` function instead.\n */\n constructor(\n options?: RouteOptions<\n TRegister,\n TParentRoute,\n TId,\n TCustomId,\n TFullPath,\n TPath,\n TSearchValidator,\n TParams,\n TLoaderDeps,\n TLoaderFn,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TSSR,\n TMiddlewares,\n THandlers\n >,\n ) {\n super(options)\n }\n\n useMatch: UseMatchRoute<TId> = (opts) => {\n return useMatch({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useRouteContext: UseRouteContextRoute<TId> = (opts?) => {\n return useMatch({\n ...opts,\n from: this.id,\n select: (d) => (opts?.select ? opts.select(d.context) : d.context),\n }) as any\n }\n\n useSearch: UseSearchRoute<TId> = (opts) => {\n return useSearch({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useParams: UseParamsRoute<TId> = (opts) => {\n return useParams({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useLoaderDeps: UseLoaderDepsRoute<TId> = (opts) => {\n return useLoaderDeps({ ...opts, from: this.id } as any)\n }\n\n useLoaderData: UseLoaderDataRoute<TId> = (opts) => {\n return useLoaderData({ ...opts, from: this.id } as any)\n }\n\n useNavigate = (): UseNavigateResult<TFullPath> => {\n return useNavigate({ from: this.fullPath })\n }\n}\n\nexport function createRoute<\n TRegister = unknown,\n TParentRoute extends RouteConstraints['TParentRoute'] = AnyRoute,\n TPath extends RouteConstraints['TPath'] = '/',\n TFullPath extends RouteConstraints['TFullPath'] = ResolveFullPath<\n TParentRoute,\n TPath\n >,\n TCustomId extends RouteConstraints['TCustomId'] = string,\n TId extends RouteConstraints['TId'] = ResolveId<\n TParentRoute,\n TCustomId,\n TPath\n >,\n TSearchValidator = undefined,\n TParams = ResolveParams<TPath>,\n TRouteContextFn = AnyContext,\n TBeforeLoadFn = AnyContext,\n TLoaderDeps extends Record<string, any> = {},\n TLoaderFn = undefined,\n TChildren = unknown,\n TSSR = unknown,\n THandlers = undefined,\n>(\n options: RouteOptions<\n TRegister,\n TParentRoute,\n TId,\n TCustomId,\n TFullPath,\n TPath,\n TSearchValidator,\n TParams,\n TLoaderDeps,\n TLoaderFn,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TSSR,\n THandlers\n >,\n): Route<\n TRegister,\n TParentRoute,\n TPath,\n TFullPath,\n TCustomId,\n TId,\n TSearchValidator,\n TParams,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n unknown,\n TSSR,\n THandlers\n> {\n return new Route<\n TRegister,\n TParentRoute,\n TPath,\n TFullPath,\n TCustomId,\n TId,\n TSearchValidator,\n TParams,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n unknown,\n TSSR,\n THandlers\n >(options)\n}\n\nexport type AnyRootRoute = RootRoute<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\nexport function createRootRouteWithContext<TRouterContext extends {}>() {\n return <\n TRegister = Register,\n TRouteContextFn = AnyContext,\n TBeforeLoadFn = AnyContext,\n TSearchValidator = undefined,\n TLoaderDeps extends Record<string, any> = {},\n TLoaderFn = undefined,\n TSSR = unknown,\n THandlers = undefined,\n >(\n options?: RootRouteOptions<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TSSR,\n THandlers\n >,\n ) => {\n return createRootRoute<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TSSR,\n THandlers\n >(options as any)\n }\n}\n\n/**\n * @deprecated Use the `createRootRouteWithContext` function instead.\n */\nexport const rootRouteWithContext = createRootRouteWithContext\n\nexport class RootRoute<\n in out TRegister = Register,\n in out TSearchValidator = undefined,\n in out TRouterContext = {},\n in out TRouteContextFn = AnyContext,\n in out TBeforeLoadFn = AnyContext,\n in out TLoaderDeps extends Record<string, any> = {},\n in out TLoaderFn = undefined,\n in out TChildren = unknown,\n in out TFileRouteTypes = unknown,\n in out TSSR = unknown,\n in out THandlers = undefined,\n >\n extends BaseRootRoute<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n TFileRouteTypes,\n TSSR,\n THandlers\n >\n implements\n RootRouteCore<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n TFileRouteTypes,\n TSSR,\n THandlers\n >\n{\n /**\n * @deprecated `RootRoute` is now an internal implementation detail. Use `createRootRoute()` instead.\n */\n constructor(\n options?: RootRouteOptions<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TSSR,\n THandlers\n >,\n ) {\n super(options)\n }\n\n useMatch: UseMatchRoute<RootRouteId> = (opts) => {\n return useMatch({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useRouteContext: UseRouteContextRoute<RootRouteId> = (opts) => {\n return useMatch({\n ...opts,\n from: this.id,\n select: (d) => (opts?.select ? opts.select(d.context) : d.context),\n }) as any\n }\n\n useSearch: UseSearchRoute<RootRouteId> = (opts) => {\n return useSearch({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useParams: UseParamsRoute<RootRouteId> = (opts) => {\n return useParams({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useLoaderDeps: UseLoaderDepsRoute<RootRouteId> = (opts) => {\n return useLoaderDeps({ ...opts, from: this.id } as any)\n }\n\n useLoaderData: UseLoaderDataRoute<RootRouteId> = (opts) => {\n return useLoaderData({ ...opts, from: this.id } as any)\n }\n\n useNavigate = (): UseNavigateResult<'/'> => {\n return useNavigate({ from: this.fullPath })\n }\n}\n\nexport function createRouteMask<\n TRouteTree extends AnyRoute,\n TFrom extends string,\n TTo extends string,\n>(\n opts: {\n routeTree: TRouteTree\n } & ToMaskOptions<RouterCore<TRouteTree, 'never', false>, TFrom, TTo>,\n): RouteMask<TRouteTree> {\n return opts as any\n}\n\nexport type VueNode = Vue.VNode\n\nexport type SyncRouteComponent<TProps> = (props: TProps) => Vue.VNode\n\nexport type AsyncRouteComponent<TProps> = SyncRouteComponent<TProps> & {\n preload?: () => Promise<void>\n}\n\nexport type RouteComponent<TProps = any> = AsyncRouteComponent<TProps>\n\nexport type ErrorRouteComponent = RouteComponent<ErrorComponentProps>\n\nexport type NotFoundRouteComponent = SyncRouteComponent<NotFoundRouteProps>\n\nexport class NotFoundRoute<\n TRegister,\n TParentRoute extends AnyRootRoute,\n TRouterContext = AnyContext,\n TRouteContextFn = AnyContext,\n TBeforeLoadFn = AnyContext,\n TSearchValidator = undefined,\n TLoaderDeps extends Record<string, any> = {},\n TLoaderFn = undefined,\n TChildren = unknown,\n TSSR = unknown,\n THandlers = undefined,\n> extends Route<\n TRegister,\n TParentRoute,\n '/404',\n '/404',\n '404',\n '404',\n TSearchValidator,\n {},\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n TSSR,\n THandlers\n> {\n constructor(\n options: Omit<\n RouteOptions<\n TRegister,\n TParentRoute,\n string,\n string,\n string,\n string,\n TSearchValidator,\n {},\n TLoaderDeps,\n TLoaderFn,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TSSR,\n THandlers\n >,\n | 'caseSensitive'\n | 'parseParams'\n | 'stringifyParams'\n | 'path'\n | 'id'\n | 'params'\n >,\n ) {\n super({\n ...(options as any),\n id: '404',\n })\n }\n}\n\nexport function createRootRoute<\n TRegister = Register,\n TSearchValidator = undefined,\n TRouterContext = {},\n TRouteContextFn = AnyContext,\n TBeforeLoadFn = AnyContext,\n TLoaderDeps extends Record<string, any> = {},\n TLoaderFn = undefined,\n TSSR = unknown,\n THandlers = undefined,\n>(\n options?: RootRouteOptions<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TSSR,\n THandlers\n >,\n): RootRoute<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n unknown,\n unknown,\n TSSR,\n THandlers\n> {\n return new RootRoute<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n unknown,\n unknown,\n TSSR,\n THandlers\n >(options)\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sources":["../../src/route.ts"],"sourcesContent":["import {\n BaseRootRoute,\n BaseRoute,\n BaseRouteApi,\n notFound,\n} from '@tanstack/router-core'\nimport * as Vue from 'vue'\nimport { Link } from './link'\nimport { useLoaderData } from './useLoaderData'\nimport { useLoaderDeps } from './useLoaderDeps'\nimport { useParams } from './useParams'\nimport { useSearch } from './useSearch'\nimport { useNavigate } from './useNavigate'\nimport { useMatch } from './useMatch'\nimport { useRouter } from './useRouter'\nimport type {\n AnyContext,\n AnyRoute,\n AnyRouter,\n ConstrainLiteral,\n ErrorComponentProps,\n NotFoundError,\n NotFoundRouteProps,\n Register,\n RegisteredRouter,\n ResolveFullPath,\n ResolveId,\n ResolveParams,\n RootRoute as RootRouteCore,\n RootRouteId,\n RootRouteOptions,\n RouteConstraints,\n Route as RouteCore,\n RouteIds,\n RouteMask,\n RouteOptions,\n RouteTypesById,\n RouterCore,\n ToMaskOptions,\n UseNavigateResult,\n} from '@tanstack/router-core'\nimport type { UseLoaderDataRoute } from './useLoaderData'\nimport type { UseMatchRoute } from './useMatch'\nimport type { UseLoaderDepsRoute } from './useLoaderDeps'\nimport type { UseParamsRoute } from './useParams'\nimport type { UseSearchRoute } from './useSearch'\nimport type { UseRouteContextRoute } from './useRouteContext'\nimport type { LinkComponentRoute } from './link'\n\n// Structural type for Vue SFC components (.vue files)\n// Uses structural matching to accept Vue components without breaking\n// TypeScript inference for inline function components\ntype VueSFC = {\n readonly __name?: string\n setup?: (...args: Array<any>) => any\n render?: Function\n}\n\ndeclare module '@tanstack/router-core' {\n export interface UpdatableRouteOptionsExtensions {\n component?: RouteComponent | VueSFC\n errorComponent?: false | null | undefined | ErrorRouteComponent | VueSFC\n notFoundComponent?: NotFoundRouteComponent | VueSFC\n pendingComponent?: RouteComponent | VueSFC\n }\n\n export interface RouteExtensions<\n in out TId extends string,\n in out TFullPath extends string,\n > {\n useMatch: UseMatchRoute<TId>\n useRouteContext: UseRouteContextRoute<TId>\n useSearch: UseSearchRoute<TId>\n useParams: UseParamsRoute<TId>\n useLoaderDeps: UseLoaderDepsRoute<TId>\n useLoaderData: UseLoaderDataRoute<TId>\n useNavigate: () => UseNavigateResult<TFullPath>\n Link: LinkComponentRoute<TFullPath>\n }\n}\n\nexport function getRouteApi<\n const TId,\n TRouter extends AnyRouter = RegisteredRouter,\n>(id: ConstrainLiteral<TId, RouteIds<TRouter['routeTree']>>) {\n return new RouteApi<TId, TRouter>({ id })\n}\n\nexport class RouteApi<\n TId,\n TRouter extends AnyRouter = RegisteredRouter,\n> extends BaseRouteApi<TId, TRouter> {\n /**\n * @deprecated Use the `getRouteApi` function instead.\n */\n constructor({ id }: { id: TId }) {\n super({ id })\n }\n\n useMatch: UseMatchRoute<TId> = (opts) => {\n return useMatch({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useRouteContext: UseRouteContextRoute<TId> = (opts) => {\n return useMatch({\n from: this.id as any,\n select: (d) => (opts?.select ? opts.select(d.context) : d.context),\n }) as any\n }\n\n useSearch: UseSearchRoute<TId> = (opts) => {\n return useSearch({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useParams: UseParamsRoute<TId> = (opts) => {\n return useParams({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useLoaderDeps: UseLoaderDepsRoute<TId> = (opts) => {\n return useLoaderDeps({ ...opts, from: this.id, strict: false } as any)\n }\n\n useLoaderData: UseLoaderDataRoute<TId> = (opts) => {\n return useLoaderData({ ...opts, from: this.id, strict: false } as any)\n }\n\n useNavigate = (): UseNavigateResult<\n RouteTypesById<TRouter, TId>['fullPath']\n > => {\n const router = useRouter()\n return useNavigate({ from: router.routesById[this.id as string].fullPath })\n }\n\n notFound = (opts?: NotFoundError) => {\n return notFound({ routeId: this.id as string, ...opts })\n }\n\n Link: LinkComponentRoute<RouteTypesById<TRouter, TId>['fullPath']> = ((\n props,\n ctx?: Vue.SetupContext,\n ) => {\n const router = useRouter()\n const fullPath = router.routesById[this.id as string].fullPath\n return Vue.h(\n Link as any,\n { from: fullPath as never, ...(props as any) },\n ctx?.slots,\n )\n }) as LinkComponentRoute<RouteTypesById<TRouter, TId>['fullPath']>\n}\n\nexport class Route<\n in out TRegister = unknown,\n in out TParentRoute extends RouteConstraints['TParentRoute'] = AnyRoute,\n in out TPath extends RouteConstraints['TPath'] = '/',\n in out TFullPath extends RouteConstraints['TFullPath'] = ResolveFullPath<\n TParentRoute,\n TPath\n >,\n in out TCustomId extends RouteConstraints['TCustomId'] = string,\n in out TId extends RouteConstraints['TId'] = ResolveId<\n TParentRoute,\n TCustomId,\n TPath\n >,\n in out TSearchValidator = undefined,\n in out TParams = ResolveParams<TPath>,\n in out TRouterContext = AnyContext,\n in out TRouteContextFn = AnyContext,\n in out TBeforeLoadFn = AnyContext,\n in out TLoaderDeps extends Record<string, any> = {},\n in out TLoaderFn = undefined,\n in out TChildren = unknown,\n in out TFileRouteTypes = unknown,\n in out TSSR = unknown,\n in out TMiddlewares = unknown,\n in out THandlers = undefined,\n >\n extends BaseRoute<\n TRegister,\n TParentRoute,\n TPath,\n TFullPath,\n TCustomId,\n TId,\n TSearchValidator,\n TParams,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n TFileRouteTypes,\n TSSR,\n TMiddlewares,\n THandlers\n >\n implements\n RouteCore<\n TRegister,\n TParentRoute,\n TPath,\n TFullPath,\n TCustomId,\n TId,\n TSearchValidator,\n TParams,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n TFileRouteTypes,\n TSSR,\n TMiddlewares,\n THandlers\n >\n{\n /**\n * @deprecated Use the `createRoute` function instead.\n */\n constructor(\n options?: RouteOptions<\n TRegister,\n TParentRoute,\n TId,\n TCustomId,\n TFullPath,\n TPath,\n TSearchValidator,\n TParams,\n TLoaderDeps,\n TLoaderFn,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TSSR,\n TMiddlewares,\n THandlers\n >,\n ) {\n super(options)\n }\n\n useMatch: UseMatchRoute<TId> = (opts) => {\n return useMatch({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useRouteContext: UseRouteContextRoute<TId> = (opts?) => {\n return useMatch({\n ...opts,\n from: this.id,\n select: (d) => (opts?.select ? opts.select(d.context) : d.context),\n }) as any\n }\n\n useSearch: UseSearchRoute<TId> = (opts) => {\n return useSearch({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useParams: UseParamsRoute<TId> = (opts) => {\n return useParams({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useLoaderDeps: UseLoaderDepsRoute<TId> = (opts) => {\n return useLoaderDeps({ ...opts, from: this.id } as any)\n }\n\n useLoaderData: UseLoaderDataRoute<TId> = (opts) => {\n return useLoaderData({ ...opts, from: this.id } as any)\n }\n\n useNavigate = (): UseNavigateResult<TFullPath> => {\n return useNavigate({ from: this.fullPath })\n }\n\n Link: LinkComponentRoute<TFullPath> = ((props, ctx?: Vue.SetupContext) => {\n return Vue.h(\n Link as any,\n { from: this.fullPath as never, ...(props as any) },\n ctx?.slots,\n )\n }) as LinkComponentRoute<TFullPath>\n}\n\nexport function createRoute<\n TRegister = unknown,\n TParentRoute extends RouteConstraints['TParentRoute'] = AnyRoute,\n TPath extends RouteConstraints['TPath'] = '/',\n TFullPath extends RouteConstraints['TFullPath'] = ResolveFullPath<\n TParentRoute,\n TPath\n >,\n TCustomId extends RouteConstraints['TCustomId'] = string,\n TId extends RouteConstraints['TId'] = ResolveId<\n TParentRoute,\n TCustomId,\n TPath\n >,\n TSearchValidator = undefined,\n TParams = ResolveParams<TPath>,\n TRouteContextFn = AnyContext,\n TBeforeLoadFn = AnyContext,\n TLoaderDeps extends Record<string, any> = {},\n TLoaderFn = undefined,\n TChildren = unknown,\n TSSR = unknown,\n THandlers = undefined,\n>(\n options: RouteOptions<\n TRegister,\n TParentRoute,\n TId,\n TCustomId,\n TFullPath,\n TPath,\n TSearchValidator,\n TParams,\n TLoaderDeps,\n TLoaderFn,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TSSR,\n THandlers\n >,\n): Route<\n TRegister,\n TParentRoute,\n TPath,\n TFullPath,\n TCustomId,\n TId,\n TSearchValidator,\n TParams,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n unknown,\n TSSR,\n THandlers\n> {\n return new Route<\n TRegister,\n TParentRoute,\n TPath,\n TFullPath,\n TCustomId,\n TId,\n TSearchValidator,\n TParams,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n unknown,\n TSSR,\n THandlers\n >(options)\n}\n\nexport type AnyRootRoute = RootRoute<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\nexport function createRootRouteWithContext<TRouterContext extends {}>() {\n return <\n TRegister = Register,\n TRouteContextFn = AnyContext,\n TBeforeLoadFn = AnyContext,\n TSearchValidator = undefined,\n TLoaderDeps extends Record<string, any> = {},\n TLoaderFn = undefined,\n TSSR = unknown,\n THandlers = undefined,\n >(\n options?: RootRouteOptions<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TSSR,\n THandlers\n >,\n ) => {\n return createRootRoute<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TSSR,\n THandlers\n >(options as any)\n }\n}\n\n/**\n * @deprecated Use the `createRootRouteWithContext` function instead.\n */\nexport const rootRouteWithContext = createRootRouteWithContext\n\nexport class RootRoute<\n in out TRegister = Register,\n in out TSearchValidator = undefined,\n in out TRouterContext = {},\n in out TRouteContextFn = AnyContext,\n in out TBeforeLoadFn = AnyContext,\n in out TLoaderDeps extends Record<string, any> = {},\n in out TLoaderFn = undefined,\n in out TChildren = unknown,\n in out TFileRouteTypes = unknown,\n in out TSSR = unknown,\n in out THandlers = undefined,\n >\n extends BaseRootRoute<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n TFileRouteTypes,\n TSSR,\n THandlers\n >\n implements\n RootRouteCore<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n TFileRouteTypes,\n TSSR,\n THandlers\n >\n{\n /**\n * @deprecated `RootRoute` is now an internal implementation detail. Use `createRootRoute()` instead.\n */\n constructor(\n options?: RootRouteOptions<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TSSR,\n THandlers\n >,\n ) {\n super(options)\n }\n\n useMatch: UseMatchRoute<RootRouteId> = (opts) => {\n return useMatch({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useRouteContext: UseRouteContextRoute<RootRouteId> = (opts) => {\n return useMatch({\n ...opts,\n from: this.id,\n select: (d) => (opts?.select ? opts.select(d.context) : d.context),\n }) as any\n }\n\n useSearch: UseSearchRoute<RootRouteId> = (opts) => {\n return useSearch({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useParams: UseParamsRoute<RootRouteId> = (opts) => {\n return useParams({\n select: opts?.select,\n from: this.id,\n } as any) as any\n }\n\n useLoaderDeps: UseLoaderDepsRoute<RootRouteId> = (opts) => {\n return useLoaderDeps({ ...opts, from: this.id } as any)\n }\n\n useLoaderData: UseLoaderDataRoute<RootRouteId> = (opts) => {\n return useLoaderData({ ...opts, from: this.id } as any)\n }\n\n useNavigate = (): UseNavigateResult<'/'> => {\n return useNavigate({ from: this.fullPath })\n }\n\n Link: LinkComponentRoute<'/'> = ((props, ctx?: Vue.SetupContext) => {\n return Vue.h(\n Link as any,\n { from: this.fullPath as never, ...(props as any) },\n ctx?.slots,\n )\n }) as LinkComponentRoute<'/'>\n}\n\nexport function createRouteMask<\n TRouteTree extends AnyRoute,\n TFrom extends string,\n TTo extends string,\n>(\n opts: {\n routeTree: TRouteTree\n } & ToMaskOptions<RouterCore<TRouteTree, 'never', false>, TFrom, TTo>,\n): RouteMask<TRouteTree> {\n return opts as any\n}\n\nexport type VueNode = Vue.VNode\n\nexport type SyncRouteComponent<TProps> = (props: TProps) => Vue.VNode\n\nexport type AsyncRouteComponent<TProps> = SyncRouteComponent<TProps> & {\n preload?: () => Promise<void>\n}\n\nexport type RouteComponent<TProps = any> = AsyncRouteComponent<TProps>\n\nexport type ErrorRouteComponent = RouteComponent<ErrorComponentProps>\n\nexport type NotFoundRouteComponent = SyncRouteComponent<NotFoundRouteProps>\n\nexport class NotFoundRoute<\n TRegister,\n TParentRoute extends AnyRootRoute,\n TRouterContext = AnyContext,\n TRouteContextFn = AnyContext,\n TBeforeLoadFn = AnyContext,\n TSearchValidator = undefined,\n TLoaderDeps extends Record<string, any> = {},\n TLoaderFn = undefined,\n TChildren = unknown,\n TSSR = unknown,\n THandlers = undefined,\n> extends Route<\n TRegister,\n TParentRoute,\n '/404',\n '/404',\n '404',\n '404',\n TSearchValidator,\n {},\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n TSSR,\n THandlers\n> {\n constructor(\n options: Omit<\n RouteOptions<\n TRegister,\n TParentRoute,\n string,\n string,\n string,\n string,\n TSearchValidator,\n {},\n TLoaderDeps,\n TLoaderFn,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TSSR,\n THandlers\n >,\n | 'caseSensitive'\n | 'parseParams'\n | 'stringifyParams'\n | 'path'\n | 'id'\n | 'params'\n >,\n ) {\n super({\n ...(options as any),\n id: '404',\n })\n }\n}\n\nexport function createRootRoute<\n TRegister = Register,\n TSearchValidator = undefined,\n TRouterContext = {},\n TRouteContextFn = AnyContext,\n TBeforeLoadFn = AnyContext,\n TLoaderDeps extends Record<string, any> = {},\n TLoaderFn = undefined,\n TSSR = unknown,\n THandlers = undefined,\n>(\n options?: RootRouteOptions<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TSSR,\n THandlers\n >,\n): RootRoute<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n unknown,\n unknown,\n TSSR,\n THandlers\n> {\n return new RootRoute<\n TRegister,\n TSearchValidator,\n TRouterContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n unknown,\n unknown,\n TSSR,\n THandlers\n >(options)\n}\n"],"names":[],"mappings":"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"}