/** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { APP_BASE_HREF, HashLocationStrategy, Location, LocationStrategy, PathLocationStrategy, PlatformLocation } from '@angular/common'; import { ANALYZE_FOR_ENTRY_COMPONENTS, APP_BOOTSTRAP_LISTENER, ApplicationRef, Compiler, Inject, Injector, NgModule, NgModuleFactoryLoader, NgProbeToken, OpaqueToken, Optional, SkipSelf, SystemJsNgModuleLoader } from '@angular/core'; import { RouterLink, RouterLinkWithHref } from './directives/router_link'; import { RouterLinkActive } from './directives/router_link_active'; import { RouterOutlet } from './directives/router_outlet'; import { getDOM } from './private_import_platform-browser'; import { RouteReuseStrategy } from './route_reuse_strategy'; import { Router } from './router'; import { ROUTES } from './router_config_loader'; import { RouterOutletMap } from './router_outlet_map'; import { NoPreloading, PreloadAllModules, PreloadingStrategy, RouterPreloader } from './router_preloader'; import { ActivatedRoute } from './router_state'; import { UrlHandlingStrategy } from './url_handling_strategy'; import { DefaultUrlSerializer, UrlSerializer } from './url_tree'; import { flatten } from './utils/collection'; /** * @whatItDoes Contains a list of directives * @stable */ var /** @type {?} */ ROUTER_DIRECTIVES = [RouterOutlet, RouterLink, RouterLinkWithHref, RouterLinkActive]; /** * @whatItDoes Is used in DI to configure the router. * @stable */ export var /** @type {?} */ ROUTER_CONFIGURATION = new OpaqueToken('ROUTER_CONFIGURATION'); /** * @docsNotRequired */ export var /** @type {?} */ ROUTER_FORROOT_GUARD = new OpaqueToken('ROUTER_FORROOT_GUARD'); export var /** @type {?} */ ROUTER_PROVIDERS = [ Location, { provide: UrlSerializer, useClass: DefaultUrlSerializer }, { provide: Router, useFactory: setupRouter, deps: [ ApplicationRef, UrlSerializer, RouterOutletMap, Location, Injector, NgModuleFactoryLoader, Compiler, ROUTES, ROUTER_CONFIGURATION, [UrlHandlingStrategy, new Optional()], [RouteReuseStrategy, new Optional()] ] }, RouterOutletMap, { provide: ActivatedRoute, useFactory: rootRoute, deps: [Router] }, { provide: NgModuleFactoryLoader, useClass: SystemJsNgModuleLoader }, RouterPreloader, NoPreloading, PreloadAllModules, { provide: ROUTER_CONFIGURATION, useValue: { enableTracing: false } }, ]; /** * @return {?} */ export function routerNgProbeToken() { return new NgProbeToken('Router', Router); } /** * \@whatItDoes Adds router directives and providers. * * \@howToUse * * RouterModule can be imported multiple times: once per lazily-loaded bundle. * Since the router deals with a global shared resource--location, we cannot have * more than one router service active. * * That is why there are two ways to create the module: `RouterModule.forRoot` and * `RouterModule.forChild`. * * * `forRoot` creates a module that contains all the directives, the given routes, and the router * service itself. * * `forChild` creates a module that contains all the directives and the given routes, but does not * include the router service. * * When registered at the root, the module should be used as follows * * ``` * \@NgModule({ * imports: [RouterModule.forRoot(ROUTES)] * }) * class MyNgModule {} * ``` * * For submodules and lazy loaded submodules the module should be used as follows: * * ``` * \@NgModule({ * imports: [RouterModule.forChild(ROUTES)] * }) * class MyNgModule {} * ``` * * \@description * * Managing state transitions is one of the hardest parts of building applications. This is * especially true on the web, where you also need to ensure that the state is reflected in the URL. * In addition, we often want to split applications into multiple bundles and load them on demand. * Doing this transparently is not trivial. * * The Angular 2 router solves these problems. Using the router, you can declaratively specify * application states, manage state transitions while taking care of the URL, and load bundles on * demand. * * [Read this developer guide](https://angular.io/docs/ts/latest/guide/router.html) to get an * overview of how the router should be used. * * \@stable */ export var RouterModule = (function () { /** * @param {?} guard */ function RouterModule(guard) { } /** * Creates a module with all the router providers and directives. It also optionally sets up an * application listener to perform an initial navigation. * * Options: * * `enableTracing` makes the router log all its internal events to the console. * * `useHash` enables the location strategy that uses the URL fragment instead of the history * API. * * `initialNavigation` disables the initial navigation. * * `errorHandler` provides a custom error handler. * @param {?} routes * @param {?=} config * @return {?} */ RouterModule.forRoot = function (routes, config) { return { ngModule: RouterModule, providers: [ ROUTER_PROVIDERS, provideRoutes(routes), { provide: ROUTER_FORROOT_GUARD, useFactory: provideForRootGuard, deps: [[Router, new Optional(), new SkipSelf()]] }, { provide: ROUTER_CONFIGURATION, useValue: config ? config : {} }, { provide: LocationStrategy, useFactory: provideLocationStrategy, deps: [ PlatformLocation, [new Inject(APP_BASE_HREF), new Optional()], ROUTER_CONFIGURATION ] }, { provide: PreloadingStrategy, useExisting: config && config.preloadingStrategy ? config.preloadingStrategy : NoPreloading }, { provide: NgProbeToken, multi: true, useFactory: routerNgProbeToken }, provideRouterInitializer(), ], }; }; /** * Creates a module with all the router directives and a provider registering routes. * @param {?} routes * @return {?} */ RouterModule.forChild = function (routes) { return { ngModule: RouterModule, providers: [provideRoutes(routes)] }; }; RouterModule.decorators = [ { type: NgModule, args: [{ declarations: ROUTER_DIRECTIVES, exports: ROUTER_DIRECTIVES },] }, ]; /** @nocollapse */ RouterModule.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [ROUTER_FORROOT_GUARD,] },] }, ]; }; return RouterModule; }()); function RouterModule_tsickle_Closure_declarations() { /** @type {?} */ RouterModule.decorators; /** * @nocollapse * @type {?} */ RouterModule.ctorParameters; } /** * @param {?} platformLocationStrategy * @param {?} baseHref * @param {?=} options * @return {?} */ export function provideLocationStrategy(platformLocationStrategy, baseHref, options) { if (options === void 0) { options = {}; } return options.useHash ? new HashLocationStrategy(platformLocationStrategy, baseHref) : new PathLocationStrategy(platformLocationStrategy, baseHref); } /** * @param {?} router * @return {?} */ export function provideForRootGuard(router) { if (router) { throw new Error("RouterModule.forRoot() called twice. Lazy loaded modules should use RouterModule.forChild() instead."); } return 'guarded'; } /** * \@whatItDoes Registers routes. * * \@howToUse * * ``` * \@NgModule({ * imports: [RouterModule.forChild(ROUTES)], * providers: [provideRoutes(EXTRA_ROUTES)] * }) * class MyNgModule {} * ``` * * \@stable * @param {?} routes * @return {?} */ export function provideRoutes(routes) { return [ { provide: ANALYZE_FOR_ENTRY_COMPONENTS, multi: true, useValue: routes }, { provide: ROUTES, multi: true, useValue: routes }, ]; } /** * @param {?} ref * @param {?} urlSerializer * @param {?} outletMap * @param {?} location * @param {?} injector * @param {?} loader * @param {?} compiler * @param {?} config * @param {?=} opts * @param {?=} urlHandlingStrategy * @param {?=} routeReuseStrategy * @return {?} */ export function setupRouter(ref, urlSerializer, outletMap, location, injector, loader, compiler, config, opts, urlHandlingStrategy, routeReuseStrategy) { if (opts === void 0) { opts = {}; } var /** @type {?} */ router = new Router(null, urlSerializer, outletMap, location, injector, loader, compiler, flatten(config)); if (urlHandlingStrategy) { router.urlHandlingStrategy = urlHandlingStrategy; } if (routeReuseStrategy) { router.routeReuseStrategy = routeReuseStrategy; } if (opts.errorHandler) { router.errorHandler = opts.errorHandler; } if (opts.enableTracing) { var /** @type {?} */ dom_1 = getDOM(); router.events.subscribe(function (e) { dom_1.logGroup("Router Event: " + ((e.constructor)).name); dom_1.log(e.toString()); dom_1.log(e); dom_1.logGroupEnd(); }); } return router; } /** * @param {?} router * @return {?} */ export function rootRoute(router) { return router.routerState.root; } /** * @param {?} router * @param {?} ref * @param {?} preloader * @param {?} opts * @return {?} */ export function initialRouterNavigation(router, ref, preloader, opts) { return function (bootstrappedComponentRef) { if (bootstrappedComponentRef !== ref.components[0]) { return; } router.resetRootComponentType(ref.componentTypes[0]); preloader.setUpPreloading(); if (opts.initialNavigation === false) { router.setUpLocationChangeListener(); } else { router.initialNavigation(); } }; } /** * A token for the router initializer that will be called after the app is bootstrapped. * * @experimental */ export var /** @type {?} */ ROUTER_INITIALIZER = new OpaqueToken('Router Initializer'); /** * @return {?} */ export function provideRouterInitializer() { return [ { provide: ROUTER_INITIALIZER, useFactory: initialRouterNavigation, deps: [Router, ApplicationRef, RouterPreloader, ROUTER_CONFIGURATION] }, { provide: APP_BOOTSTRAP_LISTENER, multi: true, useExisting: ROUTER_INITIALIZER }, ]; } //# sourceMappingURL=router_module.js.map