diff --git a/README.md b/README.md index 4e454c5..e92910e 100644 --- a/README.md +++ b/README.md @@ -185,10 +185,12 @@ export ROUTES = [ ] ``` -The actions can be dispatched by injecting the `Actions` provider: +The `Actions` class from `@ngneat/effects` has been injectable when using `@ngneat/effects-ng`. + +To dispatch an action, simply inject `Actions`: ```ts -import { Actions } from '@ngneat/effects-ng'; +import { Actions } from '@ngneat/effects'; @Component(...) export class AppComponent { @@ -206,7 +208,8 @@ export class AppComponent { `provideDirectiveEffects()` and `EffectsDirective` serve to register effects on the `component injector` level. This means that effects will live as long as the component where effects are registered lives. Do not forget to call `provideEffectsManager` in the root providers. ```ts -import { provideDirectiveEffects, EffectsDirective, Actions } from '@ngneat/effects-ng'; +import { Actions } from "@ngneat/effects"; +import { provideDirectiveEffects, EffectsDirective } from '@ngneat/effects-ng'; @Component({ ..., diff --git a/libs/effects-ng/src/lib/actions.ts b/libs/effects-ng/src/lib/actions.ts index ae14244..056c788 100644 --- a/libs/effects-ng/src/lib/actions.ts +++ b/libs/effects-ng/src/lib/actions.ts @@ -1,6 +1,9 @@ import { Actions as _Actions } from '@ngneat/effects'; import { Injectable } from '@angular/core'; +/** + * @deprecated Use `Actions` exported from `@ngneat/effects` instead. + */ @Injectable({ providedIn: 'root', }) diff --git a/libs/effects-ng/src/lib/effects-ng.module.spec.ts b/libs/effects-ng/src/lib/effects-ng.module.spec.ts index 888ff9e..1000b95 100644 --- a/libs/effects-ng/src/lib/effects-ng.module.spec.ts +++ b/libs/effects-ng/src/lib/effects-ng.module.spec.ts @@ -1,11 +1,16 @@ import { Component, Injectable, NgModule } from '@angular/core'; import { TestBed, flushMicrotasks, fakeAsync } from '@angular/core/testing'; -import { createAction, createEffect } from '@ngneat/effects'; +import { + Actions, + EffectsManager, + createAction, + createEffect, +} from '@ngneat/effects'; import { tap } from 'rxjs'; import { ofType } from 'ts-action-operators'; -import { Actions } from './actions'; import { EffectsNgModule } from './effects-ng.module'; -import { EFFECTS_PROVIDERS } from './tokens'; +import { EFFECTS_MANAGER, EFFECTS_PROVIDERS } from './tokens'; +import { Actions as _Actions } from './actions'; import { Router, RouterModule } from '@angular/router'; const spy = jest.fn(); @@ -40,6 +45,24 @@ describe('Effects ng module', () => { spy.mockReset(); }); + it('should provide the same instance for different tokens of Actions', () => { + TestBed.configureTestingModule({ + imports: [EffectsNgModule.forRoot([])], + }); + const actions = TestBed.inject(Actions); + const _actions = TestBed.inject(_Actions); + expect(actions === _actions).toBe(true); + }); + + it('should provide the same instance for different tokens of EffectsManager', () => { + TestBed.configureTestingModule({ + imports: [EffectsNgModule.forRoot([])], + }); + const effectsManager = TestBed.inject(EffectsManager); + const _effectsManager = TestBed.inject(EFFECTS_MANAGER); + expect(effectsManager === _effectsManager).toBe(true); + }); + it('should provide effects one using forRoot', () => { TestBed.configureTestingModule({ imports: [EffectsNgModule.forRoot([EffectsOne])], diff --git a/libs/effects-ng/src/lib/effects-ng.module.ts b/libs/effects-ng/src/lib/effects-ng.module.ts index 10eeb48..805ea3e 100644 --- a/libs/effects-ng/src/lib/effects-ng.module.ts +++ b/libs/effects-ng/src/lib/effects-ng.module.ts @@ -1,13 +1,14 @@ import { Inject, ModuleWithProviders, NgModule, Type } from '@angular/core'; import { + Actions, actions, EffectsConfig, EffectsManager, initEffects, } from '@ngneat/effects'; -import { Actions } from './actions'; import { EFFECTS_MANAGER, EFFECTS_PROVIDERS } from './tokens'; import { registerEffectFromProviders } from './provide-effects'; +import { Actions as _Actions } from './actions'; /** * @deprecated Please consider using `provideEffectManager` and `provideEffects` functions instead. This module will be @@ -34,9 +35,17 @@ export class EffectsNgModule { useValue: config?.customActionsStream || actions, }, { - provide: EFFECTS_MANAGER, + provide: _Actions, + useExisting: Actions, + }, + { + provide: EffectsManager, useFactory: () => initEffects(config), }, + { + provide: EFFECTS_MANAGER, + useExisting: EffectsManager, + }, ...providers, { provide: EFFECTS_PROVIDERS, diff --git a/libs/effects-ng/src/lib/provide-effects-manager.spec.ts b/libs/effects-ng/src/lib/provide-effects-manager.spec.ts index b7b62cb..a3ac4f3 100644 --- a/libs/effects-ng/src/lib/provide-effects-manager.spec.ts +++ b/libs/effects-ng/src/lib/provide-effects-manager.spec.ts @@ -1,11 +1,17 @@ import { Component, Injectable } from '@angular/core'; import { TestBed } from '@angular/core/testing'; -import { createAction, createEffect } from '@ngneat/effects'; +import { + Actions, + EffectsManager, + createAction, + createEffect, +} from '@ngneat/effects'; import { tap, map } from 'rxjs'; import { ofType } from 'ts-action-operators'; -import { Actions } from './actions'; import { provideEffects } from './provide-effects'; import { provideEffectsManager } from './provide-effects-manager'; +import { EFFECTS_MANAGER } from './tokens'; +import { Actions as _Actions } from './actions'; const spy = jest.fn(); @@ -69,4 +75,20 @@ describe('provideEffectsManager', () => { expect((component as any).actions).toBeInstanceOf(CustomActions); expect(dispatchSpy).toHaveBeenCalled(); }); + + it('should provide the same instance for different tokens of the same object', () => { + TestBed.configureTestingModule({ + providers: [ + TodoComponent, + provideEffects(EffectsOne), + provideEffectsManager(), + ], + }); + const actions = TestBed.inject(Actions); + const _actions = TestBed.inject(_Actions); + expect(actions === _actions).toBe(true); + const manager = TestBed.inject(EffectsManager); + const _manager = TestBed.inject(EFFECTS_MANAGER); + expect(manager === _manager).toBe(true); + }); }); diff --git a/libs/effects-ng/src/lib/provide-effects-manager.ts b/libs/effects-ng/src/lib/provide-effects-manager.ts index f183e39..c870c9b 100644 --- a/libs/effects-ng/src/lib/provide-effects-manager.ts +++ b/libs/effects-ng/src/lib/provide-effects-manager.ts @@ -1,7 +1,13 @@ import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core'; -import { Actions } from './actions'; import { EFFECTS_MANAGER } from './tokens'; -import { initEffects, EffectsConfig, actions } from '@ngneat/effects'; +import { Actions as _Actions } from './actions'; +import { + initEffects, + EffectsConfig, + actions, + Actions, + EffectsManager, +} from '@ngneat/effects'; /** * Must be called at the root level. @@ -19,8 +25,16 @@ export function provideEffectsManager( useValue: customActionsStream, }, { - provide: EFFECTS_MANAGER, + provide: _Actions, + useExisting: Actions, + }, + { + provide: EffectsManager, useValue: manager, }, + { + provide: EFFECTS_MANAGER, + useExisting: EffectsManager, + }, ]); } diff --git a/libs/effects-ng/src/lib/provide-effects.spec.ts b/libs/effects-ng/src/lib/provide-effects.spec.ts index 28b3b01..ba3c23e 100644 --- a/libs/effects-ng/src/lib/provide-effects.spec.ts +++ b/libs/effects-ng/src/lib/provide-effects.spec.ts @@ -1,9 +1,8 @@ import { Component, Injectable } from '@angular/core'; import { TestBed, flushMicrotasks, fakeAsync } from '@angular/core/testing'; -import { createAction, createEffect } from '@ngneat/effects'; +import { Actions, createAction, createEffect } from '@ngneat/effects'; import { tap } from 'rxjs'; import { ofType } from 'ts-action-operators'; -import { Actions } from './actions'; import { provideEffects } from './provide-effects'; import { provideEffectsManager } from './provide-effects-manager'; import { Routes, provideRouter, Router } from '@angular/router'; diff --git a/libs/effects-ng/src/lib/provide-effects.ts b/libs/effects-ng/src/lib/provide-effects.ts index ea4cee5..bd4bf38 100644 --- a/libs/effects-ng/src/lib/provide-effects.ts +++ b/libs/effects-ng/src/lib/provide-effects.ts @@ -5,7 +5,6 @@ import { makeEnvironmentProviders, EnvironmentProviders, } from '@angular/core'; -import { EFFECTS_MANAGER } from './tokens'; import { getEffectPropsMap } from './utils'; import { Effect, EffectsManager } from '@ngneat/effects'; import { @@ -27,7 +26,7 @@ export function provideEffects( provide: ENVIRONMENT_INITIALIZER, multi: true, useValue: () => { - const manager = inject(EFFECTS_MANAGER, { optional: true }); + const manager = inject(EffectsManager, { optional: true }); if (!manager) { throw new TypeError( diff --git a/libs/effects-ng/src/lib/tokens.ts b/libs/effects-ng/src/lib/tokens.ts index ee9bdb1..38cffec 100644 --- a/libs/effects-ng/src/lib/tokens.ts +++ b/libs/effects-ng/src/lib/tokens.ts @@ -4,6 +4,10 @@ import { EffectsManager } from '@ngneat/effects'; export const EFFECTS_PROVIDERS = new InjectionToken[]>( '@ngneat/effects Effects providers' ); + +/** + * @deprecated Use the {@link EffectsManager} class from `@ngneat/effects` instead. + */ export const EFFECTS_MANAGER = new InjectionToken( '@ngneat/effects Effects Manager' ); diff --git a/libs/effects-ng/src/lib/use-directive-effects.spec.ts b/libs/effects-ng/src/lib/use-directive-effects.spec.ts index 1cc6f6a..9281a02 100644 --- a/libs/effects-ng/src/lib/use-directive-effects.spec.ts +++ b/libs/effects-ng/src/lib/use-directive-effects.spec.ts @@ -1,9 +1,8 @@ import { Component, Injectable, Type } from '@angular/core'; import { TestBed } from '@angular/core/testing'; -import { createAction, createEffect } from '@ngneat/effects'; +import { Actions, createAction, createEffect } from '@ngneat/effects'; import { tap } from 'rxjs'; import { ofType } from 'ts-action-operators'; -import { Actions } from './actions'; import { provideEffectsManager } from './provide-effects-manager'; import { provideDirectiveEffects, diff --git a/libs/effects-ng/src/lib/use-directive-effects.ts b/libs/effects-ng/src/lib/use-directive-effects.ts index a6143aa..ce72fd7 100644 --- a/libs/effects-ng/src/lib/use-directive-effects.ts +++ b/libs/effects-ng/src/lib/use-directive-effects.ts @@ -6,9 +6,8 @@ import { Provider, InjectionToken, } from '@angular/core'; -import { EFFECTS_MANAGER } from './tokens'; import { getEffectPropsMap } from './utils'; -import { Effect } from '@ngneat/effects'; +import { Effect, EffectsManager } from '@ngneat/effects'; import { isEffectProvided, increaseProvidedEffectSources, @@ -39,7 +38,7 @@ export class EffectsDirective implements OnDestroy { self: true, optional: true, }); - private readonly manager = inject(EFFECTS_MANAGER, { optional: true }); + private readonly manager = inject(EffectsManager, { optional: true }); private readonly sourceInstancesWithProvidersEffectsTokens = new Map< any, ProvidedEffectToken