217 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| export * from '@angular/router-deprecated';
 | |
| 
 | |
| import { Directive, DynamicComponentLoader, ViewContainerRef,
 | |
|          Injectable, Optional, Input } from '@angular/core';
 | |
| 
 | |
| import { ComponentInstruction, Instruction,
 | |
|          Router, RouterOutlet} from '@angular/router-deprecated';
 | |
| 
 | |
| let _resolveToTrue = Promise.resolve(true);
 | |
| 
 | |
| const NOT_IMPLEMENTED = (what: string) => {
 | |
|   throw new Error (`"${what}" is not implemented`);
 | |
| };
 | |
| 
 | |
| 
 | |
| @Directive({
 | |
|   selector: '[routerLink]',
 | |
|   host: {
 | |
|     '(click)': 'onClick()',
 | |
|     '[attr.href]': 'visibleHref',
 | |
|     '[class.router-link-active]': 'isRouteActive'
 | |
|   }
 | |
| })
 | |
| export class MockRouterLink  {
 | |
| 
 | |
|   isRouteActive = false;
 | |
|   visibleHref: string; // the url displayed on the anchor element.
 | |
| 
 | |
|   @Input('routerLink') routeParams: any[];
 | |
|   @Input() target: string;
 | |
|   navigatedTo: any[] = null;
 | |
| 
 | |
|   constructor(public router: Router) { }
 | |
| 
 | |
|   onClick() {
 | |
|     this.navigatedTo = null;
 | |
| 
 | |
|     // If no target, or if target is _self, prevent default browser behavior
 | |
|     if (!this.target || typeof this.target !== 'string' || this.target === '_self') {
 | |
|       this.navigatedTo = this.routeParams;
 | |
|       return false;
 | |
|     }
 | |
|     return true;
 | |
|   }
 | |
| }
 | |
| 
 | |
| @Directive({selector: 'router-outlet'})
 | |
| export class MockRouterOutlet extends RouterOutlet {
 | |
|   name: string = null;
 | |
| 
 | |
|   constructor(
 | |
|     _viewContainerRef: ViewContainerRef,
 | |
|     @Optional() _loader: DynamicComponentLoader,
 | |
|     _parentRouter: Router,
 | |
|     nameAttr: string) {
 | |
|     super(_viewContainerRef, _loader, _parentRouter, nameAttr);
 | |
|       if (nameAttr) {
 | |
|         this.name = nameAttr;
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Called by the Router to instantiate a new component during the commit phase of a navigation.
 | |
|    * This method in turn is responsible for calling the `routerOnActivate` hook of its child.
 | |
|    */
 | |
|   activate(nextInstruction: ComponentInstruction): Promise<any> { NOT_IMPLEMENTED('activate'); return _resolveToTrue; }
 | |
| 
 | |
|   /**
 | |
|    * Called by the {@link Router} during the commit phase of a navigation when an outlet
 | |
|    * reuses a component between different routes.
 | |
|    * This method in turn is responsible for calling the `routerOnReuse` hook of its child.
 | |
|    */
 | |
|   reuse(nextInstruction: ComponentInstruction): Promise<any> { NOT_IMPLEMENTED('reuse'); return _resolveToTrue; }
 | |
| 
 | |
|   /**
 | |
|    * Called by the {@link Router} when an outlet disposes of a component's contents.
 | |
|    * This method in turn is responsible for calling the `routerOnDeactivate` hook of its child.
 | |
|    */
 | |
|   deactivate(nextInstruction: ComponentInstruction): Promise<any> { NOT_IMPLEMENTED('deactivate'); return _resolveToTrue; }
 | |
| 
 | |
|   /**
 | |
|    * Called by the {@link Router} during recognition phase of a navigation.
 | |
|    *
 | |
|    * If this resolves to `false`, the given navigation is cancelled.
 | |
|    *
 | |
|    * This method delegates to the child component's `routerCanDeactivate` hook if it exists,
 | |
|    * and otherwise resolves to true.
 | |
|    */
 | |
|   routerCanDeactivate(nextInstruction: ComponentInstruction): Promise<any> {
 | |
|     NOT_IMPLEMENTED('routerCanDeactivate'); return _resolveToTrue;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Called by the {@link Router} during recognition phase of a navigation.
 | |
|    *
 | |
|    * If the new child component has a different Type than the existing child component,
 | |
|    * this will resolve to `false`. You can't reuse an old component when the new component
 | |
|    * is of a different Type.
 | |
|    *
 | |
|    * Otherwise, this method delegates to the child component's `routerCanReuse` hook if it exists,
 | |
|    * or resolves to true if the hook is not present.
 | |
|    */
 | |
|   routerCanReuse(nextInstruction: ComponentInstruction): Promise<any> { NOT_IMPLEMENTED('routerCanReuse'); return _resolveToTrue; }
 | |
| 
 | |
| }
 | |
| 
 | |
| @Injectable()
 | |
| export class MockRouter extends Router {
 | |
| 
 | |
|   mockIsRouteActive = false;
 | |
|   mockRecognizedInstruction: Instruction;
 | |
|   outlet: RouterOutlet = null;
 | |
| 
 | |
|   constructor() {
 | |
|     super(null, null, null, null);
 | |
|   }
 | |
| 
 | |
|   auxRouter(hostComponent: any): Router { return new MockChildRouter(this, hostComponent); }
 | |
|   childRouter(hostComponent: any): Router { return new MockChildRouter(this, hostComponent); }
 | |
| 
 | |
|   commit(instruction: Instruction, _skipLocationChange = false): Promise<any> {
 | |
|     NOT_IMPLEMENTED('commit'); return _resolveToTrue;
 | |
|   }
 | |
| 
 | |
|   deactivate(instruction: Instruction, _skipLocationChange = false): Promise<any> {
 | |
|     NOT_IMPLEMENTED('deactivate'); return _resolveToTrue;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Generate an `Instruction` based on the provided Route Link DSL.
 | |
|    */
 | |
|   generate(linkParams: any[]): Instruction {
 | |
|     NOT_IMPLEMENTED('generate');  return null;
 | |
|   }
 | |
| 
 | |
|   isRouteActive(instruction: Instruction): boolean { return this.mockIsRouteActive; }
 | |
| 
 | |
|   /**
 | |
|    * Navigate based on the provided Route Link DSL. It's preferred to navigate with this method
 | |
|    * over `navigateByUrl`.
 | |
|    *
 | |
|    * ### Usage
 | |
|    *
 | |
|    * This method takes an array representing the Route Link DSL:
 | |
|    * ```
 | |
|    * ['./MyCmp', {param: 3}]
 | |
|    * ```
 | |
|    * See the {@link RouterLink} directive for more.
 | |
|    */
 | |
|   navigate(linkParams: any[]): Promise<any> {
 | |
|     return Promise.resolve(linkParams);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Navigate to a URL. Returns a promise that resolves when navigation is complete.
 | |
|    * It's preferred to navigate with `navigate` instead of this method, since URLs are more brittle.
 | |
|    *
 | |
|    * If the given URL begins with a `/`, router will navigate absolutely.
 | |
|    * If the given URL does not begin with `/`, the router will navigate relative to this component.
 | |
|    */
 | |
|   navigateByUrl(url: string, _skipLocationChange = false): Promise<any> {
 | |
|     return Promise.resolve(url);
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Navigate via the provided instruction. Returns a promise that resolves when navigation is
 | |
|    * complete.
 | |
|    */
 | |
|   navigateByInstruction(instruction: Instruction, _skipLocationChange = false): Promise<any> {
 | |
|     return Promise.resolve(instruction);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Subscribe to URL updates from the router
 | |
|    */
 | |
|   subscribe(onNext: (v: any) => void, onError?: (v: any) => void) {
 | |
|     return {onNext, onError};
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Given a URL, returns an instruction representing the component graph
 | |
|    */
 | |
|   recognize(url: string): Promise<Instruction> {
 | |
|     return Promise.resolve(this.mockRecognizedInstruction);
 | |
|   }
 | |
| 
 | |
|   registerPrimaryOutlet(outlet: RouterOutlet): Promise<any> {
 | |
|     this.outlet = outlet;
 | |
|     return super.registerPrimaryOutlet(outlet);
 | |
|   }
 | |
| 
 | |
|   unregisterPrimaryOutlet(outlet: RouterOutlet) {
 | |
|     super.unregisterPrimaryOutlet(outlet);
 | |
|     this.outlet = null;
 | |
|   }
 | |
| }
 | |
| 
 | |
| class MockChildRouter extends MockRouter {
 | |
|   constructor(parent: MockRouter, hostComponent: any) {
 | |
|     super();
 | |
|     this.parent = parent;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   navigateByUrl(url: string, _skipLocationChange = false): Promise<any> {
 | |
|     // Delegate navigation to the root router
 | |
|     return this.parent.navigateByUrl(url, _skipLocationChange);
 | |
|   }
 | |
| 
 | |
|   navigateByInstruction(instruction: Instruction, _skipLocationChange = false):
 | |
|       Promise<any> {
 | |
|     // Delegate navigation to the root router
 | |
|     return this.parent.navigateByInstruction(instruction, _skipLocationChange);
 | |
|   }
 | |
| }
 |