diff --git a/etc/api/angular_devkit/architect/src/index.d.ts b/etc/api/angular_devkit/architect/src/index.d.ts index be03aecd6029..1d7e5cb3e925 100644 --- a/etc/api/angular_devkit/architect/src/index.d.ts +++ b/etc/api/angular_devkit/architect/src/index.d.ts @@ -38,7 +38,7 @@ export declare type BuilderInput = json.JsonObject & RealBuilderInput; export declare type BuilderOutput = json.JsonObject & RealBuilderOutput; -export declare type BuilderOutputLike = Observable | Promise | BuilderOutput; +export declare type BuilderOutputLike = SubscribableOrPromise | BuilderOutput; export declare type BuilderProgress = json.JsonObject & RealBuilderProgress & TypedBuilderProgress; @@ -60,6 +60,8 @@ export interface BuilderRun { export declare function createBuilder(fn: BuilderHandlerFn): Builder; +export declare function isBuilderOutput(obj: any): obj is BuilderOutput; + export interface ScheduleOptions { analytics?: analytics.Analytics; logger?: logging.Logger; diff --git a/packages/angular_devkit/architect/src/api.ts b/packages/angular_devkit/architect/src/api.ts index 032482041059..52dfcf377883 100644 --- a/packages/angular_devkit/architect/src/api.ts +++ b/packages/angular_devkit/architect/src/api.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ import { analytics, experimental, json, logging } from '@angular-devkit/core'; -import { Observable, from } from 'rxjs'; +import { Observable, SubscribableOrPromise, from } from 'rxjs'; import { switchMap } from 'rxjs/operators'; import { Schema as RealBuilderInput, Target as RealTarget } from './input-schema'; import { Schema as RealBuilderOutput } from './output-schema'; @@ -250,8 +250,16 @@ export interface BuilderContext { /** * An accepted return value from a builder. Can be either an Observable, a Promise or a vector. */ -export type BuilderOutputLike = Observable | Promise | BuilderOutput; +export type BuilderOutputLike = SubscribableOrPromise | BuilderOutput; +// tslint:disable-next-line:no-any +export function isBuilderOutput(obj: any): obj is BuilderOutput { + if (!obj || typeof obj.then === 'function' || typeof obj.subscribe === 'function') { + return false; + } + + return typeof obj.success === 'boolean'; +} /** * A builder handler function. The function signature passed to `createBuilder()`. diff --git a/packages/angular_devkit/architect/src/create-builder.ts b/packages/angular_devkit/architect/src/create-builder.ts index 224431e5d4c6..0a4b97aaebde 100644 --- a/packages/angular_devkit/architect/src/create-builder.ts +++ b/packages/angular_devkit/architect/src/create-builder.ts @@ -5,8 +5,8 @@ * 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 { analytics, experimental, isPromise, json, logging } from '@angular-devkit/core'; -import { Observable, Subscription, from, isObservable, of, throwError } from 'rxjs'; +import { analytics, experimental, json, logging } from '@angular-devkit/core'; +import { Observable, Subscription, from, of, throwError } from 'rxjs'; import { tap } from 'rxjs/operators'; import { BuilderContext, @@ -14,11 +14,11 @@ import { BuilderInfo, BuilderInput, BuilderOutput, - BuilderOutputLike, BuilderProgressState, ScheduleOptions, Target, TypedBuilderProgress, + isBuilderOutput, targetStringFromTarget, } from './api'; import { Builder, BuilderSymbol, BuilderVersionSymbol } from './internal'; @@ -189,19 +189,18 @@ export function createBuilder< }; context.reportRunning(); - let result: BuilderOutputLike; + let result; try { result = fn(i.options as OptT, context); + if (isBuilderOutput(result)) { + result = of(result); + } else { + result = from(result); + } } catch (e) { result = throwError(e); } - if (isPromise(result)) { - result = from(result); - } else if (!isObservable(result)) { - result = of(result); - } - // Manage some state automatically. progress({ state: BuilderProgressState.Running, current: 0, total: 1 }, context); subscriptions.push(result.pipe(