diff --git a/modules/schematics/src/effect/files/__name@dasherize@if-flat__/__name@dasherize__.effects.ts.template b/modules/schematics/src/effect/files/__name@dasherize@if-flat__/__name@dasherize__.effects.ts.template index 09e7ebfcc3..9fc4ea7b35 100644 --- a/modules/schematics/src/effect/files/__name@dasherize@if-flat__/__name@dasherize__.effects.ts.template +++ b/modules/schematics/src/effect/files/__name@dasherize@if-flat__/__name@dasherize__.effects.ts.template @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { Actions, Effect<% if (feature) { %>, ofType<% } %> } from '@ngrx/effects'; +import { Actions, <% if (effectCreator) { %>createEffect<% } else { %>Effect<% } %><% if (feature) { %>, ofType<% } %> } from '@ngrx/effects'; <% if (feature && api) { %>import { catchError, map, concatMap } from 'rxjs/operators'; import { EMPTY, of } from 'rxjs'; import { Load<%= classify(name) %>sFailure, Load<%= classify(name) %>sSuccess, <%= classify(name) %>ActionTypes, <%= classify(name) %>Actions } from '<%= featurePath(group, flat, "actions", dasherize(name)) %><%= dasherize(name) %>.actions'; @@ -11,7 +11,7 @@ import { <%= classify(name) %>ActionTypes, <%= classify(name) %>Actions } from ' @Injectable() export class <%= classify(name) %>Effects { -<% if (feature && api) { %> +<% if (feature && api && !effectCreator) { %> @Effect() load<%= classify(name) %>s$ = this.actions$.pipe( ofType(<%= classify(name) %>ActionTypes.Load<%= classify(name) %>s), @@ -22,7 +22,7 @@ export class <%= classify(name) %>Effects { catchError(error => of(new Load<%= classify(name) %>sFailure({ error })))) ) );<% } %> -<% if (feature && !api) { %> +<% if (feature && !api && !effectCreator) { %> @Effect() load<%= classify(name) %>s$ = this.actions$.pipe( ofType(<%= classify(name) %>ActionTypes.Load<%= classify(name) %>s), @@ -35,4 +35,22 @@ export class <%= classify(name) %>Effects { <% } else { %> constructor(private actions$: Actions) {} <% } %> + +<% if (feature && api && effectCreator) { %> + load<%= classify(name) %>s$ = createEffect(() => this.actions$.pipe( + ofType(<%= classify(name) %>ActionTypes.Load<%= classify(name) %>s), + concatMap(() => + /** An EMPTY observable only emits completion. Replace with your own observable API request */ + EMPTY.pipe( + map(data => new Load<%= classify(name) %>sSuccess({ data })), + catchError(error => of(new Load<%= classify(name) %>sFailure({ error })))) + ) + ));<% } %> + +<% if (feature && !api && effectCreator) { %> + load<%= classify(name) %>s$ = createEffect(() => this.actions$.pipe( + ofType(<%= classify(name) %>ActionTypes.LoadMyTestFeatures), + concatMap(() => EMPTY) + )); +<% } %> } diff --git a/modules/schematics/src/effect/index.spec.ts b/modules/schematics/src/effect/index.spec.ts index 909cae69fe..20fdf2701c 100644 --- a/modules/schematics/src/effect/index.spec.ts +++ b/modules/schematics/src/effect/index.spec.ts @@ -27,6 +27,7 @@ describe('Effect Schematic', () => { feature: false, root: false, group: false, + effectCreator: false, }; const projectPath = getTestProjectPath(); @@ -316,4 +317,41 @@ describe('Effect Schematic', () => { /constructor\(private actions\$: Actions\) {}/ ); }); + + it('should create an effect using creator function', () => { + const options = { ...defaultOptions, effectCreator: true, feature: true }; + + const tree = schematicRunner.runSchematic('effect', options, appTree); + const content = tree.readContent( + `${projectPath}/src/app/foo/foo.effects.ts` + ); + expect(content).toMatch( + /import { Actions, createEffect, ofType } from '@ngrx\/effects';/ + ); + expect(content).not.toMatch(/@Effect\(\)/); + expect(content).toMatch( + /loadFoos\$ = createEffect\(\(\) => this.actions\$.pipe\(/ + ); + }); + + it('should create an api effect using creator function', () => { + const options = { + ...defaultOptions, + effectCreator: true, + api: true, + feature: true, + }; + + const tree = schematicRunner.runSchematic('effect', options, appTree); + const content = tree.readContent( + `${projectPath}/src/app/foo/foo.effects.ts` + ); + expect(content).toMatch( + /import { Actions, createEffect, ofType } from '@ngrx\/effects';/ + ); + expect(content).not.toMatch(/@Effect\(\)/); + expect(content).toMatch( + /loadFoos\$ = createEffect\(\(\) => this.actions\$.pipe\(/ + ); + }); }); diff --git a/modules/schematics/src/effect/schema.json b/modules/schematics/src/effect/schema.json index 7d29ab270d..5678bc8196 100644 --- a/modules/schematics/src/effect/schema.json +++ b/modules/schematics/src/effect/schema.json @@ -63,6 +63,12 @@ "description": "Specifies if effect has api success and failure actions wired up", "aliases": ["a"] + }, + "effectCreator": { + "type": "boolean", + "default": false, + "description": "Specifies if the effect creation uses 'createEffect'", + "aliases": ["ec"] } }, "required": [] diff --git a/modules/schematics/src/effect/schema.ts b/modules/schematics/src/effect/schema.ts index 96b82a8e1b..64a8ad9700 100644 --- a/modules/schematics/src/effect/schema.ts +++ b/modules/schematics/src/effect/schema.ts @@ -48,4 +48,9 @@ export interface Schema { * Specifies if effect has api success and failure actions wired up */ api?: boolean; + + /** + * Specifies if the effect creation uses 'createEffect' + */ + effectCreator?: boolean; } diff --git a/modules/schematics/src/feature/schema.json b/modules/schematics/src/feature/schema.json index f39099fbec..17a1eb5ac7 100644 --- a/modules/schematics/src/feature/schema.json +++ b/modules/schematics/src/feature/schema.json @@ -56,6 +56,12 @@ "description": "Specifies if api success and failure actions, reducer, and effects should be generated as part of this feature.", "aliases": ["a"] + }, + "effectCreator": { + "type": "boolean", + "default": false, + "description": "Specifies if the effect creation uses 'createEffect'", + "aliases": ["ec"] } }, "required": [] diff --git a/modules/schematics/src/feature/schema.ts b/modules/schematics/src/feature/schema.ts index 08ac475cb2..0663f2d10c 100644 --- a/modules/schematics/src/feature/schema.ts +++ b/modules/schematics/src/feature/schema.ts @@ -44,4 +44,9 @@ export interface Schema { * should be generated as part of this feature. */ api?: boolean; + + /** + * Specifies if the effect creation uses 'createEffect' + */ + effectCreator?: boolean; }