Skip to content

Commit ac4c109

Browse files
committed
fix(@angular-devkit/build-angular): ensure output directory is present before writing stats JSON
If an error occurs during a build, it is possible that the output path directory may not be present and then cause the stats JSON file write to fail. Fixes: #20349
1 parent 09daf7a commit ac4c109

File tree

1 file changed

+17
-7
lines changed
  • packages/angular_devkit/build_angular/src/webpack/configs

1 file changed

+17
-7
lines changed

packages/angular_devkit/build_angular/src/webpack/configs/common.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
buildOptimizerLoaderPath,
1111
} from '@angular-devkit/build-optimizer';
1212
import * as CopyWebpackPlugin from 'copy-webpack-plugin';
13-
import { createWriteStream, existsSync } from 'fs';
13+
import { createWriteStream, existsSync, promises as fsPromises } from 'fs';
1414
import * as path from 'path';
1515
import { ScriptTarget } from 'typescript';
1616
import {
@@ -34,6 +34,7 @@ import {
3434
} from '../../utils/environment-options';
3535
import { findAllNodeModules } from '../../utils/find-up';
3636
import { Spinner } from '../../utils/spinner';
37+
import { addError } from '../../utils/webpack-diagnostics';
3738
import { isWebpackFiveOrHigher, withWebpackFourOrFive } from '../../utils/webpack-version';
3839
import {
3940
DedupeModuleResolvePlugin,
@@ -294,12 +295,21 @@ export function getCommonConfig(wco: WebpackConfigOptions): Configuration {
294295
const data = stats.toJson('verbose');
295296
const statsOutputPath = path.join(stats.compilation.outputOptions.path, 'stats.json');
296297

297-
return new Promise<void>((resolve, reject) =>
298-
stringifyStream(data)
299-
.pipe(createWriteStream(statsOutputPath))
300-
.on('close', resolve)
301-
.on('error', reject),
302-
);
298+
try {
299+
await fsPromises.mkdir(path.dirname(statsOutputPath), { recursive: true });
300+
301+
await new Promise<void>((resolve, reject) =>
302+
stringifyStream(data)
303+
.pipe(createWriteStream(statsOutputPath))
304+
.on('close', resolve)
305+
.on('error', reject),
306+
);
307+
} catch (error) {
308+
addError(
309+
stats.compilation,
310+
`Unable to write stats file: ${error.message || 'unknown error'}`,
311+
);
312+
}
303313
});
304314
}
305315
})(),

0 commit comments

Comments
 (0)