Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions goldens/public-api/angular/ssr/index.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ export enum PrerenderFallback {
// @public
export function provideServerRendering(...features: ServerRenderingFeature<ServerRenderingFeatureKind>[]): EnvironmentProviders;

// @public
export function provideServerRendering(options: ServerRenderingOptions, ...features: ServerRenderingFeature<ServerRenderingFeatureKind>[]): EnvironmentProviders;

// @public
export enum RenderMode {
Client = 1,
Expand All @@ -51,6 +54,11 @@ export enum RenderMode {
// @public
export type RequestHandlerFunction = (request: Request) => Promise<Response | null> | null | Response;

// @public
export interface ServerRenderingOptions {
maxResponseBodySize: number;
}

// @public
export type ServerRoute = ServerRouteClient | ServerRoutePrerender | ServerRoutePrerenderWithParams | ServerRouteServer;

Expand Down
1 change: 1 addition & 0 deletions packages/angular/ssr/public_api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export {
type ServerRoutePrerenderWithParams,
type ServerRouteServer,
type ServerRouteCommon,
type ServerRenderingOptions,
} from './src/routes/route-config';

export { IS_DISCOVERING_ROUTES } from './src/routes/ng-routes';
87 changes: 86 additions & 1 deletion packages/angular/ssr/src/routes/route-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,17 @@ export function withAppShell(
};
}

/**
* Options for configuring server-side rendering.
*/
export interface ServerRenderingOptions {
/**
* The maximum allowed response body size when using the Fetch API.
* @default 1MB
*/
maxResponseBodySize: number;
}

/**
* Configures server-side rendering for an Angular application.
*
Expand Down Expand Up @@ -379,10 +390,71 @@ export function withAppShell(
*/
export function provideServerRendering(
...features: ServerRenderingFeature<ServerRenderingFeatureKind>[]
): EnvironmentProviders;

/**
* Configures server-side rendering for an Angular application with additional options.
*
* This function sets up the necessary providers for server-side rendering, including
* support for server routes and app shell. It combines features configured using
* `withRoutes` and `withAppShell` to provide a comprehensive server-side rendering setup.
*
* @param options - Configuration options for server-side rendering.
* @param features - Optional features to configure additional server rendering behaviors.
* @returns An `EnvironmentProviders` instance with the server-side rendering configuration.
*
* @example
* Basic example of how you can enable server-side rendering with options in your application
* when using the `bootstrapApplication` function:
*
* ```ts
* import { bootstrapApplication, BootstrapContext } from '@angular/platform-browser';
* import { provideServerRendering, withRoutes, withAppShell } from '@angular/ssr';
* import { AppComponent } from './app/app.component';
* import { SERVER_ROUTES } from './app/app.server.routes';
* import { AppShellComponent } from './app/app-shell.component';
*
* const bootstrap = (context: BootstrapContext) =>
* bootstrapApplication(AppComponent, {
* providers: [
* provideServerRendering(
* { maxResponseBodySize: 1024 * 1024 }, // 1MB limit
* withRoutes(SERVER_ROUTES),
* withAppShell(AppShellComponent),
* ),
* ],
* }, context);
*
* export default bootstrap;
* ```
* @see {@link withRoutes} configures server-side routing
* @see {@link withAppShell} configures the application shell
*/
export function provideServerRendering(
options: ServerRenderingOptions,
...features: ServerRenderingFeature<ServerRenderingFeatureKind>[]
): EnvironmentProviders;
export function provideServerRendering(
...args:
| ServerRenderingFeature<ServerRenderingFeatureKind>[]
| [ServerRenderingOptions, ...ServerRenderingFeature<ServerRenderingFeatureKind>[]]
): EnvironmentProviders {
let options: ServerRenderingOptions | undefined;
let features: ServerRenderingFeature<ServerRenderingFeatureKind>[];
if (hasOptions(args)) {
const [first, ...rest] = args;
options = first;
features = rest;
} else {
features = args;
}

const providers: (Provider | EnvironmentProviders)[] = [
provideServerRenderingPlatformServer(options),
];

let hasAppShell = false;
let hasServerRoutes = false;
const providers: (Provider | EnvironmentProviders)[] = [provideServerRenderingPlatformServer()];

for (const { ɵkind, ɵproviders } of features) {
hasAppShell ||= ɵkind === ServerRenderingFeatureKind.AppShell;
Expand All @@ -399,3 +471,16 @@ export function provideServerRendering(

return makeEnvironmentProviders(providers);
}

/**
* Checks if the first element of args is a `ServerRenderingOptions` object.
*/
function hasOptions(
args:
| ServerRenderingFeature<ServerRenderingFeatureKind>[]
| [ServerRenderingOptions, ...ServerRenderingFeature<ServerRenderingFeatureKind>[]],
): args is [ServerRenderingOptions, ...ServerRenderingFeature<ServerRenderingFeatureKind>[]] {
const value = args[0];

return !!value && typeof value === 'object' && !('ɵkind' in value);
}
Loading