From 1cc5b6604dfd80deb835238e524ceb8ce34f7e83 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Sat, 9 Jun 2018 12:16:52 +0200 Subject: [PATCH] feat(angular_devkit): stop blocking karma after compilation error --- .../plugins/karma-webpack-failure-cb.ts | 4 ++-- .../src/angular-cli-files/plugins/karma.ts | 22 ++++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/angular-cli-files/plugins/karma-webpack-failure-cb.ts b/packages/angular_devkit/build_angular/src/angular-cli-files/plugins/karma-webpack-failure-cb.ts index 392eebd14bc3..b4c02479bd6e 100644 --- a/packages/angular_devkit/build_angular/src/angular-cli-files/plugins/karma-webpack-failure-cb.ts +++ b/packages/angular_devkit/build_angular/src/angular-cli-files/plugins/karma-webpack-failure-cb.ts @@ -12,12 +12,12 @@ // Workaround for https://github.com/webpack-contrib/karma-webpack/issues/66 export class KarmaWebpackFailureCb { - constructor(private callback: () => void) { } + constructor(private callback: (error: string | undefined, errors: string[]) => void) { } apply(compiler: any): void { compiler.hooks.done.tap('KarmaWebpackFailureCb', (stats: any) => { if (stats.compilation.errors.length > 0) { - this.callback(); + this.callback(undefined, stats.compilation.errors.map((error: any) => error.message? error.message : error.toString())); } }); } diff --git a/packages/angular_devkit/build_angular/src/angular-cli-files/plugins/karma.ts b/packages/angular_devkit/build_angular/src/angular-cli-files/plugins/karma.ts index fcf6dcb516b1..a2c238dbd2ee 100644 --- a/packages/angular_devkit/build_angular/src/angular-cli-files/plugins/karma.ts +++ b/packages/angular_devkit/build_angular/src/angular-cli-files/plugins/karma.ts @@ -91,8 +91,16 @@ const init: any = (config: any, emitter: any, customFileHandlers: any) => { publicPath: '/_karma_webpack_/', }; - // Finish Karma run early in case of compilation error. - const compilationErrorCb = () => emitter.emit('run_complete', [], { exitCode: 1 }); + const compilationErrorCb = (error: string | undefined, errors: string[]) => { + // Notify potential listeners of the compile error + emitter.emit('compile_error', errors); + + // Finish Karma run early in case of compilation error. + emitter.emit('run_complete', [], { exitCode: 1 }); + + // Unblock any karma requests (potentially started using `karma run`) + unblock(); + } webpackConfig.plugins.push(new KarmaWebpackFailureCb(compilationErrorCb)); // Use existing config if any. @@ -157,14 +165,18 @@ const init: any = (config: any, emitter: any, customFileHandlers: any) => { }); }); + function unblock(){ + isBlocked = false; + blocked.forEach((cb) => cb()); + blocked = []; + } + compiler.plugin('done', (stats: any) => { // Don't refresh karma when there are webpack errors. if (stats.compilation.errors.length === 0) { emitter.refreshFiles(); - isBlocked = false; - blocked.forEach((cb) => cb()); - blocked = []; } + unblock(); }); webpackMiddleware = new webpackDevMiddleware(compiler, webpackMiddlewareConfig);