diff --git a/packages/angular_devkit/build_angular/src/dev-server/index.ts b/packages/angular_devkit/build_angular/src/dev-server/index.ts index 32f21603f3..09d19da281 100644 --- a/packages/angular_devkit/build_angular/src/dev-server/index.ts +++ b/packages/angular_devkit/build_angular/src/dev-server/index.ts @@ -199,7 +199,7 @@ export class DevServerBuilder implements Builder { this.context.logger.info(statsErrorsToString(json, statsConfig)); } } - obs.next({ success: true }); + obs.next({ success: !stats.hasErrors() }); if (first && options.open) { first = false; diff --git a/packages/angular_devkit/build_angular/test/browser/bundle-budgets_spec_large.ts b/packages/angular_devkit/build_angular/test/browser/bundle-budgets_spec_large.ts index 5169b0e7f7..88ba690752 100644 --- a/packages/angular_devkit/build_angular/test/browser/bundle-budgets_spec_large.ts +++ b/packages/angular_devkit/build_angular/test/browser/bundle-budgets_spec_large.ts @@ -38,7 +38,7 @@ describe('Browser Builder bundle budgets', () => { runTargetSpec(host, browserTargetSpec, overrides).pipe( tap((buildEvent) => expect(buildEvent.success).toBe(false)), ).subscribe(undefined, done.fail, done); - }, Timeout.Standard); + }, Timeout.Complex); it('shows warnings', (done) => { const overrides = { @@ -52,5 +52,5 @@ describe('Browser Builder bundle budgets', () => { tap((buildEvent) => expect(buildEvent.success).toBe(true)), tap(() => expect(logger.includes('WARNING')).toBe(true)), ).subscribe(undefined, done.fail, done); - }, Timeout.Standard); + }, Timeout.Complex); }); diff --git a/packages/angular_devkit/build_angular/test/browser/custom-lazy-modules_spec_large.ts b/packages/angular_devkit/build_angular/test/browser/custom-lazy-modules_spec_large.ts deleted file mode 100644 index 7e0b6647aa..0000000000 --- a/packages/angular_devkit/build_angular/test/browser/custom-lazy-modules_spec_large.ts +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @license - * Copyright Google Inc. 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 { Architect } from '@angular-devkit/architect'; -// import { join, normalize } from '@angular-devkit/core'; -// import { concatMap, tap, toArray } from 'rxjs/operators'; -// import { host, browserTargetSpec, makeWorkspace } from '../utils'; -// import { lazyModuleFiles, lazyModuleImport } from './rebuild_spec_large'; - - -// TODO: re-enable this test when the custom lazy module changes have been ported over to -// webpack-builder from the CLI. -// describe('Browser Builder custom lazy modules', () => { -// -// const architect = new Architect(normalize(workspaceRoot), host); -// const outputPath = normalize('dist'); - -// beforeEach(done => host.initialize().subscribe(undefined, done.fail, done)); -// afterEach(done => host.restore().subscribe(undefined, done.fail, done)); - -// it('works', (done) => { -// host.writeMultipleFiles(lazyModuleFiles); -// host.writeMultipleFiles(lazyModuleImport); -// host.writeMultipleFiles({ -// 'src/app/app.component.ts': ` -// import { Component, SystemJsNgModuleLoader } from '@angular/core'; - -// @Component({ -// selector: 'app-root', -// templateUrl: './app.component.html', -// styleUrls: ['./app.component.css'], -// }) -// export class AppComponent { -// title = 'app'; -// constructor(loader: SystemJsNgModuleLoader) { -// // Module will be split at build time and loaded when requested below -// loader.load('app/lazy/lazy.module#LazyModule') -// .then((factory) => { /* Use factory here */ }); -// } -// }`, -// }); - -// const overrides = { lazyModules: ['app/lazy/lazy.module'] }; - -// architect.loadWorkspaceFromJson(makeWorkspace(browserTargetSpec)).pipe( -// concatMap(() => architect.run(architect.getTarget({ overrides }))), -// tap((buildEvent) => expect(buildEvent.success).toBe(true)), -// tap(() => -// expect(host.scopedSync().exists(join(outputPath, 'lazy.module.js'))).toBe(true)), -// ).subscribe(undefined, done.fail, done); -// }, 30000); -// }); diff --git a/packages/angular_devkit/build_angular/test/browser/lazy-module_spec_large.ts b/packages/angular_devkit/build_angular/test/browser/lazy-module_spec_large.ts index 61ac885895..1583ea44a3 100644 --- a/packages/angular_devkit/build_angular/test/browser/lazy-module_spec_large.ts +++ b/packages/angular_devkit/build_angular/test/browser/lazy-module_spec_large.ts @@ -258,5 +258,5 @@ describe('Browser Builder lazy modules', () => { .exists(join(outputPath, 'src-app-lazy-lazy-module-ngfactory.js'))) .toBe(true)), ).subscribe(undefined, done.fail, done); - }, Timeout.Basic); + }, Timeout.Complex); }); diff --git a/packages/angular_devkit/build_angular/test/browser/license-extraction_spec_large.ts b/packages/angular_devkit/build_angular/test/browser/license-extraction_spec_large.ts index 11edc1621c..aea18cb623 100644 --- a/packages/angular_devkit/build_angular/test/browser/license-extraction_spec_large.ts +++ b/packages/angular_devkit/build_angular/test/browser/license-extraction_spec_large.ts @@ -30,5 +30,5 @@ describe('Browser Builder license extraction', () => { expect(host.scopedSync().exists(fileName)).toBe(true); }), ).subscribe(undefined, done.fail, done); - }, Timeout.Standard); + }, Timeout.Complex); }); diff --git a/packages/angular_devkit/build_angular/test/browser/styles_spec_large.ts b/packages/angular_devkit/build_angular/test/browser/styles_spec_large.ts index 99ed697eab..f88d007ef3 100644 --- a/packages/angular_devkit/build_angular/test/browser/styles_spec_large.ts +++ b/packages/angular_devkit/build_angular/test/browser/styles_spec_large.ts @@ -220,7 +220,7 @@ describe('Browser Builder styles', () => { runTargetSpec(host, browserTargetSpec, overrides).pipe( tap((buildEvent) => expect(buildEvent.success).toBe(true)), ).subscribe(undefined, done.fail, done); - }, Timeout.Basic); + }, Timeout.Complex); extensionsWithVariableSupport.forEach(ext => { it(`supports ${ext} includePaths`, (done) => { @@ -389,7 +389,7 @@ describe('Browser Builder styles', () => { '/*! important-comment */div{-ms-flex:1;flex:1}'); }), ).subscribe(undefined, done.fail, done); - }, Timeout.Standard); + }, Timeout.Complex); // TODO: consider making this a unit test in the url processing plugins. it(`supports baseHref and deployUrl in resource urls`, (done) => { diff --git a/packages/angular_devkit/core/node/host.ts b/packages/angular_devkit/core/node/host.ts index 7cdcf6ca6f..1ccdc8377d 100644 --- a/packages/angular_devkit/core/node/host.ts +++ b/packages/angular_devkit/core/node/host.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ import * as fs from 'fs'; -import { EMPTY, Observable, concat, from as observableFrom } from 'rxjs'; +import { EMPTY, Observable, concat, from as observableFrom, throwError } from 'rxjs'; import { concatMap, ignoreElements, @@ -257,9 +257,17 @@ export class NodeJsSyncHost implements virtualFs.Host { for (const name of fs.readdirSync(getSystemPath(path))) { this.delete(join(path, name)).subscribe(); } - fs.rmdirSync(getSystemPath(path)); + try { + fs.rmdirSync(getSystemPath(path)); + } catch (error) { + return throwError(error); + } } else { - fs.unlinkSync(getSystemPath(path)); + try { + fs.unlinkSync(getSystemPath(path)); + } catch (error) { + return throwError(error); + } } return EMPTY; diff --git a/packages/angular_devkit/core/src/utils/literals.ts b/packages/angular_devkit/core/src/utils/literals.ts index eff190829a..95805254e0 100644 --- a/packages/angular_devkit/core/src/utils/literals.ts +++ b/packages/angular_devkit/core/src/utils/literals.ts @@ -55,3 +55,14 @@ export function stripIndents(strings: TemplateStringsArray, ...values: any[]) { .join('\n') .trim(); } + +// tslint:disable-next-line:no-any +export function trimNewlines(strings: TemplateStringsArray, ...values: any[]) { + const endResult = String.raw(strings, ...values); + + return endResult + // Remove the newline at the start. + .replace(/^(?:\r?\n)+/, '') + // Remove the newline at the end and following whitespace. + .replace(/(?:\r?\n(?:\s*))$/, ''); +} diff --git a/packages/angular_devkit/core/src/utils/literals_spec.ts b/packages/angular_devkit/core/src/utils/literals_spec.ts index 3b28d52332..0883eb6855 100644 --- a/packages/angular_devkit/core/src/utils/literals_spec.ts +++ b/packages/angular_devkit/core/src/utils/literals_spec.ts @@ -5,7 +5,7 @@ * 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 { oneLine, stripIndent, stripIndents } from './literals'; +import { oneLine, stripIndent, stripIndents, trimNewlines } from './literals'; describe('literals', () => { describe('stripIndent', () => { @@ -43,4 +43,14 @@ describe('literals', () => { expect(test).toBe('hello world how are you? blue red test'); }); }); + + describe('trimNewlines', () => { + it('works', () => { + const test = trimNewlines` + hello world + `; + + expect(test).toBe(' hello world'); + }); + }); });