diff --git a/packages/router/src/interfaces.ts b/packages/router/src/interfaces.ts index 460c5468a8..91c5222635 100644 --- a/packages/router/src/interfaces.ts +++ b/packages/router/src/interfaces.ts @@ -10,7 +10,7 @@ import {Observable} from 'rxjs'; import {Route} from './config'; import {ActivatedRouteSnapshot, RouterStateSnapshot} from './router_state'; -import {UrlSegment} from './url_tree'; +import {UrlSegment, UrlTree} from './url_tree'; /** @@ -33,7 +33,7 @@ import {UrlSegment} from './url_tree'; * canActivate( * route: ActivatedRouteSnapshot, * state: RouterStateSnapshot - * ): Observable|Promise|boolean { + * ): Observable|Promise|boolean|UrlTree { * return this.permissions.canActivate(this.currentUser, route.params.id); * } * } @@ -80,9 +80,12 @@ import {UrlSegment} from './url_tree'; */ export interface CanActivate { canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): - Observable|Promise|boolean; + Observable|Promise|boolean|UrlTree; } +export type CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => + Observable| Promise| boolean | UrlTree; + /** * @description * @@ -103,7 +106,7 @@ export interface CanActivate { * canActivateChild( * route: ActivatedRouteSnapshot, * state: RouterStateSnapshot - * ): Observable|Promise|boolean { + * ): Observable|Promise|boolean|UrlTree { * return this.permissions.canActivate(this.currentUser, route.params.id); * } * } @@ -160,9 +163,12 @@ export interface CanActivate { */ export interface CanActivateChild { canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): - Observable|Promise|boolean; + Observable|Promise|boolean|UrlTree; } +export type CanActivateChildFn = (childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot) => + Observable| Promise| boolean | UrlTree; + /** * @description * @@ -185,7 +191,7 @@ export interface CanActivateChild { * currentRoute: ActivatedRouteSnapshot, * currentState: RouterStateSnapshot, * nextState: RouterStateSnapshot - * ): Observable|Promise|boolean { + * ): Observable|Promise|boolean|UrlTree { * return this.permissions.canDeactivate(this.currentUser, route.params.id); * } * } @@ -234,9 +240,14 @@ export interface CanActivateChild { export interface CanDeactivate { canDeactivate( component: T, currentRoute: ActivatedRouteSnapshot, currentState: RouterStateSnapshot, - nextState?: RouterStateSnapshot): Observable|Promise|boolean; + nextState?: RouterStateSnapshot): Observable|Promise|boolean + |UrlTree; } +export type CanDeactivateFn = + (component: T, currentRoute: ActivatedRouteSnapshot, currentState: RouterStateSnapshot, + nextState?: RouterStateSnapshot) => Observable| Promise| boolean | UrlTree; + /** * @description * @@ -374,7 +385,9 @@ export interface Resolve { * * @publicApi */ -export interface CanLoad { canLoad: CanLoadFn; } +export interface CanLoad { + canLoad(route: Route, segments: UrlSegment[]): Observable|Promise|boolean; +} export type CanLoadFn = (route: Route, segments: UrlSegment[]) => Observable| Promise| boolean; diff --git a/packages/router/src/utils/type_guards.ts b/packages/router/src/utils/type_guards.ts index 83656af52c..008394d81c 100644 --- a/packages/router/src/utils/type_guards.ts +++ b/packages/router/src/utils/type_guards.ts @@ -7,7 +7,7 @@ */ import {Type} from '@angular/core'; -import {CanActivate, CanActivateChild, CanDeactivate} from '../interfaces'; +import {CanActivate, CanActivateChild, CanDeactivate, CanLoad} from '../interfaces'; /** * Simple function check, but generic so type inference will flow. Example: @@ -26,6 +26,10 @@ export function isFunction(v: any): v is T { return typeof v === 'function'; } +export function isCanLoad(guard: any): guard is CanLoad { + return guard && isFunction(guard.canLoad); +} + export function isCanActivate(guard: any): guard is CanActivate { return guard && isFunction(guard.canActivate); } diff --git a/tools/public_api_guard/router/router.d.ts b/tools/public_api_guard/router/router.d.ts index 0140289f5a..c62e9f97e1 100644 --- a/tools/public_api_guard/router/router.d.ts +++ b/tools/public_api_guard/router/router.d.ts @@ -52,15 +52,15 @@ export declare class ActivationStart { } export interface CanActivate { - canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean; + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree; } export interface CanActivateChild { - canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean; + canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree; } export interface CanDeactivate { - canDeactivate(component: T, currentRoute: ActivatedRouteSnapshot, currentState: RouterStateSnapshot, nextState?: RouterStateSnapshot): Observable | Promise | boolean; + canDeactivate(component: T, currentRoute: ActivatedRouteSnapshot, currentState: RouterStateSnapshot, nextState?: RouterStateSnapshot): Observable | Promise | boolean | UrlTree; } export interface CanLoad {