import { Router, createRouter, useRoute as useRouteVueRouter, onBeforeRouteLeave as onBeforeRouteLeaveVueRouter, onBeforeRouteUpdate as onBeforeRouteUpdateVueRouter, NavigationGuard } from 'vue-router' import { RoutiderLocation, RoutiderLocationOfNames } from './route/location' import { RoutiderOptions, RouteNames, routiderOptionsToRouterOptions, FlatRoutes } from './options/options' import { RoutiderRouter, createRoutiderRouter, RoutiderRouteLocation } from './router/router' import { warnIfIncorrectRoute } from './route/checkRoute' import { RoutiderNavigationGuard } from './router/navigationGuard' declare const validTypeLocation: unique symbol export type ValidTypeLocation = typeof validTypeLocation export interface Routider { rawRouter: Router router: RoutiderRouter useRouter: () => RoutiderRouter useRoute: < N extends | RouteNames> | RouteNames>[] | null >( name: N ) => N extends null ? RoutiderLocation< undefined, string, string, RouteNames> > : RoutiderLocationOfNames, Exclude> onBeforeRouteLeave: ( leaveGuard: RoutiderNavigationGuard> ) => void onBeforeRouteUpdate: ( updateGuard: RoutiderNavigationGuard> ) => void ensureLocationType>>( location: RoutiderRouteLocation, N> ): RoutiderRouteLocation, N> & ValidTypeLocation } export const createRoutider = ( options: O ): Routider => { const routerOptions = routiderOptionsToRouterOptions(options) const rawRouter = createRouter(routerOptions) const router = createRoutiderRouter(rawRouter) const useRouter = () => router const useRoute = < N extends | RouteNames> | RouteNames>[] | null >( name: N ) => { const route = useRouteVueRouter() if (__DEV__) { warnIfIncorrectRoute>(route, name) } return route as N extends null ? RoutiderLocation< undefined, string, string, RouteNames> > : RoutiderLocationOfNames, Exclude> } const onBeforeRouteLeave = ( leaveGuard: RoutiderNavigationGuard> ) => { onBeforeRouteLeaveVueRouter(leaveGuard as NavigationGuard) } const onBeforeRouteUpdate = ( updateGuard: RoutiderNavigationGuard> ) => { onBeforeRouteUpdateVueRouter(updateGuard as NavigationGuard) } const ensureLocationType = >>( location: RoutiderRouteLocation, N> ) => location as RoutiderRouteLocation, N> & ValidTypeLocation return { rawRouter, router, useRouter, useRoute, onBeforeRouteLeave, onBeforeRouteUpdate, ensureLocationType } }