@tanstack/vue-router
Advanced tools
@@ -22,3 +22,6 @@ import { ClientOnly } from "./ClientOnly.js"; | ||
| loadPromise = importer().then((res) => { | ||
| loadPromise = void 0; | ||
| if (typeof document !== "undefined") { | ||
| loadPromise = void 0; | ||
| lazyComp.preload = void 0; | ||
| } | ||
| comp = res[exportName ?? "default"]; | ||
@@ -25,0 +28,0 @@ return comp; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"lazyRouteComponent.js","names":["Vue","Outlet","ClientOnly","isModuleNotFoundError","error","message","startsWith","lazyRouteComponent","importer","exportName","ssr","loadPromise","comp","attemptedReload","load","document","Promise","resolve","undefined","then","res","catch","err","lazyComp","defineComponent","name","setup","props","component","shallowRef","markRaw","errorState","ref","loading","value","onMounted","result","window","sessionStorage","storageKey","getItem","setItem","location","reload","h","fallback","default","preload"],"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 error = undefined\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.preload = load\n\n return lazyComp as any\n}\n"],"mappings":";;;;AAUA,SAASG,sBAAsBC,OAAqB;CAIlD,IAAI,OAAOA,OAAOC,YAAY,UAAU,OAAO;CAC/C,OACED,MAAMC,QAAQC,WAAW,6CAA6C,KACtEF,MAAMC,QAAQC,WAAW,2CAA2C,KACpEF,MAAMC,QAAQC,WAAW,kCAAkC;AAE/D;AAEA,SAAgBC,mBAIdC,UACAC,YACAC,KAGQ;CACR,IAAIC;CACJ,IAAIC,OAAsC;CAC1C,IAAIR,QAAa;CACjB,IAAIS,kBAAkB;CAEtB,MAAMC,aAAa;EAEjB,IAAI,OAAOC,aAAa,eAAeL,MAAM,MAAM,OAAO;GACxDE,aAAc;GACd,OAAOI,QAAQC,QAAQL,IAAI;EAC7B;EAGA,IAAI,CAACD,aAAa;GAChBP,QAAQc,KAAAA;GACRP,cAAcH,SAAS,EACpBW,MAAMC,QAAQ;IACbT,cAAcO,KAAAA;IACdN,OAAOQ,IAAIX,cAAc;IACzB,OAAOG;GACT,CAAC,EACAS,OAAOC,QAAQ;IACdlB,QAAQkB;IACRX,cAAcO,KAAAA;IAGd,IAAIf,sBAAsBC,KAAK,GAC7B,OAAO;IAGT,MAAMkB;GACR,CAAC;EACL;EAEA,OAAOX;CACT;CAGA,MAAMY,WAAWvB,IAAIwB,gBAAgB;EACnCC,MAAM;EACNC,MAAMC,OAAY;GAGhB,MAAMC,YAAY5B,IAAI6B,WAAgBjB,OAAOZ,IAAI8B,QAAQlB,IAAI,IAAIA,IAAI;GACrE,MAAMmB,aAAa/B,IAAIgC,IAAS5B,KAAK;GACrC,MAAM6B,UAAUjC,IAAIgC,IAAI,CAACJ,UAAUM,SAAS,CAACH,WAAWG,KAAK;GAG7DlC,IAAImC,gBAAgB;IAClB,IAAI,CAACP,UAAUM,SAAS,CAACH,WAAWG,OAAO;KACzCD,QAAQC,QAAQ;KAEhBpB,KAAK,EACFK,MAAMiB,WAAW;MAEhBR,UAAUM,QAAQE,SAASpC,IAAI8B,QAAQM,MAAM,IAAIA;MACjDH,QAAQC,QAAQ;KAClB,CAAC,EACAb,OAAOC,QAAQ;MACdS,WAAWG,QAAQZ;MACnBW,QAAQC,QAAQ;KAClB,CAAC;IACL;GACF,CAAC;GAGD,IACEH,WAAWG,SACX/B,sBAAsB4B,WAAWG,KAAK,KACtC,CAACrB;QAGC,OAAOwB,WAAW,eAClB,OAAOC,mBAAmB,aAC1B;KAEA,MAAMC,aAAa,0BAA0BR,WAAWG,MAAM7B;KAC9D,IAAI,CAACiC,eAAeE,QAAQD,UAAU,GAAG;MACvCD,eAAeG,QAAQF,YAAY,GAAG;MACtC1B,kBAAkB;MAClBwB,OAAOK,SAASC,OAAO;MACvB,aAAa;KACf;IACF;;GAIF,IAAIZ,WAAWG,SAAS,CAAC/B,sBAAsB4B,WAAWG,KAAK,GAC7D,MAAMH,WAAWG;GAInB,aAAa;IAEX,IAAID,QAAQC,SAAS,CAACN,UAAUM,OAC9B,OAAOlC,IAAI4C,EAAE,OAAO,IAAI;IAI1B,IAAIlC,MAAM,MAAM,OACd,OAAOV,IAAI4C,EACT1C,YACA,EACE2C,UAAU7C,IAAI4C,EAAE3C,MAAM,EACxB,GACA,EACE6C,eAAe9C,IAAI4C,EAAEhB,UAAUM,OAAOP,KAAK,EAC7C,CACF;IAIF,OAAO3B,IAAI4C,EAAEhB,UAAUM,OAAOP,KAAK;GACrC;EACF;CACF,CAAC;CAGDJ,SAASwB,UAAUjC;CAEnB,OAAOS;AACT"} | ||
| {"version":3,"file":"lazyRouteComponent.js","names":["Vue","Outlet","ClientOnly","isModuleNotFoundError","error","message","startsWith","lazyRouteComponent","importer","exportName","ssr","loadPromise","comp","attemptedReload","load","document","Promise","resolve","undefined","then","res","lazyComp","preload","catch","err","defineComponent","name","setup","props","component","shallowRef","markRaw","errorState","ref","loading","value","onMounted","result","window","sessionStorage","storageKey","getItem","setItem","location","reload","h","fallback","default"],"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 error = undefined\n loadPromise = importer()\n .then((res) => {\n if (typeof document !== 'undefined') {\n loadPromise = undefined\n ;(lazyComp as any).preload = undefined\n }\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 // 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.preload = load\n\n return lazyComp as any\n}\n"],"mappings":";;;;AAUA,SAASG,sBAAsBC,OAAqB;CAIlD,IAAI,OAAOA,OAAOC,YAAY,UAAU,OAAO;CAC/C,OACED,MAAMC,QAAQC,WAAW,6CAA6C,KACtEF,MAAMC,QAAQC,WAAW,2CAA2C,KACpEF,MAAMC,QAAQC,WAAW,kCAAkC;AAE/D;AAEA,SAAgBC,mBAIdC,UACAC,YACAC,KAGQ;CACR,IAAIC;CACJ,IAAIC,OAAsC;CAC1C,IAAIR,QAAa;CACjB,IAAIS,kBAAkB;CAEtB,MAAMC,aAAa;EAEjB,IAAI,OAAOC,aAAa,eAAeL,MAAM,MAAM,OAAO;GACxDE,aAAc;GACd,OAAOI,QAAQC,QAAQL,IAAI;EAC7B;EAGA,IAAI,CAACD,aAAa;GAChBP,QAAQc,KAAAA;GACRP,cAAcH,SAAS,EACpBW,MAAMC,QAAQ;IACb,IAAI,OAAOL,aAAa,aAAa;KACnCJ,cAAcO,KAAAA;KACZG,SAAiBC,UAAUJ,KAAAA;IAC/B;IACAN,OAAOQ,IAAIX,cAAc;IACzB,OAAOG;GACT,CAAC,EACAW,OAAOC,QAAQ;IACdpB,QAAQoB;IACRb,cAAcO,KAAAA;IAGd,IAAIf,sBAAsBC,KAAK,GAC7B,OAAO;IAGT,MAAMoB;GACR,CAAC;EACL;EAEA,OAAOb;CACT;CAEA,MAAMU,WAAWrB,IAAIyB,gBAAgB;EACnCC,MAAM;EACNC,MAAMC,OAAY;GAGhB,MAAMC,YAAY7B,IAAI8B,WAAgBlB,OAAOZ,IAAI+B,QAAQnB,IAAI,IAAIA,IAAI;GACrE,MAAMoB,aAAahC,IAAIiC,IAAS7B,KAAK;GACrC,MAAM8B,UAAUlC,IAAIiC,IAAI,CAACJ,UAAUM,SAAS,CAACH,WAAWG,KAAK;GAG7DnC,IAAIoC,gBAAgB;IAClB,IAAI,CAACP,UAAUM,SAAS,CAACH,WAAWG,OAAO;KACzCD,QAAQC,QAAQ;KAEhBrB,KAAK,EACFK,MAAMkB,WAAW;MAEhBR,UAAUM,QAAQE,SAASrC,IAAI+B,QAAQM,MAAM,IAAIA;MACjDH,QAAQC,QAAQ;KAClB,CAAC,EACAZ,OAAOC,QAAQ;MACdQ,WAAWG,QAAQX;MACnBU,QAAQC,QAAQ;KAClB,CAAC;IACL;GACF,CAAC;GAGD,IACEH,WAAWG,SACXhC,sBAAsB6B,WAAWG,KAAK,KACtC,CAACtB;QAGC,OAAOyB,WAAW,eAClB,OAAOC,mBAAmB,aAC1B;KAEA,MAAMC,aAAa,0BAA0BR,WAAWG,MAAM9B;KAC9D,IAAI,CAACkC,eAAeE,QAAQD,UAAU,GAAG;MACvCD,eAAeG,QAAQF,YAAY,GAAG;MACtC3B,kBAAkB;MAClByB,OAAOK,SAASC,OAAO;MACvB,aAAa;KACf;IACF;;GAIF,IAAIZ,WAAWG,SAAS,CAAChC,sBAAsB6B,WAAWG,KAAK,GAC7D,MAAMH,WAAWG;GAInB,aAAa;IAEX,IAAID,QAAQC,SAAS,CAACN,UAAUM,OAC9B,OAAOnC,IAAI6C,EAAE,OAAO,IAAI;IAI1B,IAAInC,MAAM,MAAM,OACd,OAAOV,IAAI6C,EACT3C,YACA,EACE4C,UAAU9C,IAAI6C,EAAE5C,MAAM,EACxB,GACA,EACE8C,eAAe/C,IAAI6C,EAAEhB,UAAUM,OAAOP,KAAK,EAC7C,CACF;IAIF,OAAO5B,IAAI6C,EAAEhB,UAAUM,OAAOP,KAAK;GACrC;EACF;CACF,CAAC;CAGDP,SAASC,UAAUR;CAEnB,OAAOO;AACT"} |
+116
-87
@@ -10,4 +10,7 @@ import { useRouter } from "./useRouter.js"; | ||
| function useLinkProps(options) { | ||
| return useLinkPropsImpl(() => options); | ||
| } | ||
| function useLinkPropsImpl(getOptions) { | ||
| const router = useRouter(); | ||
| let hasRenderFetched = false; | ||
| let renderFetchedHref; | ||
| if (!router) { | ||
@@ -18,2 +21,3 @@ console.warn("useRouter must be used inside a <RouterProvider> component!"); | ||
| const type = Vue.computed(() => { | ||
| const options = getOptions(); | ||
| try { | ||
@@ -27,50 +31,5 @@ new URL(`${options.to}`); | ||
| const ref = Vue.ref(null); | ||
| const eventHandlers = getLinkEventHandlers(options); | ||
| if (type.value === "external") { | ||
| if (isDangerousProtocol(options.to, router.protocolAllowlist)) { | ||
| if (process.env.NODE_ENV !== "production") console.warn(`Blocked Link with dangerous protocol: ${options.to}`); | ||
| const safeProps = { | ||
| ...getPropsSafeToSpread(options), | ||
| ref, | ||
| target: options.target, | ||
| disabled: options.disabled, | ||
| style: options.style, | ||
| class: options.class, | ||
| onClick: options.onClick, | ||
| onBlur: options.onBlur, | ||
| onFocus: options.onFocus, | ||
| onMouseenter: eventHandlers.onMouseenter, | ||
| onMouseleave: eventHandlers.onMouseleave, | ||
| onMouseover: eventHandlers.onMouseover, | ||
| onMouseout: eventHandlers.onMouseout, | ||
| onTouchstart: eventHandlers.onTouchstart | ||
| }; | ||
| Object.keys(safeProps).forEach((key) => { | ||
| if (safeProps[key] === void 0) delete safeProps[key]; | ||
| }); | ||
| return Vue.computed(() => safeProps); | ||
| } | ||
| const externalProps = { | ||
| ...getPropsSafeToSpread(options), | ||
| ref, | ||
| href: options.to, | ||
| target: options.target, | ||
| disabled: options.disabled, | ||
| style: options.style, | ||
| class: options.class, | ||
| onClick: options.onClick, | ||
| onBlur: options.onBlur, | ||
| onFocus: options.onFocus, | ||
| onMouseenter: eventHandlers.onMouseenter, | ||
| onMouseleave: eventHandlers.onMouseleave, | ||
| onMouseover: eventHandlers.onMouseover, | ||
| onMouseout: eventHandlers.onMouseout, | ||
| onTouchstart: eventHandlers.onTouchstart | ||
| }; | ||
| Object.keys(externalProps).forEach((key) => { | ||
| if (externalProps[key] === void 0) delete externalProps[key]; | ||
| }); | ||
| return Vue.computed(() => externalProps); | ||
| } | ||
| if (isServer ?? router.isServer) { | ||
| const options = getOptions(); | ||
| if (type.value === "external") return Vue.ref(getExternalLinkProps(options, router, ref)); | ||
| const next = router.buildLocation(options); | ||
@@ -91,4 +50,12 @@ const href = getHref(options, router, next); | ||
| } | ||
| const currentLocation = useStore(router.stores.location, (l) => l, { equal: (prev, next) => prev.href === next.href }); | ||
| const currentLocation = type.value === "external" ? Vue.shallowRef(router.stores.location.get()) : useStore(router.stores.location, (l) => l, { equal: (prev, next) => prev.href === next.href }); | ||
| if (type.value === "external") Vue.watchEffect((onCleanup) => { | ||
| if (type.value === "external") return; | ||
| const subscription = router.stores.location.subscribe((location) => { | ||
| if (currentLocation.value.href !== location.href) currentLocation.value = location; | ||
| }); | ||
| onCleanup(() => subscription.unsubscribe()); | ||
| }); | ||
| const next = Vue.computed(() => { | ||
| const options = getOptions(); | ||
| const opts = { | ||
@@ -101,14 +68,22 @@ _fromLocation: currentLocation.value, | ||
| const preload = Vue.computed(() => { | ||
| if (options.reloadDocument || options.disabled) return false; | ||
| const options = getOptions(); | ||
| if (type.value === "external" || options.reloadDocument || options.disabled) return false; | ||
| return options.preload ?? router.options.defaultPreload; | ||
| }); | ||
| const preloadDelay = Vue.computed(() => options.preloadDelay ?? router.options.defaultPreloadDelay ?? 0); | ||
| const isActive = Vue.computed(() => getIsActive(currentLocation.value, next.value, options.activeOptions, router)); | ||
| const doPreload = () => router.preloadRoute({ | ||
| ...options, | ||
| _builtLocation: next.value | ||
| }).catch((err) => { | ||
| console.warn(err); | ||
| console.warn(preloadWarning); | ||
| const preloadDelay = Vue.computed(() => getOptions().preloadDelay ?? router.options.defaultPreloadDelay ?? 0); | ||
| const isActive = Vue.computed(() => { | ||
| const options = getOptions(); | ||
| return getIsActive(currentLocation.value, next.value, options.activeOptions, router); | ||
| }); | ||
| const doPreload = () => { | ||
| const options = getOptions(); | ||
| return router.preloadRoute({ | ||
| ...options, | ||
| _builtLocation: next.value | ||
| }).catch((err) => { | ||
| console.warn(err); | ||
| console.warn(preloadWarning); | ||
| }); | ||
| }; | ||
| let pendingPreload; | ||
| const enqueuePreload = (e) => { | ||
@@ -118,8 +93,12 @@ if (!e) { | ||
| timeoutMap.delete(ref); | ||
| pendingPreload = void 0; | ||
| return; | ||
| } | ||
| if (!(e.isIntersecting ?? preload.value === "intent")) { | ||
| if (e.isIntersecting === false) { | ||
| const isIntersecting = e.isIntersecting; | ||
| const preloadMode = isIntersecting === void 0 ? "intent" : "viewport"; | ||
| if (preload.value !== preloadMode || isIntersecting === false) { | ||
| if (isIntersecting === false && pendingPreload === "viewport") { | ||
| clearTimeout(timeoutMap.get(ref)); | ||
| timeoutMap.delete(ref); | ||
| pendingPreload = void 0; | ||
| } | ||
@@ -132,16 +111,24 @@ return; | ||
| } | ||
| if (!timeoutMap.has(ref)) timeoutMap.set(ref, setTimeout(() => { | ||
| timeoutMap.delete(ref); | ||
| doPreload(); | ||
| }, preloadDelay.value)); | ||
| if (!timeoutMap.has(ref)) { | ||
| const scheduledHref = next.value.href; | ||
| pendingPreload = preloadMode; | ||
| timeoutMap.set(ref, setTimeout(() => { | ||
| timeoutMap.delete(ref); | ||
| pendingPreload = void 0; | ||
| if (preload.value === preloadMode && next.value.href === scheduledHref) doPreload(); | ||
| }, preloadDelay.value)); | ||
| } | ||
| }; | ||
| useIntersectionObserver(ref, enqueuePreload, () => preload.value !== "viewport"); | ||
| Vue.effect(() => { | ||
| if (hasRenderFetched) return; | ||
| if (preload.value === "render") { | ||
| Vue.watchEffect(() => { | ||
| if (preload.value !== "render") return; | ||
| const nextHref = next.value.href; | ||
| if (nextHref && renderFetchedHref !== nextHref) { | ||
| renderFetchedHref = nextHref; | ||
| doPreload(); | ||
| hasRenderFetched = true; | ||
| } | ||
| }); | ||
| const handleClick = (e) => { | ||
| if (type.value === "external") return; | ||
| const options = getOptions(); | ||
| const elementTarget = e.currentTarget?.getAttribute("target"); | ||
@@ -164,29 +151,36 @@ const effectiveTarget = options.target !== void 0 ? options.target : elementTarget; | ||
| const handleTouchStart = () => { | ||
| if (preload.value !== "intent") return; | ||
| doPreload(); | ||
| if (preload.value === "intent") doPreload(); | ||
| }; | ||
| const handleLeave = () => { | ||
| if (preload.value === "intent") { | ||
| if (pendingPreload === "intent") { | ||
| clearTimeout(timeoutMap.get(ref)); | ||
| timeoutMap.delete(ref); | ||
| pendingPreload = void 0; | ||
| } | ||
| }; | ||
| function composeEventHandlers(handlers) { | ||
| function composeEventHandlers(getUserHandler, handler) { | ||
| return (event) => { | ||
| for (const handler of handlers) if (handler) handler(event); | ||
| getUserHandler()?.(event); | ||
| handler(event); | ||
| }; | ||
| } | ||
| const resolvedStyleProps = Vue.computed(() => resolveStyleProps(options, isActive.value)); | ||
| const href = Vue.computed(() => getHref(options, router, next.value)); | ||
| const resolvedStyleProps = Vue.computed(() => { | ||
| return resolveStyleProps(getOptions(), isActive.value); | ||
| }); | ||
| const href = Vue.computed(() => { | ||
| return getHref(getOptions(), router, next.value); | ||
| }); | ||
| const staticEventHandlers = { | ||
| onClick: composeEventHandlers([options.onClick, handleClick]), | ||
| onBlur: composeEventHandlers([options.onBlur, handleLeave]), | ||
| onFocus: composeEventHandlers([options.onFocus, enqueuePreload]), | ||
| onMouseenter: composeEventHandlers([eventHandlers.onMouseenter, enqueuePreload]), | ||
| onMouseover: composeEventHandlers([eventHandlers.onMouseover, enqueuePreload]), | ||
| onMouseleave: composeEventHandlers([eventHandlers.onMouseleave, handleLeave]), | ||
| onMouseout: composeEventHandlers([eventHandlers.onMouseout, handleLeave]), | ||
| onTouchstart: composeEventHandlers([eventHandlers.onTouchstart, handleTouchStart]) | ||
| onClick: composeEventHandlers(() => getOptions().onClick, handleClick), | ||
| onBlur: composeEventHandlers(() => getOptions().onBlur, handleLeave), | ||
| onFocus: composeEventHandlers(() => getOptions().onFocus, enqueuePreload), | ||
| onMouseenter: composeEventHandlers(() => getLinkEventHandlers(getOptions()).onMouseenter, enqueuePreload), | ||
| onMouseover: composeEventHandlers(() => getLinkEventHandlers(getOptions()).onMouseover, enqueuePreload), | ||
| onMouseleave: composeEventHandlers(() => getLinkEventHandlers(getOptions()).onMouseleave, handleLeave), | ||
| onMouseout: composeEventHandlers(() => getLinkEventHandlers(getOptions()).onMouseout, handleLeave), | ||
| onTouchstart: composeEventHandlers(() => getLinkEventHandlers(getOptions()).onTouchstart, handleTouchStart) | ||
| }; | ||
| return Vue.computed(() => { | ||
| const options = getOptions(); | ||
| if (type.value === "external") return getExternalLinkProps(options, router, ref, staticEventHandlers); | ||
| const { resolvedActiveProps, resolvedInactiveProps, resolvedClassName, resolvedStyle } = resolvedStyleProps.value; | ||
@@ -240,3 +234,3 @@ return combineResultProps({ | ||
| href, | ||
| disabled: !!options.disabled, | ||
| disabled: options._asChild ? !!options.disabled : void 0, | ||
| target: options.target | ||
@@ -258,2 +252,30 @@ }; | ||
| } | ||
| function getExternalLinkProps(options, router, ref, staticEventHandlers) { | ||
| const dangerous = isDangerousProtocol(options.to, router.protocolAllowlist); | ||
| if (dangerous && process.env.NODE_ENV !== "production") console.warn(`Blocked Link with dangerous protocol: ${options.to}`); | ||
| const eventHandlers = getLinkEventHandlers(options); | ||
| const result = { | ||
| ...getPropsSafeToSpread(options), | ||
| ref, | ||
| href: dangerous || options.disabled ? void 0 : options.to, | ||
| target: options.target, | ||
| disabled: options._asChild ? !!options.disabled : void 0, | ||
| style: options.style, | ||
| class: options.class, | ||
| onClick: staticEventHandlers?.onClick ?? options.onClick, | ||
| onBlur: staticEventHandlers?.onBlur ?? options.onBlur, | ||
| onFocus: staticEventHandlers?.onFocus ?? options.onFocus, | ||
| onMouseenter: staticEventHandlers?.onMouseenter ?? eventHandlers.onMouseenter, | ||
| onMouseleave: staticEventHandlers?.onMouseleave ?? eventHandlers.onMouseleave, | ||
| onMouseover: staticEventHandlers?.onMouseover ?? eventHandlers.onMouseover, | ||
| onMouseout: staticEventHandlers?.onMouseout ?? eventHandlers.onMouseout, | ||
| onTouchstart: staticEventHandlers?.onTouchstart ?? eventHandlers.onTouchstart | ||
| }; | ||
| if (options.disabled) { | ||
| result.role = "link"; | ||
| result["aria-disabled"] = true; | ||
| } | ||
| for (const key of Object.keys(result)) if (result[key] === void 0) delete result[key]; | ||
| return result; | ||
| } | ||
| function getLinkEventHandlers(options) { | ||
@@ -339,6 +361,13 @@ return { | ||
| setup(props, { attrs, slots }) { | ||
| const linkPropsSource = useLinkProps({ | ||
| const attrsSnapshot = Vue.shallowRef({ ...attrs }); | ||
| Vue.onBeforeUpdate(() => { | ||
| const keys = Object.keys(attrs); | ||
| const previous = attrsSnapshot.value; | ||
| if (keys.length !== Object.keys(previous).length || keys.some((key) => !Object.is(attrs[key], previous[key]))) attrsSnapshot.value = { ...attrs }; | ||
| }); | ||
| const allProps = Vue.computed(() => ({ | ||
| ...props, | ||
| ...attrs | ||
| }); | ||
| ...attrsSnapshot.value | ||
| })); | ||
| const linkPropsSource = useLinkPropsImpl(() => allProps.value); | ||
| return () => { | ||
@@ -345,0 +374,0 @@ const Component = props._asChild || "a"; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"link.js","names":["Vue","deepEqual","exactPathTest","hasKeys","isDangerousProtocol","preloadWarning","removeTrailingSlash","isServer","useStore","useRouter","useIntersectionObserver","timeoutMap","WeakMap","useLinkProps","options","router","hasRenderFetched","console","warn","computed","type","URL","to","ref","eventHandlers","getLinkEventHandlers","value","protocolAllowlist","process","env","NODE_ENV","safeProps","getPropsSafeToSpread","target","disabled","style","class","onClick","onBlur","onFocus","onMouseenter","onMouseleave","onMouseover","onMouseout","onTouchstart","Object","keys","forEach","key","undefined","externalProps","href","next","buildLocation","getHref","isActive","getIsActive","stores","location","get","activeOptions","resolvedActiveProps","resolvedInactiveProps","resolvedClassName","resolvedStyle","resolveStyleProps","result","combineResultProps","currentLocation","l","equal","prev","opts","_fromLocation","preload","reloadDocument","defaultPreload","preloadDelay","defaultPreloadDelay","doPreload","preloadRoute","_builtLocation","catch","err","enqueuePreload","e","clearTimeout","delete","isIntersecting","has","set","setTimeout","effect","handleClick","elementTarget","currentTarget","getAttribute","effectiveTarget","isCtrlEvent","defaultPrevented","button","preventDefault","navigate","replace","resetScroll","hashScrollIntoView","startTransition","viewTransition","ignoreBlocker","handleTouchStart","handleLeave","composeEventHandlers","handlers","event","handler","resolvedStyleProps","staticEventHandlers","computedProps","activeProps","inactiveProps","classes","filter","Boolean","length","join","assign","role","onMouseEnter","onMouseLeave","onMouseOver","onMouseOut","onTouchStart","_activeProps","_inactiveProps","_activeOptions","_to","_preload","_preloadDelay","preloadIntentProximity","_preloadIntentProximity","_hashScrollIntoView","_replace","_startTransition","_resetScroll","_viewTransition","children","_children","_target","_disabled","_style","_class","_onClick","_onBlur","_onFocus","_onMouseEnter","_onMouseenter","_onMouseLeave","_onMouseleave","_onMouseOver","_onMouseover","_onMouseOut","_onMouseout","_onTouchStart","_onTouchstart","_ignoreBlocker","params","_params","search","_search","hash","_hash","state","_state","mask","_mask","_reloadDocument","unsafeRelative","_unsafeRelative","_asChild","__asChild","from","_from","additionalProps","_additionalProps","propsSafeToSpread","loc","nextLoc","exact","testExact","pathname","basepath","currentPath","nextPath","pathIsFuzzyEqual","startsWith","includeSearch","searchTest","partial","ignoreUndefined","explicitUndefined","includeHash","nextLocation","maskedLocation","publicHref","external","history","createHref","createLink","Comp","defineComponent","name","inheritAttrs","setup","_","attrs","slots","h","LinkImpl","props","allProps","linkPropsSource","Component","linkProps","unref","slotContent","default","svgLinkProps","Link","metaKey","altKey","ctrlKey","shiftKey","linkOptions"],"sources":["../../src/link.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport {\n deepEqual,\n exactPathTest,\n hasKeys,\n isDangerousProtocol,\n preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\n\nimport { useStore } from '@tanstack/vue-store'\nimport { useRouter } from './useRouter'\nimport { useIntersectionObserver } from './utils'\n\nimport type {\n AnyRouter,\n Constrain,\n LinkOptions,\n ParsedLocation,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type { AnchorHTMLAttributes, ReservedProps } from '@vue/runtime-dom'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\n\ntype EventHandler<TEvent = Event> = (e: TEvent) => void\n\nconst timeoutMap = new WeakMap<object, ReturnType<typeof setTimeout>>()\n\ntype DataAttributes = {\n [K in `data-${string}`]?: unknown\n}\n\ntype LinkHTMLAttributes = AnchorHTMLAttributes &\n ReservedProps &\n DataAttributes & {\n // Vue's runtime-dom types use lowercase event names.\n // Also accept 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\n // `disabled` is not a valid <a> attribute, but is useful when using `asChild`.\n disabled?: boolean\n }\n\ntype VueStyleLinkEventHandlers = {\n onMouseenter?: EventHandler<MouseEvent>\n onMouseleave?: EventHandler<MouseEvent>\n onMouseover?: EventHandler<MouseEvent>\n onMouseout?: EventHandler<MouseEvent>\n onTouchstart?: EventHandler<TouchEvent>\n}\n\ninterface StyledProps {\n class?: LinkHTMLAttributes['class']\n style?: LinkHTMLAttributes['style']\n [key: string]: unknown\n}\n\ntype PropsOfComponent<TComp> =\n // Functional components\n TComp extends (props: infer P, ...args: Array<unknown>) => any\n ? P\n : // Vue components (defineComponent, class components, etc)\n TComp extends Vue.Component<infer P>\n ? P\n : Record<string, unknown>\n\ntype AnyLinkPropsOptions = UseLinkPropsOptions<any, any, any, any, any>\ntype LinkEventOptions = AnyLinkPropsOptions & Partial<VueStyleLinkEventHandlers>\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): LinkHTMLAttributes {\n const router = useRouter()\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 Vue.computed(() => ({})) as unknown as LinkHTMLAttributes\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 ref = Vue.ref<Element | null>(null)\n const eventHandlers = getLinkEventHandlers(options as LinkEventOptions)\n\n if (type.value === 'external') {\n // Block dangerous protocols like javascript:, blob:, data:\n if (isDangerousProtocol(options.to as string, router.protocolAllowlist)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Blocked Link with dangerous protocol: ${options.to}`)\n }\n // Return props without href to prevent navigation\n const safeProps: Record<string, unknown> = {\n ...getPropsSafeToSpread(options as AnyLinkPropsOptions),\n ref,\n // No href attribute - blocks the dangerous protocol\n target: options.target,\n disabled: options.disabled,\n style: options.style,\n class: options.class,\n onClick: options.onClick,\n onBlur: options.onBlur,\n onFocus: options.onFocus,\n onMouseenter: eventHandlers.onMouseenter,\n onMouseleave: eventHandlers.onMouseleave,\n onMouseover: eventHandlers.onMouseover,\n onMouseout: eventHandlers.onMouseout,\n onTouchstart: eventHandlers.onTouchstart,\n }\n\n // Remove undefined values\n Object.keys(safeProps).forEach((key) => {\n if (safeProps[key] === undefined) {\n delete safeProps[key]\n }\n })\n\n return Vue.computed(\n () => safeProps as LinkHTMLAttributes,\n ) as unknown as LinkHTMLAttributes\n }\n\n // External links just have simple props\n const externalProps: Record<string, unknown> = {\n ...getPropsSafeToSpread(options as AnyLinkPropsOptions),\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 onBlur: options.onBlur,\n onFocus: options.onFocus,\n onMouseenter: eventHandlers.onMouseenter,\n onMouseleave: eventHandlers.onMouseleave,\n onMouseover: eventHandlers.onMouseover,\n onMouseout: eventHandlers.onMouseout,\n onTouchstart: eventHandlers.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 Vue.computed(\n () => externalProps as LinkHTMLAttributes,\n ) as unknown as LinkHTMLAttributes\n }\n\n // During SSR we render exactly once and do not need reactivity.\n // Avoid store subscriptions, effects and observers on the server.\n if (isServer ?? router.isServer) {\n const next = router.buildLocation(options as any)\n const href = getHref(options as AnyLinkPropsOptions, router, next)\n\n const isActive = getIsActive(\n router.stores.location.get(),\n next,\n options.activeOptions,\n router,\n )\n\n const {\n resolvedActiveProps,\n resolvedInactiveProps,\n resolvedClassName,\n resolvedStyle,\n } = resolveStyleProps(options as AnyLinkPropsOptions, isActive)\n\n const result = combineResultProps({\n href,\n options: options as AnyLinkPropsOptions,\n isActive,\n resolvedActiveProps,\n resolvedInactiveProps,\n resolvedClassName,\n resolvedStyle,\n })\n\n return Vue.ref(\n result as LinkHTMLAttributes,\n ) as unknown as LinkHTMLAttributes\n }\n\n const currentLocation = useStore(router.stores.location, (l) => l, {\n equal: (prev, next) => prev.href === next.href,\n })\n\n const next = Vue.computed(() => {\n // Rebuild when inherited search/hash or the current route context changes.\n\n const opts = { _fromLocation: currentLocation.value, ...options }\n return router.buildLocation(opts)\n })\n\n const preload = Vue.computed(() => {\n if (options.reloadDocument || options.disabled) {\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 = Vue.computed(() =>\n getIsActive(\n currentLocation.value,\n next.value,\n options.activeOptions,\n router,\n ),\n )\n\n const doPreload = () =>\n router\n .preloadRoute({ ...options, _builtLocation: next.value } as any)\n .catch((err: any) => {\n console.warn(err)\n console.warn(preloadWarning)\n })\n\n const enqueuePreload = (\n e?: MouseEvent | FocusEvent | IntersectionObserverEntry,\n ) => {\n if (!e) {\n clearTimeout(timeoutMap.get(ref))\n timeoutMap.delete(ref)\n return\n }\n\n if (\n !(\n (e as IntersectionObserverEntry).isIntersecting ??\n preload.value === 'intent'\n )\n ) {\n if ((e as IntersectionObserverEntry).isIntersecting === false) {\n clearTimeout(timeoutMap.get(ref))\n timeoutMap.delete(ref)\n }\n return\n }\n\n if (!preloadDelay.value) {\n doPreload()\n return\n }\n\n if (!timeoutMap.has(ref)) {\n timeoutMap.set(\n ref,\n setTimeout(() => {\n timeoutMap.delete(ref)\n doPreload()\n }, preloadDelay.value),\n )\n }\n }\n\n useIntersectionObserver(\n ref,\n enqueuePreload,\n () => preload.value !== 'viewport',\n )\n\n Vue.effect(() => {\n if (hasRenderFetched) {\n return\n }\n if (preload.value === 'render') {\n doPreload()\n hasRenderFetched = true\n }\n })\n\n // The click handler\n const handleClick = (e: PointerEvent): 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.reloadDocument) {\n return\n }\n\n e.preventDefault()\n\n // All is well? Navigate!\n router.navigate({\n ...options,\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 })\n }\n }\n\n const handleTouchStart = () => {\n if (preload.value !== 'intent') return\n doPreload()\n }\n\n const handleLeave = () => {\n if (preload.value === 'intent') {\n clearTimeout(timeoutMap.get(ref))\n timeoutMap.delete(ref)\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 resolvedStyleProps = Vue.computed(() =>\n resolveStyleProps(options as AnyLinkPropsOptions, isActive.value),\n )\n\n const href = Vue.computed(() =>\n getHref(options as AnyLinkPropsOptions, router, next.value),\n )\n\n // Create static event handlers that don't change between renders\n const staticEventHandlers = {\n onClick: composeEventHandlers<PointerEvent>([options.onClick, handleClick]),\n onBlur: composeEventHandlers<FocusEvent>([options.onBlur, handleLeave]),\n onFocus: composeEventHandlers<FocusEvent>([\n options.onFocus,\n enqueuePreload,\n ]),\n onMouseenter: composeEventHandlers<MouseEvent>([\n eventHandlers.onMouseenter,\n enqueuePreload,\n ]),\n onMouseover: composeEventHandlers<MouseEvent>([\n eventHandlers.onMouseover,\n enqueuePreload,\n ]),\n onMouseleave: composeEventHandlers<MouseEvent>([\n eventHandlers.onMouseleave,\n handleLeave,\n ]),\n onMouseout: composeEventHandlers<MouseEvent>([\n eventHandlers.onMouseout,\n handleLeave,\n ]),\n onTouchstart: composeEventHandlers<TouchEvent>([\n eventHandlers.onTouchstart,\n handleTouchStart,\n ]),\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<LinkHTMLAttributes>(() => {\n const {\n resolvedActiveProps,\n resolvedInactiveProps,\n resolvedClassName,\n resolvedStyle,\n } = resolvedStyleProps.value\n return combineResultProps({\n href: href.value,\n options: options as AnyLinkPropsOptions,\n ref,\n staticEventHandlers,\n isActive: isActive.value,\n resolvedActiveProps,\n resolvedInactiveProps,\n resolvedClassName,\n resolvedStyle,\n })\n })\n\n // Return the computed ref itself - callers should access .value\n return computedProps as unknown as LinkHTMLAttributes\n}\n\nfunction resolveStyleProps(options: AnyLinkPropsOptions, isActive: boolean) {\n const activeProps = options.activeProps || (() => ({ class: 'active' }))\n const resolvedActiveProps: StyledProps = (isActive\n ? typeof activeProps === 'function'\n ? activeProps()\n : activeProps\n : {}) || { class: undefined, style: undefined }\n\n const inactiveProps = options.inactiveProps || (() => ({}))\n\n const resolvedInactiveProps: StyledProps = (isActive\n ? {}\n : typeof inactiveProps === 'function'\n ? inactiveProps()\n : inactiveProps) || { class: undefined, style: undefined }\n\n const classes = [\n options.class,\n resolvedActiveProps?.class,\n resolvedInactiveProps?.class,\n ].filter(Boolean)\n const resolvedClassName = classes.length ? classes.join(' ') : undefined\n\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?.style) {\n Object.assign(result, resolvedActiveProps.style)\n }\n\n if (resolvedInactiveProps?.style) {\n Object.assign(result, resolvedInactiveProps.style)\n }\n\n const resolvedStyle = hasKeys(result) ? result : undefined\n return {\n resolvedActiveProps,\n resolvedInactiveProps,\n resolvedClassName,\n resolvedStyle,\n }\n}\n\nfunction combineResultProps({\n href,\n options,\n isActive,\n resolvedActiveProps,\n resolvedInactiveProps,\n resolvedClassName,\n resolvedStyle,\n ref,\n staticEventHandlers,\n}: {\n initial?: LinkHTMLAttributes\n href: string | undefined\n options: AnyLinkPropsOptions\n isActive: boolean\n resolvedActiveProps: StyledProps\n resolvedInactiveProps: StyledProps\n resolvedClassName?: string\n resolvedStyle?: Record<string, string | number>\n ref?: Vue.VNodeRef | undefined\n staticEventHandlers?: {\n onClick: any\n onBlur: any\n onFocus: any\n onMouseenter: any\n onMouseover: any\n onMouseleave: any\n onMouseout: any\n onTouchstart: any\n }\n}) {\n const result: Record<string, unknown> = {\n ...getPropsSafeToSpread(options),\n ref,\n ...staticEventHandlers,\n href,\n disabled: !!options.disabled,\n target: options.target,\n }\n\n if (resolvedStyle) {\n result.style = resolvedStyle\n }\n\n if (resolvedClassName) {\n result.class = resolvedClassName\n }\n\n if (options.disabled) {\n result.role = 'link'\n result['aria-disabled'] = true\n }\n\n if (isActive) {\n result['data-status'] = 'active'\n result['aria-current'] = 'page'\n }\n\n for (const key of Object.keys(resolvedActiveProps)) {\n if (key !== 'class' && key !== 'style') {\n result[key] = resolvedActiveProps[key]\n }\n }\n\n for (const key of Object.keys(resolvedInactiveProps)) {\n if (key !== 'class' && key !== 'style') {\n result[key] = resolvedInactiveProps[key]\n }\n }\n return result\n}\n\nfunction getLinkEventHandlers(\n options: LinkEventOptions,\n): VueStyleLinkEventHandlers {\n return {\n onMouseenter: options.onMouseEnter ?? options.onMouseenter,\n onMouseleave: options.onMouseLeave ?? options.onMouseleave,\n onMouseover: options.onMouseOver ?? options.onMouseover,\n onMouseout: options.onMouseOut ?? options.onMouseout,\n onTouchstart: options.onTouchStart ?? options.onTouchstart,\n }\n}\n\nconst getPropsSafeToSpread = (options: AnyLinkPropsOptions) => {\n const {\n activeProps: _activeProps,\n inactiveProps: _inactiveProps,\n activeOptions: _activeOptions,\n to: _to,\n preload: _preload,\n preloadDelay: _preloadDelay,\n preloadIntentProximity: _preloadIntentProximity,\n hashScrollIntoView: _hashScrollIntoView,\n replace: _replace,\n startTransition: _startTransition,\n resetScroll: _resetScroll,\n viewTransition: _viewTransition,\n children: _children,\n target: _target,\n disabled: _disabled,\n style: _style,\n class: _class,\n onClick: _onClick,\n onBlur: _onBlur,\n onFocus: _onFocus,\n onMouseEnter: _onMouseEnter,\n onMouseenter: _onMouseenter,\n onMouseLeave: _onMouseLeave,\n onMouseleave: _onMouseleave,\n onMouseOver: _onMouseOver,\n onMouseover: _onMouseover,\n onMouseOut: _onMouseOut,\n onMouseout: _onMouseout,\n onTouchStart: _onTouchStart,\n onTouchstart: _onTouchstart,\n ignoreBlocker: _ignoreBlocker,\n params: _params,\n search: _search,\n hash: _hash,\n state: _state,\n mask: _mask,\n reloadDocument: _reloadDocument,\n unsafeRelative: _unsafeRelative,\n _asChild: __asChild,\n from: _from,\n additionalProps: _additionalProps,\n ...propsSafeToSpread\n } = options as AnyLinkPropsOptions & {\n additionalProps?: unknown\n children?: unknown\n _asChild?: unknown\n }\n\n return propsSafeToSpread\n}\n\nfunction getIsActive(\n loc: {\n pathname: string\n search: any\n hash: string\n },\n nextLoc: {\n pathname: string\n search: any\n hash: string\n },\n activeOptions: LinkOptions['activeOptions'],\n router: AnyRouter,\n) {\n if (activeOptions?.exact) {\n const testExact = exactPathTest(\n loc.pathname,\n nextLoc.pathname,\n router.basepath,\n )\n if (!testExact) {\n return false\n }\n } else {\n const currentPath = removeTrailingSlash(loc.pathname, router.basepath)\n const nextPath = removeTrailingSlash(nextLoc.pathname, router.basepath)\n\n const pathIsFuzzyEqual =\n currentPath.startsWith(nextPath) &&\n (currentPath.length === nextPath.length ||\n currentPath[nextPath.length] === '/')\n if (!pathIsFuzzyEqual) {\n return false\n }\n }\n\n if (activeOptions?.includeSearch ?? true) {\n const searchTest = deepEqual(loc.search, nextLoc.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 loc.hash === nextLoc.hash\n }\n return true\n}\n\nfunction getHref(\n options: AnyLinkPropsOptions,\n router: AnyRouter,\n nextLocation?: ParsedLocation,\n) {\n if (options.disabled) {\n return undefined\n }\n const location = nextLocation?.maskedLocation ?? nextLocation\n\n // Use publicHref - it contains the correct href for display\n // When a rewrite changes the origin, publicHref is the full URL\n // Otherwise it's the origin-stripped path\n // This avoids constructing URL objects in the hot path\n const publicHref = location?.publicHref\n if (!publicHref) return undefined\n\n const external = location?.external\n if (external) return publicHref\n\n return router.history.createHref(publicHref) || '/'\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 LinkHTMLAttributes\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 (TComp extends keyof HTMLElementTagNameMap\n ? LinkHTMLAttributes\n : PropsOfComponent<TComp>) & {\n [key: `data-${string}`]: unknown\n }\n>\n\nexport interface ActiveLinkOptionProps<TComp = 'a'> {\n /**\n * A function that returns additional props for the `active` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `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?: Vue.VNodeChild | ((state: { isActive: boolean }) => Vue.VNodeChild)\n}\n\ntype LinkComponentVueProps<TComp> = TComp extends keyof HTMLElementTagNameMap\n ? Omit<LinkHTMLAttributes, keyof CreateLinkProps>\n : Omit<PropsOfComponent<TComp>, keyof CreateLinkProps>\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<\n in out TComp,\n in out TDefaultFrom extends string = string,\n> = <\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = TDefaultFrom,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => 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(LinkImpl, { ...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 'preloadIntentProximity',\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 const allProps = { ...props, ...attrs }\n const linkPropsSource = useLinkProps(allProps) as\n | LinkHTMLAttributes\n | Vue.ComputedRef<LinkHTMLAttributes>\n\n return () => {\n const Component = props._asChild || 'a'\n\n const linkProps = Vue.unref(linkPropsSource)\n\n const isActive = linkProps['data-status'] === 'active'\n\n // Create the slot content or empty array if no default slot\n const slotContent = slots.default ? slots.default({ isActive }) : []\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.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 Vue.Component<unknown> &\n Vue.Component<CreateLinkProps> &\n LinkComponent<'a'>\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"],"mappings":"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"} | ||
| {"version":3,"file":"link.js","names":["Vue","deepEqual","exactPathTest","hasKeys","isDangerousProtocol","preloadWarning","removeTrailingSlash","isServer","useStore","useRouter","useIntersectionObserver","timeoutMap","WeakMap","useLinkProps","options","useLinkPropsImpl","getOptions","router","renderFetchedHref","console","warn","computed","type","URL","to","ref","value","getExternalLinkProps","next","buildLocation","href","getHref","isActive","getIsActive","stores","location","get","activeOptions","resolvedActiveProps","resolvedInactiveProps","resolvedClassName","resolvedStyle","resolveStyleProps","result","combineResultProps","currentLocation","shallowRef","l","equal","prev","watchEffect","onCleanup","store","subscription","subscribe","unsubscribe","opts","_fromLocation","preload","reloadDocument","disabled","defaultPreload","preloadDelay","defaultPreloadDelay","doPreload","preloadRoute","_builtLocation","catch","err","pendingPreload","enqueuePreload","e","clearTimeout","delete","undefined","isIntersecting","preloadMode","has","scheduledHref","set","setTimeout","nextHref","handleClick","elementTarget","currentTarget","getAttribute","effectiveTarget","target","isCtrlEvent","defaultPrevented","button","preventDefault","navigate","replace","resetScroll","hashScrollIntoView","startTransition","viewTransition","ignoreBlocker","handleTouchStart","handleLeave","composeEventHandlers","getUserHandler","handler","event","resolvedStyleProps","staticEventHandlers","onClick","onBlur","onFocus","onMouseenter","getLinkEventHandlers","onMouseover","onMouseleave","onMouseout","onTouchstart","computedProps","activeProps","class","style","inactiveProps","classes","filter","Boolean","length","join","Object","assign","getPropsSafeToSpread","_asChild","role","key","keys","dangerous","protocolAllowlist","process","env","NODE_ENV","eventHandlers","onMouseEnter","onMouseLeave","onMouseOver","onMouseOut","onTouchStart","_activeProps","_inactiveProps","_activeOptions","_to","_preload","_preloadDelay","preloadIntentProximity","_preloadIntentProximity","_hashScrollIntoView","_replace","_startTransition","_resetScroll","_viewTransition","children","_children","_target","_disabled","_style","_class","_onClick","_onBlur","_onFocus","_onMouseEnter","_onMouseenter","_onMouseLeave","_onMouseleave","_onMouseOver","_onMouseover","_onMouseOut","_onMouseout","_onTouchStart","_onTouchstart","_ignoreBlocker","params","_params","search","_search","hash","_hash","state","_state","mask","_mask","_reloadDocument","unsafeRelative","_unsafeRelative","__asChild","from","_from","additionalProps","_additionalProps","propsSafeToSpread","loc","nextLoc","exact","testExact","pathname","basepath","currentPath","nextPath","pathIsFuzzyEqual","startsWith","includeSearch","searchTest","partial","ignoreUndefined","explicitUndefined","includeHash","nextLocation","maskedLocation","publicHref","external","history","createHref","createLink","Comp","defineComponent","name","inheritAttrs","setup","_","attrs","slots","h","LinkImpl","props","attrsSnapshot","onBeforeUpdate","previous","some","is","allProps","linkPropsSource","Component","linkProps","unref","slotContent","default","svgLinkProps","Link","metaKey","altKey","ctrlKey","shiftKey","linkOptions"],"sources":["../../src/link.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport {\n deepEqual,\n exactPathTest,\n hasKeys,\n isDangerousProtocol,\n preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\n\nimport { useStore } from '@tanstack/vue-store'\nimport { useRouter } from './useRouter'\nimport { useIntersectionObserver } from './utils'\n\nimport type {\n AnyRouter,\n Constrain,\n LinkOptions,\n ParsedLocation,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type { AnchorHTMLAttributes, ReservedProps } from '@vue/runtime-dom'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\n\ntype EventHandler<TEvent = Event> = (e: TEvent) => void\n\nconst timeoutMap = new WeakMap<object, ReturnType<typeof setTimeout>>()\n\ntype DataAttributes = {\n [K in `data-${string}`]?: unknown\n}\n\ntype LinkHTMLAttributes = AnchorHTMLAttributes &\n ReservedProps &\n DataAttributes & {\n // Vue's runtime-dom types use lowercase event names.\n // Also accept 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\n // `disabled` is not a valid <a> attribute, but is useful when using `asChild`.\n disabled?: boolean\n }\n\ntype VueStyleLinkEventHandlers = {\n onMouseenter?: EventHandler<MouseEvent>\n onMouseleave?: EventHandler<MouseEvent>\n onMouseover?: EventHandler<MouseEvent>\n onMouseout?: EventHandler<MouseEvent>\n onTouchstart?: EventHandler<TouchEvent>\n}\n\ntype LinkEventHandlers = {\n onClick: EventHandler<PointerEvent>\n onBlur: EventHandler<FocusEvent>\n onFocus: EventHandler<FocusEvent>\n onMouseenter: EventHandler<MouseEvent>\n onMouseleave: EventHandler<MouseEvent>\n onMouseover: EventHandler<MouseEvent>\n onMouseout: EventHandler<MouseEvent>\n onTouchstart: EventHandler<TouchEvent>\n}\n\ninterface StyledProps {\n class?: LinkHTMLAttributes['class']\n style?: LinkHTMLAttributes['style']\n [key: string]: unknown\n}\n\ntype PropsOfComponent<TComp> =\n // Functional components\n TComp extends (props: infer P, ...args: Array<unknown>) => any\n ? P\n : // Vue components (defineComponent, class components, etc)\n TComp extends Vue.Component<infer P>\n ? P\n : Record<string, unknown>\n\ntype AnyLinkPropsOptions = UseLinkPropsOptions<any, any, any, any, any> & {\n _asChild?: unknown\n}\ntype LinkEventOptions = AnyLinkPropsOptions & Partial<VueStyleLinkEventHandlers>\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): LinkHTMLAttributes {\n return useLinkPropsImpl(() => options as AnyLinkPropsOptions)\n}\n\nfunction useLinkPropsImpl(\n getOptions: () => AnyLinkPropsOptions,\n): LinkHTMLAttributes {\n const router = useRouter()\n let renderFetchedHref: string | undefined\n\n // Ensure router is defined before proceeding\n if (!router) {\n console.warn('useRouter must be used inside a <RouterProvider> component!')\n return Vue.computed(() => ({})) as unknown as LinkHTMLAttributes\n }\n\n // Determine if the link is external or internal\n const type = Vue.computed(() => {\n const options = getOptions()\n try {\n new URL(`${options.to}`)\n return 'external'\n } catch {\n return 'internal'\n }\n })\n\n const ref = Vue.ref<Element | null>(null)\n\n // During SSR we render exactly once and do not need reactivity.\n // Avoid store subscriptions, effects and observers on the server.\n if (isServer ?? router.isServer) {\n const options = getOptions()\n if (type.value === 'external') {\n return Vue.ref(\n getExternalLinkProps(options, router, ref),\n ) as unknown as LinkHTMLAttributes\n }\n\n const next = router.buildLocation(options as any)\n const href = getHref(options, router, next)\n\n const isActive = getIsActive(\n router.stores.location.get(),\n next,\n options.activeOptions,\n router,\n )\n\n const {\n resolvedActiveProps,\n resolvedInactiveProps,\n resolvedClassName,\n resolvedStyle,\n } = resolveStyleProps(options, isActive)\n\n const result = combineResultProps({\n href,\n options,\n isActive,\n resolvedActiveProps,\n resolvedInactiveProps,\n resolvedClassName,\n resolvedStyle,\n })\n\n return Vue.ref(\n result as LinkHTMLAttributes,\n ) as unknown as LinkHTMLAttributes\n }\n\n const currentLocation: Vue.Ref<\n ReturnType<typeof router.stores.location.get>\n > =\n type.value === 'external'\n ? Vue.shallowRef(router.stores.location.get())\n : (useStore(router.stores.location, (l) => l, {\n equal: (prev, next) => prev.href === next.href,\n }) as Vue.Ref<ReturnType<typeof router.stores.location.get>>)\n\n // Links that start external skip useStore above. Subscribe if they later\n // become internal so active state follows subsequent location changes.\n if (type.value === 'external') {\n Vue.watchEffect((onCleanup) => {\n if (type.value === 'external') {\n return\n }\n\n const store = router.stores.location\n const subscription = store.subscribe((location) => {\n if (currentLocation.value.href !== location.href) {\n currentLocation.value = location\n }\n })\n onCleanup(() => subscription.unsubscribe())\n })\n }\n\n const next = Vue.computed(() => {\n // Rebuild when inherited search/hash or the current route context changes.\n\n const options = getOptions()\n const opts = { _fromLocation: currentLocation.value, ...options }\n return router.buildLocation(opts)\n })\n\n const preload = Vue.computed(() => {\n const options = getOptions()\n if (\n type.value === 'external' ||\n options.reloadDocument ||\n options.disabled\n ) {\n return false\n }\n return options.preload ?? router.options.defaultPreload\n })\n\n const preloadDelay = Vue.computed(\n () => getOptions().preloadDelay ?? router.options.defaultPreloadDelay ?? 0,\n )\n\n const isActive = Vue.computed(() => {\n const options = getOptions()\n return getIsActive(\n currentLocation.value,\n next.value,\n options.activeOptions,\n router,\n )\n })\n\n const doPreload = () => {\n const options = getOptions()\n return router\n .preloadRoute({ ...options, _builtLocation: next.value } as any)\n .catch((err: any) => {\n console.warn(err)\n console.warn(preloadWarning)\n })\n }\n\n let pendingPreload: 'intent' | 'viewport' | undefined\n\n const enqueuePreload = (\n e?: MouseEvent | FocusEvent | IntersectionObserverEntry,\n ) => {\n if (!e) {\n clearTimeout(timeoutMap.get(ref))\n timeoutMap.delete(ref)\n pendingPreload = undefined\n return\n }\n\n const isIntersecting = (e as IntersectionObserverEntry).isIntersecting\n const preloadMode = isIntersecting === undefined ? 'intent' : 'viewport'\n if (preload.value !== preloadMode || isIntersecting === false) {\n if (isIntersecting === false && pendingPreload === 'viewport') {\n clearTimeout(timeoutMap.get(ref))\n timeoutMap.delete(ref)\n pendingPreload = undefined\n }\n return\n }\n\n if (!preloadDelay.value) {\n doPreload()\n return\n }\n\n if (!timeoutMap.has(ref)) {\n const scheduledHref = next.value.href\n pendingPreload = preloadMode\n timeoutMap.set(\n ref,\n setTimeout(() => {\n timeoutMap.delete(ref)\n pendingPreload = undefined\n if (\n preload.value === preloadMode &&\n next.value.href === scheduledHref\n ) {\n doPreload()\n }\n }, preloadDelay.value),\n )\n }\n }\n\n useIntersectionObserver(\n ref,\n enqueuePreload,\n () => preload.value !== 'viewport',\n )\n\n Vue.watchEffect(() => {\n if (preload.value !== 'render') {\n return\n }\n\n const nextHref = next.value.href\n if (nextHref && renderFetchedHref !== nextHref) {\n renderFetchedHref = nextHref\n doPreload()\n }\n })\n\n // The click handler\n const handleClick = (e: PointerEvent): void => {\n if (type.value === 'external') {\n return\n }\n\n const options = getOptions()\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.reloadDocument) {\n return\n }\n\n e.preventDefault()\n\n // All is well? Navigate!\n router.navigate({\n ...options,\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 })\n }\n }\n\n const handleTouchStart = () => {\n if (preload.value === 'intent') {\n doPreload()\n }\n }\n\n const handleLeave = () => {\n if (pendingPreload === 'intent') {\n clearTimeout(timeoutMap.get(ref))\n timeoutMap.delete(ref)\n pendingPreload = undefined\n }\n }\n\n function composeEventHandlers<T extends Event>(\n getUserHandler: () => EventHandler<T> | undefined,\n handler: EventHandler<T>,\n ): (e: T) => void {\n return (event: T) => {\n getUserHandler()?.(event)\n handler(event)\n }\n }\n\n // Get the active and inactive props\n const resolvedStyleProps = Vue.computed(() => {\n const options = getOptions()\n return resolveStyleProps(options, isActive.value)\n })\n\n const href = Vue.computed(() => {\n const options = getOptions()\n return getHref(options, router, next.value)\n })\n\n // Create static event handlers that don't change between renders\n const staticEventHandlers: LinkEventHandlers = {\n onClick: composeEventHandlers(() => getOptions().onClick, handleClick),\n onBlur: composeEventHandlers(() => getOptions().onBlur, handleLeave),\n onFocus: composeEventHandlers(() => getOptions().onFocus, enqueuePreload),\n onMouseenter: composeEventHandlers(\n () => getLinkEventHandlers(getOptions() as LinkEventOptions).onMouseenter,\n enqueuePreload,\n ),\n onMouseover: composeEventHandlers(\n () => getLinkEventHandlers(getOptions() as LinkEventOptions).onMouseover,\n enqueuePreload,\n ),\n onMouseleave: composeEventHandlers(\n () => getLinkEventHandlers(getOptions() as LinkEventOptions).onMouseleave,\n handleLeave,\n ),\n onMouseout: composeEventHandlers(\n () => getLinkEventHandlers(getOptions() as LinkEventOptions).onMouseout,\n handleLeave,\n ),\n onTouchstart: composeEventHandlers(\n () => getLinkEventHandlers(getOptions() as LinkEventOptions).onTouchstart,\n handleTouchStart,\n ),\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<LinkHTMLAttributes>(() => {\n const options = getOptions()\n if (type.value === 'external') {\n return getExternalLinkProps(options, router, ref, staticEventHandlers)\n }\n\n const {\n resolvedActiveProps,\n resolvedInactiveProps,\n resolvedClassName,\n resolvedStyle,\n } = resolvedStyleProps.value\n return combineResultProps({\n href: href.value,\n options,\n ref,\n staticEventHandlers,\n isActive: isActive.value,\n resolvedActiveProps,\n resolvedInactiveProps,\n resolvedClassName,\n resolvedStyle,\n })\n })\n\n // Return the computed ref itself - callers should access .value\n return computedProps as unknown as LinkHTMLAttributes\n}\n\nfunction resolveStyleProps(options: AnyLinkPropsOptions, isActive: boolean) {\n const activeProps = options.activeProps || (() => ({ class: 'active' }))\n const resolvedActiveProps: StyledProps = (isActive\n ? typeof activeProps === 'function'\n ? activeProps()\n : activeProps\n : {}) || { class: undefined, style: undefined }\n\n const inactiveProps = options.inactiveProps || (() => ({}))\n\n const resolvedInactiveProps: StyledProps = (isActive\n ? {}\n : typeof inactiveProps === 'function'\n ? inactiveProps()\n : inactiveProps) || { class: undefined, style: undefined }\n\n const classes = [\n options.class,\n resolvedActiveProps?.class,\n resolvedInactiveProps?.class,\n ].filter(Boolean)\n const resolvedClassName = classes.length ? classes.join(' ') : undefined\n\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?.style) {\n Object.assign(result, resolvedActiveProps.style)\n }\n\n if (resolvedInactiveProps?.style) {\n Object.assign(result, resolvedInactiveProps.style)\n }\n\n const resolvedStyle = hasKeys(result) ? result : undefined\n return {\n resolvedActiveProps,\n resolvedInactiveProps,\n resolvedClassName,\n resolvedStyle,\n }\n}\n\nfunction combineResultProps({\n href,\n options,\n isActive,\n resolvedActiveProps,\n resolvedInactiveProps,\n resolvedClassName,\n resolvedStyle,\n ref,\n staticEventHandlers,\n}: {\n initial?: LinkHTMLAttributes\n href: string | undefined\n options: AnyLinkPropsOptions\n isActive: boolean\n resolvedActiveProps: StyledProps\n resolvedInactiveProps: StyledProps\n resolvedClassName?: string\n resolvedStyle?: Record<string, string | number>\n ref?: Vue.VNodeRef | undefined\n staticEventHandlers?: LinkEventHandlers\n}) {\n const result: Record<string, unknown> = {\n ...getPropsSafeToSpread(options),\n ref,\n ...staticEventHandlers,\n href,\n disabled: options._asChild ? !!options.disabled : undefined,\n target: options.target,\n }\n\n if (resolvedStyle) {\n result.style = resolvedStyle\n }\n\n if (resolvedClassName) {\n result.class = resolvedClassName\n }\n\n if (options.disabled) {\n result.role = 'link'\n result['aria-disabled'] = true\n }\n\n if (isActive) {\n result['data-status'] = 'active'\n result['aria-current'] = 'page'\n }\n\n for (const key of Object.keys(resolvedActiveProps)) {\n if (key !== 'class' && key !== 'style') {\n result[key] = resolvedActiveProps[key]\n }\n }\n\n for (const key of Object.keys(resolvedInactiveProps)) {\n if (key !== 'class' && key !== 'style') {\n result[key] = resolvedInactiveProps[key]\n }\n }\n return result\n}\n\nfunction getExternalLinkProps(\n options: AnyLinkPropsOptions,\n router: AnyRouter,\n ref: Vue.Ref<Element | null>,\n staticEventHandlers?: LinkEventHandlers,\n): LinkHTMLAttributes {\n const dangerous = isDangerousProtocol(\n options.to as string,\n router.protocolAllowlist,\n )\n if (dangerous && process.env.NODE_ENV !== 'production') {\n console.warn(`Blocked Link with dangerous protocol: ${options.to}`)\n }\n\n const eventHandlers = getLinkEventHandlers(options as LinkEventOptions)\n const result: Record<string, unknown> = {\n ...getPropsSafeToSpread(options),\n ref,\n href: dangerous || options.disabled ? undefined : options.to,\n target: options.target,\n disabled: options._asChild ? !!options.disabled : undefined,\n style: options.style,\n class: options.class,\n onClick: staticEventHandlers?.onClick ?? options.onClick,\n onBlur: staticEventHandlers?.onBlur ?? options.onBlur,\n onFocus: staticEventHandlers?.onFocus ?? options.onFocus,\n onMouseenter:\n staticEventHandlers?.onMouseenter ?? eventHandlers.onMouseenter,\n onMouseleave:\n staticEventHandlers?.onMouseleave ?? eventHandlers.onMouseleave,\n onMouseover: staticEventHandlers?.onMouseover ?? eventHandlers.onMouseover,\n onMouseout: staticEventHandlers?.onMouseout ?? eventHandlers.onMouseout,\n onTouchstart:\n staticEventHandlers?.onTouchstart ?? eventHandlers.onTouchstart,\n }\n\n if (options.disabled) {\n result.role = 'link'\n result['aria-disabled'] = true\n }\n\n for (const key of Object.keys(result)) {\n if (result[key] === undefined) {\n delete result[key]\n }\n }\n\n return result as LinkHTMLAttributes\n}\n\nfunction getLinkEventHandlers(\n options: LinkEventOptions,\n): VueStyleLinkEventHandlers {\n return {\n onMouseenter: options.onMouseEnter ?? options.onMouseenter,\n onMouseleave: options.onMouseLeave ?? options.onMouseleave,\n onMouseover: options.onMouseOver ?? options.onMouseover,\n onMouseout: options.onMouseOut ?? options.onMouseout,\n onTouchstart: options.onTouchStart ?? options.onTouchstart,\n }\n}\n\nconst getPropsSafeToSpread = (options: AnyLinkPropsOptions) => {\n const {\n activeProps: _activeProps,\n inactiveProps: _inactiveProps,\n activeOptions: _activeOptions,\n to: _to,\n preload: _preload,\n preloadDelay: _preloadDelay,\n preloadIntentProximity: _preloadIntentProximity,\n hashScrollIntoView: _hashScrollIntoView,\n replace: _replace,\n startTransition: _startTransition,\n resetScroll: _resetScroll,\n viewTransition: _viewTransition,\n children: _children,\n target: _target,\n disabled: _disabled,\n style: _style,\n class: _class,\n onClick: _onClick,\n onBlur: _onBlur,\n onFocus: _onFocus,\n onMouseEnter: _onMouseEnter,\n onMouseenter: _onMouseenter,\n onMouseLeave: _onMouseLeave,\n onMouseleave: _onMouseleave,\n onMouseOver: _onMouseOver,\n onMouseover: _onMouseover,\n onMouseOut: _onMouseOut,\n onMouseout: _onMouseout,\n onTouchStart: _onTouchStart,\n onTouchstart: _onTouchstart,\n ignoreBlocker: _ignoreBlocker,\n params: _params,\n search: _search,\n hash: _hash,\n state: _state,\n mask: _mask,\n reloadDocument: _reloadDocument,\n unsafeRelative: _unsafeRelative,\n _asChild: __asChild,\n from: _from,\n additionalProps: _additionalProps,\n ...propsSafeToSpread\n } = options as AnyLinkPropsOptions & {\n additionalProps?: unknown\n children?: unknown\n _asChild?: unknown\n }\n\n return propsSafeToSpread\n}\n\nfunction getIsActive(\n loc: {\n pathname: string\n search: any\n hash: string\n },\n nextLoc: {\n pathname: string\n search: any\n hash: string\n },\n activeOptions: LinkOptions['activeOptions'],\n router: AnyRouter,\n) {\n if (activeOptions?.exact) {\n const testExact = exactPathTest(\n loc.pathname,\n nextLoc.pathname,\n router.basepath,\n )\n if (!testExact) {\n return false\n }\n } else {\n const currentPath = removeTrailingSlash(loc.pathname, router.basepath)\n const nextPath = removeTrailingSlash(nextLoc.pathname, router.basepath)\n\n const pathIsFuzzyEqual =\n currentPath.startsWith(nextPath) &&\n (currentPath.length === nextPath.length ||\n currentPath[nextPath.length] === '/')\n if (!pathIsFuzzyEqual) {\n return false\n }\n }\n\n if (activeOptions?.includeSearch ?? true) {\n const searchTest = deepEqual(loc.search, nextLoc.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 loc.hash === nextLoc.hash\n }\n return true\n}\n\nfunction getHref(\n options: AnyLinkPropsOptions,\n router: AnyRouter,\n nextLocation?: ParsedLocation,\n) {\n if (options.disabled) {\n return undefined\n }\n const location = nextLocation?.maskedLocation ?? nextLocation\n\n // Use publicHref - it contains the correct href for display\n // When a rewrite changes the origin, publicHref is the full URL\n // Otherwise it's the origin-stripped path\n // This avoids constructing URL objects in the hot path\n const publicHref = location?.publicHref\n if (!publicHref) return undefined\n\n const external = location?.external\n if (external) return publicHref\n\n return router.history.createHref(publicHref) || '/'\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 LinkHTMLAttributes\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 (TComp extends keyof HTMLElementTagNameMap\n ? LinkHTMLAttributes\n : PropsOfComponent<TComp>) & {\n [key: `data-${string}`]: unknown\n }\n>\n\nexport interface ActiveLinkOptionProps<TComp = 'a'> {\n /**\n * A function that returns additional props for the `active` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `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?: Vue.VNodeChild | ((state: { isActive: boolean }) => Vue.VNodeChild)\n}\n\ntype LinkComponentVueProps<TComp> = TComp extends keyof HTMLElementTagNameMap\n ? Omit<LinkHTMLAttributes, keyof CreateLinkProps>\n : Omit<PropsOfComponent<TComp>, keyof CreateLinkProps>\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<\n in out TComp,\n in out TDefaultFrom extends string = string,\n> = <\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = TDefaultFrom,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => 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(LinkImpl, { ...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 'preloadIntentProximity',\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 const attrsSnapshot = Vue.shallowRef({ ...attrs })\n Vue.onBeforeUpdate(() => {\n const keys = Object.keys(attrs)\n const previous = attrsSnapshot.value\n if (\n keys.length !== Object.keys(previous).length ||\n keys.some((key) => !Object.is(attrs[key], previous[key]))\n ) {\n attrsSnapshot.value = { ...attrs }\n }\n })\n\n // Keep a plain cached snapshot so location-only updates do not repeatedly\n // cross Vue's props and attrs proxies for every link computation.\n const allProps = Vue.computed(() => ({\n ...props,\n ...attrsSnapshot.value,\n }))\n const linkPropsSource = useLinkPropsImpl(() => allProps.value) as\n | LinkHTMLAttributes\n | Vue.ComputedRef<LinkHTMLAttributes>\n\n return () => {\n const Component = props._asChild || 'a'\n\n const linkProps = Vue.unref(linkPropsSource)\n\n const isActive = linkProps['data-status'] === 'active'\n\n // Create the slot content or empty array if no default slot\n const slotContent = slots.default ? slots.default({ isActive }) : []\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.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 Vue.Component<unknown> &\n Vue.Component<CreateLinkProps> &\n LinkComponent<'a'>\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"],"mappings":"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"} |
@@ -78,3 +78,3 @@ import { nonRouteComponentContext, renderInNonRouteComponentContext } from "./nonRouteComponentContext.js"; | ||
| const remountFn = router.routesById[matchRouteId].options.remountDeps ?? router.options.defaultRemountDeps; | ||
| const remountDeps = remountFn ? remountFn({ | ||
| return [match, remountFn ? JSON.stringify(remountFn({ | ||
| routeId: matchRouteId, | ||
@@ -84,4 +84,3 @@ loaderDeps: match.loaderDeps, | ||
| search: match._strictSearch | ||
| }) : void 0; | ||
| return [match, remountDeps ? JSON.stringify(remountDeps) : void 0]; | ||
| })) : void 0]; | ||
| }); | ||
@@ -132,13 +131,12 @@ return () => { | ||
| const route = router.routesById[parentRouteId]; | ||
| const childMatch = useStore(router.stores.matches, (matches) => { | ||
| const child = matches[matches.findIndex((match) => match.routeId === parentRouteId) + 1]; | ||
| return child ? [child.routeId, child.routeId + JSON.stringify(child._strictParams)] : void 0; | ||
| const childRouteId = useStore(router.stores.matches, (matches) => { | ||
| return matches[matches.findIndex((match) => match.routeId === parentRouteId) + 1]?.routeId; | ||
| }); | ||
| return () => { | ||
| if (parentMatch.value?._notFound) return renderRouteNotFound(router, route, parentMatch.value.error); | ||
| const child = childMatch.value; | ||
| const child = childRouteId.value; | ||
| if (!child) return null; | ||
| return Vue.h(Match, { | ||
| routeId: child[0], | ||
| key: child[1] | ||
| routeId: child, | ||
| key: child | ||
| }); | ||
@@ -145,0 +143,0 @@ }; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"Match.js","names":["Vue","isNotFound","rootRouteId","isServer","useStore","CatchBoundary","ClientOnly","useRouter","CatchNotFound","routeIdContext","renderRouteNotFound","ScrollRestoration","nonRouteComponentContext","renderInNonRouteComponentContext","Match","defineComponent","name","props","routeId","type","String","required","setup","router","activeMatch","stores","getMatchStore","value","equal","Object","is","provide","match","route","routesById","undefined","PendingComponent","options","pendingComponent","defaultPendingComponent","pendingElement","process","env","NODE_ENV","h","routeErrorComponent","errorComponent","defaultErrorComponent","routeOnCatch","onCatch","defaultOnCatch","routeNotFoundComponent","isRoot","notFoundComponent","notFoundRoute","component","ShellComponent","shellComponent","resolvedNoSsr","ssr","renderMatchContent","matchInner","MatchInner","content","fallback","default","error","children","getResetKey","console","warn","id","parentRoute","Fragment","scrollRestoration","inject","combinedState","computed","matchRouteId","remountFn","remountDeps","defaultRemountDeps","loaderDeps","params","_strictParams","search","_strictSearch","JSON","stringify","state","remountKey","status","RouteErrorComponent","errorProps","reset","invalidate","info","componentStack","Comp","defaultComponent","key","Outlet","nonRouteComponent","watch","immediate","parentRouteId","parentMatch","childMatch","matches","index","findIndex","child","_notFound","nextMatch"],"sources":["../../src/Match.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { isNotFound, rootRouteId } from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useStore } from '@tanstack/vue-store'\nimport { CatchBoundary } from './CatchBoundary'\nimport { ClientOnly } from './ClientOnly'\nimport { useRouter } from './useRouter'\nimport { CatchNotFound } from './not-found'\nimport { routeIdContext } from './matchContext'\nimport { renderRouteNotFound } from './renderRouteNotFound'\nimport { ScrollRestoration } from './scroll-restoration'\nimport {\n nonRouteComponentContext,\n renderInNonRouteComponentContext,\n} from './nonRouteComponentContext'\nimport type { VNode } from 'vue'\nimport type { AnyRoute, RootRouteOptions } from '@tanstack/router-core'\n\nexport const Match = Vue.defineComponent({\n name: 'Match',\n props: {\n routeId: {\n type: String,\n required: true,\n },\n },\n setup(props) {\n const router = useRouter()\n\n const routeId = props.routeId\n\n const activeMatch = useStore(\n router.stores.getMatchStore(routeId),\n (value) => value,\n { equal: Object.is },\n )\n // Provide routeId context (stable string) for children.\n // MatchInner, Outlet, and useMatch all consume this.\n Vue.provide(routeIdContext, routeId)\n\n return (): VNode => {\n const match = activeMatch.value\n const route = match ? (router.routesById[routeId] as AnyRoute) : undefined\n const PendingComponent =\n route?.options.pendingComponent ??\n router.options.defaultPendingComponent\n const pendingElement = PendingComponent\n ? process.env.NODE_ENV !== 'production'\n ? renderInNonRouteComponentContext(\n PendingComponent,\n undefined,\n 'pendingComponent',\n )\n : Vue.h(PendingComponent)\n : undefined\n const routeErrorComponent =\n route?.options.errorComponent ?? router.options.defaultErrorComponent\n const routeOnCatch =\n route?.options.onCatch ?? router.options.defaultOnCatch\n const routeNotFoundComponent = route?.isRoot\n ? (route.options.notFoundComponent ??\n router.options.notFoundRoute?.options.component)\n : route?.options.notFoundComponent\n const ShellComponent = route?.isRoot\n ? ((route.options as RootRouteOptions).shellComponent as any)\n : undefined\n const resolvedNoSsr = match?.ssr === false || match?.ssr === 'data-only'\n\n const renderMatchContent = (): VNode => {\n const matchInner = Vue.h(MatchInner)\n\n let content: VNode = resolvedNoSsr\n ? Vue.h(\n ClientOnly,\n {\n fallback: pendingElement,\n },\n {\n default: () => matchInner,\n },\n )\n : matchInner\n\n // Wrap in NotFound boundary if needed\n if (routeNotFoundComponent) {\n content = Vue.h(CatchNotFound, {\n fallback: (error: any) => {\n error.routeId ??= routeId\n\n if (error.routeId !== routeId) {\n throw error\n }\n\n return process.env.NODE_ENV !== 'production'\n ? renderInNonRouteComponentContext(\n routeNotFoundComponent,\n error,\n 'notFoundComponent',\n )\n : Vue.h(routeNotFoundComponent, error)\n },\n children: content,\n })\n }\n\n // Wrap in error boundary if needed\n if (routeErrorComponent) {\n content = CatchBoundary({\n getResetKey: () => activeMatch.value,\n errorComponent: routeErrorComponent,\n onCatch: (error: Error) => {\n // Forward not found errors (we don't want to show the error component for these)\n if (isNotFound(error)) {\n error.routeId ??= routeId\n throw error\n }\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Warning: Error in route match: ${match?.id}`)\n }\n routeOnCatch?.(error)\n },\n children: content,\n })\n }\n\n if (route?.parentRoute?.id !== rootRouteId) {\n return content\n }\n\n return Vue.h(Vue.Fragment, null, [\n content,\n Vue.h(Vue.Fragment, null, [\n (isServer ?? router.isServer) && router.options.scrollRestoration\n ? Vue.h(ScrollRestoration)\n : null,\n ]),\n ])\n }\n\n if (!ShellComponent) {\n return renderMatchContent()\n }\n\n return Vue.h(ShellComponent, null, {\n // Important: return a fresh VNode on each slot invocation so that shell\n // components can re-render without reusing a cached VNode instance.\n default: () => renderMatchContent(),\n })\n }\n },\n})\n\n// On Rendered can't happen above the root layout because it actually\nexport const MatchInner = Vue.defineComponent({\n name: 'MatchInner',\n setup() {\n const router = useRouter()\n\n // Use routeId from context (provided by parent Match) — stable string.\n const routeId = Vue.inject(routeIdContext)!\n const activeMatch = useStore(router.stores.getMatchStore(routeId))\n\n // Combined selector for match state AND remount key\n // This ensures both are computed in the same selector call with consistent data\n const combinedState = Vue.computed(() => {\n const match = activeMatch.value\n if (!match) {\n // Route no longer exists - truly navigating away\n return null\n }\n\n const matchRouteId = match.routeId as string\n\n // Compute remount key\n const remountFn =\n (router.routesById[matchRouteId] as AnyRoute).options.remountDeps ??\n router.options.defaultRemountDeps\n\n const remountDeps = remountFn\n ? remountFn({\n routeId: matchRouteId,\n loaderDeps: match.loaderDeps,\n params: match._strictParams,\n search: match._strictSearch,\n })\n : undefined\n\n return [\n match,\n remountDeps ? JSON.stringify(remountDeps) : undefined,\n ] as const\n })\n\n return (): VNode | null => {\n // If match doesn't exist, return null (component is being unmounted or not ready)\n const state = combinedState.value\n if (!state) {\n return null\n }\n const [match, remountKey] = state\n const route = router.routesById[match.routeId]!\n\n // Handle different match statuses\n if (match.status === 'notFound') {\n return renderRouteNotFound(router, route, match.error)\n }\n\n if (match.status === 'error') {\n // Check if this route or any parent has an error component\n const RouteErrorComponent =\n route.options.errorComponent ?? router.options.defaultErrorComponent\n\n // If this route has an error component, render it directly\n // This is more reliable than relying on Vue's error boundary\n if (RouteErrorComponent) {\n const errorProps = {\n error: match.error,\n reset: () => {\n router.invalidate()\n },\n info: {\n componentStack: '',\n },\n }\n return process.env.NODE_ENV !== 'production'\n ? renderInNonRouteComponentContext(\n RouteErrorComponent,\n errorProps,\n 'errorComponent',\n )\n : Vue.h(RouteErrorComponent, errorProps)\n }\n\n // If there's no error component for this route, throw the error\n // so it can bubble up to the nearest parent with an error component\n throw match.error\n }\n\n if (match.status === 'pending') {\n // In Vue, we render the pending component directly instead of throwing a promise\n // because Vue's Suspense doesn't catch thrown promises like React does\n const PendingComponent =\n route.options.pendingComponent ??\n router.options.defaultPendingComponent\n\n if (PendingComponent) {\n return process.env.NODE_ENV !== 'production'\n ? renderInNonRouteComponentContext(\n PendingComponent,\n undefined,\n 'pendingComponent',\n )\n : Vue.h(PendingComponent)\n }\n\n // If no pending component, return null while loading\n return null\n }\n\n // Success status - render the component with remount key\n const Comp = route.options.component ?? router.options.defaultComponent\n if (Comp) {\n // Pass key as a prop - Vue.h properly handles 'key' as a special prop\n return Vue.h(\n Comp,\n remountKey !== undefined ? { key: remountKey } : undefined,\n )\n }\n\n return Vue.h(\n Outlet,\n remountKey !== undefined ? { key: remountKey } : undefined,\n )\n }\n },\n})\n\nexport const Outlet = Vue.defineComponent({\n name: 'Outlet',\n setup() {\n if (process.env.NODE_ENV !== 'production') {\n const nonRouteComponent = Vue.inject(nonRouteComponentContext!, undefined)\n if (nonRouteComponent) {\n Vue.watch(\n nonRouteComponent,\n (component) => {\n console.warn(\n `Warning: An <Outlet /> was rendered inside a ${component}. <Outlet /> should only be rendered inside a route component.`,\n )\n },\n { immediate: true },\n )\n }\n }\n\n const router = useRouter()\n const parentRouteId = Vue.inject(routeIdContext)!\n\n const parentMatch = useStore(router.stores.getMatchStore(parentRouteId))\n\n const route = router.routesById[parentRouteId]!\n\n const childMatch = useStore(router.stores.matches, (matches) => {\n const index = matches.findIndex(\n (match) => match.routeId === parentRouteId,\n )\n const child = matches[index + 1]\n return child\n ? ([\n child.routeId,\n child.routeId + JSON.stringify(child._strictParams),\n ] as const)\n : undefined\n })\n\n return (): VNode | null => {\n if (parentMatch.value?._notFound) {\n return renderRouteNotFound(router, route, parentMatch.value.error)\n }\n\n const child = childMatch.value\n if (!child) {\n return null\n }\n\n const nextMatch = Vue.h(Match, {\n routeId: child[0 /* routeId */],\n // Key based on routeId + params only (not loaderDeps)\n // This ensures component recreates when params change,\n // but NOT when only loaderDeps change\n key: child[1 /* key */],\n })\n\n // Note: We intentionally do NOT wrap in Suspense here.\n // The top-level Suspense in Matches already covers the root.\n // The old code compared matchId (e.g. \"__root__/\") with rootRouteId (\"__root__\")\n // which never matched, so this Suspense was effectively dead code.\n // With routeId-based lookup, parentRouteId === rootRouteId would match,\n // causing a double-Suspense that corrupts Vue's DOM during updates.\n return nextMatch\n }\n },\n})\n"],"mappings":"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"} | ||
| {"version":3,"file":"Match.js","names":["Vue","isNotFound","rootRouteId","isServer","useStore","CatchBoundary","ClientOnly","useRouter","CatchNotFound","routeIdContext","renderRouteNotFound","ScrollRestoration","nonRouteComponentContext","renderInNonRouteComponentContext","Match","defineComponent","name","props","routeId","type","String","required","setup","router","activeMatch","stores","getMatchStore","value","equal","Object","is","provide","match","route","routesById","undefined","PendingComponent","options","pendingComponent","defaultPendingComponent","pendingElement","process","env","NODE_ENV","h","routeErrorComponent","errorComponent","defaultErrorComponent","routeOnCatch","onCatch","defaultOnCatch","routeNotFoundComponent","isRoot","notFoundComponent","notFoundRoute","component","ShellComponent","shellComponent","resolvedNoSsr","ssr","renderMatchContent","matchInner","MatchInner","content","fallback","default","error","children","getResetKey","console","warn","id","parentRoute","Fragment","scrollRestoration","inject","combinedState","computed","matchRouteId","remountFn","remountDeps","defaultRemountDeps","remountKey","JSON","stringify","loaderDeps","params","_strictParams","search","_strictSearch","state","status","RouteErrorComponent","errorProps","reset","invalidate","info","componentStack","Comp","defaultComponent","key","Outlet","nonRouteComponent","watch","immediate","parentRouteId","parentMatch","childRouteId","matches","index","findIndex","_notFound","child","nextMatch"],"sources":["../../src/Match.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { isNotFound, rootRouteId } from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useStore } from '@tanstack/vue-store'\nimport { CatchBoundary } from './CatchBoundary'\nimport { ClientOnly } from './ClientOnly'\nimport { useRouter } from './useRouter'\nimport { CatchNotFound } from './not-found'\nimport { routeIdContext } from './matchContext'\nimport { renderRouteNotFound } from './renderRouteNotFound'\nimport { ScrollRestoration } from './scroll-restoration'\nimport {\n nonRouteComponentContext,\n renderInNonRouteComponentContext,\n} from './nonRouteComponentContext'\nimport type { VNode } from 'vue'\nimport type { AnyRoute, RootRouteOptions } from '@tanstack/router-core'\n\nexport const Match = Vue.defineComponent({\n name: 'Match',\n props: {\n routeId: {\n type: String,\n required: true,\n },\n },\n setup(props) {\n const router = useRouter()\n\n const routeId = props.routeId\n\n const activeMatch = useStore(\n router.stores.getMatchStore(routeId),\n (value) => value,\n { equal: Object.is },\n )\n // Provide routeId context (stable string) for children.\n // MatchInner, Outlet, and useMatch all consume this.\n Vue.provide(routeIdContext, routeId)\n\n return (): VNode => {\n const match = activeMatch.value\n const route = match ? (router.routesById[routeId] as AnyRoute) : undefined\n const PendingComponent =\n route?.options.pendingComponent ??\n router.options.defaultPendingComponent\n const pendingElement = PendingComponent\n ? process.env.NODE_ENV !== 'production'\n ? renderInNonRouteComponentContext(\n PendingComponent,\n undefined,\n 'pendingComponent',\n )\n : Vue.h(PendingComponent)\n : undefined\n const routeErrorComponent =\n route?.options.errorComponent ?? router.options.defaultErrorComponent\n const routeOnCatch =\n route?.options.onCatch ?? router.options.defaultOnCatch\n const routeNotFoundComponent = route?.isRoot\n ? (route.options.notFoundComponent ??\n router.options.notFoundRoute?.options.component)\n : route?.options.notFoundComponent\n const ShellComponent = route?.isRoot\n ? ((route.options as RootRouteOptions).shellComponent as any)\n : undefined\n const resolvedNoSsr = match?.ssr === false || match?.ssr === 'data-only'\n\n const renderMatchContent = (): VNode => {\n const matchInner = Vue.h(MatchInner)\n\n let content: VNode = resolvedNoSsr\n ? Vue.h(\n ClientOnly,\n {\n fallback: pendingElement,\n },\n {\n default: () => matchInner,\n },\n )\n : matchInner\n\n // Wrap in NotFound boundary if needed\n if (routeNotFoundComponent) {\n content = Vue.h(CatchNotFound, {\n fallback: (error: any) => {\n error.routeId ??= routeId\n\n if (error.routeId !== routeId) {\n throw error\n }\n\n return process.env.NODE_ENV !== 'production'\n ? renderInNonRouteComponentContext(\n routeNotFoundComponent,\n error,\n 'notFoundComponent',\n )\n : Vue.h(routeNotFoundComponent, error)\n },\n children: content,\n })\n }\n\n // Wrap in error boundary if needed\n if (routeErrorComponent) {\n content = CatchBoundary({\n getResetKey: () => activeMatch.value,\n errorComponent: routeErrorComponent,\n onCatch: (error: Error) => {\n // Forward not found errors (we don't want to show the error component for these)\n if (isNotFound(error)) {\n error.routeId ??= routeId\n throw error\n }\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Warning: Error in route match: ${match?.id}`)\n }\n routeOnCatch?.(error)\n },\n children: content,\n })\n }\n\n if (route?.parentRoute?.id !== rootRouteId) {\n return content\n }\n\n return Vue.h(Vue.Fragment, null, [\n content,\n Vue.h(Vue.Fragment, null, [\n (isServer ?? router.isServer) && router.options.scrollRestoration\n ? Vue.h(ScrollRestoration)\n : null,\n ]),\n ])\n }\n\n if (!ShellComponent) {\n return renderMatchContent()\n }\n\n return Vue.h(ShellComponent, null, {\n // Important: return a fresh VNode on each slot invocation so that shell\n // components can re-render without reusing a cached VNode instance.\n default: () => renderMatchContent(),\n })\n }\n },\n})\n\n// On Rendered can't happen above the root layout because it actually\nexport const MatchInner = Vue.defineComponent({\n name: 'MatchInner',\n setup() {\n const router = useRouter()\n\n // Use routeId from context (provided by parent Match) — stable string.\n const routeId = Vue.inject(routeIdContext)!\n const activeMatch = useStore(router.stores.getMatchStore(routeId))\n\n // Combined selector for match state AND remount key\n // This ensures both are computed in the same selector call with consistent data\n const combinedState = Vue.computed(() => {\n const match = activeMatch.value\n if (!match) {\n // Route no longer exists - truly navigating away\n return null\n }\n\n const matchRouteId = match.routeId as string\n\n // Compute remount key\n const remountFn =\n (router.routesById[matchRouteId] as AnyRoute).options.remountDeps ??\n router.options.defaultRemountDeps\n\n const remountKey = remountFn\n ? JSON.stringify(\n remountFn({\n routeId: matchRouteId,\n loaderDeps: match.loaderDeps,\n params: match._strictParams,\n search: match._strictSearch,\n }),\n )\n : undefined\n\n return [match, remountKey] as const\n })\n\n return (): VNode | null => {\n // If match doesn't exist, return null (component is being unmounted or not ready)\n const state = combinedState.value\n if (!state) {\n return null\n }\n const [match, remountKey] = state\n const route = router.routesById[match.routeId]!\n\n // Handle different match statuses\n if (match.status === 'notFound') {\n return renderRouteNotFound(router, route, match.error)\n }\n\n if (match.status === 'error') {\n // Check if this route or any parent has an error component\n const RouteErrorComponent =\n route.options.errorComponent ?? router.options.defaultErrorComponent\n\n // If this route has an error component, render it directly\n // This is more reliable than relying on Vue's error boundary\n if (RouteErrorComponent) {\n const errorProps = {\n error: match.error,\n reset: () => {\n router.invalidate()\n },\n info: {\n componentStack: '',\n },\n }\n return process.env.NODE_ENV !== 'production'\n ? renderInNonRouteComponentContext(\n RouteErrorComponent,\n errorProps,\n 'errorComponent',\n )\n : Vue.h(RouteErrorComponent, errorProps)\n }\n\n // If there's no error component for this route, throw the error\n // so it can bubble up to the nearest parent with an error component\n throw match.error\n }\n\n if (match.status === 'pending') {\n // In Vue, we render the pending component directly instead of throwing a promise\n // because Vue's Suspense doesn't catch thrown promises like React does\n const PendingComponent =\n route.options.pendingComponent ??\n router.options.defaultPendingComponent\n\n if (PendingComponent) {\n return process.env.NODE_ENV !== 'production'\n ? renderInNonRouteComponentContext(\n PendingComponent,\n undefined,\n 'pendingComponent',\n )\n : Vue.h(PendingComponent)\n }\n\n // If no pending component, return null while loading\n return null\n }\n\n // Success status - render the component with remount key\n const Comp = route.options.component ?? router.options.defaultComponent\n if (Comp) {\n // Pass key as a prop - Vue.h properly handles 'key' as a special prop\n return Vue.h(\n Comp,\n remountKey !== undefined ? { key: remountKey } : undefined,\n )\n }\n\n return Vue.h(\n Outlet,\n remountKey !== undefined ? { key: remountKey } : undefined,\n )\n }\n },\n})\n\nexport const Outlet = Vue.defineComponent({\n name: 'Outlet',\n setup() {\n if (process.env.NODE_ENV !== 'production') {\n const nonRouteComponent = Vue.inject(nonRouteComponentContext!, undefined)\n if (nonRouteComponent) {\n Vue.watch(\n nonRouteComponent,\n (component) => {\n console.warn(\n `Warning: An <Outlet /> was rendered inside a ${component}. <Outlet /> should only be rendered inside a route component.`,\n )\n },\n { immediate: true },\n )\n }\n }\n\n const router = useRouter()\n const parentRouteId = Vue.inject(routeIdContext)!\n\n const parentMatch = useStore(router.stores.getMatchStore(parentRouteId))\n\n const route = router.routesById[parentRouteId]!\n\n const childRouteId = useStore(router.stores.matches, (matches) => {\n const index = matches.findIndex(\n (match) => match.routeId === parentRouteId,\n )\n return matches[index + 1]?.routeId\n })\n\n return (): VNode | null => {\n if (parentMatch.value?._notFound) {\n return renderRouteNotFound(router, route, parentMatch.value.error)\n }\n\n const child = childRouteId.value\n if (!child) {\n return null\n }\n\n const nextMatch = Vue.h(Match, {\n routeId: child,\n key: child,\n })\n\n // Note: We intentionally do NOT wrap in Suspense here.\n // The top-level Suspense in Matches already covers the root.\n // The old code compared matchId (e.g. \"__root__/\") with rootRouteId (\"__root__\")\n // which never matched, so this Suspense was effectively dead code.\n // With routeId-based lookup, parentRouteId === rootRouteId would match,\n // causing a double-Suspense that corrupts Vue's DOM during updates.\n return nextMatch\n }\n },\n})\n"],"mappings":"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"} |
@@ -92,3 +92,3 @@ import { BaseRootRoute, BaseRoute, BaseRouteApi, AnyContext, AnyRoute, AnyRouter, ConstrainLiteral, ErrorComponentProps, NotFoundError, NotFoundRouteProps, Register, RegisteredRouter, ResolveFullPath, ResolveId, ResolveParams, RootRoute as RootRouteCore, RootRouteId, RootRouteOptions, RouteConstraints, Route as RouteCore, RouteIds, RouteMask, RouteOptions, RouteTypesById, RouterCore, ToMaskOptions, UseNavigateResult } from '@tanstack/router-core'; | ||
| export type AsyncRouteComponent<TProps> = SyncRouteComponent<TProps> & { | ||
| preload?: () => Promise<void>; | ||
| preload?: () => Promise<void> | undefined; | ||
| }; | ||
@@ -95,0 +95,0 @@ export type RouteComponent<TProps = any> = AsyncRouteComponent<TProps>; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"route.js","names":[],"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 { useRouteContext } from './useRouteContext'\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 useRouteContext({ ...(opts as any), from: this.id })\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 useRouteContext({ ...(opts as any), from: this.id })\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)\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 useRouteContext({ ...(opts as any), from: this.id })\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(Link, { from: this.fullPath as never, ...props }, ctx?.slots)\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"],"mappings":"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"} | ||
| {"version":3,"file":"route.js","names":[],"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 { useRouteContext } from './useRouteContext'\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 useRouteContext({ ...(opts as any), from: this.id })\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 useRouteContext({ ...(opts as any), from: this.id })\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)\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 useRouteContext({ ...(opts as any), from: this.id })\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(Link, { from: this.fullPath as never, ...props }, ctx?.slots)\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> | undefined\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"],"mappings":"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"} |
@@ -9,8 +9,9 @@ import { useRouter } from "./useRouter.js"; | ||
| if (isServer ?? router.isServer) return; | ||
| const transition = async (fn) => { | ||
| let transitionOwner; | ||
| router.startTransition = async (fn, expected) => { | ||
| transitionOwner = expected; | ||
| fn(); | ||
| await Vue.nextTick(); | ||
| return true; | ||
| return transitionOwner === expected; | ||
| }; | ||
| router.startTransition = transition; | ||
| Vue.onMounted(() => { | ||
@@ -17,0 +18,0 @@ Vue.onUnmounted(router.history.subscribe(router.load)); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"Transitioner.js","names":["Vue","getLocationChangeInfo","trimPathRight","isServer","useRouter","useTransitionerSetup","router","transition","fn","nextTick","startTransition","onMounted","onUnmounted","history","subscribe","load","nextLocation","buildLocation","to","latestLocation","pathname","search","params","hash","state","_includeValidateSearch","publicHref","commitLocation","replace","ignoreBlocker","resolvedLocation","stores","get","href","__TSR_key","emit","type","_tx","catch","console","error","Transitioner","defineComponent","name","setup"],"sources":["../../src/Transitioner.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { getLocationChangeInfo, trimPathRight } from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\n\nexport function useTransitionerSetup() {\n const router = useRouter()\n if (isServer ?? router.isServer) {\n return\n }\n\n const transition = async (fn: () => void) => {\n fn()\n await Vue.nextTick()\n return true\n }\n router.startTransition = transition\n\n Vue.onMounted(() => {\n Vue.onUnmounted(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.publicHref) !==\n trimPathRight(nextLocation.publicHref)\n ) {\n router.commitLocation({\n ...nextLocation,\n replace: true,\n ignoreBlocker: true,\n })\n return\n }\n\n const resolvedLocation = router.stores.resolvedLocation.get()\n if (\n resolvedLocation?.href === router.latestLocation.href &&\n resolvedLocation.state.__TSR_key === router.latestLocation.state.__TSR_key\n ) {\n router.emit({\n type: 'onRendered',\n ...getLocationChangeInfo(resolvedLocation, resolvedLocation),\n })\n } else if (!router._tx) {\n router.load().catch(console.error)\n }\n })\n}\n\n/** @deprecated Use useTransitionerSetup() instead. */\nexport const Transitioner = Vue.defineComponent({\n name: 'Transitioner',\n setup() {\n useTransitionerSetup()\n return () => null\n },\n})\n"],"mappings":";;;;;AAKA,SAAgBK,uBAAuB;CACrC,MAAMC,SAASF,UAAU;CACzB,IAAID,YAAYG,OAAOH,UACrB;CAGF,MAAMI,aAAa,OAAOC,OAAmB;EAC3CA,GAAG;EACH,MAAMR,IAAIS,SAAS;EACnB,OAAO;CACT;CACAH,OAAOI,kBAAkBH;CAEzBP,IAAIW,gBAAgB;EAClBX,IAAIY,YAAYN,OAAOO,QAAQC,UAAUR,OAAOS,IAAI,CAAC;EAErD,MAAMC,eAAeV,OAAOW,cAAc;GACxCC,IAAIZ,OAAOa,eAAeC;GAC1BC,QAAQ;GACRC,QAAQ;GACRC,MAAM;GACNC,OAAO;GACPC,wBAAwB;EAC1B,CAAC;EAED,IACEvB,cAAcI,OAAOa,eAAeO,UAAU,MAC9CxB,cAAcc,aAAaU,UAAU,GACrC;GACApB,OAAOqB,eAAe;IACpB,GAAGX;IACHY,SAAS;IACTC,eAAe;GACjB,CAAC;GACD;EACF;EAEA,MAAMC,mBAAmBxB,OAAOyB,OAAOD,iBAAiBE,IAAI;EAC5D,IACEF,kBAAkBG,SAAS3B,OAAOa,eAAec,QACjDH,iBAAiBN,MAAMU,cAAc5B,OAAOa,eAAeK,MAAMU,WAEjE5B,OAAO6B,KAAK;GACVC,MAAM;GACN,GAAGnC,sBAAsB6B,kBAAkBA,gBAAgB;EAC7D,CAAC;OACI,IAAI,CAACxB,OAAO+B,KACjB/B,OAAOS,KAAK,EAAEuB,MAAMC,QAAQC,KAAK;CAErC,CAAC;AACH;AAG4BxC,IAAI0C,gBAAgB;CAC9CC,MAAM;CACNC,QAAQ;EACNvC,qBAAqB;EACrB,aAAa;CACf;AACF,CAAC"} | ||
| {"version":3,"file":"Transitioner.js","names":["Vue","getLocationChangeInfo","trimPathRight","isServer","useRouter","useTransitionerSetup","router","transitionOwner","startTransition","fn","expected","nextTick","onMounted","onUnmounted","history","subscribe","load","nextLocation","buildLocation","to","latestLocation","pathname","search","params","hash","state","_includeValidateSearch","publicHref","commitLocation","replace","ignoreBlocker","resolvedLocation","stores","get","href","__TSR_key","emit","type","_tx","catch","console","error","Transitioner","defineComponent","name","setup"],"sources":["../../src/Transitioner.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { getLocationChangeInfo, trimPathRight } from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport type { AnyRouteMatch } from '@tanstack/router-core'\n\nexport function useTransitionerSetup() {\n const router = useRouter()\n if (isServer ?? router.isServer) {\n return\n }\n\n let transitionOwner: Array<AnyRouteMatch> | undefined\n router.startTransition = async (fn, expected) => {\n transitionOwner = expected\n fn()\n await Vue.nextTick()\n return transitionOwner === expected\n }\n\n Vue.onMounted(() => {\n Vue.onUnmounted(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.publicHref) !==\n trimPathRight(nextLocation.publicHref)\n ) {\n router.commitLocation({\n ...nextLocation,\n replace: true,\n ignoreBlocker: true,\n })\n return\n }\n\n const resolvedLocation = router.stores.resolvedLocation.get()\n if (\n resolvedLocation?.href === router.latestLocation.href &&\n resolvedLocation.state.__TSR_key === router.latestLocation.state.__TSR_key\n ) {\n router.emit({\n type: 'onRendered',\n ...getLocationChangeInfo(resolvedLocation, resolvedLocation),\n })\n } else if (!router._tx) {\n router.load().catch(console.error)\n }\n })\n}\n\n/** @deprecated Use useTransitionerSetup() instead. */\nexport const Transitioner = Vue.defineComponent({\n name: 'Transitioner',\n setup() {\n useTransitionerSetup()\n return () => null\n },\n})\n"],"mappings":";;;;;AAMA,SAAgBK,uBAAuB;CACrC,MAAMC,SAASF,UAAU;CACzB,IAAID,YAAYG,OAAOH,UACrB;CAGF,IAAII;CACJD,OAAOE,kBAAkB,OAAOC,IAAIC,aAAa;EAC/CH,kBAAkBG;EAClBD,GAAG;EACH,MAAMT,IAAIW,SAAS;EACnB,OAAOJ,oBAAoBG;CAC7B;CAEAV,IAAIY,gBAAgB;EAClBZ,IAAIa,YAAYP,OAAOQ,QAAQC,UAAUT,OAAOU,IAAI,CAAC;EAErD,MAAMC,eAAeX,OAAOY,cAAc;GACxCC,IAAIb,OAAOc,eAAeC;GAC1BC,QAAQ;GACRC,QAAQ;GACRC,MAAM;GACNC,OAAO;GACPC,wBAAwB;EAC1B,CAAC;EAED,IACExB,cAAcI,OAAOc,eAAeO,UAAU,MAC9CzB,cAAce,aAAaU,UAAU,GACrC;GACArB,OAAOsB,eAAe;IACpB,GAAGX;IACHY,SAAS;IACTC,eAAe;GACjB,CAAC;GACD;EACF;EAEA,MAAMC,mBAAmBzB,OAAO0B,OAAOD,iBAAiBE,IAAI;EAC5D,IACEF,kBAAkBG,SAAS5B,OAAOc,eAAec,QACjDH,iBAAiBN,MAAMU,cAAc7B,OAAOc,eAAeK,MAAMU,WAEjE7B,OAAO8B,KAAK;GACVC,MAAM;GACN,GAAGpC,sBAAsB8B,kBAAkBA,gBAAgB;EAC7D,CAAC;OACI,IAAI,CAACzB,OAAOgC,KACjBhC,OAAOU,KAAK,EAAEuB,MAAMC,QAAQC,KAAK;CAErC,CAAC;AACH;AAG4BzC,IAAI2C,gBAAgB;CAC9CC,MAAM;CACNC,QAAQ;EACNxC,qBAAqB;EACrB,aAAa;CACf;AACF,CAAC"} |
@@ -35,3 +35,6 @@ import * as Vue from 'vue'; | ||
| .then((res) => { | ||
| loadPromise = undefined; | ||
| if (typeof document !== 'undefined') { | ||
| loadPromise = undefined; | ||
| lazyComp.preload = undefined; | ||
| } | ||
| comp = res[exportName ?? 'default']; | ||
@@ -38,0 +41,0 @@ return comp; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"lazyRouteComponent.jsx","sourceRoot":"","sources":["../../src/lazyRouteComponent.tsx"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"lazyRouteComponent.jsx","sourceRoot":"","sources":["../../src/lazyRouteComponent.tsx"],"names":[],"mappings":"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"} |
+152
-124
@@ -9,4 +9,7 @@ import * as Vue from 'vue'; | ||
| export function useLinkProps(options) { | ||
| return useLinkPropsImpl(() => options); | ||
| } | ||
| function useLinkPropsImpl(getOptions) { | ||
| const router = useRouter(); | ||
| let hasRenderFetched = false; | ||
| let renderFetchedHref; | ||
| // Ensure router is defined before proceeding | ||
@@ -19,2 +22,3 @@ if (!router) { | ||
| const type = Vue.computed(() => { | ||
| const options = getOptions(); | ||
| try { | ||
@@ -29,64 +33,9 @@ new URL(`${options.to}`); | ||
| const ref = Vue.ref(null); | ||
| const eventHandlers = getLinkEventHandlers(options); | ||
| if (type.value === 'external') { | ||
| // Block dangerous protocols like javascript:, blob:, data: | ||
| if (isDangerousProtocol(options.to, router.protocolAllowlist)) { | ||
| if (process.env.NODE_ENV !== 'production') { | ||
| console.warn(`Blocked Link with dangerous protocol: ${options.to}`); | ||
| } | ||
| // Return props without href to prevent navigation | ||
| const safeProps = { | ||
| ...getPropsSafeToSpread(options), | ||
| ref, | ||
| // No href attribute - blocks the dangerous protocol | ||
| target: options.target, | ||
| disabled: options.disabled, | ||
| style: options.style, | ||
| class: options.class, | ||
| onClick: options.onClick, | ||
| onBlur: options.onBlur, | ||
| onFocus: options.onFocus, | ||
| onMouseenter: eventHandlers.onMouseenter, | ||
| onMouseleave: eventHandlers.onMouseleave, | ||
| onMouseover: eventHandlers.onMouseover, | ||
| onMouseout: eventHandlers.onMouseout, | ||
| onTouchstart: eventHandlers.onTouchstart, | ||
| }; | ||
| // Remove undefined values | ||
| Object.keys(safeProps).forEach((key) => { | ||
| if (safeProps[key] === undefined) { | ||
| delete safeProps[key]; | ||
| } | ||
| }); | ||
| return Vue.computed(() => safeProps); | ||
| } | ||
| // External links just have simple props | ||
| const externalProps = { | ||
| ...getPropsSafeToSpread(options), | ||
| ref, | ||
| href: options.to, | ||
| target: options.target, | ||
| disabled: options.disabled, | ||
| style: options.style, | ||
| class: options.class, | ||
| onClick: options.onClick, | ||
| onBlur: options.onBlur, | ||
| onFocus: options.onFocus, | ||
| onMouseenter: eventHandlers.onMouseenter, | ||
| onMouseleave: eventHandlers.onMouseleave, | ||
| onMouseover: eventHandlers.onMouseover, | ||
| onMouseout: eventHandlers.onMouseout, | ||
| onTouchstart: eventHandlers.onTouchstart, | ||
| }; | ||
| // Remove undefined values | ||
| Object.keys(externalProps).forEach((key) => { | ||
| if (externalProps[key] === undefined) { | ||
| delete externalProps[key]; | ||
| } | ||
| }); | ||
| return Vue.computed(() => externalProps); | ||
| } | ||
| // During SSR we render exactly once and do not need reactivity. | ||
| // Avoid store subscriptions, effects and observers on the server. | ||
| if (isServer ?? router.isServer) { | ||
| const options = getOptions(); | ||
| if (type.value === 'external') { | ||
| return Vue.ref(getExternalLinkProps(options, router, ref)); | ||
| } | ||
| const next = router.buildLocation(options); | ||
@@ -98,3 +47,3 @@ const href = getHref(options, router, next); | ||
| href, | ||
| options: options, | ||
| options, | ||
| isActive, | ||
@@ -108,7 +57,26 @@ resolvedActiveProps, | ||
| } | ||
| const currentLocation = useStore(router.stores.location, (l) => l, { | ||
| equal: (prev, next) => prev.href === next.href, | ||
| }); | ||
| const currentLocation = type.value === 'external' | ||
| ? Vue.shallowRef(router.stores.location.get()) | ||
| : useStore(router.stores.location, (l) => l, { | ||
| equal: (prev, next) => prev.href === next.href, | ||
| }); | ||
| // Links that start external skip useStore above. Subscribe if they later | ||
| // become internal so active state follows subsequent location changes. | ||
| if (type.value === 'external') { | ||
| Vue.watchEffect((onCleanup) => { | ||
| if (type.value === 'external') { | ||
| return; | ||
| } | ||
| const store = router.stores.location; | ||
| const subscription = store.subscribe((location) => { | ||
| if (currentLocation.value.href !== location.href) { | ||
| currentLocation.value = location; | ||
| } | ||
| }); | ||
| onCleanup(() => subscription.unsubscribe()); | ||
| }); | ||
| } | ||
| const next = Vue.computed(() => { | ||
| // Rebuild when inherited search/hash or the current route context changes. | ||
| const options = getOptions(); | ||
| const opts = { _fromLocation: currentLocation.value, ...options }; | ||
@@ -118,3 +86,6 @@ return router.buildLocation(opts); | ||
| const preload = Vue.computed(() => { | ||
| if (options.reloadDocument || options.disabled) { | ||
| const options = getOptions(); | ||
| if (type.value === 'external' || | ||
| options.reloadDocument || | ||
| options.disabled) { | ||
| return false; | ||
@@ -124,10 +95,17 @@ } | ||
| }); | ||
| const preloadDelay = Vue.computed(() => options.preloadDelay ?? router.options.defaultPreloadDelay ?? 0); | ||
| const isActive = Vue.computed(() => getIsActive(currentLocation.value, next.value, options.activeOptions, router)); | ||
| const doPreload = () => router | ||
| .preloadRoute({ ...options, _builtLocation: next.value }) | ||
| .catch((err) => { | ||
| console.warn(err); | ||
| console.warn(preloadWarning); | ||
| const preloadDelay = Vue.computed(() => getOptions().preloadDelay ?? router.options.defaultPreloadDelay ?? 0); | ||
| const isActive = Vue.computed(() => { | ||
| const options = getOptions(); | ||
| return getIsActive(currentLocation.value, next.value, options.activeOptions, router); | ||
| }); | ||
| const doPreload = () => { | ||
| const options = getOptions(); | ||
| return router | ||
| .preloadRoute({ ...options, _builtLocation: next.value }) | ||
| .catch((err) => { | ||
| console.warn(err); | ||
| console.warn(preloadWarning); | ||
| }); | ||
| }; | ||
| let pendingPreload; | ||
| const enqueuePreload = (e) => { | ||
@@ -137,9 +115,12 @@ if (!e) { | ||
| timeoutMap.delete(ref); | ||
| pendingPreload = undefined; | ||
| return; | ||
| } | ||
| if (!(e.isIntersecting ?? | ||
| preload.value === 'intent')) { | ||
| if (e.isIntersecting === false) { | ||
| const isIntersecting = e.isIntersecting; | ||
| const preloadMode = isIntersecting === undefined ? 'intent' : 'viewport'; | ||
| if (preload.value !== preloadMode || isIntersecting === false) { | ||
| if (isIntersecting === false && pendingPreload === 'viewport') { | ||
| clearTimeout(timeoutMap.get(ref)); | ||
| timeoutMap.delete(ref); | ||
| pendingPreload = undefined; | ||
| } | ||
@@ -153,5 +134,11 @@ return; | ||
| if (!timeoutMap.has(ref)) { | ||
| const scheduledHref = next.value.href; | ||
| pendingPreload = preloadMode; | ||
| timeoutMap.set(ref, setTimeout(() => { | ||
| timeoutMap.delete(ref); | ||
| doPreload(); | ||
| pendingPreload = undefined; | ||
| if (preload.value === preloadMode && | ||
| next.value.href === scheduledHref) { | ||
| doPreload(); | ||
| } | ||
| }, preloadDelay.value)); | ||
@@ -161,9 +148,10 @@ } | ||
| useIntersectionObserver(ref, enqueuePreload, () => preload.value !== 'viewport'); | ||
| Vue.effect(() => { | ||
| if (hasRenderFetched) { | ||
| Vue.watchEffect(() => { | ||
| if (preload.value !== 'render') { | ||
| return; | ||
| } | ||
| if (preload.value === 'render') { | ||
| const nextHref = next.value.href; | ||
| if (nextHref && renderFetchedHref !== nextHref) { | ||
| renderFetchedHref = nextHref; | ||
| doPreload(); | ||
| hasRenderFetched = true; | ||
| } | ||
@@ -173,2 +161,6 @@ }); | ||
| const handleClick = (e) => { | ||
| if (type.value === 'external') { | ||
| return; | ||
| } | ||
| const options = getOptions(); | ||
| // Check actual element's target attribute as fallback | ||
@@ -200,53 +192,38 @@ const elementTarget = e.currentTarget?.getAttribute('target'); | ||
| const handleTouchStart = () => { | ||
| if (preload.value !== 'intent') | ||
| return; | ||
| doPreload(); | ||
| if (preload.value === 'intent') { | ||
| doPreload(); | ||
| } | ||
| }; | ||
| const handleLeave = () => { | ||
| if (preload.value === 'intent') { | ||
| if (pendingPreload === 'intent') { | ||
| clearTimeout(timeoutMap.get(ref)); | ||
| timeoutMap.delete(ref); | ||
| pendingPreload = undefined; | ||
| } | ||
| }; | ||
| // Helper to compose event handlers - with explicit return type and better type handling | ||
| function composeEventHandlers(handlers) { | ||
| function composeEventHandlers(getUserHandler, handler) { | ||
| return (event) => { | ||
| for (const handler of handlers) { | ||
| if (handler) { | ||
| handler(event); | ||
| } | ||
| } | ||
| getUserHandler()?.(event); | ||
| handler(event); | ||
| }; | ||
| } | ||
| // Get the active and inactive props | ||
| const resolvedStyleProps = Vue.computed(() => resolveStyleProps(options, isActive.value)); | ||
| const href = Vue.computed(() => getHref(options, router, next.value)); | ||
| const resolvedStyleProps = Vue.computed(() => { | ||
| const options = getOptions(); | ||
| return resolveStyleProps(options, isActive.value); | ||
| }); | ||
| const href = Vue.computed(() => { | ||
| const options = getOptions(); | ||
| return getHref(options, router, next.value); | ||
| }); | ||
| // Create static event handlers that don't change between renders | ||
| const staticEventHandlers = { | ||
| onClick: composeEventHandlers([options.onClick, handleClick]), | ||
| onBlur: composeEventHandlers([options.onBlur, handleLeave]), | ||
| onFocus: composeEventHandlers([ | ||
| options.onFocus, | ||
| enqueuePreload, | ||
| ]), | ||
| onMouseenter: composeEventHandlers([ | ||
| eventHandlers.onMouseenter, | ||
| enqueuePreload, | ||
| ]), | ||
| onMouseover: composeEventHandlers([ | ||
| eventHandlers.onMouseover, | ||
| enqueuePreload, | ||
| ]), | ||
| onMouseleave: composeEventHandlers([ | ||
| eventHandlers.onMouseleave, | ||
| handleLeave, | ||
| ]), | ||
| onMouseout: composeEventHandlers([ | ||
| eventHandlers.onMouseout, | ||
| handleLeave, | ||
| ]), | ||
| onTouchstart: composeEventHandlers([ | ||
| eventHandlers.onTouchstart, | ||
| handleTouchStart, | ||
| ]), | ||
| onClick: composeEventHandlers(() => getOptions().onClick, handleClick), | ||
| onBlur: composeEventHandlers(() => getOptions().onBlur, handleLeave), | ||
| onFocus: composeEventHandlers(() => getOptions().onFocus, enqueuePreload), | ||
| onMouseenter: composeEventHandlers(() => getLinkEventHandlers(getOptions()).onMouseenter, enqueuePreload), | ||
| onMouseover: composeEventHandlers(() => getLinkEventHandlers(getOptions()).onMouseover, enqueuePreload), | ||
| onMouseleave: composeEventHandlers(() => getLinkEventHandlers(getOptions()).onMouseleave, handleLeave), | ||
| onMouseout: composeEventHandlers(() => getLinkEventHandlers(getOptions()).onMouseout, handleLeave), | ||
| onTouchstart: composeEventHandlers(() => getLinkEventHandlers(getOptions()).onTouchstart, handleTouchStart), | ||
| }; | ||
@@ -256,6 +233,10 @@ // Compute all props synchronously to avoid hydration mismatches | ||
| const computedProps = Vue.computed(() => { | ||
| const options = getOptions(); | ||
| if (type.value === 'external') { | ||
| return getExternalLinkProps(options, router, ref, staticEventHandlers); | ||
| } | ||
| const { resolvedActiveProps, resolvedInactiveProps, resolvedClassName, resolvedStyle, } = resolvedStyleProps.value; | ||
| return combineResultProps({ | ||
| href: href.value, | ||
| options: options, | ||
| options, | ||
| ref, | ||
@@ -317,3 +298,3 @@ staticEventHandlers, | ||
| href, | ||
| disabled: !!options.disabled, | ||
| disabled: options._asChild ? !!options.disabled : undefined, | ||
| target: options.target, | ||
@@ -347,2 +328,36 @@ }; | ||
| } | ||
| function getExternalLinkProps(options, router, ref, staticEventHandlers) { | ||
| const dangerous = isDangerousProtocol(options.to, router.protocolAllowlist); | ||
| if (dangerous && process.env.NODE_ENV !== 'production') { | ||
| console.warn(`Blocked Link with dangerous protocol: ${options.to}`); | ||
| } | ||
| const eventHandlers = getLinkEventHandlers(options); | ||
| const result = { | ||
| ...getPropsSafeToSpread(options), | ||
| ref, | ||
| href: dangerous || options.disabled ? undefined : options.to, | ||
| target: options.target, | ||
| disabled: options._asChild ? !!options.disabled : undefined, | ||
| style: options.style, | ||
| class: options.class, | ||
| onClick: staticEventHandlers?.onClick ?? options.onClick, | ||
| onBlur: staticEventHandlers?.onBlur ?? options.onBlur, | ||
| onFocus: staticEventHandlers?.onFocus ?? options.onFocus, | ||
| onMouseenter: staticEventHandlers?.onMouseenter ?? eventHandlers.onMouseenter, | ||
| onMouseleave: staticEventHandlers?.onMouseleave ?? eventHandlers.onMouseleave, | ||
| onMouseover: staticEventHandlers?.onMouseover ?? eventHandlers.onMouseover, | ||
| onMouseout: staticEventHandlers?.onMouseout ?? eventHandlers.onMouseout, | ||
| onTouchstart: staticEventHandlers?.onTouchstart ?? eventHandlers.onTouchstart, | ||
| }; | ||
| if (options.disabled) { | ||
| result.role = 'link'; | ||
| result['aria-disabled'] = true; | ||
| } | ||
| for (const key of Object.keys(result)) { | ||
| if (result[key] === undefined) { | ||
| delete result[key]; | ||
| } | ||
| } | ||
| return result; | ||
| } | ||
| function getLinkEventHandlers(options) { | ||
@@ -448,5 +463,18 @@ return { | ||
| setup(props, { attrs, slots }) { | ||
| // Call useLinkProps ONCE during setup with combined props and attrs | ||
| const allProps = { ...props, ...attrs }; | ||
| const linkPropsSource = useLinkProps(allProps); | ||
| const attrsSnapshot = Vue.shallowRef({ ...attrs }); | ||
| Vue.onBeforeUpdate(() => { | ||
| const keys = Object.keys(attrs); | ||
| const previous = attrsSnapshot.value; | ||
| if (keys.length !== Object.keys(previous).length || | ||
| keys.some((key) => !Object.is(attrs[key], previous[key]))) { | ||
| attrsSnapshot.value = { ...attrs }; | ||
| } | ||
| }); | ||
| // Keep a plain cached snapshot so location-only updates do not repeatedly | ||
| // cross Vue's props and attrs proxies for every link computation. | ||
| const allProps = Vue.computed(() => ({ | ||
| ...props, | ||
| ...attrsSnapshot.value, | ||
| })); | ||
| const linkPropsSource = useLinkPropsImpl(() => allProps.value); | ||
| return () => { | ||
@@ -453,0 +481,0 @@ const Component = props._asChild || 'a'; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"link.jsx","sourceRoot":"","sources":["../../src/link.tsx"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"link.jsx","sourceRoot":"","sources":["../../src/link.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAC1B,OAAO,EACL,SAAS,EACT,aAAa,EACb,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GACpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAkBjD,MAAM,UAAU,GAAG,IAAI,OAAO,EAAyC,CAAA;AA4DvE,MAAM,UAAU,YAAY,CAO1B,OAAqE;IAErE,OAAO,gBAAgB,CAAC,GAAG,EAAE,CAAC,OAA8B,CAAC,CAAA;AAC/D,CAAC;AAED,SAAS,gBAAgB,CACvB,UAAqC;IAErC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,IAAI,iBAAqC,CAAA;IAEzC,6CAA6C;IAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;QAC3E,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAkC,CAAA;IAClE,CAAC;IAED,gDAAgD;IAChD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;QAC7B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;QAC5B,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;YACxB,OAAO,UAAU,CAAA;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,UAAU,CAAA;QACnB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAiB,IAAI,CAAC,CAAA;IAEzC,gEAAgE;IAChE,kEAAkE;IAClE,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;QAC5B,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC9B,OAAO,GAAG,CAAC,GAAG,CACZ,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CACV,CAAA;QACpC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,OAAc,CAAC,CAAA;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;QAE3C,MAAM,QAAQ,GAAG,WAAW,CAC1B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAC5B,IAAI,EACJ,OAAO,CAAC,aAAa,EACrB,MAAM,CACP,CAAA;QAED,MAAM,EACJ,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,GACd,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QAExC,MAAM,MAAM,GAAG,kBAAkB,CAAC;YAChC,IAAI;YACJ,OAAO;YACP,QAAQ;YACR,mBAAmB;YACnB,qBAAqB;YACrB,iBAAiB;YACjB,aAAa;SACd,CAAC,CAAA;QAEF,OAAO,GAAG,CAAC,GAAG,CACZ,MAA4B,CACI,CAAA;IACpC,CAAC;IAED,MAAM,eAAe,GAGnB,IAAI,CAAC,KAAK,KAAK,UAAU;QACvB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC9C,CAAC,CAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;YAC1C,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;SAC/C,CAA4D,CAAA;IAEnE,yEAAyE;IACzE,uEAAuE;IACvE,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAC9B,GAAG,CAAC,WAAW,CAAC,CAAC,SAAS,EAAE,EAAE;YAC5B,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC9B,OAAM;YACR,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAA;YACpC,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAChD,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACjD,eAAe,CAAC,KAAK,GAAG,QAAQ,CAAA;gBAClC,CAAC;YACH,CAAC,CAAC,CAAA;YACF,SAAS,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;QAC7B,2EAA2E;QAE3E,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;QAC5B,MAAM,IAAI,GAAG,EAAE,aAAa,EAAE,eAAe,CAAC,KAAK,EAAE,GAAG,OAAO,EAAE,CAAA;QACjE,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;QAChC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;QAC5B,IACE,IAAI,CAAC,KAAK,KAAK,UAAU;YACzB,OAAO,CAAC,cAAc;YACtB,OAAO,CAAC,QAAQ,EAChB,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAA;IACzD,CAAC,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,CAC/B,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,IAAI,CAAC,CAC3E,CAAA;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;QACjC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;QAC5B,OAAO,WAAW,CAChB,eAAe,CAAC,KAAK,EACrB,IAAI,CAAC,KAAK,EACV,OAAO,CAAC,aAAa,EACrB,MAAM,CACP,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;QAC5B,OAAO,MAAM;aACV,YAAY,CAAC,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,KAAK,EAAS,CAAC;aAC/D,KAAK,CAAC,CAAC,GAAQ,EAAE,EAAE;YAClB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjB,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC9B,CAAC,CAAC,CAAA;IACN,CAAC,CAAA;IAED,IAAI,cAAiD,CAAA;IAErD,MAAM,cAAc,GAAG,CACrB,CAAuD,EACvD,EAAE;QACF,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;YACjC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACtB,cAAc,GAAG,SAAS,CAAA;YAC1B,OAAM;QACR,CAAC;QAED,MAAM,cAAc,GAAI,CAA+B,CAAC,cAAc,CAAA;QACtE,MAAM,WAAW,GAAG,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAA;QACxE,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,IAAI,cAAc,KAAK,KAAK,EAAE,CAAC;YAC9D,IAAI,cAAc,KAAK,KAAK,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;gBAC9D,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;gBACjC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACtB,cAAc,GAAG,SAAS,CAAA;YAC5B,CAAC;YACD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YACxB,SAAS,EAAE,CAAA;YACX,OAAM;QACR,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAA;YACrC,cAAc,GAAG,WAAW,CAAA;YAC5B,UAAU,CAAC,GAAG,CACZ,GAAG,EACH,UAAU,CAAC,GAAG,EAAE;gBACd,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACtB,cAAc,GAAG,SAAS,CAAA;gBAC1B,IACE,OAAO,CAAC,KAAK,KAAK,WAAW;oBAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,EACjC,CAAC;oBACD,SAAS,EAAE,CAAA;gBACb,CAAC;YACH,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CACvB,CAAA;QACH,CAAC;IACH,CAAC,CAAA;IAED,uBAAuB,CACrB,GAAG,EACH,cAAc,EACd,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,UAAU,CACnC,CAAA;IAED,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE;QACnB,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAM;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAA;QAChC,IAAI,QAAQ,IAAI,iBAAiB,KAAK,QAAQ,EAAE,CAAC;YAC/C,iBAAiB,GAAG,QAAQ,CAAA;YAC5B,SAAS,EAAE,CAAA;QACb,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,oBAAoB;IACpB,MAAM,WAAW,GAAG,CAAC,CAAe,EAAQ,EAAE;QAC5C,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC9B,OAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;QAC5B,sDAAsD;QACtD,MAAM,aAAa,GACjB,CAAC,CAAC,aACH,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;QACzB,MAAM,eAAe,GACnB,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAA;QAE/D,IACE,CAAC,OAAO,CAAC,QAAQ;YACjB,CAAC,WAAW,CAAC,CAAC,CAAC;YACf,CAAC,CAAC,CAAC,gBAAgB;YACnB,CAAC,CAAC,eAAe,IAAI,eAAe,KAAK,OAAO,CAAC;YACjD,CAAC,CAAC,MAAM,KAAK,CAAC,EACd,CAAC;YACD,uEAAuE;YACvE,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC3B,OAAM;YACR,CAAC;YAED,CAAC,CAAC,cAAc,EAAE,CAAA;YAElB,yBAAyB;YACzB,MAAM,CAAC,QAAQ,CAAC;gBACd,GAAG,OAAO;gBACV,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;gBAC9C,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,aAAa,EAAE,OAAO,CAAC,aAAa;aACrC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,SAAS,EAAE,CAAA;QACb,CAAC;IACH,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;YAChC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;YACjC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACtB,cAAc,GAAG,SAAS,CAAA;QAC5B,CAAC;IACH,CAAC,CAAA;IAED,SAAS,oBAAoB,CAC3B,cAAiD,EACjD,OAAwB;QAExB,OAAO,CAAC,KAAQ,EAAE,EAAE;YAClB,cAAc,EAAE,EAAE,CAAC,KAAK,CAAC,CAAA;YACzB,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC,CAAA;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,kBAAkB,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;QAC3C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;QAC5B,OAAO,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;QAC7B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;QAC5B,OAAO,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,iEAAiE;IACjE,MAAM,mBAAmB,GAAsB;QAC7C,OAAO,EAAE,oBAAoB,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;QACtE,MAAM,EAAE,oBAAoB,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;QACpE,OAAO,EAAE,oBAAoB,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;QACzE,YAAY,EAAE,oBAAoB,CAChC,GAAG,EAAE,CAAC,oBAAoB,CAAC,UAAU,EAAsB,CAAC,CAAC,YAAY,EACzE,cAAc,CACf;QACD,WAAW,EAAE,oBAAoB,CAC/B,GAAG,EAAE,CAAC,oBAAoB,CAAC,UAAU,EAAsB,CAAC,CAAC,WAAW,EACxE,cAAc,CACf;QACD,YAAY,EAAE,oBAAoB,CAChC,GAAG,EAAE,CAAC,oBAAoB,CAAC,UAAU,EAAsB,CAAC,CAAC,YAAY,EACzE,WAAW,CACZ;QACD,UAAU,EAAE,oBAAoB,CAC9B,GAAG,EAAE,CAAC,oBAAoB,CAAC,UAAU,EAAsB,CAAC,CAAC,UAAU,EACvE,WAAW,CACZ;QACD,YAAY,EAAE,oBAAoB,CAChC,GAAG,EAAE,CAAC,oBAAoB,CAAC,UAAU,EAAsB,CAAC,CAAC,YAAY,EACzE,gBAAgB,CACjB;KACF,CAAA;IAED,gEAAgE;IAChE,4EAA4E;IAC5E,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAqB,GAAG,EAAE;QAC1D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;QAC5B,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC9B,OAAO,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAA;QACxE,CAAC;QAED,MAAM,EACJ,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,GACd,GAAG,kBAAkB,CAAC,KAAK,CAAA;QAC5B,OAAO,kBAAkB,CAAC;YACxB,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,OAAO;YACP,GAAG;YACH,mBAAmB;YACnB,QAAQ,EAAE,QAAQ,CAAC,KAAK;YACxB,mBAAmB;YACnB,qBAAqB;YACrB,iBAAiB;YACjB,aAAa;SACd,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,gEAAgE;IAChE,OAAO,aAA8C,CAAA;AACvD,CAAC;AAED,SAAS,iBAAiB,CAAC,OAA4B,EAAE,QAAiB;IACxE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;IACxE,MAAM,mBAAmB,GAAgB,CAAC,QAAQ;QAChD,CAAC,CAAC,OAAO,WAAW,KAAK,UAAU;YACjC,CAAC,CAAC,WAAW,EAAE;YACf,CAAC,CAAC,WAAW;QACf,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;IAEjD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAE3D,MAAM,qBAAqB,GAAgB,CAAC,QAAQ;QAClD,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,OAAO,aAAa,KAAK,UAAU;YACnC,CAAC,CAAC,aAAa,EAAE;YACjB,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;IAE9D,MAAM,OAAO,GAAG;QACd,OAAO,CAAC,KAAK;QACb,mBAAmB,EAAE,KAAK;QAC1B,qBAAqB,EAAE,KAAK;KAC7B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACjB,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAExE,MAAM,MAAM,GAAoC,EAAE,CAAA;IAElD,gCAAgC;IAChC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC;IAED,IAAI,mBAAmB,EAAE,KAAK,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAA;IAClD,CAAC;IAED,IAAI,qBAAqB,EAAE,KAAK,EAAE,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAA;IACpD,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1D,OAAO;QACL,mBAAmB;QACnB,qBAAqB;QACrB,iBAAiB;QACjB,aAAa;KACd,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,EAC1B,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,GAAG,EACH,mBAAmB,GAYpB;IACC,MAAM,MAAM,GAA4B;QACtC,GAAG,oBAAoB,CAAC,OAAO,CAAC;QAChC,GAAG;QACH,GAAG,mBAAmB;QACtB,IAAI;QACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QAC3D,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAA;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,GAAG,aAAa,CAAA;IAC9B,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,CAAC,KAAK,GAAG,iBAAiB,CAAA;IAClC,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAA;QACpB,MAAM,CAAC,eAAe,CAAC,GAAG,IAAI,CAAA;IAChC,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAA;QAChC,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,CAAA;IACjC,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;QACxC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACrD,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAA4B,EAC5B,MAAiB,EACjB,GAA4B,EAC5B,mBAAuC;IAEvC,MAAM,SAAS,GAAG,mBAAmB,CACnC,OAAO,CAAC,EAAY,EACpB,MAAM,CAAC,iBAAiB,CACzB,CAAA;IACD,IAAI,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,yCAAyC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IACrE,CAAC;IAED,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAA2B,CAAC,CAAA;IACvE,MAAM,MAAM,GAA4B;QACtC,GAAG,oBAAoB,CAAC,OAAO,CAAC;QAChC,GAAG;QACH,IAAI,EAAE,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE;QAC5D,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QAC3D,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,mBAAmB,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO;QACxD,MAAM,EAAE,mBAAmB,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM;QACrD,OAAO,EAAE,mBAAmB,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO;QACxD,YAAY,EACV,mBAAmB,EAAE,YAAY,IAAI,aAAa,CAAC,YAAY;QACjE,YAAY,EACV,mBAAmB,EAAE,YAAY,IAAI,aAAa,CAAC,YAAY;QACjE,WAAW,EAAE,mBAAmB,EAAE,WAAW,IAAI,aAAa,CAAC,WAAW;QAC1E,UAAU,EAAE,mBAAmB,EAAE,UAAU,IAAI,aAAa,CAAC,UAAU;QACvE,YAAY,EACV,mBAAmB,EAAE,YAAY,IAAI,aAAa,CAAC,YAAY;KAClE,CAAA;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAA;QACpB,MAAM,CAAC,eAAe,CAAC,GAAG,IAAI,CAAA;IAChC,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IAED,OAAO,MAA4B,CAAA;AACrC,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAAyB;IAEzB,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY;QAC1D,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY;QAC1D,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW;QACvD,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU;QACpD,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY;KAC3D,CAAA;AACH,CAAC;AAED,MAAM,oBAAoB,GAAG,CAAC,OAA4B,EAAE,EAAE;IAC5D,MAAM,EACJ,WAAW,EAAE,YAAY,EACzB,aAAa,EAAE,cAAc,EAC7B,aAAa,EAAE,cAAc,EAC7B,EAAE,EAAE,GAAG,EACP,OAAO,EAAE,QAAQ,EACjB,YAAY,EAAE,aAAa,EAC3B,sBAAsB,EAAE,uBAAuB,EAC/C,kBAAkB,EAAE,mBAAmB,EACvC,OAAO,EAAE,QAAQ,EACjB,eAAe,EAAE,gBAAgB,EACjC,WAAW,EAAE,YAAY,EACzB,cAAc,EAAE,eAAe,EAC/B,QAAQ,EAAE,SAAS,EACnB,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,SAAS,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,QAAQ,EACjB,YAAY,EAAE,aAAa,EAC3B,YAAY,EAAE,aAAa,EAC3B,YAAY,EAAE,aAAa,EAC3B,YAAY,EAAE,aAAa,EAC3B,WAAW,EAAE,YAAY,EACzB,WAAW,EAAE,YAAY,EACzB,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,WAAW,EACvB,YAAY,EAAE,aAAa,EAC3B,YAAY,EAAE,aAAa,EAC3B,aAAa,EAAE,cAAc,EAC7B,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,KAAK,EACX,cAAc,EAAE,eAAe,EAC/B,cAAc,EAAE,eAAe,EAC/B,QAAQ,EAAE,SAAS,EACnB,IAAI,EAAE,KAAK,EACX,eAAe,EAAE,gBAAgB,EACjC,GAAG,iBAAiB,EACrB,GAAG,OAIH,CAAA;IAED,OAAO,iBAAiB,CAAA;AAC1B,CAAC,CAAA;AAED,SAAS,WAAW,CAClB,GAIC,EACD,OAIC,EACD,aAA2C,EAC3C,MAAiB;IAEjB,IAAI,aAAa,EAAE,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,aAAa,CAC7B,GAAG,CAAC,QAAQ,EACZ,OAAO,CAAC,QAAQ,EAChB,MAAM,CAAC,QAAQ,CAChB,CAAA;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;QACtE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;QAEvE,MAAM,gBAAgB,GACpB,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC;YAChC,CAAC,WAAW,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;gBACrC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAA;QACzC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,aAAa,EAAE,aAAa,IAAI,IAAI,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;YACvD,OAAO,EAAE,CAAC,aAAa,EAAE,KAAK;YAC9B,eAAe,EAAE,CAAC,aAAa,EAAE,iBAAiB;SACnD,CAAC,CAAA;QACF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,aAAa,EAAE,WAAW,EAAE,CAAC;QAC/B,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAA;IAClC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,OAAO,CACd,OAA4B,EAC5B,MAAiB,EACjB,YAA6B;IAE7B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,QAAQ,GAAG,YAAY,EAAE,cAAc,IAAI,YAAY,CAAA;IAE7D,4DAA4D;IAC5D,gEAAgE;IAChE,0CAA0C;IAC1C,uDAAuD;IACvD,MAAM,UAAU,GAAG,QAAQ,EAAE,UAAU,CAAA;IACvC,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IAEjC,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,CAAA;IACnC,IAAI,QAAQ;QAAE,OAAO,UAAU,CAAA;IAE/B,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,GAAG,CAAA;AACrD,CAAC;AAkHD,MAAM,UAAU,UAAU,CACxB,IAAkE;IAElE,OAAO,GAAG,CAAC,eAAe,CAAC;QACzB,IAAI,EAAE,aAAa;QACnB,YAAY,EAAE,KAAK;QACnB,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;YACvB,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;QACnE,CAAC;KACF,CAAQ,CAAA;AACX,CAAC;AAED,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC;IACnC,IAAI,EAAE,MAAM;IACZ,YAAY,EAAE,KAAK;IACnB,KAAK,EAAE;QACL,UAAU;QACV,IAAI;QACJ,SAAS;QACT,cAAc;QACd,wBAAwB;QACxB,aAAa;QACb,eAAe;QACf,eAAe;QACf,MAAM;QACN,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,OAAO;QACP,MAAM;QACN,gBAAgB;QAChB,UAAU;QACV,iBAAiB;QACjB,gBAAgB;QAChB,aAAa;QACb,iBAAiB;QACjB,oBAAoB;QACpB,SAAS;QACT,eAAe;QACf,QAAQ;KACT;IACD,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;QAC3B,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAA;QAClD,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE;YACtB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC/B,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAA;YACpC,IACE,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM;gBAC5C,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EACzD,CAAC;gBACD,aAAa,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,CAAA;YACpC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;YACnC,GAAG,KAAK;YACR,GAAG,aAAa,CAAC,KAAK;SACvB,CAAC,CAAC,CAAA;QACH,MAAM,eAAe,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAEtB,CAAA;QAEvC,OAAO,GAAG,EAAE;YACV,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAA;YAEvC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;YAE5C,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAA;YAEtD,4DAA4D;YAC5D,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YAEpE,8DAA8D;YAC9D,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBACxB,0CAA0C;gBAC1C,MAAM,YAAY,GAAG,EAAE,GAAG,SAAS,EAAE,CAAA;gBACrC,OAAO,YAAY,CAAC,KAAK,CAAA;gBACzB,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;YAClE,CAAC;YAED,yEAAyE;YACzE,yDAAyD;YACzD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAClC,OAAO,GAAG,CAAC,CAAC,CACV,SAAS,EACT,EAAE,GAAG,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,EACvC,WAAW,CACZ,CAAA;YACH,CAAC;YAED,+CAA+C;YAC/C,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;QACjD,CAAC,CAAA;IACH,CAAC;CACF,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,QAEA,CAAA;AAEpB,SAAS,WAAW,CAAC,CAAa;IAChC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAA;AAC7D,CAAC;AAkBD,MAAM,CAAC,MAAM,WAAW,GAAuB,CAAC,OAAO,EAAE,EAAE;IACzD,OAAO,OAAc,CAAA;AACvB,CAAC,CAAA"} |
@@ -134,4 +134,4 @@ import * as Vue from 'vue'; | ||
| router.options.defaultRemountDeps; | ||
| const remountDeps = remountFn | ||
| ? remountFn({ | ||
| const remountKey = remountFn | ||
| ? JSON.stringify(remountFn({ | ||
| routeId: matchRouteId, | ||
@@ -141,8 +141,5 @@ loaderDeps: match.loaderDeps, | ||
| search: match._strictSearch, | ||
| }) | ||
| })) | ||
| : undefined; | ||
| return [ | ||
| match, | ||
| remountDeps ? JSON.stringify(remountDeps) : undefined, | ||
| ]; | ||
| return [match, remountKey]; | ||
| }); | ||
@@ -222,11 +219,5 @@ return () => { | ||
| const route = router.routesById[parentRouteId]; | ||
| const childMatch = useStore(router.stores.matches, (matches) => { | ||
| const childRouteId = useStore(router.stores.matches, (matches) => { | ||
| const index = matches.findIndex((match) => match.routeId === parentRouteId); | ||
| const child = matches[index + 1]; | ||
| return child | ||
| ? [ | ||
| child.routeId, | ||
| child.routeId + JSON.stringify(child._strictParams), | ||
| ] | ||
| : undefined; | ||
| return matches[index + 1]?.routeId; | ||
| }); | ||
@@ -237,3 +228,3 @@ return () => { | ||
| } | ||
| const child = childMatch.value; | ||
| const child = childRouteId.value; | ||
| if (!child) { | ||
@@ -243,7 +234,4 @@ return null; | ||
| const nextMatch = Vue.h(Match, { | ||
| routeId: child[0 /* routeId */], | ||
| // Key based on routeId + params only (not loaderDeps) | ||
| // This ensures component recreates when params change, | ||
| // but NOT when only loaderDeps change | ||
| key: child[1 /* key */], | ||
| routeId: child, | ||
| key: child, | ||
| }); | ||
@@ -250,0 +238,0 @@ // Note: We intentionally do NOT wrap in Suspense here. |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"Match.jsx","sourceRoot":"","sources":["../../src/Match.tsx"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"Match.jsx","sourceRoot":"","sources":["../../src/Match.tsx"],"names":[],"mappings":"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"} |
@@ -93,3 +93,3 @@ import { BaseRootRoute, BaseRoute, BaseRouteApi } from '@tanstack/router-core'; | ||
| export type AsyncRouteComponent<TProps> = SyncRouteComponent<TProps> & { | ||
| preload?: () => Promise<void>; | ||
| preload?: () => Promise<void> | undefined; | ||
| }; | ||
@@ -96,0 +96,0 @@ export type RouteComponent<TProps = any> = AsyncRouteComponent<TProps>; |
@@ -10,8 +10,9 @@ import * as Vue from 'vue'; | ||
| } | ||
| const transition = async (fn) => { | ||
| let transitionOwner; | ||
| router.startTransition = async (fn, expected) => { | ||
| transitionOwner = expected; | ||
| fn(); | ||
| await Vue.nextTick(); | ||
| return true; | ||
| return transitionOwner === expected; | ||
| }; | ||
| router.startTransition = transition; | ||
| Vue.onMounted(() => { | ||
@@ -18,0 +19,0 @@ Vue.onUnmounted(router.history.subscribe(router.load)); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"Transitioner.jsx","sourceRoot":"","sources":["../../src/Transitioner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,MAAM,UAAU,oBAAoB;IAClC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,OAAM;IACR,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,EAAE,EAAc,EAAE,EAAE;QAC1C,EAAE,EAAE,CAAA;QACJ,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAA;QACpB,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IACD,MAAM,CAAC,eAAe,GAAG,UAAU,CAAA;IAEnC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QAEtD,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;YACxC,EAAE,EAAE,MAAM,CAAC,cAAc,CAAC,QAAQ;YAClC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,IAAI;YACX,sBAAsB,EAAE,IAAI;SAC7B,CAAC,CAAA;QAEF,IACE,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC;YAC/C,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,EACtC,CAAC;YACD,MAAM,CAAC,cAAc,CAAC;gBACpB,GAAG,YAAY;gBACf,OAAO,EAAE,IAAI;gBACb,aAAa,EAAE,IAAI;aACpB,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAA;QAC7D,IACE,gBAAgB,EAAE,IAAI,KAAK,MAAM,CAAC,cAAc,CAAC,IAAI;YACrD,gBAAgB,CAAC,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAC1E,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,YAAY;gBAClB,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;aAC7D,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC,eAAe,CAAC;IAC9C,IAAI,EAAE,cAAc;IACpB,KAAK;QACH,oBAAoB,EAAE,CAAA;QACtB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAA;IACnB,CAAC;CACF,CAAC,CAAA"} | ||
| {"version":3,"file":"Transitioner.jsx","sourceRoot":"","sources":["../../src/Transitioner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGvC,MAAM,UAAU,oBAAoB;IAClC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,OAAM;IACR,CAAC;IAED,IAAI,eAAiD,CAAA;IACrD,MAAM,CAAC,eAAe,GAAG,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE;QAC9C,eAAe,GAAG,QAAQ,CAAA;QAC1B,EAAE,EAAE,CAAA;QACJ,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAA;QACpB,OAAO,eAAe,KAAK,QAAQ,CAAA;IACrC,CAAC,CAAA;IAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QAEtD,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;YACxC,EAAE,EAAE,MAAM,CAAC,cAAc,CAAC,QAAQ;YAClC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,IAAI;YACX,sBAAsB,EAAE,IAAI;SAC7B,CAAC,CAAA;QAEF,IACE,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC;YAC/C,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,EACtC,CAAC;YACD,MAAM,CAAC,cAAc,CAAC;gBACpB,GAAG,YAAY;gBACf,OAAO,EAAE,IAAI;gBACb,aAAa,EAAE,IAAI;aACpB,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAA;QAC7D,IACE,gBAAgB,EAAE,IAAI,KAAK,MAAM,CAAC,cAAc,CAAC,IAAI;YACrD,gBAAgB,CAAC,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAC1E,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,YAAY;gBAClB,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;aAC7D,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC,eAAe,CAAC;IAC9C,IAAI,EAAE,cAAc;IACpB,KAAK;QACH,oBAAoB,EAAE,CAAA;QACtB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAA;IACnB,CAAC;CACF,CAAC,CAAA"} |
+3
-3
| { | ||
| "name": "@tanstack/vue-router", | ||
| "version": "1.170.24", | ||
| "version": "1.170.25", | ||
| "description": "Modern and scalable routing for Vue applications", | ||
@@ -66,4 +66,4 @@ "author": "Tanner Linsley", | ||
| "isbot": "^5.1.22", | ||
| "@tanstack/history": "1.162.1", | ||
| "@tanstack/router-core": "1.171.22" | ||
| "@tanstack/router-core": "1.171.23", | ||
| "@tanstack/history": "1.162.1" | ||
| }, | ||
@@ -70,0 +70,0 @@ "devDependencies": { |
@@ -50,3 +50,6 @@ import * as Vue from 'vue' | ||
| .then((res) => { | ||
| loadPromise = undefined | ||
| if (typeof document !== 'undefined') { | ||
| loadPromise = undefined | ||
| ;(lazyComp as any).preload = undefined | ||
| } | ||
| comp = res[exportName ?? 'default'] | ||
@@ -70,3 +73,2 @@ return comp | ||
| } | ||
| // Create a lazy component wrapper using defineComponent so it works in Vue SFC templates | ||
@@ -73,0 +75,0 @@ const lazyComp = Vue.defineComponent({ |
+216
-150
@@ -61,2 +61,13 @@ import * as Vue from 'vue' | ||
| type LinkEventHandlers = { | ||
| onClick: EventHandler<PointerEvent> | ||
| onBlur: EventHandler<FocusEvent> | ||
| onFocus: EventHandler<FocusEvent> | ||
| onMouseenter: EventHandler<MouseEvent> | ||
| onMouseleave: EventHandler<MouseEvent> | ||
| onMouseover: EventHandler<MouseEvent> | ||
| onMouseout: EventHandler<MouseEvent> | ||
| onTouchstart: EventHandler<TouchEvent> | ||
| } | ||
| interface StyledProps { | ||
@@ -77,3 +88,5 @@ class?: LinkHTMLAttributes['class'] | ||
| type AnyLinkPropsOptions = UseLinkPropsOptions<any, any, any, any, any> | ||
| type AnyLinkPropsOptions = UseLinkPropsOptions<any, any, any, any, any> & { | ||
| _asChild?: unknown | ||
| } | ||
| type LinkEventOptions = AnyLinkPropsOptions & Partial<VueStyleLinkEventHandlers> | ||
@@ -90,4 +103,10 @@ | ||
| ): LinkHTMLAttributes { | ||
| return useLinkPropsImpl(() => options as AnyLinkPropsOptions) | ||
| } | ||
| function useLinkPropsImpl( | ||
| getOptions: () => AnyLinkPropsOptions, | ||
| ): LinkHTMLAttributes { | ||
| const router = useRouter() | ||
| let hasRenderFetched = false | ||
| let renderFetchedHref: string | undefined | ||
@@ -102,2 +121,3 @@ // Ensure router is defined before proceeding | ||
| const type = Vue.computed(() => { | ||
| const options = getOptions() | ||
| try { | ||
@@ -112,77 +132,15 @@ new URL(`${options.to}`) | ||
| const ref = Vue.ref<Element | null>(null) | ||
| const eventHandlers = getLinkEventHandlers(options as LinkEventOptions) | ||
| if (type.value === 'external') { | ||
| // Block dangerous protocols like javascript:, blob:, data: | ||
| if (isDangerousProtocol(options.to as string, router.protocolAllowlist)) { | ||
| if (process.env.NODE_ENV !== 'production') { | ||
| console.warn(`Blocked Link with dangerous protocol: ${options.to}`) | ||
| } | ||
| // Return props without href to prevent navigation | ||
| const safeProps: Record<string, unknown> = { | ||
| ...getPropsSafeToSpread(options as AnyLinkPropsOptions), | ||
| ref, | ||
| // No href attribute - blocks the dangerous protocol | ||
| target: options.target, | ||
| disabled: options.disabled, | ||
| style: options.style, | ||
| class: options.class, | ||
| onClick: options.onClick, | ||
| onBlur: options.onBlur, | ||
| onFocus: options.onFocus, | ||
| onMouseenter: eventHandlers.onMouseenter, | ||
| onMouseleave: eventHandlers.onMouseleave, | ||
| onMouseover: eventHandlers.onMouseover, | ||
| onMouseout: eventHandlers.onMouseout, | ||
| onTouchstart: eventHandlers.onTouchstart, | ||
| } | ||
| // Remove undefined values | ||
| Object.keys(safeProps).forEach((key) => { | ||
| if (safeProps[key] === undefined) { | ||
| delete safeProps[key] | ||
| } | ||
| }) | ||
| return Vue.computed( | ||
| () => safeProps as LinkHTMLAttributes, | ||
| // During SSR we render exactly once and do not need reactivity. | ||
| // Avoid store subscriptions, effects and observers on the server. | ||
| if (isServer ?? router.isServer) { | ||
| const options = getOptions() | ||
| if (type.value === 'external') { | ||
| return Vue.ref( | ||
| getExternalLinkProps(options, router, ref), | ||
| ) as unknown as LinkHTMLAttributes | ||
| } | ||
| // External links just have simple props | ||
| const externalProps: Record<string, unknown> = { | ||
| ...getPropsSafeToSpread(options as AnyLinkPropsOptions), | ||
| ref, | ||
| href: options.to, | ||
| target: options.target, | ||
| disabled: options.disabled, | ||
| style: options.style, | ||
| class: options.class, | ||
| onClick: options.onClick, | ||
| onBlur: options.onBlur, | ||
| onFocus: options.onFocus, | ||
| onMouseenter: eventHandlers.onMouseenter, | ||
| onMouseleave: eventHandlers.onMouseleave, | ||
| onMouseover: eventHandlers.onMouseover, | ||
| onMouseout: eventHandlers.onMouseout, | ||
| onTouchstart: eventHandlers.onTouchstart, | ||
| } | ||
| // Remove undefined values | ||
| Object.keys(externalProps).forEach((key) => { | ||
| if (externalProps[key] === undefined) { | ||
| delete externalProps[key] | ||
| } | ||
| }) | ||
| return Vue.computed( | ||
| () => externalProps as LinkHTMLAttributes, | ||
| ) as unknown as LinkHTMLAttributes | ||
| } | ||
| // During SSR we render exactly once and do not need reactivity. | ||
| // Avoid store subscriptions, effects and observers on the server. | ||
| if (isServer ?? router.isServer) { | ||
| const next = router.buildLocation(options as any) | ||
| const href = getHref(options as AnyLinkPropsOptions, router, next) | ||
| const href = getHref(options, router, next) | ||
@@ -201,7 +159,7 @@ const isActive = getIsActive( | ||
| resolvedStyle, | ||
| } = resolveStyleProps(options as AnyLinkPropsOptions, isActive) | ||
| } = resolveStyleProps(options, isActive) | ||
| const result = combineResultProps({ | ||
| href, | ||
| options: options as AnyLinkPropsOptions, | ||
| options, | ||
| isActive, | ||
@@ -219,9 +177,33 @@ resolvedActiveProps, | ||
| const currentLocation = useStore(router.stores.location, (l) => l, { | ||
| equal: (prev, next) => prev.href === next.href, | ||
| }) | ||
| const currentLocation: Vue.Ref< | ||
| ReturnType<typeof router.stores.location.get> | ||
| > = | ||
| type.value === 'external' | ||
| ? Vue.shallowRef(router.stores.location.get()) | ||
| : (useStore(router.stores.location, (l) => l, { | ||
| equal: (prev, next) => prev.href === next.href, | ||
| }) as Vue.Ref<ReturnType<typeof router.stores.location.get>>) | ||
| // Links that start external skip useStore above. Subscribe if they later | ||
| // become internal so active state follows subsequent location changes. | ||
| if (type.value === 'external') { | ||
| Vue.watchEffect((onCleanup) => { | ||
| if (type.value === 'external') { | ||
| return | ||
| } | ||
| const store = router.stores.location | ||
| const subscription = store.subscribe((location) => { | ||
| if (currentLocation.value.href !== location.href) { | ||
| currentLocation.value = location | ||
| } | ||
| }) | ||
| onCleanup(() => subscription.unsubscribe()) | ||
| }) | ||
| } | ||
| const next = Vue.computed(() => { | ||
| // Rebuild when inherited search/hash or the current route context changes. | ||
| const options = getOptions() | ||
| const opts = { _fromLocation: currentLocation.value, ...options } | ||
@@ -232,3 +214,8 @@ return router.buildLocation(opts) | ||
| const preload = Vue.computed(() => { | ||
| if (options.reloadDocument || options.disabled) { | ||
| const options = getOptions() | ||
| if ( | ||
| type.value === 'external' || | ||
| options.reloadDocument || | ||
| options.disabled | ||
| ) { | ||
| return false | ||
@@ -240,7 +227,8 @@ } | ||
| const preloadDelay = Vue.computed( | ||
| () => options.preloadDelay ?? router.options.defaultPreloadDelay ?? 0, | ||
| () => getOptions().preloadDelay ?? router.options.defaultPreloadDelay ?? 0, | ||
| ) | ||
| const isActive = Vue.computed(() => | ||
| getIsActive( | ||
| const isActive = Vue.computed(() => { | ||
| const options = getOptions() | ||
| return getIsActive( | ||
| currentLocation.value, | ||
@@ -250,7 +238,8 @@ next.value, | ||
| router, | ||
| ), | ||
| ) | ||
| ) | ||
| }) | ||
| const doPreload = () => | ||
| router | ||
| const doPreload = () => { | ||
| const options = getOptions() | ||
| return router | ||
| .preloadRoute({ ...options, _builtLocation: next.value } as any) | ||
@@ -261,3 +250,6 @@ .catch((err: any) => { | ||
| }) | ||
| } | ||
| let pendingPreload: 'intent' | 'viewport' | undefined | ||
| const enqueuePreload = ( | ||
@@ -269,14 +261,13 @@ e?: MouseEvent | FocusEvent | IntersectionObserverEntry, | ||
| timeoutMap.delete(ref) | ||
| pendingPreload = undefined | ||
| return | ||
| } | ||
| if ( | ||
| !( | ||
| (e as IntersectionObserverEntry).isIntersecting ?? | ||
| preload.value === 'intent' | ||
| ) | ||
| ) { | ||
| if ((e as IntersectionObserverEntry).isIntersecting === false) { | ||
| const isIntersecting = (e as IntersectionObserverEntry).isIntersecting | ||
| const preloadMode = isIntersecting === undefined ? 'intent' : 'viewport' | ||
| if (preload.value !== preloadMode || isIntersecting === false) { | ||
| if (isIntersecting === false && pendingPreload === 'viewport') { | ||
| clearTimeout(timeoutMap.get(ref)) | ||
| timeoutMap.delete(ref) | ||
| pendingPreload = undefined | ||
| } | ||
@@ -292,2 +283,4 @@ return | ||
| if (!timeoutMap.has(ref)) { | ||
| const scheduledHref = next.value.href | ||
| pendingPreload = preloadMode | ||
| timeoutMap.set( | ||
@@ -297,3 +290,9 @@ ref, | ||
| timeoutMap.delete(ref) | ||
| doPreload() | ||
| pendingPreload = undefined | ||
| if ( | ||
| preload.value === preloadMode && | ||
| next.value.href === scheduledHref | ||
| ) { | ||
| doPreload() | ||
| } | ||
| }, preloadDelay.value), | ||
@@ -310,9 +309,11 @@ ) | ||
| Vue.effect(() => { | ||
| if (hasRenderFetched) { | ||
| Vue.watchEffect(() => { | ||
| if (preload.value !== 'render') { | ||
| return | ||
| } | ||
| if (preload.value === 'render') { | ||
| const nextHref = next.value.href | ||
| if (nextHref && renderFetchedHref !== nextHref) { | ||
| renderFetchedHref = nextHref | ||
| doPreload() | ||
| hasRenderFetched = true | ||
| } | ||
@@ -323,2 +324,7 @@ }) | ||
| const handleClick = (e: PointerEvent): void => { | ||
| if (type.value === 'external') { | ||
| return | ||
| } | ||
| const options = getOptions() | ||
| // Check actual element's target attribute as fallback | ||
@@ -359,23 +365,22 @@ const elementTarget = ( | ||
| const handleTouchStart = () => { | ||
| if (preload.value !== 'intent') return | ||
| doPreload() | ||
| if (preload.value === 'intent') { | ||
| doPreload() | ||
| } | ||
| } | ||
| const handleLeave = () => { | ||
| if (preload.value === 'intent') { | ||
| if (pendingPreload === 'intent') { | ||
| clearTimeout(timeoutMap.get(ref)) | ||
| timeoutMap.delete(ref) | ||
| pendingPreload = undefined | ||
| } | ||
| } | ||
| // Helper to compose event handlers - with explicit return type and better type handling | ||
| function composeEventHandlers<T extends Event>( | ||
| handlers: Array<EventHandler<T> | undefined>, | ||
| getUserHandler: () => EventHandler<T> | undefined, | ||
| handler: EventHandler<T>, | ||
| ): (e: T) => void { | ||
| return (event: T) => { | ||
| for (const handler of handlers) { | ||
| if (handler) { | ||
| handler(event) | ||
| } | ||
| } | ||
| getUserHandler()?.(event) | ||
| handler(event) | ||
| } | ||
@@ -385,38 +390,37 @@ } | ||
| // Get the active and inactive props | ||
| const resolvedStyleProps = Vue.computed(() => | ||
| resolveStyleProps(options as AnyLinkPropsOptions, isActive.value), | ||
| ) | ||
| const resolvedStyleProps = Vue.computed(() => { | ||
| const options = getOptions() | ||
| return resolveStyleProps(options, isActive.value) | ||
| }) | ||
| const href = Vue.computed(() => | ||
| getHref(options as AnyLinkPropsOptions, router, next.value), | ||
| ) | ||
| const href = Vue.computed(() => { | ||
| const options = getOptions() | ||
| return getHref(options, router, next.value) | ||
| }) | ||
| // Create static event handlers that don't change between renders | ||
| const staticEventHandlers = { | ||
| onClick: composeEventHandlers<PointerEvent>([options.onClick, handleClick]), | ||
| onBlur: composeEventHandlers<FocusEvent>([options.onBlur, handleLeave]), | ||
| onFocus: composeEventHandlers<FocusEvent>([ | ||
| options.onFocus, | ||
| const staticEventHandlers: LinkEventHandlers = { | ||
| onClick: composeEventHandlers(() => getOptions().onClick, handleClick), | ||
| onBlur: composeEventHandlers(() => getOptions().onBlur, handleLeave), | ||
| onFocus: composeEventHandlers(() => getOptions().onFocus, enqueuePreload), | ||
| onMouseenter: composeEventHandlers( | ||
| () => getLinkEventHandlers(getOptions() as LinkEventOptions).onMouseenter, | ||
| enqueuePreload, | ||
| ]), | ||
| onMouseenter: composeEventHandlers<MouseEvent>([ | ||
| eventHandlers.onMouseenter, | ||
| ), | ||
| onMouseover: composeEventHandlers( | ||
| () => getLinkEventHandlers(getOptions() as LinkEventOptions).onMouseover, | ||
| enqueuePreload, | ||
| ]), | ||
| onMouseover: composeEventHandlers<MouseEvent>([ | ||
| eventHandlers.onMouseover, | ||
| enqueuePreload, | ||
| ]), | ||
| onMouseleave: composeEventHandlers<MouseEvent>([ | ||
| eventHandlers.onMouseleave, | ||
| ), | ||
| onMouseleave: composeEventHandlers( | ||
| () => getLinkEventHandlers(getOptions() as LinkEventOptions).onMouseleave, | ||
| handleLeave, | ||
| ]), | ||
| onMouseout: composeEventHandlers<MouseEvent>([ | ||
| eventHandlers.onMouseout, | ||
| ), | ||
| onMouseout: composeEventHandlers( | ||
| () => getLinkEventHandlers(getOptions() as LinkEventOptions).onMouseout, | ||
| handleLeave, | ||
| ]), | ||
| onTouchstart: composeEventHandlers<TouchEvent>([ | ||
| eventHandlers.onTouchstart, | ||
| ), | ||
| onTouchstart: composeEventHandlers( | ||
| () => getLinkEventHandlers(getOptions() as LinkEventOptions).onTouchstart, | ||
| handleTouchStart, | ||
| ]), | ||
| ), | ||
| } | ||
@@ -427,2 +431,7 @@ | ||
| const computedProps = Vue.computed<LinkHTMLAttributes>(() => { | ||
| const options = getOptions() | ||
| if (type.value === 'external') { | ||
| return getExternalLinkProps(options, router, ref, staticEventHandlers) | ||
| } | ||
| const { | ||
@@ -436,3 +445,3 @@ resolvedActiveProps, | ||
| href: href.value, | ||
| options: options as AnyLinkPropsOptions, | ||
| options, | ||
| ref, | ||
@@ -519,12 +528,3 @@ staticEventHandlers, | ||
| ref?: Vue.VNodeRef | undefined | ||
| staticEventHandlers?: { | ||
| onClick: any | ||
| onBlur: any | ||
| onFocus: any | ||
| onMouseenter: any | ||
| onMouseover: any | ||
| onMouseleave: any | ||
| onMouseout: any | ||
| onTouchstart: any | ||
| } | ||
| staticEventHandlers?: LinkEventHandlers | ||
| }) { | ||
@@ -536,3 +536,3 @@ const result: Record<string, unknown> = { | ||
| href, | ||
| disabled: !!options.disabled, | ||
| disabled: options._asChild ? !!options.disabled : undefined, | ||
| target: options.target, | ||
@@ -573,2 +573,52 @@ } | ||
| function getExternalLinkProps( | ||
| options: AnyLinkPropsOptions, | ||
| router: AnyRouter, | ||
| ref: Vue.Ref<Element | null>, | ||
| staticEventHandlers?: LinkEventHandlers, | ||
| ): LinkHTMLAttributes { | ||
| const dangerous = isDangerousProtocol( | ||
| options.to as string, | ||
| router.protocolAllowlist, | ||
| ) | ||
| if (dangerous && process.env.NODE_ENV !== 'production') { | ||
| console.warn(`Blocked Link with dangerous protocol: ${options.to}`) | ||
| } | ||
| const eventHandlers = getLinkEventHandlers(options as LinkEventOptions) | ||
| const result: Record<string, unknown> = { | ||
| ...getPropsSafeToSpread(options), | ||
| ref, | ||
| href: dangerous || options.disabled ? undefined : options.to, | ||
| target: options.target, | ||
| disabled: options._asChild ? !!options.disabled : undefined, | ||
| style: options.style, | ||
| class: options.class, | ||
| onClick: staticEventHandlers?.onClick ?? options.onClick, | ||
| onBlur: staticEventHandlers?.onBlur ?? options.onBlur, | ||
| onFocus: staticEventHandlers?.onFocus ?? options.onFocus, | ||
| onMouseenter: | ||
| staticEventHandlers?.onMouseenter ?? eventHandlers.onMouseenter, | ||
| onMouseleave: | ||
| staticEventHandlers?.onMouseleave ?? eventHandlers.onMouseleave, | ||
| onMouseover: staticEventHandlers?.onMouseover ?? eventHandlers.onMouseover, | ||
| onMouseout: staticEventHandlers?.onMouseout ?? eventHandlers.onMouseout, | ||
| onTouchstart: | ||
| staticEventHandlers?.onTouchstart ?? eventHandlers.onTouchstart, | ||
| } | ||
| if (options.disabled) { | ||
| result.role = 'link' | ||
| result['aria-disabled'] = true | ||
| } | ||
| for (const key of Object.keys(result)) { | ||
| if (result[key] === undefined) { | ||
| delete result[key] | ||
| } | ||
| } | ||
| return result as LinkHTMLAttributes | ||
| } | ||
| function getLinkEventHandlers( | ||
@@ -868,5 +918,21 @@ options: LinkEventOptions, | ||
| setup(props, { attrs, slots }) { | ||
| // Call useLinkProps ONCE during setup with combined props and attrs | ||
| const allProps = { ...props, ...attrs } | ||
| const linkPropsSource = useLinkProps(allProps) as | ||
| const attrsSnapshot = Vue.shallowRef({ ...attrs }) | ||
| Vue.onBeforeUpdate(() => { | ||
| const keys = Object.keys(attrs) | ||
| const previous = attrsSnapshot.value | ||
| if ( | ||
| keys.length !== Object.keys(previous).length || | ||
| keys.some((key) => !Object.is(attrs[key], previous[key])) | ||
| ) { | ||
| attrsSnapshot.value = { ...attrs } | ||
| } | ||
| }) | ||
| // Keep a plain cached snapshot so location-only updates do not repeatedly | ||
| // cross Vue's props and attrs proxies for every link computation. | ||
| const allProps = Vue.computed(() => ({ | ||
| ...props, | ||
| ...attrsSnapshot.value, | ||
| })) | ||
| const linkPropsSource = useLinkPropsImpl(() => allProps.value) as | ||
| | LinkHTMLAttributes | ||
@@ -873,0 +939,0 @@ | Vue.ComputedRef<LinkHTMLAttributes> |
+15
-25
@@ -179,15 +179,14 @@ import * as Vue from 'vue' | ||
| const remountDeps = remountFn | ||
| ? remountFn({ | ||
| routeId: matchRouteId, | ||
| loaderDeps: match.loaderDeps, | ||
| params: match._strictParams, | ||
| search: match._strictSearch, | ||
| }) | ||
| const remountKey = remountFn | ||
| ? JSON.stringify( | ||
| remountFn({ | ||
| routeId: matchRouteId, | ||
| loaderDeps: match.loaderDeps, | ||
| params: match._strictParams, | ||
| search: match._strictSearch, | ||
| }), | ||
| ) | ||
| : undefined | ||
| return [ | ||
| match, | ||
| remountDeps ? JSON.stringify(remountDeps) : undefined, | ||
| ] as const | ||
| return [match, remountKey] as const | ||
| }) | ||
@@ -304,13 +303,7 @@ | ||
| const childMatch = useStore(router.stores.matches, (matches) => { | ||
| const childRouteId = useStore(router.stores.matches, (matches) => { | ||
| const index = matches.findIndex( | ||
| (match) => match.routeId === parentRouteId, | ||
| ) | ||
| const child = matches[index + 1] | ||
| return child | ||
| ? ([ | ||
| child.routeId, | ||
| child.routeId + JSON.stringify(child._strictParams), | ||
| ] as const) | ||
| : undefined | ||
| return matches[index + 1]?.routeId | ||
| }) | ||
@@ -323,3 +316,3 @@ | ||
| const child = childMatch.value | ||
| const child = childRouteId.value | ||
| if (!child) { | ||
@@ -330,7 +323,4 @@ return null | ||
| const nextMatch = Vue.h(Match, { | ||
| routeId: child[0 /* routeId */], | ||
| // Key based on routeId + params only (not loaderDeps) | ||
| // This ensures component recreates when params change, | ||
| // but NOT when only loaderDeps change | ||
| key: child[1 /* key */], | ||
| routeId: child, | ||
| key: child, | ||
| }) | ||
@@ -337,0 +327,0 @@ |
+1
-1
@@ -555,3 +555,3 @@ import { | ||
| export type AsyncRouteComponent<TProps> = SyncRouteComponent<TProps> & { | ||
| preload?: () => Promise<void> | ||
| preload?: () => Promise<void> | undefined | ||
| } | ||
@@ -558,0 +558,0 @@ |
@@ -5,2 +5,3 @@ import * as Vue from 'vue' | ||
| import { useRouter } from './useRouter' | ||
| import type { AnyRouteMatch } from '@tanstack/router-core' | ||
@@ -13,8 +14,9 @@ export function useTransitionerSetup() { | ||
| const transition = async (fn: () => void) => { | ||
| let transitionOwner: Array<AnyRouteMatch> | undefined | ||
| router.startTransition = async (fn, expected) => { | ||
| transitionOwner = expected | ||
| fn() | ||
| await Vue.nextTick() | ||
| return true | ||
| return transitionOwner === expected | ||
| } | ||
| router.startTransition = transition | ||
@@ -21,0 +23,0 @@ Vue.onMounted(() => { |
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
926790
1.26%14101
0.74%+ Added
- Removed