From e406db2898bb9d4843f024f54c09010b3485e8d4 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Fri, 25 Oct 2024 17:31:13 +0000 Subject: [PATCH] fix(@angular/ssr): ensure wildcard RenderMode is applied when no Angular routes are defined This fix addresses a bug where, in the absence of defined Angular routes, the RenderMode was not correctly applied based on the wildcard setting. --- packages/angular/ssr/src/routes/ng-routes.ts | 39 +++++++++++-------- .../angular/ssr/test/routes/ng-routes_spec.ts | 14 +++++++ 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/packages/angular/ssr/src/routes/ng-routes.ts b/packages/angular/ssr/src/routes/ng-routes.ts index a2680d5175d9..1d60841a090d 100644 --- a/packages/angular/ssr/src/routes/ng-routes.ts +++ b/packages/angular/ssr/src/routes/ng-routes.ts @@ -411,26 +411,26 @@ export async function getRoutesFromAngularRouterConfig( injector.get(APP_BASE_HREF, null, { optional: true }) ?? injector.get(PlatformLocation).getBaseHrefFromDOM(); - if (router.config.length) { - const compiler = injector.get(Compiler); + const compiler = injector.get(Compiler); - const serverRoutesConfig = injector.get(SERVER_ROUTES_CONFIG, null, { optional: true }); - let serverConfigRouteTree: RouteTree | undefined; + const serverRoutesConfig = injector.get(SERVER_ROUTES_CONFIG, null, { optional: true }); + let serverConfigRouteTree: RouteTree | undefined; - if (serverRoutesConfig) { - const result = buildServerConfigRouteTree(serverRoutesConfig); - serverConfigRouteTree = result.serverConfigRouteTree; - errors.push(...result.errors); - } + if (serverRoutesConfig) { + const result = buildServerConfigRouteTree(serverRoutesConfig); + serverConfigRouteTree = result.serverConfigRouteTree; + errors.push(...result.errors); + } - if (errors.length) { - return { - baseHref, - routes: routesResults, - errors, - }; - } + if (errors.length) { + return { + baseHref, + routes: routesResults, + errors, + }; + } + if (router.config.length) { // Retrieve all routes from the Angular router configuration. const traverseRoutes = traverseRoutesConfig({ routes: router.config, @@ -478,7 +478,12 @@ export async function getRoutesFromAngularRouterConfig( } } } else { - routesResults.push({ route: '', renderMode: RenderMode.Prerender }); + const renderMode = serverConfigRouteTree?.match('')?.renderMode ?? RenderMode.Prerender; + + routesResults.push({ + route: '', + renderMode, + }); } return { diff --git a/packages/angular/ssr/test/routes/ng-routes_spec.ts b/packages/angular/ssr/test/routes/ng-routes_spec.ts index 82ac36288110..bb0795a156c3 100644 --- a/packages/angular/ssr/test/routes/ng-routes_spec.ts +++ b/packages/angular/ssr/test/routes/ng-routes_spec.ts @@ -361,4 +361,18 @@ describe('extractRoutesAndCreateRouteTree', () => { `Both 'home' and 'shell' routes have their 'renderMode' set to 'AppShell'.`, ); }); + + it('should apply RenderMode matching the wildcard when no Angular routes are defined', async () => { + setAngularAppTestingManifest([], [{ path: '**', renderMode: RenderMode.Server }]); + + const { errors, routeTree } = await extractRoutesAndCreateRouteTree( + url, + /** manifest */ undefined, + /** invokeGetPrerenderParams */ false, + /** includePrerenderFallbackRoutes */ false, + ); + + expect(errors).toHaveSize(0); + expect(routeTree.toObject()).toEqual([{ route: '/', renderMode: RenderMode.Server }]); + }); });