diff --git a/goldens/public-api/router/index.md b/goldens/public-api/router/index.md index 701f6ce95bdbf..5592f0f97e3af 100644 --- a/goldens/public-api/router/index.md +++ b/goldens/public-api/router/index.md @@ -356,7 +356,7 @@ export interface IsActiveMatchOptions { } // @public -export type LoadChildren = LoadChildrenCallback; +export type LoadChildren = LoadChildrenCallback | ɵDeprecatedLoadChildren; // @public export type LoadChildrenCallback = () => Type | NgModuleFactory | Routes | Observable | Routes> | Promise | Type | Routes>; diff --git a/packages/router/src/deprecated_load_children.ts b/packages/router/src/deprecated_load_children.ts new file mode 100644 index 0000000000000..315f4df2605ff --- /dev/null +++ b/packages/router/src/deprecated_load_children.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright Google LLC 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 {Injector, NgModuleFactory} from '@angular/core'; +import {Observable} from 'rxjs'; + +// This file exists to support the legacy `loadChildren: string` behavior being patched back into +// Angular. + +/** + * Deprecated `loadChildren` value types. + * + * @publicApi + * @deprecated represents the deprecated type side of `LoadChildren`. + */ +export type DeprecatedLoadChildren = never; + +export function deprecatedLoadChildrenString( + injector: Injector, loadChildren: unknown): Observable>|null { + return null; +} diff --git a/packages/router/src/models.ts b/packages/router/src/models.ts index a7f6deef294b9..87e02aae21402 100644 --- a/packages/router/src/models.ts +++ b/packages/router/src/models.ts @@ -9,6 +9,7 @@ import {EnvironmentInjector, ImportedNgModuleProviders, InjectionToken, NgModuleFactory, Provider, ProviderToken, Type} from '@angular/core'; import {Observable} from 'rxjs'; +import {DeprecatedLoadChildren} from './deprecated_load_children'; import {ActivatedRouteSnapshot, RouterStateSnapshot} from './router_state'; import {UrlSegment, UrlSegmentGroup, UrlTree} from './url_tree'; @@ -125,7 +126,7 @@ export type LoadChildrenCallback = () => Type|NgModuleFactory|Routes| * @see `LoadChildrenCallback` * @publicApi */ -export type LoadChildren = LoadChildrenCallback; +export type LoadChildren = LoadChildrenCallback|DeprecatedLoadChildren; /** * diff --git a/packages/router/src/private_export.ts b/packages/router/src/private_export.ts index a543c0b9c602b..a056ccff57434 100644 --- a/packages/router/src/private_export.ts +++ b/packages/router/src/private_export.ts @@ -8,6 +8,7 @@ export {ɵEmptyOutletComponent} from './components/empty_outlet'; +export {DeprecatedLoadChildren as ɵDeprecatedLoadChildren} from './deprecated_load_children'; export {withPreloading as ɵwithPreloading} from './provide_router'; export {assignExtraOptionsToRouter as ɵassignExtraOptionsToRouter, RestoredState as ɵRestoredState} from './router'; export {ROUTER_PROVIDERS as ɵROUTER_PROVIDERS} from './router_module'; diff --git a/packages/router/src/router_config_loader.ts b/packages/router/src/router_config_loader.ts index 1b25c3b72dd35..3223c51f0797a 100644 --- a/packages/router/src/router_config_loader.ts +++ b/packages/router/src/router_config_loader.ts @@ -10,7 +10,8 @@ import {Compiler, EnvironmentInjector, Injectable, InjectFlags, InjectionToken, import {ConnectableObservable, from, Observable, of, Subject} from 'rxjs'; import {catchError, finalize, map, mergeMap, refCount, tap} from 'rxjs/operators'; -import {LoadChildren, LoadedRouterConfig, Route, Routes} from './models'; +import {deprecatedLoadChildrenString} from './deprecated_load_children'; +import {LoadChildren, LoadChildrenCallback, LoadedRouterConfig, Route, Routes} from './models'; import {flatten, wrapIntoObservable} from './utils/collection'; import {assertStandalone, standardizeConfig, validateConfig} from './utils/config'; @@ -122,7 +123,12 @@ export class RouterConfigLoader { private loadModuleFactoryOrRoutes(loadChildren: LoadChildren): Observable|Routes> { - return wrapIntoObservable(loadChildren()).pipe(mergeMap((t) => { + const deprecatedResult = deprecatedLoadChildrenString(this.injector, loadChildren); + if (deprecatedResult) { + return deprecatedResult; + } + + return wrapIntoObservable((loadChildren as LoadChildrenCallback)()).pipe(mergeMap((t) => { if (t instanceof NgModuleFactory || Array.isArray(t)) { return of(t); } else {