Skip to content

Commit b78508f

Browse files
committed
fix(@angular-devkit/build-angular): several fixes to assets and files writes in browser-esbuild builder
This commit ports #26016 to the esbuilder and also fixes an issue where assets were being outputted in the wrong directory. Closes #26021 (cherry picked from commit b2678bb)
1 parent 53ca80c commit b78508f

File tree

4 files changed

+445
-66
lines changed

4 files changed

+445
-66
lines changed

goldens/circular-deps/packages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
"packages/angular_devkit/build_angular/src/tools/esbuild/bundler-context.ts",
44
"packages/angular_devkit/build_angular/src/tools/esbuild/utils.ts"
55
],
6+
[
7+
"packages/angular_devkit/build_angular/src/tools/esbuild/bundler-execution-result.ts",
8+
"packages/angular_devkit/build_angular/src/tools/esbuild/utils.ts"
9+
],
610
[
711
"packages/angular_devkit/build_angular/src/tools/webpack/utils/stats.ts",
812
"packages/angular_devkit/build_angular/src/utils/bundle-calculator.ts"

packages/angular_devkit/build_angular/src/builders/browser-esbuild/index.ts

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { constants as fsConstants } from 'node:fs';
1212
import fs from 'node:fs/promises';
1313
import path from 'node:path';
1414
import { BuildOutputFile } from '../../tools/esbuild/bundler-context';
15+
import { BuildOutputAsset } from '../../tools/esbuild/bundler-execution-result';
16+
import { emitFilesToDisk } from '../../tools/esbuild/utils';
1517
import { buildApplicationInternal } from '../application';
1618
import { Schema as ApplicationBuilderOptions } from '../application/schema';
1719
import { logBuilderStatusWarnings } from './builder-status-warnings';
@@ -74,36 +76,37 @@ function normalizeOptions(options: BrowserBuilderOptions): ApplicationBuilderOpt
7476
// and not output browser files into '/browser'.
7577
async function writeResultFiles(
7678
outputFiles: BuildOutputFile[],
77-
assetFiles: { source: string; destination: string }[] | undefined,
79+
assetFiles: BuildOutputAsset[] | undefined,
7880
outputPath: string,
7981
) {
8082
const directoryExists = new Set<string>();
81-
await Promise.all(
82-
outputFiles.map(async (file) => {
83-
// Ensure output subdirectories exist
84-
const basePath = path.dirname(file.path);
85-
if (basePath && !directoryExists.has(basePath)) {
86-
await fs.mkdir(path.join(outputPath, basePath), { recursive: true });
87-
directoryExists.add(basePath);
88-
}
89-
// Write file contents
90-
await fs.writeFile(path.join(outputPath, file.path), file.contents);
91-
}),
92-
);
83+
const ensureDirectoryExists = async (basePath: string) => {
84+
if (basePath && !directoryExists.has(basePath)) {
85+
await fs.mkdir(path.join(outputPath, basePath), { recursive: true });
86+
directoryExists.add(basePath);
87+
}
88+
};
89+
90+
// Writes the output file to disk and ensures the containing directories are present
91+
await emitFilesToDisk(outputFiles, async (file: BuildOutputFile) => {
92+
// Ensure output subdirectories exist
93+
const basePath = path.dirname(file.path);
94+
await ensureDirectoryExists(basePath);
95+
96+
// Write file contents
97+
await fs.writeFile(path.join(outputPath, file.path), file.contents);
98+
});
9399

94100
if (assetFiles?.length) {
95-
await Promise.all(
96-
assetFiles.map(async ({ source, destination }) => {
97-
// Ensure output subdirectories exist
98-
const basePath = path.dirname(destination);
99-
if (basePath && !directoryExists.has(basePath)) {
100-
await fs.mkdir(path.join(outputPath, basePath), { recursive: true });
101-
directoryExists.add(basePath);
102-
}
103-
// Copy file contents
104-
await fs.copyFile(source, path.join(outputPath), fsConstants.COPYFILE_FICLONE);
105-
}),
106-
);
101+
await emitFilesToDisk(assetFiles, async ({ source, destination }) => {
102+
const basePath = path.dirname(destination);
103+
104+
// Ensure output subdirectories exist
105+
await ensureDirectoryExists(basePath);
106+
107+
// Copy file contents
108+
await fs.copyFile(source, path.join(outputPath, destination), fsConstants.COPYFILE_FICLONE);
109+
});
107110
}
108111
}
109112

0 commit comments

Comments
 (0)