diff --git a/packages/angular_devkit/build_angular/src/builders/server/index.ts b/packages/angular_devkit/build_angular/src/builders/server/index.ts index 011a42088805..057ec10dedf2 100644 --- a/packages/angular_devkit/build_angular/src/builders/server/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/server/index.ts @@ -33,7 +33,13 @@ import { } from '../../utils/webpack-browser-config'; import { getCommonConfig, getStylesConfig } from '../../webpack/configs'; import { isPlatformServerInstalled } from '../../webpack/utils/helpers'; -import { webpackStatsLogger } from '../../webpack/utils/stats'; +import { + statsErrorsToString, + statsHasErrors, + statsHasWarnings, + statsWarningsToString, + webpackStatsLogger, +} from '../../webpack/utils/stats'; import { Schema as ServerBuilderOptions } from './schema'; /** @@ -87,12 +93,19 @@ export function execute( }, }).pipe( concatMap(async (output) => { - const { emittedFiles = [], outputPath, webpackStats } = output; + const { emittedFiles = [], outputPath, webpackStats, success } = output; if (!webpackStats) { throw new Error('Webpack stats build result is required.'); } - if (!output.success) { + if (!success) { + if (statsHasWarnings(webpackStats)) { + context.logger.warn(statsWarningsToString(webpackStats, { colors: true })); + } + if (statsHasErrors(webpackStats)) { + context.logger.error(statsErrorsToString(webpackStats, { colors: true })); + } + return output; } diff --git a/packages/angular_devkit/build_angular/src/builders/server/tests/behavior/build-errors_spec.ts b/packages/angular_devkit/build_angular/src/builders/server/tests/behavior/build-errors_spec.ts new file mode 100644 index 000000000000..8db1f181d3ee --- /dev/null +++ b/packages/angular_devkit/build_angular/src/builders/server/tests/behavior/build-errors_spec.ts @@ -0,0 +1,34 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import { logging } from '@angular-devkit/core'; +import { execute } from '../../index'; +import { BASE_OPTIONS, SERVER_BUILDER_INFO, describeBuilder } from '../setup'; + +describeBuilder(execute, SERVER_BUILDER_INFO, (harness) => { + describe('Behavior: "Build Error"', () => { + it('emits errors', async () => { + harness.useTarget('server', { + ...BASE_OPTIONS, + watch: true, + }); + + // Generate an error + await harness.appendToFile('src/main.server.ts', `const foo: = 'abc';`); + + const { result, logs } = await harness.executeOnce(); + + expect(result?.success).toBeFalse(); + expect(logs).toContain( + jasmine.objectContaining({ + message: jasmine.stringMatching(/TS1110:.*Type expected/), + }), + ); + }); + }); +}); diff --git a/packages/angular_devkit/build_angular/src/builders/server/tests/behavior/web-workers_spec.ts b/packages/angular_devkit/build_angular/src/builders/server/tests/behavior/web-workers_spec.ts index b9cd9618cb78..0112fb0d38d8 100644 --- a/packages/angular_devkit/build_angular/src/builders/server/tests/behavior/web-workers_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/server/tests/behavior/web-workers_spec.ts @@ -12,14 +12,14 @@ import { BASE_OPTIONS, SERVER_BUILDER_INFO, describeBuilder } from '../setup'; describeBuilder(execute, SERVER_BUILDER_INFO, (harness) => { describe('Behavior: "Errors"', () => { it('should not try to resolve web-workers', async () => { - harness.useTarget('test', { + harness.useTarget('server', { ...BASE_OPTIONS, }); await harness.writeFiles({ 'src/app/app.worker.ts': ` /// - + const foo: string = 'hello world'; addEventListener('message', ({ data }) => { postMessage(foo);