Skip to content

Commit 43cd458

Browse files
committed
fix(@schematics/angular): enable opt-in for new @angular/ssr feature
This commit updates several schematics to make the new `@angular/ssr` feature opt-in. Users can opt in by using the `--server-routing` option or by responding with `yes` to the prompt.
1 parent 1890fe4 commit 43cd458

31 files changed

+168
-35
lines changed

packages/angular/ssr/schematics/ng-add/schema.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
"description": "Skip installing dependency packages.",
1616
"type": "boolean",
1717
"default": false
18+
},
19+
"serverRouting": {
20+
"description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview).",
21+
"type": "boolean"
1822
}
1923
},
2024
"required": ["project"],

packages/schematics/angular/app-shell/index.ts

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ import {
2929
import { applyToUpdateRecorder } from '../utility/change';
3030
import { getAppModulePath, isStandaloneApp } from '../utility/ng-ast-utils';
3131
import { findBootstrapApplicationCall, getMainFilePath } from '../utility/standalone/util';
32-
import { getWorkspace } from '../utility/workspace';
32+
import { getWorkspace, updateWorkspace } from '../utility/workspace';
33+
import { Builders } from '../utility/workspace-models';
3334
import { Schema as AppShellOptions } from './schema';
3435

3536
const APP_SHELL_ROUTE = 'shell';
@@ -169,6 +170,29 @@ function getMetadataProperty(metadata: ts.Node, propertyName: string): ts.Proper
169170
return property;
170171
}
171172

173+
function addAppShellConfigToWorkspace(options: AppShellOptions): Rule {
174+
return updateWorkspace((workspace) => {
175+
const project = workspace.projects.get(options.project);
176+
if (!project) {
177+
return;
178+
}
179+
const buildTarget = project.targets.get('build');
180+
if (
181+
buildTarget?.builder === Builders.Application ||
182+
buildTarget?.builder === Builders.BuildApplication
183+
) {
184+
// Application builder configuration.
185+
const prodConfig = buildTarget.configurations?.production;
186+
if (!prodConfig) {
187+
throw new SchematicsException(
188+
`A "production" configuration is not defined for the "build" builder.`,
189+
);
190+
}
191+
prodConfig.appShell = true;
192+
}
193+
});
194+
}
195+
172196
function addServerRoutes(options: AppShellOptions): Rule {
173197
return async (host: Tree) => {
174198
// The workspace gets updated so this needs to be reloaded
@@ -349,9 +373,12 @@ export default function (options: AppShellOptions): Rule {
349373
return chain([
350374
validateProject(browserEntryPoint),
351375
schematic('server', options),
352-
isStandalone ? noop() : addRouterModule(browserEntryPoint),
353-
isStandalone ? addStandaloneServerRoute(options) : addServerRoutes(options),
354-
addServerRoutingConfig(options),
376+
...(isStandalone
377+
? [addStandaloneServerRoute(options)]
378+
: [addRouterModule(browserEntryPoint), addServerRoutes(options)]),
379+
options.serverRouting
380+
? addServerRoutingConfig(options)
381+
: addAppShellConfigToWorkspace(options),
355382
schematic('component', {
356383
name: 'app-shell',
357384
module: 'app.module.server.ts',

packages/schematics/angular/app-shell/index_spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ describe('App Shell Schematic', () => {
1919
);
2020
const defaultOptions: AppShellOptions = {
2121
project: 'bar',
22+
serverRouting: true,
2223
};
2324

2425
const workspaceOptions: WorkspaceOptions = {

packages/schematics/angular/app-shell/schema.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212
"$default": {
1313
"$source": "projectName"
1414
}
15+
},
16+
"serverRouting": {
17+
"description": "Creates a server application using the Server Routing API (Developer Preview).",
18+
"type": "boolean",
19+
"default": false
1520
}
1621
},
1722
"required": ["project"]

packages/schematics/angular/application/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ export default function (options: ApplicationOptions): Rule {
101101
options.ssr
102102
? schematic('ssr', {
103103
project: options.name,
104+
serverRouting: options.serverRouting,
104105
skipInstall: true,
105106
})
106107
: noop(),

packages/schematics/angular/application/schema.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@
118118
"default": false,
119119
"x-user-analytics": "ep.ng_ssr"
120120
},
121+
"serverRouting": {
122+
"description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview).",
123+
"type": "boolean"
124+
},
121125
"experimentalZoneless": {
122126
"description": "Create an application that does not utilize zone.js.",
123127
"type": "boolean",

packages/schematics/angular/ng-new/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export default function (options: NgNewOptions): Rule {
5757
minimal: options.minimal,
5858
standalone: options.standalone,
5959
ssr: options.ssr,
60+
serverRouting: options.serverRouting,
6061
experimentalZoneless: options.experimentalZoneless,
6162
};
6263

packages/schematics/angular/ng-new/schema.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@
139139
"type": "boolean",
140140
"x-user-analytics": "ep.ng_ssr"
141141
},
142+
"serverRouting": {
143+
"description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview).",
144+
"type": "boolean"
145+
},
142146
"experimentalZoneless": {
143147
"description": "Create an application that does not utilize zone.js.",
144148
"type": "boolean",
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { NgModule } from '@angular/core';
2-
import { ServerModule } from '@angular/platform-server';
3-
import { provideServerRoutesConfig } from '@angular/ssr';
2+
import { ServerModule } from '@angular/platform-server';<% if(serverRouting) { %>
3+
import { provideServerRoutesConfig } from '@angular/ssr';<% } %>
44
import { AppComponent } from './app.component';
5-
import { AppModule } from './app.module';
6-
import { serverRoutes } from './app.routes.server';
5+
import { AppModule } from './app.module';<% if(serverRouting) { %>
6+
import { serverRoutes } from './app.routes.server';<% } %>
77

88
@NgModule({
9-
imports: [AppModule, ServerModule],
10-
providers: [provideServerRoutesConfig(serverRoutes)],
9+
imports: [AppModule, ServerModule],<% if(serverRouting) { %>
10+
providers: [provideServerRoutesConfig(serverRoutes)],<% } %>
1111
bootstrap: [AppComponent],
1212
})
1313
export class AppServerModule {}

packages/schematics/angular/server/files/application-builder/standalone-src/app/app.config.server.ts.template

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
2-
import { provideServerRendering } from '@angular/platform-server';
3-
import { provideServerRoutesConfig } from '@angular/ssr';
4-
import { appConfig } from './app.config';
5-
import { serverRoutes } from './app.routes.server';
2+
import { provideServerRendering } from '@angular/platform-server';<% if(serverRouting) { %>
3+
import { provideServerRoutesConfig } from '@angular/ssr';<% } %>
4+
import { appConfig } from './app.config';<% if(serverRouting) { %>
5+
import { serverRoutes } from './app.routes.server';<% } %>
66

77
const serverConfig: ApplicationConfig = {
88
providers: [
9-
provideServerRendering(),
10-
provideServerRoutesConfig(serverRoutes)
9+
provideServerRendering(),<% if(serverRouting) { %>
10+
provideServerRoutesConfig(serverRoutes)<% } %>
1111
]
1212
};
1313

0 commit comments

Comments
 (0)