Skip to content

Commit 553d3d7

Browse files
committed
fix(@angular/build): add missing redirect in SSR manifest
Corrected an issue where a redirect was not properly included in the SSR (Server-Side Rendering) manifest. This fix ensures that all necessary redirects are accounted for during the build process.
1 parent cdad256 commit 553d3d7

File tree

3 files changed

+24
-30
lines changed

3 files changed

+24
-30
lines changed

packages/angular/build/src/builders/application/execute-post-bundle.ts

+3-16
Original file line numberDiff line numberDiff line change
@@ -176,23 +176,10 @@ export async function executePostBundleSteps(
176176
const serializableRouteTreeNodeForManifest: WritableSerializableRouteTreeNode = [];
177177

178178
for (const metadata of serializableRouteTreeNode) {
179-
switch (metadata.renderMode) {
180-
case RouteRenderMode.Prerender:
181-
case /* Legacy building mode */ undefined: {
182-
if (!metadata.redirectTo) {
183-
serializableRouteTreeNodeForManifest.push(metadata);
179+
serializableRouteTreeNodeForManifest.push(metadata);
184180

185-
if (!metadata.route.includes('*')) {
186-
prerenderedRoutes[metadata.route] = { headers: metadata.headers };
187-
}
188-
}
189-
break;
190-
}
191-
case RouteRenderMode.Server:
192-
case RouteRenderMode.Client:
193-
serializableRouteTreeNodeForManifest.push(metadata);
194-
195-
break;
181+
if (metadata.renderMode === RouteRenderMode.Prerender && !metadata.route.includes('*')) {
182+
prerenderedRoutes[metadata.route] = { headers: metadata.headers };
196183
}
197184
}
198185

packages/angular/ssr/src/app.ts

+14-14
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,16 @@ export class AngularServerApp {
154154
return null;
155155
}
156156

157-
if (matchedRoute.renderMode === RenderMode.Prerender) {
157+
const { redirectTo, status, renderMode } = matchedRoute;
158+
if (redirectTo !== undefined) {
159+
// Note: The status code is validated during route extraction.
160+
// 302 Found is used by default for redirections
161+
// See: https://developer.mozilla.org/en-US/docs/Web/API/Response/redirect_static#status
162+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
163+
return Response.redirect(new URL(redirectTo, new URL(request.url)), (status as any) ?? 302);
164+
}
165+
166+
if (renderMode === RenderMode.Prerender) {
158167
const response = await this.handleServe(request, matchedRoute);
159168
if (response) {
160169
return response;
@@ -186,7 +195,7 @@ export class AngularServerApp {
186195
return null;
187196
}
188197

189-
const { url, method } = request;
198+
const { method } = request;
190199
if (method !== 'GET' && method !== 'HEAD') {
191200
return null;
192201
}
@@ -228,18 +237,7 @@ export class AngularServerApp {
228237
matchedRoute: RouteTreeNodeMetadata,
229238
requestContext?: unknown,
230239
): Promise<Response | null> {
231-
const { redirectTo, status } = matchedRoute;
232-
const url = new URL(request.url);
233-
234-
if (redirectTo !== undefined) {
235-
// Note: The status code is validated during route extraction.
236-
// 302 Found is used by default for redirections
237-
// See: https://developer.mozilla.org/en-US/docs/Web/API/Response/redirect_static#status
238-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
239-
return Response.redirect(new URL(redirectTo, url), (status as any) ?? 302);
240-
}
241-
242-
const { renderMode, headers } = matchedRoute;
240+
const { renderMode, headers, status } = matchedRoute;
243241
if (
244242
!this.allowStaticRouteRender &&
245243
(renderMode === RenderMode.Prerender || renderMode === RenderMode.AppShell)
@@ -292,7 +290,9 @@ export class AngularServerApp {
292290
});
293291
}
294292

293+
const url = new URL(request.url);
295294
let html = await assets.getIndexServerHtml().text();
295+
296296
// Skip extra microtask if there are no pre hooks.
297297
if (hooks.has('html:transform:pre')) {
298298
html = await hooks.run('html:transform:pre', { html, url });

tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server.ts

+7
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,13 @@ export default async function () {
160160
'x-custom': 'csr',
161161
},
162162
},
163+
'/redirect': {
164+
content: 'ssg works!',
165+
serverContext: 'ng-server-context="ssg"',
166+
headers: {
167+
'x-custom': 'ssg',
168+
},
169+
},
163170
};
164171

165172
const port = await spawnServer();

0 commit comments

Comments
 (0)