From 13abfd01ecf2f355fb3829eb9a6352a29ca748d5 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 10 Apr 2019 13:26:21 -0400 Subject: [PATCH] fix(@angular-devkit/schematics): fully support async rules --- .../angular_devkit/schematics/src/_golden-api.d.ts | 2 +- .../angular_devkit/schematics/src/engine/interface.ts | 2 +- packages/angular_devkit/schematics/src/rules/call.ts | 11 ++++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/etc/api/angular_devkit/schematics/src/_golden-api.d.ts b/etc/api/angular_devkit/schematics/src/_golden-api.d.ts index f2b35fb764..4edbf47bee 100644 --- a/etc/api/angular_devkit/schematics/src/_golden-api.d.ts +++ b/etc/api/angular_devkit/schematics/src/_golden-api.d.ts @@ -426,7 +426,7 @@ export interface RequiredWorkflowExecutionContext { schematic: string; } -export declare type Rule = (tree: Tree, context: SchematicContext) => Tree | Observable | Rule | Promise | void; +export declare type Rule = (tree: Tree, context: SchematicContext) => Tree | Observable | Rule | Promise | Promise | void; export declare type RuleFactory = (options: T) => Rule; diff --git a/packages/angular_devkit/schematics/src/engine/interface.ts b/packages/angular_devkit/schematics/src/engine/interface.ts index 2ca66dbdff..5664780e19 100644 --- a/packages/angular_devkit/schematics/src/engine/interface.ts +++ b/packages/angular_devkit/schematics/src/engine/interface.ts @@ -231,4 +231,4 @@ export type AsyncFileOperator = (tree: FileEntry) => Observable Tree | Observable; export type Rule = (tree: Tree, context: SchematicContext) => - Tree | Observable | Rule | Promise | void; + Tree | Observable | Rule | Promise | Promise | void; diff --git a/packages/angular_devkit/schematics/src/rules/call.ts b/packages/angular_devkit/schematics/src/rules/call.ts index 4668d3df95..369d81cd9e 100644 --- a/packages/angular_devkit/schematics/src/rules/call.ts +++ b/packages/angular_devkit/schematics/src/rules/call.ts @@ -97,7 +97,16 @@ export function callRule( }), ); } else if (isPromise(result)) { - return from(result).pipe(map(() => inputTree)); + return from(result).pipe( + mergeMap(inner => { + if (typeof inner === 'function') { + // This is considered a Rule, chain the rule and return its output. + return callRule(inner, observableOf(inputTree), context); + } else { + return observableOf(inputTree); + } + }), + ); } else if (TreeSymbol in result) { return observableOf(result); } else {