]> git.ipfire.org Git - thirdparty/vuejs/router.git/commitdiff
feat: allow true in `next`
authorEduardo San Martin Morote <posva13@gmail.com>
Tue, 17 Mar 2020 09:59:57 +0000 (10:59 +0100)
committerEduardo San Martin Morote <posva13@gmail.com>
Tue, 17 Mar 2020 12:37:13 +0000 (13:37 +0100)
__tests__/guards/component-beforeRouteEnter.spec.ts
playground/views/User.vue
src/types/index.ts
src/utils/guardToPromiseFn.ts
src/utils/index.ts

index f807b67bc880066b214a7c025dfb63a5d2307a6e..5f4f48bb2b8d40338c8c082c536f698aaa9f8c32 100644 (file)
@@ -215,8 +215,8 @@ describe('beforeRouteEnter', () => {
         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 => {
@@ -225,6 +225,9 @@ describe('beforeRouteEnter', () => {
             done()
           })
         })
+
+        await router.push('/')
+        await router.push('/guard/2')
       })
 
       it.skip('calls next callback after waiting', async done => {
index 8384bf8eeeea8e2b0c84ad581d66d3809d8117d0..86ccd0c0465a14bfaa40d0ae38ce139f81fd5a76 100644 (file)
@@ -10,5 +10,13 @@ export default defineComponent({
   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>
index 74636cc0d1e74a863c898ab477f130fe69079134..b42faf5aff517f91a5aad1afdaaa9bbb710ce29d 100644 (file)
@@ -217,10 +217,12 @@ export interface MatcherLocationRedirect {
 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,
index 0cd49c64178a35489e64ffd7b8667ef6851db900..29bf6e6fde41bb9a5908ee44a0d7e375c30a7995 100644 (file)
@@ -3,6 +3,8 @@ import {
   RouteLocationNormalized,
   NavigationGuardCallback,
   RouteLocation,
+  RouteLocationNormalizedResolved,
+  NavigationGuardNextCallback,
 } from '../types'
 
 import { isRouteLocation } from '../types'
@@ -11,18 +13,24 @@ import { NavigationGuardRedirect, NavigationAborted } from '../errors'
 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)
index 60c9d019c91afe93034cea841b406889189386a8..6167d396a7c09a9132eb151f1e8bc007f57cd851 100644 (file)
@@ -3,6 +3,7 @@ import {
   RouteParams,
   Immutable,
   RouteComponent,
+  RouteLocationNormalizedResolved,
 } from '../types'
 import { guardToPromiseFn } from './guardToPromiseFn'
 import { RouteRecordNormalized } from '../matcher/types'
@@ -23,7 +24,7 @@ export function extractComponentsGuards(
   matched: RouteRecordNormalized[],
   guardType: GuardType,
   to: RouteLocationNormalized,
-  from: RouteLocationNormalized
+  from: RouteLocationNormalizedResolved
 ) {
   const guards: Array<() => Promise<void>> = []