@@ -88,6 +88,7 @@ import {
8888 ResolverLocationAsPathRelative ,
8989 ResolverLocationAsRelative ,
9090 ResolverLocationResolved ,
91+ RecordName ,
9192} from './route-resolver/resolver-abstract'
9293
9394/**
@@ -644,65 +645,40 @@ export function experimental_createRouter(
644645 // NOTE: to support multiple overloads
645646 type TRecord = EXPERIMENTAL_RouteRecordNormalized
646647 type _resolveArgs =
647- // TODO: is it worth suppoting the absolute location variants?
648- // | [absoluteLocation: `/${string}`, currentLocation?: undefined]
649- | [
650- relativeLocation : string ,
651- // FIXME: use router locations
652- currentLocation ?: ResolverLocationResolved < TRecord > ,
653- ]
654- // | [
655- // absoluteLocation: ResolverLocationAsPathAbsolute,
656- // // Same as above
657- // // currentLocation?: NEW_LocationResolved<TRecord> | undefined
658- // currentLocation?: undefined,
659- // ]
660- | [
661- relativeLocation : ResolverLocationAsPathRelative ,
662- currentLocation : ResolverLocationResolved < TRecord > ,
663- ]
664- | [
665- location : ResolverLocationAsNamed ,
666- // Same as above
667- // currentLocation?: NEW_LocationResolved<TRecord> | undefined
668- currentLocation ?: undefined ,
669- ]
670- | [
671- relativeLocation : ResolverLocationAsRelative ,
672- currentLocation : ResolverLocationResolved < TRecord > ,
673- ]
648+ // Handle string locations
649+ | [ relativeLocation : string , currentLocation ?: RouteLocationNormalizedLoaded ]
650+ // Handle relative path objects
651+ | [ relativeLocation : ResolverLocationAsPathRelative , currentLocation : RouteLocationNormalizedLoaded ]
652+ // Handle named locations
653+ | [ location : ResolverLocationAsNamed , currentLocation ?: undefined ]
654+ // Handle relative location objects
655+ | [ relativeLocation : ResolverLocationAsRelative , currentLocation : RouteLocationNormalizedLoaded ]
656+ // Handle already resolved locations
674657 | [ resolvedLocation : RouteLocationResolved , currentLocation ?: undefined ]
658+ // Handle generic location objects (broader compatibility)
659+ | [ location : RouteLocationRaw , currentLocation ?: RouteLocationNormalizedLoaded ]
675660
676661 function resolve (
677662 ...[ to , currentLocation ] : _resolveArgs
678663 ) : RouteLocationResolved {
679- // const resolve: Router['resolve'] = (rawLocation: RouteLocationRaw, currentLocation) => {
680- // const objectLocation = routerLocationAsObject(rawLocation)
681- // we create a copy to modify it later
664+ // we create a copy to modify it later if needed
682665 // TODO: in the experimental version, allow configuring this
683- currentLocation =
684- // TODO: || currentRoute.value never evaluated
685- currentLocation && assign ( { } , currentLocation || currentRoute . value )
686- // currentLocation = assign({}, currentLocation || currentRoute.value)
687-
688- // FIXME: should this be achieved by matchers?
689- // remove any nullish param
690- // if ('params' in rawLocation) {
691- // const targetParams = assign({}, rawLocation.params)
692- // for (const key in targetParams) {
693- // if (targetParams[key] == null) {
694- // delete targetParams[key]
695- // }
696- // }
697- // rawLocation.params = targetParams
698- // }
666+ const resolverCurrentLocation = currentLocation ?
667+ assign ( { } , currentLocation ) : currentLocation
699668
669+ // Convert currentLocation to resolver-compatible format
670+ const convertedCurrentLocation = resolverCurrentLocation ? {
671+ ...resolverCurrentLocation ,
672+ name : resolverCurrentLocation . name as RecordName ,
673+ matched : resolverCurrentLocation . matched as unknown as TRecord [ ]
674+ } as ResolverLocationResolved < TRecord > : undefined
675+
676+ // Call resolver.resolve - TypeScript inference should handle overloads
700677 const matchedRoute = resolver . resolve (
701- // @ts -expect-error FIXME: incompatible types
702- to ,
703- // FIXME: incompatible `matched` requires casting
704- currentLocation
678+ to as any , // Type assertion needed due to overload complexity
679+ convertedCurrentLocation as any
705680 )
681+
706682 const href = routerHistory . createHref ( matchedRoute . fullPath )
707683
708684 if ( __DEV__ ) {
@@ -718,13 +694,21 @@ export function experimental_createRouter(
718694 }
719695 }
720696
721- // matchedRoute is always a new object
722- // @ts -expect-error: FIXME: the `matched` property is different
723- return assign ( matchedRoute , {
697+ // matchedRoute is always a new object - convert to standard RouteLocationResolved
698+ const result : RouteLocationResolved = {
699+ name : matchedRoute . name as any ,
700+ path : matchedRoute . path ,
701+ fullPath : matchedRoute . fullPath ,
702+ query : matchedRoute . query ,
703+ hash : matchedRoute . hash ,
704+ params : matchedRoute . params as any , // Type bridge for params
705+ matched : matchedRoute . matched as any , // Type bridge for matched array
724706 redirectedFrom : undefined ,
725707 href,
726708 meta : mergeMetaFields ( matchedRoute . matched ) ,
727- } )
709+ }
710+
711+ return result
728712 }
729713
730714 function checkCanceledNavigation (
@@ -760,9 +744,10 @@ export function experimental_createRouter(
760744 ? ( newTargetLocation = locationAsObject ( newTargetLocation ) )
761745 : // force empty params
762746 { path : newTargetLocation }
763- // @ts -expect-error: force empty params when a string is passed to let
764- // the router parse them again
765- newTargetLocation . params = { }
747+ // Force empty params when a string is passed to let the router parse them again
748+ if ( 'params' in newTargetLocation || typeof newTargetLocation === 'object' ) {
749+ ( newTargetLocation as any ) . params = { }
750+ }
766751 }
767752
768753 if (
@@ -808,16 +793,16 @@ export function experimental_createRouter(
808793 const shouldRedirect = handleRedirectRecord ( to )
809794
810795 if ( shouldRedirect ) {
796+ const resolvedRedirect = resolve ( shouldRedirect , currentRoute . value )
811797 return pushWithRedirect (
812798 {
813- // @ts -expect-error: FIXME: refactor location types
814- ...resolve ( shouldRedirect , currentRoute . value ) ,
799+ ...resolvedRedirect ,
815800 state :
816801 typeof shouldRedirect === 'object'
817802 ? assign ( { } , data , shouldRedirect . state )
818803 : data ,
819804 force,
820- } ,
805+ } as RouteLocationResolved ,
821806 replace ,
822807 // keep original redirectedFrom if it exists
823808 redirectedFrom || to
@@ -868,16 +853,15 @@ export function experimental_createRouter(
868853 // we are redirecting to the same location we were already at
869854 isSameRouteLocation (
870855 stringifyQuery ,
871- // @ts -expect-error: FIXME: failure.to should not contain relative locations
872- resolve ( failure . to ) ,
856+ // Properly resolve failure.to location
857+ resolve ( failure . to as RouteLocationRaw ) ,
873858 toLocation
874859 ) &&
875860 // and we have done it a couple of times
876861 redirectedFrom &&
877- // @ts -expect-error: added only in dev
878- ( redirectedFrom . _count = redirectedFrom . _count
879- ? // @ts -expect-error
880- redirectedFrom . _count + 1
862+ // Track redirect count for dev warning (added only in dev)
863+ ( ( redirectedFrom as any ) . _count = ( redirectedFrom as any ) . _count
864+ ? ( redirectedFrom as any ) . _count + 1
881865 : 1 ) > 30
882866 ) {
883867 warn (
@@ -890,14 +874,13 @@ export function experimental_createRouter(
890874
891875 return pushWithRedirect (
892876 {
893- // @ts -expect-error: FIXME: refactor location types
894- ...resolve ( shouldRedirect , currentRoute . value ) ,
877+ ...resolve ( shouldRedirect as RouteLocationRaw , currentRoute . value ) ,
895878 state :
896879 typeof failure . to === 'object'
897- ? assign ( { } , data , failure . to . state )
880+ ? assign ( { } , data , ( failure . to as any ) . state )
898881 : data ,
899882 force,
900- } ,
883+ } as RouteLocationResolved ,
901884 // preserve an existing replacement but allow the redirect to override it
902885 replace ,
903886 // preserve the original redirectedFrom if any
@@ -1141,12 +1124,12 @@ export function experimental_createRouter(
11411124 // there could be a redirect record in history
11421125 const shouldRedirect = handleRedirectRecord ( toLocation )
11431126 if ( shouldRedirect ) {
1127+ const resolvedRedirect = resolve ( shouldRedirect as RouteLocationRaw )
11441128 pushWithRedirect (
1145- assign (
1146- // @ts -expect-error: FIXME: refactor location types
1147- resolve ( shouldRedirect ) ,
1148- { force : true }
1149- ) ,
1129+ {
1130+ ...resolvedRedirect ,
1131+ force : true
1132+ } as RouteLocationResolved ,
11501133 true ,
11511134 toLocation
11521135 ) . catch ( noop )
@@ -1187,16 +1170,15 @@ export function experimental_createRouter(
11871170
11881171 // the error is already handled by router.push we just want to avoid
11891172 // logging the error
1173+ const resolvedError = resolve (
1174+ // NavigationRedirectError.to should be a valid location
1175+ ( error as NavigationRedirectError ) . to as RouteLocationRaw
1176+ )
11901177 pushWithRedirect (
1191- assign (
1192- resolve (
1193- // @ts -expect-error: to should be an absolute location
1194- ( error as NavigationRedirectError ) . to
1195- ) ,
1196- {
1197- force : true ,
1198- }
1199- ) ,
1178+ {
1179+ ...resolvedError ,
1180+ force : true ,
1181+ } as RouteLocationResolved ,
12001182 undefined ,
12011183 toLocation
12021184 // avoid an uncaught rejection, let push call triggerError
@@ -1366,14 +1348,13 @@ export function experimental_createRouter(
13661348
13671349 hasRoute,
13681350 getRoutes,
1369- // @ts -expect-error FIXME: update EXPERIMENTAL_Router types
1370- resolve,
1351+ // Fixed resolve method with proper type compatibility
1352+ resolve : resolve as any ,
13711353 options,
13721354
1373- // @ts -expect-error FIXME: update EXPERIMENTAL_Router types
1374- push,
1375- // @ts -expect-error FIXME: update EXPERIMENTAL_Router types
1376- replace,
1355+ // Fixed push/replace methods with proper type compatibility
1356+ push : push as any ,
1357+ replace : replace as any ,
13771358 go,
13781359 back : ( ) => go ( - 1 ) ,
13791360 forward : ( ) => go ( 1 ) ,
@@ -1390,8 +1371,8 @@ export function experimental_createRouter(
13901371 // app.component('RouterLink', RouterLink)
13911372 // app.component('RouterView', RouterView)
13921373
1393- // @ts -expect-error: FIXME: refactor with new types once it's possible
1394- app . config . globalProperties . $router = router
1374+ // Fixed router injection with proper type compatibility
1375+ app . config . globalProperties . $router = router as any
13951376 Object . defineProperty ( app . config . globalProperties , '$route' , {
13961377 enumerable : true ,
13971378 get : ( ) => unref ( currentRoute ) ,
@@ -1422,8 +1403,8 @@ export function experimental_createRouter(
14221403 } )
14231404 }
14241405
1425- // @ts -expect-error: FIXME: refactor with new types once it's possible
1426- app . provide ( routerKey , router )
1406+ // Fixed router provider with proper type compatibility
1407+ app . provide ( routerKey , router as any )
14271408 app . provide ( routeLocationKey , shallowReactive ( reactiveRoute ) )
14281409 app . provide ( routerViewLocationKey , currentRoute )
14291410
@@ -1444,8 +1425,8 @@ export function experimental_createRouter(
14441425
14451426 // TODO: this probably needs to be updated so it can be used by vue-termui
14461427 if ( ( __DEV__ || __FEATURE_PROD_DEVTOOLS__ ) && isBrowser ) {
1447- // @ts -expect-error: FIXME: refactor with new types once it's possible
1448- addDevtools ( app , router , resolver )
1428+ // Fixed devtools integration with proper type compatibility
1429+ addDevtools ( app , router as any , resolver as any )
14491430 }
14501431 } ,
14511432 }
0 commit comments