@angular/router 18.0.0-next.2 → 18.0.0-next.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/esm2022/src/components/empty_outlet.mjs +3 -3
  2. package/esm2022/src/directives/router_link.mjs +3 -3
  3. package/esm2022/src/directives/router_link_active.mjs +3 -3
  4. package/esm2022/src/directives/router_outlet.mjs +9 -13
  5. package/esm2022/src/events.mjs +2 -2
  6. package/esm2022/src/models.mjs +2 -2
  7. package/esm2022/src/navigation_transition.mjs +16 -11
  8. package/esm2022/src/operators/activate_routes.mjs +2 -2
  9. package/esm2022/src/operators/resolve_data.mjs +7 -1
  10. package/esm2022/src/page_title_strategy.mjs +8 -8
  11. package/esm2022/src/provide_router.mjs +10 -19
  12. package/esm2022/src/route_reuse_strategy.mjs +6 -6
  13. package/esm2022/src/router.mjs +9 -9
  14. package/esm2022/src/router_config.mjs +2 -2
  15. package/esm2022/src/router_config_loader.mjs +5 -5
  16. package/esm2022/src/router_module.mjs +7 -7
  17. package/esm2022/src/router_outlet_context.mjs +13 -11
  18. package/esm2022/src/router_preloader.mjs +9 -9
  19. package/esm2022/src/router_scroller.mjs +3 -3
  20. package/esm2022/src/router_state.mjs +3 -3
  21. package/esm2022/src/statemanager/state_manager.mjs +6 -6
  22. package/esm2022/src/url_handling_strategy.mjs +6 -6
  23. package/esm2022/src/url_tree.mjs +3 -3
  24. package/esm2022/src/version.mjs +1 -1
  25. package/esm2022/testing/src/router_testing_harness.mjs +6 -6
  26. package/esm2022/testing/src/router_testing_module.mjs +4 -4
  27. package/fesm2022/router.mjs +118 -121
  28. package/fesm2022/router.mjs.map +1 -1
  29. package/fesm2022/testing.mjs +12 -12
  30. package/fesm2022/upgrade.mjs +2 -2
  31. package/index.d.ts +38 -34
  32. package/package.json +4 -4
  33. package/testing/index.d.ts +2 -2
  34. package/upgrade/index.d.ts +2 -2
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @license Angular v18.0.0-next.2
3
- * (c) 2010-2022 Google LLC. https://angular.io/
2
+ * @license Angular v18.0.0-next.4
3
+ * (c) 2010-2024 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
6
6
 
7
7
  import * as i0 from '@angular/core';
8
- import { ɵisPromise, ɵRuntimeError, Injectable, EventEmitter, inject, ViewContainerRef, ChangeDetectorRef, EnvironmentInjector, Directive, Input, Output, InjectionToken, reflectComponentType, Component, createEnvironmentInjector, ɵisNgModule, isStandalone, ɵisInjectable, runInInjectionContext, Compiler, NgModuleFactory, NgZone, afterNextRender, ɵConsole, ɵPendingTasks, ɵɵsanitizeUrlOrResourceUrl, booleanAttribute, Attribute, HostBinding, HostListener, Optional, ContentChildren, makeEnvironmentProviders, APP_BOOTSTRAP_LISTENER, ENVIRONMENT_INITIALIZER, Injector, ApplicationRef, InjectFlags, APP_INITIALIZER, SkipSelf, NgModule, Inject, Version } from '@angular/core';
8
+ import { ɵisPromise, ɵRuntimeError, Injectable, EventEmitter, inject, ViewContainerRef, ChangeDetectorRef, Directive, Input, Output, InjectionToken, reflectComponentType, Component, createEnvironmentInjector, ɵisNgModule, isStandalone, ɵisInjectable, runInInjectionContext, Compiler, NgModuleFactory, NgZone, afterNextRender, EnvironmentInjector, ɵConsole, ɵPendingTasks, ɵɵsanitizeUrlOrResourceUrl, booleanAttribute, Attribute, HostBinding, HostListener, Optional, ContentChildren, makeEnvironmentProviders, APP_BOOTSTRAP_LISTENER, ENVIRONMENT_INITIALIZER, Injector, ApplicationRef, InjectFlags, APP_INITIALIZER, SkipSelf, NgModule, Inject, Version } from '@angular/core';
9
9
  import { isObservable, from, of, BehaviorSubject, combineLatest, EmptyError, concat, defer, pipe, throwError, EMPTY, ConnectableObservable, Subject, Subscription } from 'rxjs';
10
10
  import * as i3 from '@angular/common';
11
11
  import { DOCUMENT, Location, ViewportScroller, LOCATION_INITIALIZED, LocationStrategy, HashLocationStrategy, PathLocationStrategy } from '@angular/common';
@@ -421,10 +421,10 @@ function mapChildrenIntoArray(segment, fn) {
421
421
  * @publicApi
422
422
  */
423
423
  class UrlSerializer {
424
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: UrlSerializer, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
425
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: UrlSerializer, providedIn: 'root', useFactory: () => new DefaultUrlSerializer() }); }
424
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: UrlSerializer, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
425
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: UrlSerializer, providedIn: 'root', useFactory: () => new DefaultUrlSerializer() }); }
426
426
  }
427
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: UrlSerializer, decorators: [{
427
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: UrlSerializer, decorators: [{
428
428
  type: Injectable,
429
429
  args: [{ providedIn: 'root', useFactory: () => new DefaultUrlSerializer() }]
430
430
  }] });
@@ -1256,7 +1256,7 @@ var EventType;
1256
1256
  * ```
1257
1257
  *
1258
1258
  * @see {@link Event}
1259
- * @see [Router events summary](guide/router-reference#router-events)
1259
+ * @see [Router events summary](guide/routing/router-reference#router-events)
1260
1260
  * @publicApi
1261
1261
  */
1262
1262
  class RouterEvent {
@@ -1796,11 +1796,11 @@ function stringifyEvent(routerEvent) {
1796
1796
  * @publicApi
1797
1797
  */
1798
1798
  class OutletContext {
1799
- constructor() {
1799
+ constructor(injector) {
1800
+ this.injector = injector;
1800
1801
  this.outlet = null;
1801
1802
  this.route = null;
1802
- this.injector = null;
1803
- this.children = new ChildrenOutletContexts();
1803
+ this.children = new ChildrenOutletContexts(this.injector);
1804
1804
  this.attachRef = null;
1805
1805
  }
1806
1806
  }
@@ -1810,7 +1810,9 @@ class OutletContext {
1810
1810
  * @publicApi
1811
1811
  */
1812
1812
  class ChildrenOutletContexts {
1813
- constructor() {
1813
+ /** @nodoc */
1814
+ constructor(parentInjector) {
1815
+ this.parentInjector = parentInjector;
1814
1816
  // contexts for child outlets, by name.
1815
1817
  this.contexts = new Map();
1816
1818
  }
@@ -1847,7 +1849,7 @@ class ChildrenOutletContexts {
1847
1849
  getOrCreateContext(childName) {
1848
1850
  let context = this.getContext(childName);
1849
1851
  if (!context) {
1850
- context = new OutletContext();
1852
+ context = new OutletContext(this.parentInjector);
1851
1853
  this.contexts.set(childName, context);
1852
1854
  }
1853
1855
  return context;
@@ -1855,13 +1857,13 @@ class ChildrenOutletContexts {
1855
1857
  getContext(childName) {
1856
1858
  return this.contexts.get(childName) || null;
1857
1859
  }
1858
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: ChildrenOutletContexts, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1859
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: ChildrenOutletContexts, providedIn: 'root' }); }
1860
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: ChildrenOutletContexts, deps: [{ token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable }); }
1861
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: ChildrenOutletContexts, providedIn: 'root' }); }
1860
1862
  }
1861
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: ChildrenOutletContexts, decorators: [{
1863
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: ChildrenOutletContexts, decorators: [{
1862
1864
  type: Injectable,
1863
1865
  args: [{ providedIn: 'root' }]
1864
- }] });
1866
+ }], ctorParameters: () => [{ type: i0.EnvironmentInjector }] });
1865
1867
 
1866
1868
  class Tree {
1867
1869
  constructor(root) {
@@ -1977,7 +1979,7 @@ function nodeChildrenAsMap(node) {
1977
1979
  * ```
1978
1980
  *
1979
1981
  * @see {@link ActivatedRoute}
1980
- * @see [Getting route information](guide/router#getting-route-information)
1982
+ * @see [Getting route information](guide/routing/common-router-tasks#getting-route-information)
1981
1983
  *
1982
1984
  * @publicApi
1983
1985
  */
@@ -2028,7 +2030,7 @@ function createEmptyStateSnapshot(rootComponent) {
2028
2030
  * {@example router/activated-route/module.ts region="activated-route"
2029
2031
  * header="activated-route.component.ts"}
2030
2032
  *
2031
- * @see [Getting route information](guide/router#getting-route-information)
2033
+ * @see [Getting route information](guide/routing/common-router-tasks#getting-route-information)
2032
2034
  *
2033
2035
  * @publicApi
2034
2036
  */
@@ -2399,8 +2401,6 @@ function hasStaticTitle(config) {
2399
2401
  * (detach)='onDetach($event)'></router-outlet>
2400
2402
  * ```
2401
2403
  *
2402
- * @see [Routing tutorial](guide/router-tutorial-toh#named-outlets "Example of a named
2403
- * outlet and secondary route configuration").
2404
2404
  * @see {@link RouterLink}
2405
2405
  * @see {@link Route}
2406
2406
  * @ngModule RouterModule
@@ -2414,7 +2414,6 @@ class RouterOutlet {
2414
2414
  /**
2415
2415
  * The name of the outlet
2416
2416
  *
2417
- * @see [named outlets](guide/router-tutorial-toh#displaying-multiple-routes-in-named-outlets)
2418
2417
  */
2419
2418
  this.name = PRIMARY_OUTLET;
2420
2419
  this.activateEvents = new EventEmitter();
@@ -2432,7 +2431,6 @@ class RouterOutlet {
2432
2431
  this.parentContexts = inject(ChildrenOutletContexts);
2433
2432
  this.location = inject(ViewContainerRef);
2434
2433
  this.changeDetector = inject(ChangeDetectorRef);
2435
- this.environmentInjector = inject(EnvironmentInjector);
2436
2434
  this.inputBinder = inject(INPUT_BINDER, { optional: true });
2437
2435
  /** @nodoc */
2438
2436
  this.supportsBindingToComponentInputs = true;
@@ -2562,7 +2560,7 @@ class RouterOutlet {
2562
2560
  this.activated = location.createComponent(component, {
2563
2561
  index: location.length,
2564
2562
  injector,
2565
- environmentInjector: environmentInjector ?? this.environmentInjector,
2563
+ environmentInjector: environmentInjector,
2566
2564
  });
2567
2565
  // Calling `markForCheck` to make sure we will run the change detection when the
2568
2566
  // `RouterOutlet` is inside a `ChangeDetectionStrategy.OnPush` component.
@@ -2570,10 +2568,10 @@ class RouterOutlet {
2570
2568
  this.inputBinder?.bindActivatedRouteToOutletComponent(this);
2571
2569
  this.activateEvents.emit(this.activated.instance);
2572
2570
  }
2573
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterOutlet, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2574
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.0-next.2", type: RouterOutlet, isStandalone: true, selector: "router-outlet", inputs: { name: "name" }, outputs: { activateEvents: "activate", deactivateEvents: "deactivate", attachEvents: "attach", detachEvents: "detach" }, exportAs: ["outlet"], usesOnChanges: true, ngImport: i0 }); }
2571
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterOutlet, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2572
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.0-next.4", type: RouterOutlet, isStandalone: true, selector: "router-outlet", inputs: { name: "name" }, outputs: { activateEvents: "activate", deactivateEvents: "deactivate", attachEvents: "attach", detachEvents: "detach" }, exportAs: ["outlet"], usesOnChanges: true, ngImport: i0 }); }
2575
2573
  }
2576
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterOutlet, decorators: [{
2574
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterOutlet, decorators: [{
2577
2575
  type: Directive,
2578
2576
  args: [{
2579
2577
  selector: 'router-outlet',
@@ -2685,10 +2683,10 @@ class RoutedComponentInputBinder {
2685
2683
  });
2686
2684
  this.outletDataSubscriptions.set(outlet, dataSubscription);
2687
2685
  }
2688
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RoutedComponentInputBinder, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2689
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RoutedComponentInputBinder }); }
2686
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RoutedComponentInputBinder, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2687
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RoutedComponentInputBinder }); }
2690
2688
  }
2691
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RoutedComponentInputBinder, decorators: [{
2689
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RoutedComponentInputBinder, decorators: [{
2692
2690
  type: Injectable
2693
2691
  }] });
2694
2692
 
@@ -2768,10 +2766,10 @@ function isNavigationCancelingError(error) {
2768
2766
  * to this `EmptyOutletComponent`.
2769
2767
  */
2770
2768
  class ɵEmptyOutletComponent {
2771
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: ɵEmptyOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2772
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.0-next.2", type: ɵEmptyOutletComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `<router-outlet></router-outlet>`, isInline: true, dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] }); }
2769
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: ɵEmptyOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2770
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.0-next.4", type: ɵEmptyOutletComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `<router-outlet></router-outlet>`, isInline: true, dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] }); }
2773
2771
  }
2774
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: ɵEmptyOutletComponent, decorators: [{
2772
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: ɵEmptyOutletComponent, decorators: [{
2775
2773
  type: Component,
2776
2774
  args: [{
2777
2775
  template: `<router-outlet></router-outlet>`,
@@ -3129,7 +3127,7 @@ class ActivateRoutes {
3129
3127
  const injector = getClosestRouteInjector(future.snapshot);
3130
3128
  context.attachRef = null;
3131
3129
  context.route = future;
3132
- context.injector = injector;
3130
+ context.injector = injector ?? context.injector;
3133
3131
  if (context.outlet) {
3134
3132
  // Activate the outlet when it has already been instantiated
3135
3133
  // Otherwise it will get activated from its `ngOnInit` when instantiated
@@ -3344,7 +3342,7 @@ function isEmptyError(e) {
3344
3342
  * navigation should go to and the optional `navigationBehaviorOptions` can provide more information
3345
3343
  * about _how_ to perform the navigation.
3346
3344
  *
3347
- * @see [Routing tutorial](guide/router-tutorial-toh#milestone-5-route-guards)
3345
+ * @see [Routing guide](guide/routing/common-router-tasks#preventing-unauthorized-access)
3348
3346
  * @publicApi
3349
3347
  */
3350
3348
  class RedirectCommand {
@@ -4136,6 +4134,9 @@ function resolveNode(resolve, futureARS, futureRSS, injector) {
4136
4134
  }
4137
4135
  const data = {};
4138
4136
  return from(keys).pipe(mergeMap((key) => getResolver(resolve[key], futureARS, futureRSS, injector).pipe(first(), tap((value) => {
4137
+ if (value instanceof RedirectCommand) {
4138
+ throw redirectingNavigationError(new DefaultUrlSerializer(), value);
4139
+ }
4139
4140
  data[key] = value;
4140
4141
  }))), takeLast(1), mapTo(data), catchError((e) => (isEmptyError(e) ? EMPTY : throwError(e))));
4141
4142
  }
@@ -4185,7 +4186,7 @@ function switchTap(next) {
4185
4186
  * incorporate titles in named outlets.
4186
4187
  *
4187
4188
  * @publicApi
4188
- * @see [Page title guide](guide/router#setting-the-page-title)
4189
+ * @see [Page title guide](guide/routing/common-router-tasks#setting-the-page-title)
4189
4190
  */
4190
4191
  class TitleStrategy {
4191
4192
  /**
@@ -4207,10 +4208,10 @@ class TitleStrategy {
4207
4208
  getResolvedTitleForRoute(snapshot) {
4208
4209
  return snapshot.data[RouteTitleKey];
4209
4210
  }
4210
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: TitleStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4211
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: TitleStrategy, providedIn: 'root', useFactory: () => inject(DefaultTitleStrategy) }); }
4211
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: TitleStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4212
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: TitleStrategy, providedIn: 'root', useFactory: () => inject(DefaultTitleStrategy) }); }
4212
4213
  }
4213
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: TitleStrategy, decorators: [{
4214
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: TitleStrategy, decorators: [{
4214
4215
  type: Injectable,
4215
4216
  args: [{ providedIn: 'root', useFactory: () => inject(DefaultTitleStrategy) }]
4216
4217
  }] });
@@ -4233,16 +4234,16 @@ class DefaultTitleStrategy extends TitleStrategy {
4233
4234
  this.title.setTitle(title);
4234
4235
  }
4235
4236
  }
4236
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: DefaultTitleStrategy, deps: [{ token: i1.Title }], target: i0.ɵɵFactoryTarget.Injectable }); }
4237
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: DefaultTitleStrategy, providedIn: 'root' }); }
4237
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: DefaultTitleStrategy, deps: [{ token: i1.Title }], target: i0.ɵɵFactoryTarget.Injectable }); }
4238
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: DefaultTitleStrategy, providedIn: 'root' }); }
4238
4239
  }
4239
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: DefaultTitleStrategy, decorators: [{
4240
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: DefaultTitleStrategy, decorators: [{
4240
4241
  type: Injectable,
4241
4242
  args: [{ providedIn: 'root' }]
4242
4243
  }], ctorParameters: () => [{ type: i1.Title }] });
4243
4244
 
4244
4245
  /**
4245
- * A [DI token](guide/glossary/#di-token) for the router service.
4246
+ * A DI token for the router service.
4246
4247
  *
4247
4248
  * @publicApi
4248
4249
  */
@@ -4252,7 +4253,7 @@ const ROUTER_CONFIGURATION = new InjectionToken(typeof ngDevMode === 'undefined'
4252
4253
  });
4253
4254
 
4254
4255
  /**
4255
- * The [DI token](guide/glossary/#di-token) for a router configuration.
4256
+ * The DI token for a router configuration.
4256
4257
  *
4257
4258
  * `ROUTES` is a low level API for router configuration via dependency injection.
4258
4259
  *
@@ -4312,10 +4313,10 @@ class RouterConfigLoader {
4312
4313
  this.childrenLoaders.set(route, loader);
4313
4314
  return loader;
4314
4315
  }
4315
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterConfigLoader, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4316
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterConfigLoader, providedIn: 'root' }); }
4316
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterConfigLoader, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4317
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterConfigLoader, providedIn: 'root' }); }
4317
4318
  }
4318
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterConfigLoader, decorators: [{
4319
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterConfigLoader, decorators: [{
4319
4320
  type: Injectable,
4320
4321
  args: [{ providedIn: 'root' }]
4321
4322
  }] });
@@ -4382,10 +4383,10 @@ function maybeUnwrapDefaultExport(input) {
4382
4383
  * @publicApi
4383
4384
  */
4384
4385
  class UrlHandlingStrategy {
4385
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: UrlHandlingStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4386
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: UrlHandlingStrategy, providedIn: 'root', useFactory: () => inject(DefaultUrlHandlingStrategy) }); }
4386
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: UrlHandlingStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4387
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: UrlHandlingStrategy, providedIn: 'root', useFactory: () => inject(DefaultUrlHandlingStrategy) }); }
4387
4388
  }
4388
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: UrlHandlingStrategy, decorators: [{
4389
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: UrlHandlingStrategy, decorators: [{
4389
4390
  type: Injectable,
4390
4391
  args: [{ providedIn: 'root', useFactory: () => inject(DefaultUrlHandlingStrategy) }]
4391
4392
  }] });
@@ -4402,10 +4403,10 @@ class DefaultUrlHandlingStrategy {
4402
4403
  merge(newUrlPart, wholeUrl) {
4403
4404
  return newUrlPart;
4404
4405
  }
4405
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: DefaultUrlHandlingStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4406
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: DefaultUrlHandlingStrategy, providedIn: 'root' }); }
4406
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: DefaultUrlHandlingStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4407
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: DefaultUrlHandlingStrategy, providedIn: 'root' }); }
4407
4408
  }
4408
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: DefaultUrlHandlingStrategy, decorators: [{
4409
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: DefaultUrlHandlingStrategy, decorators: [{
4409
4410
  type: Injectable,
4410
4411
  args: [{ providedIn: 'root' }]
4411
4412
  }] });
@@ -4456,6 +4457,7 @@ function createRenderPromise(injector) {
4456
4457
  });
4457
4458
  }
4458
4459
 
4460
+ const NAVIGATION_ERROR_HANDLER = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'navigation error handler' : '');
4459
4461
  class NavigationTransitions {
4460
4462
  get hasRequestedNavigation() {
4461
4463
  return this.navigationId !== 0;
@@ -4485,6 +4487,7 @@ class NavigationTransitions {
4485
4487
  this.paramsInheritanceStrategy = this.options.paramsInheritanceStrategy || 'emptyOnly';
4486
4488
  this.urlHandlingStrategy = inject(UrlHandlingStrategy);
4487
4489
  this.createViewTransition = inject(CREATE_VIEW_TRANSITION, { optional: true });
4490
+ this.navigationErrorHandler = inject(NAVIGATION_ERROR_HANDLER, { optional: true });
4488
4491
  this.navigationId = 0;
4489
4492
  /**
4490
4493
  * Hook that enables you to pause navigation after the preactivation phase.
@@ -4516,8 +4519,8 @@ class NavigationTransitions {
4516
4519
  urlAfterRedirects: this.urlHandlingStrategy.extract(initialUrlTree),
4517
4520
  rawUrl: initialUrlTree,
4518
4521
  extras: {},
4519
- resolve: null,
4520
- reject: null,
4522
+ resolve: () => { },
4523
+ reject: () => { },
4521
4524
  promise: Promise.resolve(true),
4522
4525
  source: IMPERATIVE_NAVIGATION,
4523
4526
  restoredState: null,
@@ -4572,7 +4575,7 @@ class NavigationTransitions {
4572
4575
  ? `Navigation to ${t.rawUrl} was ignored because it is the same as the current Router URL.`
4573
4576
  : '';
4574
4577
  this.events.next(new NavigationSkipped(t.id, this.urlSerializer.serialize(t.rawUrl), reason, NavigationSkippedCode.IgnoredSameUrlNavigation));
4575
- t.resolve(null);
4578
+ t.resolve(false);
4576
4579
  return EMPTY;
4577
4580
  }
4578
4581
  if (this.urlHandlingStrategy.shouldProcessUrl(t.rawUrl)) {
@@ -4632,7 +4635,7 @@ class NavigationTransitions {
4632
4635
  ` indicated neither the current URL ${t.currentRawUrl} nor target URL ${t.rawUrl} should be processed.`
4633
4636
  : '';
4634
4637
  this.events.next(new NavigationSkipped(t.id, this.urlSerializer.serialize(t.extractedUrl), reason, NavigationSkippedCode.IgnoredByUrlHandlingStrategy));
4635
- t.resolve(null);
4638
+ t.resolve(false);
4636
4639
  return EMPTY;
4637
4640
  }
4638
4641
  }),
@@ -4777,9 +4780,12 @@ class NavigationTransitions {
4777
4780
  * to the pre-error state. */
4778
4781
  }
4779
4782
  else {
4780
- this.events.next(new NavigationError(overallTransitionState.id, this.urlSerializer.serialize(overallTransitionState.extractedUrl), e, overallTransitionState.targetSnapshot ?? undefined));
4783
+ const navigationError = new NavigationError(overallTransitionState.id, this.urlSerializer.serialize(overallTransitionState.extractedUrl), e, overallTransitionState.targetSnapshot ?? undefined);
4784
+ this.events.next(navigationError);
4781
4785
  try {
4782
- overallTransitionState.resolve(router.errorHandler(e));
4786
+ runInInjectionContext(this.environmentInjector, () => this.navigationErrorHandler?.(navigationError));
4787
+ const errorHandlerResult = router.errorHandler(e);
4788
+ overallTransitionState.resolve(!!errorHandlerResult);
4783
4789
  }
4784
4790
  catch (ee) {
4785
4791
  // TODO(atscott): consider flipping the default behavior of
@@ -4836,10 +4842,10 @@ class NavigationTransitions {
4836
4842
  return (extractedBrowserUrl.toString() !== this.currentTransition?.extractedUrl.toString() &&
4837
4843
  !this.currentTransition?.extras.skipLocationChange);
4838
4844
  }
4839
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: NavigationTransitions, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4840
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: NavigationTransitions, providedIn: 'root' }); }
4845
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: NavigationTransitions, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4846
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: NavigationTransitions, providedIn: 'root' }); }
4841
4847
  }
4842
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: NavigationTransitions, decorators: [{
4848
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: NavigationTransitions, decorators: [{
4843
4849
  type: Injectable,
4844
4850
  args: [{ providedIn: 'root' }]
4845
4851
  }], ctorParameters: () => [] });
@@ -4855,10 +4861,10 @@ function isBrowserTriggeredNavigation(source) {
4855
4861
  * @publicApi
4856
4862
  */
4857
4863
  class RouteReuseStrategy {
4858
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouteReuseStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4859
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouteReuseStrategy, providedIn: 'root', useFactory: () => inject(DefaultRouteReuseStrategy) }); }
4864
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouteReuseStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4865
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouteReuseStrategy, providedIn: 'root', useFactory: () => inject(DefaultRouteReuseStrategy) }); }
4860
4866
  }
4861
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouteReuseStrategy, decorators: [{
4867
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouteReuseStrategy, decorators: [{
4862
4868
  type: Injectable,
4863
4869
  args: [{ providedIn: 'root', useFactory: () => inject(DefaultRouteReuseStrategy) }]
4864
4870
  }] });
@@ -4909,19 +4915,19 @@ class BaseRouteReuseStrategy {
4909
4915
  }
4910
4916
  }
4911
4917
  class DefaultRouteReuseStrategy extends BaseRouteReuseStrategy {
4912
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: DefaultRouteReuseStrategy, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
4913
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: DefaultRouteReuseStrategy, providedIn: 'root' }); }
4918
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: DefaultRouteReuseStrategy, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
4919
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: DefaultRouteReuseStrategy, providedIn: 'root' }); }
4914
4920
  }
4915
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: DefaultRouteReuseStrategy, decorators: [{
4921
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: DefaultRouteReuseStrategy, decorators: [{
4916
4922
  type: Injectable,
4917
4923
  args: [{ providedIn: 'root' }]
4918
4924
  }] });
4919
4925
 
4920
4926
  class StateManager {
4921
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: StateManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4922
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: StateManager, providedIn: 'root', useFactory: () => inject(HistoryStateManager) }); }
4927
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: StateManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4928
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: StateManager, providedIn: 'root', useFactory: () => inject(HistoryStateManager) }); }
4923
4929
  }
4924
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: StateManager, decorators: [{
4930
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: StateManager, decorators: [{
4925
4931
  type: Injectable,
4926
4932
  args: [{ providedIn: 'root', useFactory: () => inject(HistoryStateManager) }]
4927
4933
  }] });
@@ -5096,10 +5102,10 @@ class HistoryStateManager extends StateManager {
5096
5102
  }
5097
5103
  return { navigationId };
5098
5104
  }
5099
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: HistoryStateManager, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
5100
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: HistoryStateManager, providedIn: 'root' }); }
5105
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: HistoryStateManager, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
5106
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: HistoryStateManager, providedIn: 'root' }); }
5101
5107
  }
5102
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: HistoryStateManager, decorators: [{
5108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: HistoryStateManager, decorators: [{
5103
5109
  type: Injectable,
5104
5110
  args: [{ providedIn: 'root' }]
5105
5111
  }] });
@@ -5168,7 +5174,7 @@ const subsetMatchOptions = {
5168
5174
  * A service that provides navigation among views and URL manipulation capabilities.
5169
5175
  *
5170
5176
  * @see {@link Route}
5171
- * @see [Routing and Navigation Guide](guide/router).
5177
+ * @see [Routing and Navigation Guide](guide/routing/common-router-tasks).
5172
5178
  *
5173
5179
  * @ngModule RouterModule
5174
5180
  *
@@ -5548,7 +5554,7 @@ class Router {
5548
5554
  * router.navigateByUrl("/team/33/user/11", { skipLocationChange: true });
5549
5555
  * ```
5550
5556
  *
5551
- * @see [Routing and Navigation guide](guide/router)
5557
+ * @see [Routing and Navigation guide](guide/routing/common-router-tasks)
5552
5558
  *
5553
5559
  */
5554
5560
  navigateByUrl(url, extras = {
@@ -5590,7 +5596,7 @@ class Router {
5590
5596
  * router.navigate(['team', 33, 'user', 11], {relativeTo: route, skipLocationChange: true});
5591
5597
  * ```
5592
5598
  *
5593
- * @see [Routing and Navigation guide](guide/router)
5599
+ * @see [Routing and Navigation guide](guide/routing/common-router-tasks)
5594
5600
  *
5595
5601
  */
5596
5602
  navigate(commands, extras = { skipLocationChange: false }) {
@@ -5667,8 +5673,8 @@ class Router {
5667
5673
  currentRawUrl: this.currentUrlTree,
5668
5674
  rawUrl,
5669
5675
  extras,
5670
- resolve,
5671
- reject,
5676
+ resolve: resolve,
5677
+ reject: reject,
5672
5678
  promise,
5673
5679
  currentSnapshot: this.routerState.snapshot,
5674
5680
  currentRouterState: this.routerState,
@@ -5679,10 +5685,10 @@ class Router {
5679
5685
  return Promise.reject(e);
5680
5686
  });
5681
5687
  }
5682
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: Router, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
5683
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: Router, providedIn: 'root' }); }
5688
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: Router, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
5689
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: Router, providedIn: 'root' }); }
5684
5690
  }
5685
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: Router, decorators: [{
5691
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: Router, decorators: [{
5686
5692
  type: Injectable,
5687
5693
  args: [{ providedIn: 'root' }]
5688
5694
  }], ctorParameters: () => [] });
@@ -5957,10 +5963,10 @@ class RouterLink {
5957
5963
  preserveFragment: this.preserveFragment,
5958
5964
  });
5959
5965
  }
5960
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterLink, deps: [{ token: Router }, { token: ActivatedRoute }, { token: 'tabindex', attribute: true }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i3.LocationStrategy }], target: i0.ɵɵFactoryTarget.Directive }); }
5961
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.0.0-next.2", type: RouterLink, isStandalone: true, selector: "[routerLink]", inputs: { target: "target", queryParams: "queryParams", fragment: "fragment", queryParamsHandling: "queryParamsHandling", state: "state", info: "info", relativeTo: "relativeTo", preserveFragment: ["preserveFragment", "preserveFragment", booleanAttribute], skipLocationChange: ["skipLocationChange", "skipLocationChange", booleanAttribute], replaceUrl: ["replaceUrl", "replaceUrl", booleanAttribute], routerLink: "routerLink" }, host: { listeners: { "click": "onClick($event.button,$event.ctrlKey,$event.shiftKey,$event.altKey,$event.metaKey)" }, properties: { "attr.target": "this.target" } }, usesOnChanges: true, ngImport: i0 }); }
5966
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterLink, deps: [{ token: Router }, { token: ActivatedRoute }, { token: 'tabindex', attribute: true }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i3.LocationStrategy }], target: i0.ɵɵFactoryTarget.Directive }); }
5967
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.0.0-next.4", type: RouterLink, isStandalone: true, selector: "[routerLink]", inputs: { target: "target", queryParams: "queryParams", fragment: "fragment", queryParamsHandling: "queryParamsHandling", state: "state", info: "info", relativeTo: "relativeTo", preserveFragment: ["preserveFragment", "preserveFragment", booleanAttribute], skipLocationChange: ["skipLocationChange", "skipLocationChange", booleanAttribute], replaceUrl: ["replaceUrl", "replaceUrl", booleanAttribute], routerLink: "routerLink" }, host: { listeners: { "click": "onClick($event.button,$event.ctrlKey,$event.shiftKey,$event.altKey,$event.metaKey)" }, properties: { "attr.target": "this.target" } }, usesOnChanges: true, ngImport: i0 }); }
5962
5968
  }
5963
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterLink, decorators: [{
5969
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterLink, decorators: [{
5964
5970
  type: Directive,
5965
5971
  args: [{
5966
5972
  selector: '[routerLink]',
@@ -6198,10 +6204,10 @@ class RouterLinkActive {
6198
6204
  const isActiveCheckFn = this.isLinkActive(this.router);
6199
6205
  return (this.link && isActiveCheckFn(this.link)) || this.links.some(isActiveCheckFn);
6200
6206
  }
6201
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterLinkActive, deps: [{ token: Router }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: RouterLink, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
6202
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.0-next.2", type: RouterLinkActive, isStandalone: true, selector: "[routerLinkActive]", inputs: { routerLinkActiveOptions: "routerLinkActiveOptions", ariaCurrentWhenActive: "ariaCurrentWhenActive", routerLinkActive: "routerLinkActive" }, outputs: { isActiveChange: "isActiveChange" }, queries: [{ propertyName: "links", predicate: RouterLink, descendants: true }], exportAs: ["routerLinkActive"], usesOnChanges: true, ngImport: i0 }); }
6207
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterLinkActive, deps: [{ token: Router }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: RouterLink, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
6208
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.0-next.4", type: RouterLinkActive, isStandalone: true, selector: "[routerLinkActive]", inputs: { routerLinkActiveOptions: "routerLinkActiveOptions", ariaCurrentWhenActive: "ariaCurrentWhenActive", routerLinkActive: "routerLinkActive" }, outputs: { isActiveChange: "isActiveChange" }, queries: [{ propertyName: "links", predicate: RouterLink, descendants: true }], exportAs: ["routerLinkActive"], usesOnChanges: true, ngImport: i0 }); }
6203
6209
  }
6204
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterLinkActive, decorators: [{
6210
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterLinkActive, decorators: [{
6205
6211
  type: Directive,
6206
6212
  args: [{
6207
6213
  selector: '[routerLinkActive]',
@@ -6253,10 +6259,10 @@ class PreloadAllModules {
6253
6259
  preload(route, fn) {
6254
6260
  return fn().pipe(catchError(() => of(null)));
6255
6261
  }
6256
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: PreloadAllModules, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6257
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: PreloadAllModules, providedIn: 'root' }); }
6262
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: PreloadAllModules, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6263
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: PreloadAllModules, providedIn: 'root' }); }
6258
6264
  }
6259
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: PreloadAllModules, decorators: [{
6265
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: PreloadAllModules, decorators: [{
6260
6266
  type: Injectable,
6261
6267
  args: [{ providedIn: 'root' }]
6262
6268
  }] });
@@ -6273,10 +6279,10 @@ class NoPreloading {
6273
6279
  preload(route, fn) {
6274
6280
  return of(null);
6275
6281
  }
6276
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: NoPreloading, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6277
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: NoPreloading, providedIn: 'root' }); }
6282
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: NoPreloading, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6283
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: NoPreloading, providedIn: 'root' }); }
6278
6284
  }
6279
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: NoPreloading, decorators: [{
6285
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: NoPreloading, decorators: [{
6280
6286
  type: Injectable,
6281
6287
  args: [{ providedIn: 'root' }]
6282
6288
  }] });
@@ -6367,10 +6373,10 @@ class RouterPreloader {
6367
6373
  }
6368
6374
  });
6369
6375
  }
6370
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterPreloader, deps: [{ token: Router }, { token: i0.Compiler }, { token: i0.EnvironmentInjector }, { token: PreloadingStrategy }, { token: RouterConfigLoader }], target: i0.ɵɵFactoryTarget.Injectable }); }
6371
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterPreloader, providedIn: 'root' }); }
6376
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterPreloader, deps: [{ token: Router }, { token: i0.Compiler }, { token: i0.EnvironmentInjector }, { token: PreloadingStrategy }, { token: RouterConfigLoader }], target: i0.ɵɵFactoryTarget.Injectable }); }
6377
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterPreloader, providedIn: 'root' }); }
6372
6378
  }
6373
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterPreloader, decorators: [{
6379
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterPreloader, decorators: [{
6374
6380
  type: Injectable,
6375
6381
  args: [{ providedIn: 'root' }]
6376
6382
  }], ctorParameters: () => [{ type: Router }, { type: i0.Compiler }, { type: i0.EnvironmentInjector }, { type: PreloadingStrategy }, { type: RouterConfigLoader }] });
@@ -6463,10 +6469,10 @@ class RouterScroller {
6463
6469
  this.routerEventsSubscription?.unsubscribe();
6464
6470
  this.scrollEventsSubscription?.unsubscribe();
6465
6471
  }
6466
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterScroller, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable }); }
6467
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterScroller }); }
6472
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterScroller, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable }); }
6473
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterScroller }); }
6468
6474
  }
6469
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterScroller, decorators: [{
6475
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterScroller, decorators: [{
6470
6476
  type: Injectable
6471
6477
  }], ctorParameters: () => [{ type: UrlSerializer }, { type: NavigationTransitions }, { type: i3.ViewportScroller }, { type: i0.NgZone }, { type: undefined }] });
6472
6478
 
@@ -6547,7 +6553,7 @@ const routerIsProvidedDevModeCheck = {
6547
6553
  },
6548
6554
  };
6549
6555
  /**
6550
- * Registers a [DI provider](guide/glossary#provider) for a set of routes.
6556
+ * Registers a DI provider for a set of routes.
6551
6557
  * @param routes The route configuration to provide.
6552
6558
  *
6553
6559
  * @usageNotes
@@ -6888,10 +6894,9 @@ function withHashLocation() {
6888
6894
  return routerFeature(6 /* RouterFeatureKind.RouterHashLocationFeature */, providers);
6889
6895
  }
6890
6896
  /**
6891
- * Subscribes to the Router's navigation events and calls the given function when a
6892
- * `NavigationError` happens.
6897
+ * Provides a function which is called when a navigation error occurs.
6893
6898
  *
6894
- * This function is run inside application's [injection context](guide/dependency-injection-context)
6899
+ * This function is run inside application's [injection context](guide/di/dependency-injection-context)
6895
6900
  * so you can use the [`inject`](api/core/inject) function.
6896
6901
  *
6897
6902
  * @usageNotes
@@ -6917,19 +6922,11 @@ function withHashLocation() {
6917
6922
  *
6918
6923
  * @publicApi
6919
6924
  */
6920
- function withNavigationErrorHandler(fn) {
6925
+ function withNavigationErrorHandler(handler) {
6921
6926
  const providers = [
6922
6927
  {
6923
- provide: ENVIRONMENT_INITIALIZER,
6924
- multi: true,
6925
- useValue: () => {
6926
- const injector = inject(EnvironmentInjector);
6927
- inject(Router).events.subscribe((e) => {
6928
- if (e instanceof NavigationError) {
6929
- runInInjectionContext(injector, () => fn(e));
6930
- }
6931
- });
6932
- },
6928
+ provide: NAVIGATION_ERROR_HANDLER,
6929
+ useValue: handler,
6933
6930
  },
6934
6931
  ];
6935
6932
  return routerFeature(7 /* RouterFeatureKind.NavigationErrorHandlerFeature */, providers);
@@ -7042,7 +7039,7 @@ const ROUTER_PROVIDERS = [
7042
7039
  * * The `forChild()` method creates an `NgModule` that contains all the directives and the given
7043
7040
  * routes, but does not include the `Router` service.
7044
7041
  *
7045
- * @see [Routing and Navigation guide](guide/router) for an
7042
+ * @see [Routing and Navigation guide](guide/routing/common-router-tasks) for an
7046
7043
  * overview of how the `Router` service should be used.
7047
7044
  *
7048
7045
  * @publicApi
@@ -7116,11 +7113,11 @@ class RouterModule {
7116
7113
  providers: [{ provide: ROUTES, multi: true, useValue: routes }],
7117
7114
  };
7118
7115
  }
7119
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterModule, deps: [{ token: ROUTER_FORROOT_GUARD, optional: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
7120
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterModule, imports: [RouterOutlet, RouterLink, RouterLinkActive, ɵEmptyOutletComponent], exports: [RouterOutlet, RouterLink, RouterLinkActive, ɵEmptyOutletComponent] }); }
7121
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterModule }); }
7116
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterModule, deps: [{ token: ROUTER_FORROOT_GUARD, optional: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
7117
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterModule, imports: [RouterOutlet, RouterLink, RouterLinkActive, ɵEmptyOutletComponent], exports: [RouterOutlet, RouterLink, RouterLinkActive, ɵEmptyOutletComponent] }); }
7118
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterModule }); }
7122
7119
  }
7123
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.2", ngImport: i0, type: RouterModule, decorators: [{
7120
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0-next.4", ngImport: i0, type: RouterModule, decorators: [{
7124
7121
  type: NgModule,
7125
7122
  args: [{
7126
7123
  imports: ROUTER_DIRECTIVES,
@@ -7181,7 +7178,7 @@ function provideInitialNavigation(config) {
7181
7178
  }
7182
7179
  // TODO(atscott): This should not be in the public API
7183
7180
  /**
7184
- * A [DI token](guide/glossary/#di-token) for the router initializer that
7181
+ * A DI token for the router initializer that
7185
7182
  * is called after the app is bootstrapped.
7186
7183
  *
7187
7184
  * @publicApi
@@ -7265,7 +7262,7 @@ function mapToResolve(provider) {
7265
7262
  /**
7266
7263
  * @publicApi
7267
7264
  */
7268
- const VERSION = new Version('18.0.0-next.2');
7265
+ const VERSION = new Version('18.0.0-next.4');
7269
7266
 
7270
7267
  /**
7271
7268
  * @module