Skip to content

Commit 2640bf7

Browse files
committed
fix(@angular/ssr): correct route extraction and error handling
This commit introduces the following changes: - Disallows paths starting with a slash to match Angular router behavior. - Errors are now stored and displayed at a later stage, improving UX by avoiding unnecessary stack traces that are not useful in this context.
1 parent d60f3fe commit 2640bf7

File tree

12 files changed

+365
-165
lines changed

12 files changed

+365
-165
lines changed

packages/angular/build/src/utils/server-rendering/prerender.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ import { BuildOutputAsset } from '../../tools/esbuild/bundler-execution-result';
1515
import { urlJoin } from '../url';
1616
import type { RenderWorkerData } from './render-worker';
1717
import type {
18+
RoutersExtractorWorkerResult,
1819
RoutesExtractorWorkerData,
19-
RoutersExtractorWorkerResult as SerializableRouteTreeNode,
20+
SerializableRouteTreeNode,
2021
} from './routes-extractor-worker';
2122

2223
interface PrerenderOptions {
@@ -298,14 +299,15 @@ async function getAllRoutes(
298299
});
299300

300301
const errors: string[] = [];
301-
const serializableRouteTreeNode: SerializableRouteTreeNode = await renderWorker
302-
.run({})
303-
.catch((err) => {
304-
errors.push(`An error occurred while extracting routes.\n\n${err.stack}`);
305-
})
306-
.finally(() => {
307-
void renderWorker.destroy();
308-
});
302+
const { serializedRouteTree: serializableRouteTreeNode }: RoutersExtractorWorkerResult =
303+
await renderWorker
304+
.run({})
305+
.catch((err) => {
306+
errors.push(`An error occurred while extracting routes.\n\n${err.stack}`);
307+
})
308+
.finally(() => {
309+
void renderWorker.destroy();
310+
});
309311

310312
const skippedRedirects: string[] = [];
311313
const skippedOthers: string[] = [];

packages/angular/build/src/utils/server-rendering/routes-extractor-worker.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,30 @@ export interface RoutesExtractorWorkerData extends ESMInMemoryFileLoaderWorkerDa
1515
assetFiles: Record</** Destination */ string, /** Source */ string>;
1616
}
1717

18-
export type RoutersExtractorWorkerResult = ReturnType<
19-
Awaited<ReturnType<typeof ɵextractRoutesAndCreateRouteTree>>['toObject']
18+
export type SerializableRouteTreeNode = ReturnType<
19+
Awaited<ReturnType<typeof ɵextractRoutesAndCreateRouteTree>>['routeTree']['toObject']
2020
>;
2121

22+
export interface RoutersExtractorWorkerResult {
23+
serializedRouteTree: SerializableRouteTreeNode;
24+
errors: string[];
25+
}
26+
2227
/** Renders an application based on a provided options. */
2328
async function extractRoutes(): Promise<RoutersExtractorWorkerResult> {
2429
const { ɵextractRoutesAndCreateRouteTree: extractRoutesAndCreateRouteTree } =
2530
await loadEsmModuleFromMemory('./main.server.mjs');
2631

27-
const routeTree = await extractRoutesAndCreateRouteTree(
32+
const { routeTree, errors } = await extractRoutesAndCreateRouteTree(
2833
new URL('http://local-angular-prerender/'),
2934
/** manifest */ undefined,
3035
/** invokeGetPrerenderParams */ true,
3136
);
3237

33-
return routeTree.toObject();
38+
return {
39+
errors,
40+
serializedRouteTree: routeTree.toObject(),
41+
};
3442
}
3543

3644
function initialize() {

packages/angular/ssr/node/src/app-engine.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export class AngularNodeAppEngine {
5959
* const headers = angularAppEngine.getPrerenderHeaders(res.req);
6060
*
6161
* // Apply the retrieved headers to the response
62-
* for (const { key, value } of headers) {
62+
* for (const [key, value] of headers) {
6363
* res.setHeader(key, value);
6464
* }
6565
* }

0 commit comments

Comments
 (0)