Skip to content

Commit 6d0ebdb

Browse files
alan-agius4clydin
authored andcommitted
fix(@angular-devkit/build-angular): only generate server directory when SSR is enabled
Previously, the `server` directory was erroneously generated even in instances where SSG was enabled but SSR remained inactive.
1 parent 7fdaf84 commit 6d0ebdb

File tree

3 files changed

+77
-26
lines changed

3 files changed

+77
-26
lines changed

packages/angular_devkit/build_angular/src/builders/application/build-action.ts

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
import { deleteOutputDir } from '../../utils/delete-output-dir';
2222
import { shouldWatchRoot } from '../../utils/environment-options';
2323
import { NormalizedCachedOptions } from '../../utils/normalize-cache';
24-
import { NormalizedOutputOptions } from './options';
24+
import { NormalizedApplicationBuildOptions, NormalizedOutputOptions } from './options';
2525

2626
// Watch workspace for package manager changes
2727
const packageWatchFiles = [
@@ -37,6 +37,9 @@ const packageWatchFiles = [
3737
'.pnp.data.json',
3838
];
3939

40+
type BuildActionOutput = (ExecutionResult['outputWithFiles'] | ExecutionResult['output']) &
41+
BuilderOutput;
42+
4043
export async function* runEsBuildBuildAction(
4144
action: (rebuildState?: RebuildState) => Promise<ExecutionResult>,
4245
options: {
@@ -58,7 +61,7 @@ export async function* runEsBuildBuildAction(
5861
colors?: boolean;
5962
jsonLogs?: boolean;
6063
},
61-
): AsyncIterable<(ExecutionResult['outputWithFiles'] | ExecutionResult['output']) & BuilderOutput> {
64+
): AsyncIterable<BuildActionOutput> {
6265
const {
6366
writeToFileSystemFilter,
6467
writeToFileSystem,
@@ -153,16 +156,7 @@ export async function* runEsBuildBuildAction(
153156
// Output the first build results after setting up the watcher to ensure that any code executed
154157
// higher in the iterator call stack will trigger the watcher. This is particularly relevant for
155158
// unit tests which execute the builder and modify the file system programmatically.
156-
if (writeToFileSystem) {
157-
// Write output files
158-
await writeResultFiles(result.outputFiles, result.assetFiles, outputOptions);
159-
160-
yield result.output;
161-
} else {
162-
// Requires casting due to unneeded `JsonObject` requirement. Remove once fixed.
163-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
164-
yield result.outputWithFiles as any;
165-
}
159+
yield await writeAndEmitOutput(writeToFileSystem, result, outputOptions, writeToFileSystemFilter);
166160

167161
// Finish if watch mode is not enabled
168162
if (!watcher) {
@@ -212,19 +206,12 @@ export async function* runEsBuildBuildAction(
212206
watcher.remove([...staleWatchFiles]);
213207
}
214208

215-
if (writeToFileSystem) {
216-
// Write output files
217-
const filesToWrite = writeToFileSystemFilter
218-
? result.outputFiles.filter(writeToFileSystemFilter)
219-
: result.outputFiles;
220-
await writeResultFiles(filesToWrite, result.assetFiles, outputOptions);
221-
222-
yield result.output;
223-
} else {
224-
// Requires casting due to unneeded `JsonObject` requirement. Remove once fixed.
225-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
226-
yield result.outputWithFiles as any;
227-
}
209+
yield await writeAndEmitOutput(
210+
writeToFileSystem,
211+
result,
212+
outputOptions,
213+
writeToFileSystemFilter,
214+
);
228215
}
229216
} finally {
230217
// Stop the watcher and cleanup incremental rebuild state
@@ -233,3 +220,25 @@ export async function* runEsBuildBuildAction(
233220
shutdownSassWorkerPool();
234221
}
235222
}
223+
224+
async function writeAndEmitOutput(
225+
writeToFileSystem: boolean,
226+
{ outputFiles, output, outputWithFiles, assetFiles }: ExecutionResult,
227+
outputOptions: NormalizedApplicationBuildOptions['outputOptions'],
228+
writeToFileSystemFilter: ((file: BuildOutputFile) => boolean) | undefined,
229+
): Promise<BuildActionOutput> {
230+
if (writeToFileSystem) {
231+
// Write output files
232+
const outputFilesToWrite = writeToFileSystemFilter
233+
? outputFiles.filter(writeToFileSystemFilter)
234+
: outputFiles;
235+
236+
await writeResultFiles(outputFilesToWrite, assetFiles, outputOptions);
237+
238+
return output;
239+
} else {
240+
// Requires casting due to unneeded `JsonObject` requirement. Remove once fixed.
241+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
242+
return outputWithFiles as any;
243+
}
244+
}

packages/angular_devkit/build_angular/src/builders/application/tests/options/ssr_spec.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,5 +50,47 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
5050
expect(result?.success).toBeTrue();
5151
harness.expectFile('dist/server/server.mjs').toExist();
5252
});
53+
54+
it(`should emit 'server' directory when 'ssr' is 'true'`, async () => {
55+
await harness.writeFile('file.mjs', `console.log('Hello!');`);
56+
57+
harness.useTarget('build', {
58+
...BASE_OPTIONS,
59+
server: 'src/main.server.ts',
60+
ssr: true,
61+
});
62+
63+
const { result } = await harness.executeOnce();
64+
expect(result?.success).toBeTrue();
65+
harness.expectDirectory('dist/server').toExist();
66+
});
67+
68+
it(`should not emit 'server' directory when 'ssr' is 'false'`, async () => {
69+
await harness.writeFile('file.mjs', `console.log('Hello!');`);
70+
71+
harness.useTarget('build', {
72+
...BASE_OPTIONS,
73+
server: 'src/main.server.ts',
74+
ssr: false,
75+
});
76+
77+
const { result } = await harness.executeOnce();
78+
expect(result?.success).toBeTrue();
79+
harness.expectDirectory('dist/server').toNotExist();
80+
});
81+
82+
it(`should not emit 'server' directory when 'ssr' is not set`, async () => {
83+
await harness.writeFile('file.mjs', `console.log('Hello!');`);
84+
85+
harness.useTarget('build', {
86+
...BASE_OPTIONS,
87+
server: 'src/main.server.ts',
88+
ssr: undefined,
89+
});
90+
91+
const { result } = await harness.executeOnce();
92+
expect(result?.success).toBeTrue();
93+
harness.expectDirectory('dist/server').toNotExist();
94+
});
5395
});
5496
});

packages/angular_devkit/build_angular/src/tools/esbuild/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ export function getFeatureSupport(target: string[]): BuildOptions['supported'] {
217217
export async function writeResultFiles(
218218
outputFiles: BuildOutputFile[],
219219
assetFiles: BuildOutputAsset[] | undefined,
220-
{ base, browser, media, server }: NormalizedOutputOptions,
220+
{ base, browser, server }: NormalizedOutputOptions,
221221
) {
222222
const directoryExists = new Set<string>();
223223
const ensureDirectoryExists = async (destPath: string) => {

0 commit comments

Comments
 (0)