expect(router.currentRoute.value.fullPath).toBe('/foo')
})
- // not implemented yet as it depends on Vue 3 Suspense
- it.skip('calls next callback', done => {
+ // TODO:
+ it.skip('calls next callback', async done => {
const router = createRouter({ routes })
beforeRouteEnter.mockImplementationOnce((to, from, next) => {
next(vm => {
done()
})
})
+
+ await router.push('/')
+ await router.push('/guard/2')
})
it.skip('calls next callback after waiting', async done => {
props: {
id: String,
},
+
+ beforeRouteUpdate(to, from, next) {
+ // TODO: these do not work yet
+ console.log('this', this)
+ next(vm => {
+ console.log('in next', vm)
+ })
+ },
})
</script>
export interface NavigationGuardCallback {
(): void
(location: RouteLocation): void
- (valid: false): void
+ (valid: boolean): void
(cb: (vm: any) => void): void
}
+export type NavigationGuardNextCallback = (vm: any) => any
+
export interface NavigationGuard<V = void> {
(
this: V,
RouteLocationNormalized,
NavigationGuardCallback,
RouteLocation,
+ RouteLocationNormalizedResolved,
+ NavigationGuardNextCallback,
} from '../types'
import { isRouteLocation } from '../types'
export function guardToPromiseFn(
guard: NavigationGuard,
to: RouteLocationNormalized,
- from: RouteLocationNormalized
+ from: RouteLocationNormalizedResolved
+ // record?: RouteRecordNormalized
): () => Promise<void> {
return () =>
new Promise((resolve, reject) => {
const next: NavigationGuardCallback = (
- valid?: boolean | RouteLocation
+ valid?: boolean | RouteLocation | NavigationGuardNextCallback
) => {
- // TODO: handle callback
if (valid === false) reject(new NavigationAborted(to, from))
else if (isRouteLocation(valid)) {
reject(new NavigationGuardRedirect(to, valid))
- } else resolve()
+ } else if (!valid || valid === true) {
+ resolve()
+ } else {
+ // TODO: call the in component enter callbacks. Maybe somewhere else
+ // record && record.enterCallbacks.push(valid)
+ resolve()
+ }
}
guard(to, from, next)
RouteParams,
Immutable,
RouteComponent,
+ RouteLocationNormalizedResolved,
} from '../types'
import { guardToPromiseFn } from './guardToPromiseFn'
import { RouteRecordNormalized } from '../matcher/types'
matched: RouteRecordNormalized[],
guardType: GuardType,
to: RouteLocationNormalized,
- from: RouteLocationNormalized
+ from: RouteLocationNormalizedResolved
) {
const guards: Array<() => Promise<void>> = []