@ngrx/signals 20.1.0 → 21.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngrx-signals-entities.mjs.map +1 -1
- package/fesm2022/ngrx-signals-events.mjs +219 -57
- package/fesm2022/ngrx-signals-events.mjs.map +1 -1
- package/fesm2022/ngrx-signals-rxjs-interop.mjs +4 -4
- package/fesm2022/ngrx-signals-rxjs-interop.mjs.map +1 -1
- package/fesm2022/ngrx-signals.mjs +11 -8
- package/fesm2022/ngrx-signals.mjs.map +1 -1
- package/migrations/18_0_0-rc_3-protected-state/index.js +54 -23
- package/migrations/18_0_0-rc_3-protected-state/index.js.map +1 -1
- package/migrations/18_0_0-rc_3-writablestatesource/index.js +45 -12
- package/migrations/18_0_0-rc_3-writablestatesource/index.js.map +1 -1
- package/migrations/19_0_0-rc_0-props/index.js +72 -83
- package/migrations/19_0_0-rc_0-props/index.js.map +1 -1
- package/migrations/21_0_0-beta_0-rename-withEffects-to-withEventHandlers/index.js +103 -0
- package/migrations/21_0_0-beta_0-rename-withEffects-to-withEventHandlers/index.js.map +1 -0
- package/migrations/migration.json +5 -0
- package/package.json +8 -8
- package/schematics/ng-add/index.js +5 -5
- package/schematics/ng-add/index.js.map +1 -1
- package/schematics-core/index.js +1 -1
- package/schematics-core/index.js.map +1 -1
- package/schematics-core/utility/ast-utils.js +198 -240
- package/schematics-core/utility/ast-utils.js.map +1 -1
- package/schematics-core/utility/change.js +68 -85
- package/schematics-core/utility/change.js.map +1 -1
- package/schematics-core/utility/config.js +7 -7
- package/schematics-core/utility/config.js.map +1 -1
- package/schematics-core/utility/find-component.js +20 -20
- package/schematics-core/utility/find-component.js.map +1 -1
- package/schematics-core/utility/find-module.js +21 -21
- package/schematics-core/utility/find-module.js.map +1 -1
- package/schematics-core/utility/json-utilts.js +4 -26
- package/schematics-core/utility/json-utilts.js.map +1 -1
- package/schematics-core/utility/libs-version.js +1 -1
- package/schematics-core/utility/libs-version.js.map +1 -1
- package/schematics-core/utility/ngrx-utils.js +110 -141
- package/schematics-core/utility/ngrx-utils.js.map +1 -1
- package/schematics-core/utility/package.js +2 -3
- package/schematics-core/utility/package.js.map +1 -1
- package/schematics-core/utility/parse-name.js +3 -3
- package/schematics-core/utility/parse-name.js.map +1 -1
- package/schematics-core/utility/project.js +13 -13
- package/schematics-core/utility/project.js.map +1 -1
- package/schematics-core/utility/strings.js +12 -12
- package/schematics-core/utility/strings.js.map +1 -1
- package/schematics-core/utility/update.js +12 -12
- package/schematics-core/utility/update.js.map +1 -1
- package/schematics-core/utility/visitors.js +78 -180
- package/schematics-core/utility/visitors.js.map +1 -1
- package/types/ngrx-signals-entities.d.ts +324 -0
- package/types/ngrx-signals-events.d.ts +360 -0
- package/types/ngrx-signals-rxjs-interop.d.ts +15 -0
- package/{testing/src/unprotected.d.ts → types/ngrx-signals-testing.d.ts} +5 -3
- package/types/ngrx-signals.d.ts +332 -0
- package/entities/index.d.ts +0 -1
- package/entities/src/entity-config.d.ts +0 -17
- package/entities/src/helpers.d.ts +0 -25
- package/entities/src/index.d.ts +0 -18
- package/entities/src/models.d.ts +0 -24
- package/entities/src/updaters/add-entities.d.ts +0 -17
- package/entities/src/updaters/add-entity.d.ts +0 -17
- package/entities/src/updaters/prepend-entities.d.ts +0 -17
- package/entities/src/updaters/prepend-entity.d.ts +0 -17
- package/entities/src/updaters/remove-all-entities.d.ts +0 -6
- package/entities/src/updaters/remove-entities.d.ts +0 -10
- package/entities/src/updaters/remove-entity.d.ts +0 -6
- package/entities/src/updaters/set-all-entities.d.ts +0 -17
- package/entities/src/updaters/set-entities.d.ts +0 -17
- package/entities/src/updaters/set-entity.d.ts +0 -17
- package/entities/src/updaters/update-all-entities.d.ts +0 -17
- package/entities/src/updaters/update-entities.d.ts +0 -56
- package/entities/src/updaters/update-entity.d.ts +0 -29
- package/entities/src/updaters/upsert-entities.d.ts +0 -17
- package/entities/src/updaters/upsert-entity.d.ts +0 -17
- package/entities/src/with-entities.d.ts +0 -22
- package/events/index.d.ts +0 -1
- package/events/src/case-reducer.d.ts +0 -20
- package/events/src/dispatcher.d.ts +0 -33
- package/events/src/event-creator-group.d.ts +0 -33
- package/events/src/event-creator.d.ts +0 -9
- package/events/src/event-instance.d.ts +0 -8
- package/events/src/events-service.d.ts +0 -47
- package/events/src/index.d.ts +0 -9
- package/events/src/inject-dispatch.d.ts +0 -46
- package/events/src/with-effects.d.ts +0 -28
- package/events/src/with-reducer.d.ts +0 -30
- package/index.d.ts +0 -1
- package/rxjs-interop/index.d.ts +0 -1
- package/rxjs-interop/src/index.d.ts +0 -1
- package/rxjs-interop/src/rx-method.d.ts +0 -12
- package/src/deep-computed.d.ts +0 -2
- package/src/deep-signal.d.ts +0 -6
- package/src/index.d.ts +0 -16
- package/src/signal-method.d.ts +0 -7
- package/src/signal-state.d.ts +0 -4
- package/src/signal-store-assertions.d.ts +0 -2
- package/src/signal-store-feature.d.ts +0 -29
- package/src/signal-store-models.d.ts +0 -30
- package/src/signal-store.d.ts +0 -115
- package/src/state-source.d.ts +0 -23
- package/src/ts-helpers.d.ts +0 -11
- package/src/with-computed.d.ts +0 -12
- package/src/with-feature.d.ts +0 -26
- package/src/with-hooks.d.ts +0 -14
- package/src/with-linked-state.d.ts +0 -52
- package/src/with-methods.d.ts +0 -8
- package/src/with-props.d.ts +0 -8
- package/src/with-state.d.ts +0 -11
- package/testing/index.d.ts +0 -1
- package/testing/src/index.d.ts +0 -1
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
3
|
-
import { Subject, filter, map, queueScheduler, tap
|
|
2
|
+
import { inject, Injectable, assertInInjectionContext, Injector, untracked } from '@angular/core';
|
|
3
|
+
import { Subject, merge, filter, map, queueScheduler, tap } from 'rxjs';
|
|
4
4
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
5
|
import { signalStoreFeature, type, withHooks, getState, patchState } from '@ngrx/signals';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* @experimental
|
|
9
8
|
* @description
|
|
10
9
|
*
|
|
11
10
|
* Creates a case reducer that can be used with the `withReducer` feature.
|
|
@@ -16,19 +15,28 @@ function on(...args) {
|
|
|
16
15
|
return { reducer, events };
|
|
17
16
|
}
|
|
18
17
|
|
|
19
|
-
const EVENTS = Symbol();
|
|
20
|
-
const SOURCE_TYPE = Symbol();
|
|
18
|
+
const EVENTS = Symbol(typeof ngDevMode !== 'undefined' && ngDevMode ? 'EVENTS' : '');
|
|
19
|
+
const SOURCE_TYPE = Symbol(typeof ngDevMode !== 'undefined' && ngDevMode ? 'SOURCE_TYPE' : '');
|
|
21
20
|
class BaseEvents {
|
|
22
21
|
/**
|
|
23
22
|
* @internal
|
|
24
23
|
*/
|
|
25
24
|
[EVENTS] = new Subject();
|
|
25
|
+
events$;
|
|
26
|
+
constructor(parentEventsToken) {
|
|
27
|
+
const parentEvents = inject(parentEventsToken, {
|
|
28
|
+
skipSelf: true,
|
|
29
|
+
optional: true,
|
|
30
|
+
});
|
|
31
|
+
this.events$ = parentEvents
|
|
32
|
+
? merge(parentEvents.events$, this[EVENTS])
|
|
33
|
+
: this[EVENTS].asObservable();
|
|
34
|
+
}
|
|
26
35
|
on(...events) {
|
|
27
|
-
return this
|
|
36
|
+
return this.events$.pipe(filterByType(events), withSourceType());
|
|
28
37
|
}
|
|
29
38
|
}
|
|
30
39
|
/**
|
|
31
|
-
* @experimental
|
|
32
40
|
* @description
|
|
33
41
|
*
|
|
34
42
|
* Globally provided service for listening to dispatched events.
|
|
@@ -40,7 +48,7 @@ class BaseEvents {
|
|
|
40
48
|
*
|
|
41
49
|
* const increment = event('[Counter Page] Increment');
|
|
42
50
|
*
|
|
43
|
-
* \@Component({
|
|
51
|
+
* \@Component({ /* ... *\/ })
|
|
44
52
|
* class Counter {
|
|
45
53
|
* readonly #events = inject(Events);
|
|
46
54
|
*
|
|
@@ -48,27 +56,40 @@ class BaseEvents {
|
|
|
48
56
|
* this.#events
|
|
49
57
|
* .on(increment)
|
|
50
58
|
* .pipe(takeUntilDestroyed())
|
|
51
|
-
* .subscribe(() =>
|
|
59
|
+
* .subscribe(() => /* handle increment event *\/);
|
|
52
60
|
* }
|
|
53
61
|
* }
|
|
54
62
|
* ```
|
|
55
63
|
*/
|
|
56
64
|
class Events extends BaseEvents {
|
|
57
|
-
|
|
58
|
-
|
|
65
|
+
constructor() {
|
|
66
|
+
super(Events);
|
|
67
|
+
}
|
|
68
|
+
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: Events, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
69
|
+
/** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: Events, providedIn: 'platform' });
|
|
59
70
|
}
|
|
60
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
71
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: Events, decorators: [{
|
|
61
72
|
type: Injectable,
|
|
62
73
|
args: [{ providedIn: 'platform' }]
|
|
63
|
-
}] });
|
|
74
|
+
}], ctorParameters: () => [] });
|
|
75
|
+
/**
|
|
76
|
+
* @description
|
|
77
|
+
*
|
|
78
|
+
* Globally provided service for listening to dispatched events.
|
|
79
|
+
* Receives events before the `Events` service and is primarily used for
|
|
80
|
+
* handling state transitions.
|
|
81
|
+
*/
|
|
64
82
|
class ReducerEvents extends BaseEvents {
|
|
65
|
-
|
|
66
|
-
|
|
83
|
+
constructor() {
|
|
84
|
+
super(ReducerEvents);
|
|
85
|
+
}
|
|
86
|
+
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: ReducerEvents, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
87
|
+
/** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: ReducerEvents, providedIn: 'platform' });
|
|
67
88
|
}
|
|
68
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
89
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: ReducerEvents, decorators: [{
|
|
69
90
|
type: Injectable,
|
|
70
91
|
args: [{ providedIn: 'platform' }]
|
|
71
|
-
}] });
|
|
92
|
+
}], ctorParameters: () => [] });
|
|
72
93
|
function filterByType(events) {
|
|
73
94
|
if (events.length === 0) {
|
|
74
95
|
return (source$) => source$;
|
|
@@ -87,7 +108,6 @@ function withSourceType() {
|
|
|
87
108
|
}
|
|
88
109
|
|
|
89
110
|
/**
|
|
90
|
-
* @experimental
|
|
91
111
|
* @description
|
|
92
112
|
*
|
|
93
113
|
* Globally provided service for dispatching events.
|
|
@@ -99,7 +119,7 @@ function withSourceType() {
|
|
|
99
119
|
*
|
|
100
120
|
* const increment = event('[Counter Page] Increment');
|
|
101
121
|
*
|
|
102
|
-
* \@Component({
|
|
122
|
+
* \@Component({ /* ... *\/ })
|
|
103
123
|
* class Counter {
|
|
104
124
|
* readonly #dispatcher = inject(Dispatcher);
|
|
105
125
|
*
|
|
@@ -112,20 +132,67 @@ function withSourceType() {
|
|
|
112
132
|
class Dispatcher {
|
|
113
133
|
reducerEvents = inject(ReducerEvents);
|
|
114
134
|
events = inject(Events);
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
135
|
+
parentDispatcher = inject(Dispatcher, {
|
|
136
|
+
skipSelf: true,
|
|
137
|
+
optional: true,
|
|
138
|
+
});
|
|
139
|
+
dispatch(event, config) {
|
|
140
|
+
if (this.parentDispatcher && hasParentOrGlobalScope(config)) {
|
|
141
|
+
this.parentDispatcher.dispatch(event, config.scope === 'global' ? config : undefined);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
this.reducerEvents[EVENTS].next(event);
|
|
145
|
+
queueScheduler.schedule(() => this.events[EVENTS].next(event));
|
|
146
|
+
}
|
|
118
147
|
}
|
|
119
|
-
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
120
|
-
/** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
148
|
+
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: Dispatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
149
|
+
/** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: Dispatcher, providedIn: 'platform' });
|
|
121
150
|
}
|
|
122
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
151
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: Dispatcher, decorators: [{
|
|
123
152
|
type: Injectable,
|
|
124
153
|
args: [{ providedIn: 'platform' }]
|
|
125
154
|
}] });
|
|
155
|
+
/**
|
|
156
|
+
* @description
|
|
157
|
+
*
|
|
158
|
+
* Provides scoped instances of Dispatcher and Events services.
|
|
159
|
+
* Enables event dispatching within a specific component or feature scope.
|
|
160
|
+
*
|
|
161
|
+
* @usageNotes
|
|
162
|
+
*
|
|
163
|
+
* ```ts
|
|
164
|
+
* import { Dispatcher, event } from '@ngrx/signals/events';
|
|
165
|
+
*
|
|
166
|
+
* const increment = event('[Counter Page] Increment');
|
|
167
|
+
*
|
|
168
|
+
* \@Component({
|
|
169
|
+
* /* ... *\/
|
|
170
|
+
* providers: [provideDispatcher()],
|
|
171
|
+
* })
|
|
172
|
+
* class Counter {
|
|
173
|
+
* readonly #dispatcher = inject(Dispatcher);
|
|
174
|
+
*
|
|
175
|
+
* increment(): void {
|
|
176
|
+
* // Dispatching an event to the local Dispatcher.
|
|
177
|
+
* this.#dispatcher.dispatch(increment());
|
|
178
|
+
*
|
|
179
|
+
* // Dispatching an event to the parent Dispatcher.
|
|
180
|
+
* this.#dispatcher.dispatch(increment(), { scope: 'parent' });
|
|
181
|
+
*
|
|
182
|
+
* // Dispatching an event to the global Dispatcher.
|
|
183
|
+
* this.#dispatcher.dispatch(increment(), { scope: 'global' });
|
|
184
|
+
* }
|
|
185
|
+
* }
|
|
186
|
+
* ```
|
|
187
|
+
*/
|
|
188
|
+
function provideDispatcher() {
|
|
189
|
+
return [Events, ReducerEvents, Dispatcher];
|
|
190
|
+
}
|
|
191
|
+
function hasParentOrGlobalScope(config) {
|
|
192
|
+
return config?.scope === 'parent' || config?.scope === 'global';
|
|
193
|
+
}
|
|
126
194
|
|
|
127
195
|
/**
|
|
128
|
-
* @experimental
|
|
129
196
|
* @description
|
|
130
197
|
*
|
|
131
198
|
* Creates an event creator.
|
|
@@ -156,7 +223,6 @@ function event(type) {
|
|
|
156
223
|
}
|
|
157
224
|
|
|
158
225
|
/**
|
|
159
|
-
* @experimental
|
|
160
226
|
* @description
|
|
161
227
|
*
|
|
162
228
|
* Creates a group of event creators.
|
|
@@ -185,7 +251,92 @@ function eventGroup(config) {
|
|
|
185
251
|
}
|
|
186
252
|
|
|
187
253
|
/**
|
|
188
|
-
* @
|
|
254
|
+
* @description
|
|
255
|
+
*
|
|
256
|
+
* Marks a single event to be dispatched in the specified scope.
|
|
257
|
+
* Used in a tuple alongside an event to indicate its dispatch scope.
|
|
258
|
+
*
|
|
259
|
+
* @usageNotes
|
|
260
|
+
*
|
|
261
|
+
* ```ts
|
|
262
|
+
* import { signalStore, type } from '@ngrx/signals';
|
|
263
|
+
* import { event, Events, withEffects } from '@ngrx/signals/events';
|
|
264
|
+
* import { mapResponse } from '@ngrx/operators';
|
|
265
|
+
*
|
|
266
|
+
* const opened = event('[Users Page] Opened');
|
|
267
|
+
* const loadedSuccess = event('[Users API] Loaded Success', type<User[]>());
|
|
268
|
+
* const loadedFailure = event('[Users API] Loaded Failure', type<string>());
|
|
269
|
+
*
|
|
270
|
+
* const UsersStore = signalStore(
|
|
271
|
+
* withEffects((
|
|
272
|
+
* _,
|
|
273
|
+
* events = inject(Events),
|
|
274
|
+
* usersService = inject(UsersService)
|
|
275
|
+
* ) => ({
|
|
276
|
+
* loadUsers$: events.on(opened).pipe(
|
|
277
|
+
* exhaustMap(() =>
|
|
278
|
+
* usersService.getAll().pipe(
|
|
279
|
+
* mapResponse({
|
|
280
|
+
* next: (users) => loadedSuccess(users),
|
|
281
|
+
* error: (error: { message: string }) => [
|
|
282
|
+
* loadedFailure(error.message),
|
|
283
|
+
* toScope('global'),
|
|
284
|
+
* ],
|
|
285
|
+
* }),
|
|
286
|
+
* ),
|
|
287
|
+
* ),
|
|
288
|
+
* ),
|
|
289
|
+
* })),
|
|
290
|
+
* );
|
|
291
|
+
* ```
|
|
292
|
+
*/
|
|
293
|
+
function toScope(scope) {
|
|
294
|
+
return { scope };
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* @description
|
|
298
|
+
*
|
|
299
|
+
* RxJS operator that maps all emitted events in the stream to be dispatched
|
|
300
|
+
* in the specified scope.
|
|
301
|
+
*
|
|
302
|
+
* @usageNotes
|
|
303
|
+
*
|
|
304
|
+
* ```ts
|
|
305
|
+
* import { signalStore, type } from '@ngrx/signals';
|
|
306
|
+
* import { event, Events, withEffects } from '@ngrx/signals/events';
|
|
307
|
+
* import { mapResponse } from '@ngrx/operators';
|
|
308
|
+
*
|
|
309
|
+
* const opened = event('[Users Page] Opened');
|
|
310
|
+
* const loadedSuccess = event('[Users API] Loaded Success', type<User[]>());
|
|
311
|
+
* const loadedFailure = event('[Users API] Loaded Failure', type<string>());
|
|
312
|
+
*
|
|
313
|
+
* const UsersStore = signalStore(
|
|
314
|
+
* withEffects((
|
|
315
|
+
* _,
|
|
316
|
+
* events = inject(Events),
|
|
317
|
+
* usersService = inject(UsersService)
|
|
318
|
+
* ) => ({
|
|
319
|
+
* loadUsers$: events.on(opened).pipe(
|
|
320
|
+
* exhaustMap(() =>
|
|
321
|
+
* usersService.getAll().pipe(
|
|
322
|
+
* mapResponse({
|
|
323
|
+
* next: (users) => loadedSuccess(users),
|
|
324
|
+
* error: (error: { message: string }) =>
|
|
325
|
+
* loadedFailure(error.message),
|
|
326
|
+
* }),
|
|
327
|
+
* mapToScope('parent'),
|
|
328
|
+
* ),
|
|
329
|
+
* ),
|
|
330
|
+
* ),
|
|
331
|
+
* })),
|
|
332
|
+
* );
|
|
333
|
+
* ```
|
|
334
|
+
*/
|
|
335
|
+
function mapToScope(scope) {
|
|
336
|
+
return map((event) => [event, toScope(scope)]);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
189
340
|
* @description
|
|
190
341
|
*
|
|
191
342
|
* Creates self-dispatching events for a given event group.
|
|
@@ -204,7 +355,7 @@ function eventGroup(config) {
|
|
|
204
355
|
* },
|
|
205
356
|
* });
|
|
206
357
|
*
|
|
207
|
-
* \@Component({
|
|
358
|
+
* \@Component({ /* ... *\/ })
|
|
208
359
|
* class Counter {
|
|
209
360
|
* readonly dispatch = injectDispatch(counterPageEvents);
|
|
210
361
|
*
|
|
@@ -224,10 +375,26 @@ function injectDispatch(events, config) {
|
|
|
224
375
|
}
|
|
225
376
|
const injector = config?.injector ?? inject(Injector);
|
|
226
377
|
const dispatcher = injector.get(Dispatcher);
|
|
227
|
-
|
|
378
|
+
const eventsCache = {};
|
|
379
|
+
const dispatch = (config) => {
|
|
380
|
+
if (!eventsCache[config.scope]) {
|
|
381
|
+
eventsCache[config.scope] = Object.entries(events).reduce((acc, [eventName, eventCreator]) => ({
|
|
382
|
+
...acc,
|
|
383
|
+
[eventName]: (payload) => untracked(() => dispatcher.dispatch(eventCreator(payload), config)),
|
|
384
|
+
}), {});
|
|
385
|
+
}
|
|
386
|
+
return eventsCache[config.scope];
|
|
387
|
+
};
|
|
388
|
+
const defaultEventGroup = dispatch({ scope: 'self' });
|
|
389
|
+
const defaultEventGroupProps = Object.keys(defaultEventGroup).reduce((acc, eventName) => ({
|
|
228
390
|
...acc,
|
|
229
|
-
[eventName]:
|
|
391
|
+
[eventName]: {
|
|
392
|
+
value: defaultEventGroup[eventName],
|
|
393
|
+
enumerable: true,
|
|
394
|
+
},
|
|
230
395
|
}), {});
|
|
396
|
+
Object.defineProperties(dispatch, defaultEventGroupProps);
|
|
397
|
+
return dispatch;
|
|
231
398
|
}
|
|
232
399
|
|
|
233
400
|
function isEventInstance(value) {
|
|
@@ -235,23 +402,22 @@ function isEventInstance(value) {
|
|
|
235
402
|
}
|
|
236
403
|
|
|
237
404
|
/**
|
|
238
|
-
* @experimental
|
|
239
405
|
* @description
|
|
240
406
|
*
|
|
241
|
-
* SignalStore feature for defining
|
|
407
|
+
* SignalStore feature for defining event handlers.
|
|
242
408
|
*
|
|
243
409
|
* @usageNotes
|
|
244
410
|
*
|
|
245
411
|
* ```ts
|
|
246
412
|
* import { signalStore, withState } from '@ngrx/signals';
|
|
247
|
-
* import { event, Events,
|
|
413
|
+
* import { event, Events, withEventHandlers } from '@ngrx/signals/events';
|
|
248
414
|
*
|
|
249
415
|
* const increment = event('[Counter Page] Increment');
|
|
250
416
|
* const decrement = event('[Counter Page] Decrement');
|
|
251
417
|
*
|
|
252
418
|
* const CounterStore = signalStore(
|
|
253
419
|
* withState({ count: 0 }),
|
|
254
|
-
*
|
|
420
|
+
* withEventHandlers(({ count }, events = inject(Events)) => ({
|
|
255
421
|
* logCount$: events.on(increment, decrement).pipe(
|
|
256
422
|
* tap(({ type }) => console.log(type, count())),
|
|
257
423
|
* ),
|
|
@@ -259,16 +425,20 @@ function isEventInstance(value) {
|
|
|
259
425
|
* );
|
|
260
426
|
* ```
|
|
261
427
|
*/
|
|
262
|
-
function
|
|
428
|
+
function withEventHandlers(handlersFactory) {
|
|
263
429
|
return signalStoreFeature(type(), withHooks({
|
|
264
430
|
onInit(store, dispatcher = inject(Dispatcher)) {
|
|
265
|
-
const
|
|
266
|
-
const
|
|
267
|
-
|
|
268
|
-
|
|
431
|
+
const handlerSources = handlersFactory(store);
|
|
432
|
+
const handlers = Object.values(handlerSources).map((handlerSource$) => handlerSource$.pipe(tap((result) => {
|
|
433
|
+
const [potentialEvent, config] = Array.isArray(result)
|
|
434
|
+
? result
|
|
435
|
+
: [result];
|
|
436
|
+
if (isEventInstance(potentialEvent) &&
|
|
437
|
+
!(SOURCE_TYPE in potentialEvent)) {
|
|
438
|
+
dispatcher.dispatch(potentialEvent, config);
|
|
269
439
|
}
|
|
270
440
|
})));
|
|
271
|
-
merge(...
|
|
441
|
+
merge(...handlers)
|
|
272
442
|
.pipe(takeUntilDestroyed())
|
|
273
443
|
.subscribe();
|
|
274
444
|
},
|
|
@@ -276,10 +446,9 @@ function withEffects(effectsFactory) {
|
|
|
276
446
|
}
|
|
277
447
|
|
|
278
448
|
/**
|
|
279
|
-
* @experimental
|
|
280
449
|
* @description
|
|
281
450
|
*
|
|
282
|
-
* SignalStore feature for defining state
|
|
451
|
+
* SignalStore feature for defining state transitions based on dispatched events.
|
|
283
452
|
*
|
|
284
453
|
* @usageNotes
|
|
285
454
|
*
|
|
@@ -298,24 +467,17 @@ function withEffects(effectsFactory) {
|
|
|
298
467
|
* ```
|
|
299
468
|
*/
|
|
300
469
|
function withReducer(...caseReducers) {
|
|
301
|
-
return signalStoreFeature({ state: type() },
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
patchState(store, ...updaters);
|
|
308
|
-
})));
|
|
309
|
-
merge(...updates)
|
|
310
|
-
.pipe(takeUntilDestroyed())
|
|
311
|
-
.subscribe();
|
|
312
|
-
},
|
|
313
|
-
}));
|
|
470
|
+
return signalStoreFeature({ state: type() }, withEventHandlers((store, events = inject(ReducerEvents)) => caseReducers.map((caseReducer) => events.on(...caseReducer.events).pipe(tap((event) => {
|
|
471
|
+
const state = untracked(() => getState(store));
|
|
472
|
+
const result = caseReducer.reducer(event, state);
|
|
473
|
+
const updaters = Array.isArray(result) ? result : [result];
|
|
474
|
+
patchState(store, ...updaters);
|
|
475
|
+
})))));
|
|
314
476
|
}
|
|
315
477
|
|
|
316
478
|
/**
|
|
317
479
|
* Generated bundle index. Do not edit.
|
|
318
480
|
*/
|
|
319
481
|
|
|
320
|
-
export { Dispatcher, Events, event, eventGroup, injectDispatch, on,
|
|
482
|
+
export { Dispatcher, Events, ReducerEvents, event, eventGroup, injectDispatch, mapToScope, on, provideDispatcher, toScope, withEventHandlers, withReducer };
|
|
321
483
|
//# sourceMappingURL=ngrx-signals-events.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngrx-signals-events.mjs","sources":["../../../../modules/signals/events/src/case-reducer.ts","../../../../modules/signals/events/src/events-service.ts","../../../../modules/signals/events/src/dispatcher.ts","../../../../modules/signals/events/src/event-creator.ts","../../../../modules/signals/events/src/event-creator-group.ts","../../../../modules/signals/events/src/inject-dispatch.ts","../../../../modules/signals/events/src/event-instance.ts","../../../../modules/signals/events/src/with-effects.ts","../../../../modules/signals/events/src/with-reducer.ts","../../../../modules/signals/events/ngrx-signals-events.ts"],"sourcesContent":["import { PartialStateUpdater } from '@ngrx/signals';\nimport { EventCreator } from './event-creator';\n\nexport type CaseReducerResult<\n State extends object,\n EventCreators extends EventCreator<string, any>[],\n> = {\n reducer: CaseReducer<State, EventCreators>;\n events: EventCreators;\n};\n\ntype CaseReducer<\n State extends object,\n EventCreators extends EventCreator<string, any>[],\n> = (\n event: { [K in keyof EventCreators]: ReturnType<EventCreators[K]> }[number],\n state: State\n) =>\n | Partial<State>\n | PartialStateUpdater<State>\n | Array<Partial<State> | PartialStateUpdater<State>>;\n\n/**\n * @experimental\n * @description\n *\n * Creates a case reducer that can be used with the `withReducer` feature.\n */\nexport function on<\n State extends object,\n EventCreators extends EventCreator<string, any>[],\n>(\n ...args: [\n ...events: [...EventCreators],\n reducer: CaseReducer<NoInfer<State>, NoInfer<EventCreators>>,\n ]\n): CaseReducerResult<State, EventCreators> {\n const reducer = args.pop() as CaseReducer<State, EventCreators>;\n const events = args as unknown as EventCreators;\n\n return { reducer, events };\n}\n","import { Injectable } from '@angular/core';\nimport {\n filter,\n map,\n MonoTypeOperatorFunction,\n Observable,\n Subject,\n} from 'rxjs';\nimport { EventInstance } from './event-instance';\nimport { EventCreator } from './event-creator';\n\nexport const EVENTS = Symbol();\nexport const SOURCE_TYPE = Symbol();\n\nabstract class BaseEvents {\n /**\n * @internal\n */\n readonly [EVENTS] = new Subject<EventInstance<string, unknown>>();\n\n on(): Observable<EventInstance<string, unknown>>;\n on<EventCreators extends EventCreator<string, any>[]>(\n ...events: [...EventCreators]\n ): Observable<\n { [K in keyof EventCreators]: ReturnType<EventCreators[K]> }[number]\n >;\n on(\n ...events: EventCreator<string, unknown>[]\n ): Observable<EventInstance<string, unknown>> {\n return this[EVENTS].pipe(filterByType(events), withSourceType());\n }\n}\n\n/**\n * @experimental\n * @description\n *\n * Globally provided service for listening to dispatched events.\n *\n * @usageNotes\n *\n * ```ts\n * import { event, Events } from '@ngrx/signals/events';\n *\n * const increment = event('[Counter Page] Increment');\n *\n * \\@Component({ \\/* ... *\\/ })\n * class Counter {\n * readonly #events = inject(Events);\n *\n * constructor() {\n * this.#events\n * .on(increment)\n * .pipe(takeUntilDestroyed())\n * .subscribe(() => \\/* handle increment event *\\/);\n * }\n * }\n * ```\n */\n@Injectable({ providedIn: 'platform' })\nexport class Events extends BaseEvents {}\n\n@Injectable({ providedIn: 'platform' })\nexport class ReducerEvents extends BaseEvents {}\n\nfunction filterByType<T extends EventInstance<string, unknown>>(\n events: EventCreator<string, unknown>[]\n): MonoTypeOperatorFunction<T> {\n if (events.length === 0) {\n return (source$) => source$;\n }\n\n const eventMap = toEventCreatorMap(events);\n return filter<T>(({ type }) => !!eventMap[type]);\n}\n\nfunction toEventCreatorMap(\n events: EventCreator<string, unknown>[]\n): Record<string, EventCreator<string, unknown>> {\n return events.reduce((acc, event) => ({ ...acc, [event.type]: event }), {});\n}\n\nfunction withSourceType<\n T extends EventInstance<string, unknown>,\n>(): MonoTypeOperatorFunction<T> {\n return map(({ ...event }) => {\n Object.defineProperty(event, SOURCE_TYPE, { value: event.type });\n return event;\n });\n}\n","import { inject, Injectable } from '@angular/core';\nimport { queueScheduler } from 'rxjs';\nimport { EventInstance } from './event-instance';\nimport { Events, EVENTS, ReducerEvents } from './events-service';\n\n/**\n * @experimental\n * @description\n *\n * Globally provided service for dispatching events.\n *\n * @usageNotes\n *\n * ```ts\n * import { Dispatcher, event } from '@ngrx/signals/events';\n *\n * const increment = event('[Counter Page] Increment');\n *\n * \\@Component({ \\/* ... *\\/ })\n * class Counter {\n * readonly #dispatcher = inject(Dispatcher);\n *\n * increment(): void {\n * this.#dispatcher.dispatch(increment());\n * }\n * }\n * ```\n */\n@Injectable({ providedIn: 'platform' })\nexport class Dispatcher {\n protected readonly reducerEvents = inject(ReducerEvents);\n protected readonly events = inject(Events);\n\n dispatch(event: EventInstance<string, unknown>): void {\n this.reducerEvents[EVENTS].next(event);\n queueScheduler.schedule(() => this.events[EVENTS].next(event));\n }\n}\n","import { EventInstance } from './event-instance';\n\n/**\n * @experimental\n */\nexport type EventCreator<Type extends string, Payload> = ((\n payload: Payload\n) => EventInstance<Type, Payload>) & { type: Type };\n\nexport function event<Type extends string>(\n type: Type\n): EventCreator<Type, void>;\nexport function event<Type extends string, Payload>(\n type: Type,\n payload: Payload\n): EventCreator<Type, Payload>;\n/**\n * @experimental\n * @description\n *\n * Creates an event creator.\n *\n * @usageNotes\n *\n * ### Creating an event creator without payload\n *\n * ```ts\n * import { event } from '@ngrx/signals/events';\n *\n * const increment = event('[Counter Page] Increment');\n * ```\n *\n * ### Creating an event creator with payload\n *\n * ```ts\n * import { type } from '@ngrx/signals';\n * import { event } from '@ngrx/signals/events';\n *\n * const set = event('[Counter Page] Set', type<number>());\n * ```\n */\nexport function event(type: string): EventCreator<string, any> {\n const creator = (payload?: unknown) => ({ type, payload });\n (creator as any).type = type;\n\n return creator as EventCreator<string, unknown>;\n}\n","import { Prettify } from '@ngrx/signals';\nimport { event, EventCreator } from './event-creator';\n\ntype EventType<\n Source extends string,\n EventName extends string,\n> = `[${Source}] ${EventName}`;\n\ntype EventCreatorGroup<\n Source extends string,\n Events extends Record<string, any>,\n> = {\n [EventName in keyof Events]: EventName extends string\n ? EventCreator<EventType<Source, EventName>, Events[EventName]>\n : never;\n};\n\n/**\n * @experimental\n * @description\n *\n * Creates a group of event creators.\n *\n * @usageNotes\n *\n * ```ts\n * import { type } from '@ngrx/signals';\n * import { eventGroup } from '@ngrx/signals/events';\n *\n * const counterPageEvents = eventGroup({\n * source: 'Counter Page',\n * events: {\n * increment: type<void>(),\n * decrement: type<void>(),\n * set: type<number>(),\n * },\n * });\n * ```\n */\nexport function eventGroup<\n Source extends string,\n Events extends Record<string, unknown>,\n>(config: {\n source: Source;\n events: Events;\n}): Prettify<EventCreatorGroup<Source, Events>> {\n return Object.entries(config.events).reduce(\n (acc, [eventName]) => {\n const eventType = `[${config.source}] ${eventName}`;\n return { ...acc, [eventName]: event(eventType) };\n },\n {} as EventCreatorGroup<Source, Events>\n );\n}\n","import {\n assertInInjectionContext,\n inject,\n Injector,\n untracked,\n} from '@angular/core';\nimport { Prettify } from '@ngrx/signals';\nimport { Dispatcher } from './dispatcher';\nimport { EventCreator } from './event-creator';\n\ntype InjectDispatchResult<\n EventGroup extends Record<string, EventCreator<string, any>>,\n> = {\n [EventName in keyof EventGroup]: Parameters<EventGroup[EventName]> extends [\n infer Payload,\n ]\n ? (payload: Payload) => void\n : () => void;\n};\n\n/**\n * @experimental\n * @description\n *\n * Creates self-dispatching events for a given event group.\n *\n * @usageNotes\n *\n * ```ts\n * import { type } from '@ngrx/signals';\n * import { eventGroup, injectDispatch } from '@ngrx/signals/events';\n *\n * const counterPageEvents = eventGroup({\n * source: 'Counter Page',\n * events: {\n * increment: type<void>(),\n * decrement: type<void>(),\n * },\n * });\n *\n * \\@Component({ \\/* ... *\\/ })\n * class Counter {\n * readonly dispatch = injectDispatch(counterPageEvents);\n *\n * increment(): void {\n * this.dispatch.increment();\n * }\n *\n * decrement(): void {\n * this.dispatch.decrement();\n * }\n * }\n * ```\n */\nexport function injectDispatch<\n EventGroup extends Record<string, EventCreator<string, any>>,\n>(\n events: EventGroup,\n config?: { injector?: Injector }\n): Prettify<InjectDispatchResult<EventGroup>> {\n if (typeof ngDevMode !== 'undefined' && ngDevMode && !config?.injector) {\n assertInInjectionContext(injectDispatch);\n }\n\n const injector = config?.injector ?? inject(Injector);\n const dispatcher = injector.get(Dispatcher);\n\n return Object.entries(events).reduce(\n (acc, [eventName, eventCreator]) => ({\n ...acc,\n [eventName]: (payload?: unknown) =>\n untracked(() => dispatcher.dispatch(eventCreator(payload))),\n }),\n {} as InjectDispatchResult<EventGroup>\n );\n}\n","/**\n * @experimental\n */\nexport type EventInstance<Type extends string, Payload> = {\n type: Type;\n payload: Payload;\n};\n\nexport function isEventInstance(\n value: unknown\n): value is EventInstance<string, unknown> {\n return typeof value === 'object' && value !== null && 'type' in value;\n}\n","import { inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { merge, Observable, tap } from 'rxjs';\nimport {\n EmptyFeatureResult,\n Prettify,\n signalStoreFeature,\n SignalStoreFeature,\n SignalStoreFeatureResult,\n StateSignals,\n type,\n withHooks,\n WritableStateSource,\n} from '@ngrx/signals';\nimport { Dispatcher } from './dispatcher';\nimport { isEventInstance } from './event-instance';\nimport { SOURCE_TYPE } from './events-service';\n\n/**\n * @experimental\n * @description\n *\n * SignalStore feature for defining side effects.\n *\n * @usageNotes\n *\n * ```ts\n * import { signalStore, withState } from '@ngrx/signals';\n * import { event, Events, withEffects } from '@ngrx/signals/events';\n *\n * const increment = event('[Counter Page] Increment');\n * const decrement = event('[Counter Page] Decrement');\n *\n * const CounterStore = signalStore(\n * withState({ count: 0 }),\n * withEffects(({ count }, events = inject(Events)) => ({\n * logCount$: events.on(increment, decrement).pipe(\n * tap(({ type }) => console.log(type, count())),\n * ),\n * })),\n * );\n * ```\n */\nexport function withEffects<Input extends SignalStoreFeatureResult>(\n effectsFactory: (\n store: Prettify<\n StateSignals<Input['state']> &\n Input['props'] &\n Input['methods'] &\n WritableStateSource<Prettify<Input['state']>>\n >\n ) => Record<string, Observable<unknown>>\n): SignalStoreFeature<Input, EmptyFeatureResult> {\n return signalStoreFeature(\n type<Input>(),\n withHooks({\n onInit(store, dispatcher = inject(Dispatcher)) {\n const effectSources = effectsFactory(store);\n const effects = Object.values(effectSources).map((effectSource$) =>\n effectSource$.pipe(\n tap((value) => {\n if (isEventInstance(value) && !(SOURCE_TYPE in value)) {\n dispatcher.dispatch(value);\n }\n })\n )\n );\n\n merge(...effects)\n .pipe(takeUntilDestroyed())\n .subscribe();\n },\n })\n );\n}\n","import { inject, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { merge, tap } from 'rxjs';\nimport {\n EmptyFeatureResult,\n getState,\n patchState,\n SignalStoreFeature,\n signalStoreFeature,\n type,\n withHooks,\n} from '@ngrx/signals';\nimport { CaseReducerResult } from './case-reducer';\nimport { EventCreator } from './event-creator';\nimport { ReducerEvents } from './events-service';\n\n/**\n * @experimental\n * @description\n *\n * SignalStore feature for defining state changes based on dispatched events.\n *\n * @usageNotes\n *\n * ```ts\n * import { signalStore, type, withState } from '@ngrx/signals';\n * import { event, on, withReducer } from '@ngrx/signals/events';\n *\n * const set = event('[Counter Page] Set', type<number>());\n *\n * const CounterStore = signalStore(\n * withState({ count: 0 }),\n * withReducer(\n * on(set, ({ payload }) => ({ count: payload })),\n * ),\n * );\n * ```\n */\nexport function withReducer<State extends object>(\n ...caseReducers: CaseReducerResult<State, EventCreator<string, any>[]>[]\n): SignalStoreFeature<\n { state: State; props: {}; methods: {} },\n EmptyFeatureResult\n> {\n return signalStoreFeature(\n { state: type<State>() },\n withHooks({\n onInit(store, events = inject(ReducerEvents)) {\n const updates = caseReducers.map((caseReducer) =>\n events.on(...caseReducer.events).pipe(\n tap((event) => {\n const state = untracked(() => getState(store));\n const result = caseReducer.reducer(event, state);\n const updaters = Array.isArray(result) ? result : [result];\n\n patchState(store, ...updaters);\n })\n )\n );\n\n merge(...updates)\n .pipe(takeUntilDestroyed())\n .subscribe();\n },\n })\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngrx-signals-events.mjs","sources":["../../../../modules/signals/events/src/case-reducer.ts","../../../../modules/signals/events/src/events-service.ts","../../../../modules/signals/events/src/dispatcher.ts","../../../../modules/signals/events/src/event-creator.ts","../../../../modules/signals/events/src/event-creator-group.ts","../../../../modules/signals/events/src/event-scope.ts","../../../../modules/signals/events/src/inject-dispatch.ts","../../../../modules/signals/events/src/event-instance.ts","../../../../modules/signals/events/src/with-event-handlers.ts","../../../../modules/signals/events/src/with-reducer.ts","../../../../modules/signals/events/ngrx-signals-events.ts"],"sourcesContent":["import { PartialStateUpdater } from '@ngrx/signals';\nimport { EventCreator } from './event-creator';\n\nexport type CaseReducerResult<\n State extends object,\n EventCreators extends EventCreator<string, any>[],\n> = {\n reducer: CaseReducer<State, EventCreators>;\n events: EventCreators;\n};\n\ntype CaseReducer<\n State extends object,\n EventCreators extends EventCreator<string, any>[],\n> = (\n event: { [K in keyof EventCreators]: ReturnType<EventCreators[K]> }[number],\n state: State\n) =>\n | Partial<State>\n | PartialStateUpdater<State>\n | Array<Partial<State> | PartialStateUpdater<State>>;\n\n/**\n * @description\n *\n * Creates a case reducer that can be used with the `withReducer` feature.\n */\nexport function on<\n State extends object,\n EventCreators extends EventCreator<string, any>[],\n>(\n ...args: [\n ...events: [...EventCreators],\n reducer: CaseReducer<NoInfer<State>, NoInfer<EventCreators>>,\n ]\n): CaseReducerResult<State, EventCreators> {\n const reducer = args.pop() as CaseReducer<State, EventCreators>;\n const events = args as unknown as EventCreators;\n\n return { reducer, events };\n}\n","import { inject, Injectable, Type } from '@angular/core';\nimport {\n filter,\n map,\n merge,\n MonoTypeOperatorFunction,\n Observable,\n Subject,\n} from 'rxjs';\nimport { EventInstance } from './event-instance';\nimport { EventCreator } from './event-creator';\n\nexport const EVENTS = Symbol(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'EVENTS' : ''\n);\nexport const SOURCE_TYPE = Symbol(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'SOURCE_TYPE' : ''\n);\n\nabstract class BaseEvents {\n /**\n * @internal\n */\n readonly [EVENTS] = new Subject<EventInstance<string, unknown>>();\n protected readonly events$: Observable<EventInstance<string, unknown>>;\n\n protected constructor(parentEventsToken: Type<BaseEvents>) {\n const parentEvents = inject(parentEventsToken, {\n skipSelf: true,\n optional: true,\n });\n this.events$ = parentEvents\n ? merge(parentEvents.events$, this[EVENTS])\n : this[EVENTS].asObservable();\n }\n\n on(): Observable<EventInstance<string, unknown>>;\n on<EventCreators extends EventCreator<string, any>[]>(\n ...events: [...EventCreators]\n ): Observable<\n { [K in keyof EventCreators]: ReturnType<EventCreators[K]> }[number]\n >;\n on(\n ...events: EventCreator<string, unknown>[]\n ): Observable<EventInstance<string, unknown>> {\n return this.events$.pipe(filterByType(events), withSourceType());\n }\n}\n\n/**\n * @description\n *\n * Globally provided service for listening to dispatched events.\n *\n * @usageNotes\n *\n * ```ts\n * import { event, Events } from '@ngrx/signals/events';\n *\n * const increment = event('[Counter Page] Increment');\n *\n * \\@Component({ /* ... *\\/ })\n * class Counter {\n * readonly #events = inject(Events);\n *\n * constructor() {\n * this.#events\n * .on(increment)\n * .pipe(takeUntilDestroyed())\n * .subscribe(() => /* handle increment event *\\/);\n * }\n * }\n * ```\n */\n@Injectable({ providedIn: 'platform' })\nexport class Events extends BaseEvents {\n constructor() {\n super(Events);\n }\n}\n\n/**\n * @description\n *\n * Globally provided service for listening to dispatched events.\n * Receives events before the `Events` service and is primarily used for\n * handling state transitions.\n */\n@Injectable({ providedIn: 'platform' })\nexport class ReducerEvents extends BaseEvents {\n constructor() {\n super(ReducerEvents);\n }\n}\n\nfunction filterByType<T extends EventInstance<string, unknown>>(\n events: EventCreator<string, unknown>[]\n): MonoTypeOperatorFunction<T> {\n if (events.length === 0) {\n return (source$) => source$;\n }\n\n const eventMap = toEventCreatorMap(events);\n return filter<T>(({ type }) => !!eventMap[type]);\n}\n\nfunction toEventCreatorMap(\n events: EventCreator<string, unknown>[]\n): Record<string, EventCreator<string, unknown>> {\n return events.reduce((acc, event) => ({ ...acc, [event.type]: event }), {});\n}\n\nfunction withSourceType<\n T extends EventInstance<string, unknown>,\n>(): MonoTypeOperatorFunction<T> {\n return map(({ ...event }) => {\n Object.defineProperty(event, SOURCE_TYPE, { value: event.type });\n return event;\n });\n}\n","import { inject, Injectable, Provider } from '@angular/core';\nimport { queueScheduler } from 'rxjs';\nimport { EventInstance } from './event-instance';\nimport { EventScope, EventScopeConfig } from './event-scope';\nimport { Events, EVENTS, ReducerEvents } from './events-service';\n\n/**\n * @description\n *\n * Globally provided service for dispatching events.\n *\n * @usageNotes\n *\n * ```ts\n * import { Dispatcher, event } from '@ngrx/signals/events';\n *\n * const increment = event('[Counter Page] Increment');\n *\n * \\@Component({ /* ... *\\/ })\n * class Counter {\n * readonly #dispatcher = inject(Dispatcher);\n *\n * increment(): void {\n * this.#dispatcher.dispatch(increment());\n * }\n * }\n * ```\n */\n@Injectable({ providedIn: 'platform' })\nexport class Dispatcher {\n protected readonly reducerEvents = inject(ReducerEvents);\n protected readonly events = inject(Events);\n protected readonly parentDispatcher = inject(Dispatcher, {\n skipSelf: true,\n optional: true,\n });\n\n dispatch(\n event: EventInstance<string, unknown>,\n config?: EventScopeConfig\n ): void {\n if (this.parentDispatcher && hasParentOrGlobalScope(config)) {\n this.parentDispatcher.dispatch(\n event,\n config.scope === 'global' ? config : undefined\n );\n } else {\n this.reducerEvents[EVENTS].next(event);\n queueScheduler.schedule(() => this.events[EVENTS].next(event));\n }\n }\n}\n\n/**\n * @description\n *\n * Provides scoped instances of Dispatcher and Events services.\n * Enables event dispatching within a specific component or feature scope.\n *\n * @usageNotes\n *\n * ```ts\n * import { Dispatcher, event } from '@ngrx/signals/events';\n *\n * const increment = event('[Counter Page] Increment');\n *\n * \\@Component({\n * /* ... *\\/\n * providers: [provideDispatcher()],\n * })\n * class Counter {\n * readonly #dispatcher = inject(Dispatcher);\n *\n * increment(): void {\n * // Dispatching an event to the local Dispatcher.\n * this.#dispatcher.dispatch(increment());\n *\n * // Dispatching an event to the parent Dispatcher.\n * this.#dispatcher.dispatch(increment(), { scope: 'parent' });\n *\n * // Dispatching an event to the global Dispatcher.\n * this.#dispatcher.dispatch(increment(), { scope: 'global' });\n * }\n * }\n * ```\n */\nexport function provideDispatcher(): Provider[] {\n return [Events, ReducerEvents, Dispatcher];\n}\n\nfunction hasParentOrGlobalScope(\n config?: EventScopeConfig\n): config is { scope: Exclude<EventScope, 'self'> } {\n return config?.scope === 'parent' || config?.scope === 'global';\n}\n","import { EventInstance } from './event-instance';\n\nexport type EventCreator<Type extends string, Payload> = ((\n payload: Payload\n) => EventInstance<Type, Payload>) & { type: Type };\n\nexport function event<Type extends string>(\n type: Type\n): EventCreator<Type, void>;\nexport function event<Type extends string, Payload>(\n type: Type,\n payload: Payload\n): EventCreator<Type, Payload>;\n/**\n * @description\n *\n * Creates an event creator.\n *\n * @usageNotes\n *\n * ### Creating an event creator without payload\n *\n * ```ts\n * import { event } from '@ngrx/signals/events';\n *\n * const increment = event('[Counter Page] Increment');\n * ```\n *\n * ### Creating an event creator with payload\n *\n * ```ts\n * import { type } from '@ngrx/signals';\n * import { event } from '@ngrx/signals/events';\n *\n * const set = event('[Counter Page] Set', type<number>());\n * ```\n */\nexport function event(type: string): EventCreator<string, any> {\n const creator = (payload?: unknown) => ({ type, payload });\n (creator as any).type = type;\n\n return creator as EventCreator<string, unknown>;\n}\n","import { Prettify } from '@ngrx/signals';\nimport { event, EventCreator } from './event-creator';\n\ntype EventType<\n Source extends string,\n EventName extends string,\n> = `[${Source}] ${EventName}`;\n\ntype EventCreatorGroup<\n Source extends string,\n Events extends Record<string, any>,\n> = {\n readonly [EventName in keyof Events]: EventName extends string\n ? EventCreator<EventType<Source, EventName>, Events[EventName]>\n : never;\n};\n\n/**\n * @description\n *\n * Creates a group of event creators.\n *\n * @usageNotes\n *\n * ```ts\n * import { type } from '@ngrx/signals';\n * import { eventGroup } from '@ngrx/signals/events';\n *\n * const counterPageEvents = eventGroup({\n * source: 'Counter Page',\n * events: {\n * increment: type<void>(),\n * decrement: type<void>(),\n * set: type<number>(),\n * },\n * });\n * ```\n */\nexport function eventGroup<\n Source extends string,\n Events extends Record<string, unknown>,\n>(config: {\n source: Source;\n events: Events;\n}): Prettify<EventCreatorGroup<Source, Events>> {\n return Object.entries(config.events).reduce(\n (acc, [eventName]) => {\n const eventType = `[${config.source}] ${eventName}`;\n return { ...acc, [eventName]: event(eventType) };\n },\n {} as EventCreatorGroup<Source, Events>\n );\n}\n","import { map, OperatorFunction } from 'rxjs';\nimport { EventInstance } from './event-instance';\n\nexport type EventScope = 'self' | 'parent' | 'global';\n\nexport type EventScopeConfig = { scope: EventScope };\n\n/**\n * @description\n *\n * Marks a single event to be dispatched in the specified scope.\n * Used in a tuple alongside an event to indicate its dispatch scope.\n *\n * @usageNotes\n *\n * ```ts\n * import { signalStore, type } from '@ngrx/signals';\n * import { event, Events, withEffects } from '@ngrx/signals/events';\n * import { mapResponse } from '@ngrx/operators';\n *\n * const opened = event('[Users Page] Opened');\n * const loadedSuccess = event('[Users API] Loaded Success', type<User[]>());\n * const loadedFailure = event('[Users API] Loaded Failure', type<string>());\n *\n * const UsersStore = signalStore(\n * withEffects((\n * _,\n * events = inject(Events),\n * usersService = inject(UsersService)\n * ) => ({\n * loadUsers$: events.on(opened).pipe(\n * exhaustMap(() =>\n * usersService.getAll().pipe(\n * mapResponse({\n * next: (users) => loadedSuccess(users),\n * error: (error: { message: string }) => [\n * loadedFailure(error.message),\n * toScope('global'),\n * ],\n * }),\n * ),\n * ),\n * ),\n * })),\n * );\n * ```\n */\nexport function toScope(scope: EventScope): EventScopeConfig {\n return { scope };\n}\n\n/**\n * @description\n *\n * RxJS operator that maps all emitted events in the stream to be dispatched\n * in the specified scope.\n *\n * @usageNotes\n *\n * ```ts\n * import { signalStore, type } from '@ngrx/signals';\n * import { event, Events, withEffects } from '@ngrx/signals/events';\n * import { mapResponse } from '@ngrx/operators';\n *\n * const opened = event('[Users Page] Opened');\n * const loadedSuccess = event('[Users API] Loaded Success', type<User[]>());\n * const loadedFailure = event('[Users API] Loaded Failure', type<string>());\n *\n * const UsersStore = signalStore(\n * withEffects((\n * _,\n * events = inject(Events),\n * usersService = inject(UsersService)\n * ) => ({\n * loadUsers$: events.on(opened).pipe(\n * exhaustMap(() =>\n * usersService.getAll().pipe(\n * mapResponse({\n * next: (users) => loadedSuccess(users),\n * error: (error: { message: string }) =>\n * loadedFailure(error.message),\n * }),\n * mapToScope('parent'),\n * ),\n * ),\n * ),\n * })),\n * );\n * ```\n */\nexport function mapToScope<T extends EventInstance<string, unknown>>(\n scope: EventScope\n): OperatorFunction<T, [T, EventScopeConfig]> {\n return map((event) => [event, toScope(scope)]);\n}\n","import {\n assertInInjectionContext,\n inject,\n Injector,\n untracked,\n} from '@angular/core';\nimport { Prettify } from '@ngrx/signals';\nimport { Dispatcher } from './dispatcher';\nimport { EventCreator } from './event-creator';\nimport { EventScope, EventScopeConfig } from './event-scope';\n\ntype SelfDispatchingEvents<\n EventGroup extends Record<string, EventCreator<string, any>>,\n> = {\n readonly [EventName in keyof EventGroup]: Parameters<\n EventGroup[EventName]\n > extends [infer Payload]\n ? (payload: Payload) => void\n : () => void;\n};\n\n/**\n * @description\n *\n * Creates self-dispatching events for a given event group.\n *\n * @usageNotes\n *\n * ```ts\n * import { type } from '@ngrx/signals';\n * import { eventGroup, injectDispatch } from '@ngrx/signals/events';\n *\n * const counterPageEvents = eventGroup({\n * source: 'Counter Page',\n * events: {\n * increment: type<void>(),\n * decrement: type<void>(),\n * },\n * });\n *\n * \\@Component({ /* ... *\\/ })\n * class Counter {\n * readonly dispatch = injectDispatch(counterPageEvents);\n *\n * increment(): void {\n * this.dispatch.increment();\n * }\n *\n * decrement(): void {\n * this.dispatch.decrement();\n * }\n * }\n * ```\n */\nexport function injectDispatch<\n EventGroup extends Record<string, EventCreator<string, any>>,\n>(\n events: EventGroup,\n config?: { injector?: Injector }\n): ((config: EventScopeConfig) => Prettify<SelfDispatchingEvents<EventGroup>>) &\n Prettify<SelfDispatchingEvents<EventGroup>> {\n if (typeof ngDevMode !== 'undefined' && ngDevMode && !config?.injector) {\n assertInInjectionContext(injectDispatch);\n }\n\n const injector = config?.injector ?? inject(Injector);\n const dispatcher = injector.get(Dispatcher);\n\n const eventsCache = {} as Record<\n EventScope,\n SelfDispatchingEvents<EventGroup>\n >;\n\n const dispatch = (config: EventScopeConfig) => {\n if (!eventsCache[config.scope]) {\n eventsCache[config.scope] = Object.entries(events).reduce(\n (acc, [eventName, eventCreator]) => ({\n ...acc,\n [eventName]: (payload?: unknown) =>\n untracked(() => dispatcher.dispatch(eventCreator(payload), config)),\n }),\n {} as SelfDispatchingEvents<EventGroup>\n );\n }\n\n return eventsCache[config.scope];\n };\n\n const defaultEventGroup = dispatch({ scope: 'self' });\n const defaultEventGroupProps = Object.keys(defaultEventGroup).reduce(\n (acc, eventName) => ({\n ...acc,\n [eventName]: {\n value: defaultEventGroup[eventName],\n enumerable: true,\n },\n }),\n {} as PropertyDescriptorMap\n );\n Object.defineProperties(dispatch, defaultEventGroupProps);\n\n return dispatch as ReturnType<typeof injectDispatch<EventGroup>>;\n}\n","export type EventInstance<Type extends string, Payload> = {\n type: Type;\n payload: Payload;\n};\n\nexport function isEventInstance(\n value: unknown\n): value is EventInstance<string, unknown> {\n return typeof value === 'object' && value !== null && 'type' in value;\n}\n","import { inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { merge, Observable, tap } from 'rxjs';\nimport {\n EmptyFeatureResult,\n Prettify,\n signalStoreFeature,\n SignalStoreFeature,\n SignalStoreFeatureResult,\n StateSignals,\n type,\n withHooks,\n WritableStateSource,\n} from '@ngrx/signals';\nimport { Dispatcher } from './dispatcher';\nimport { isEventInstance } from './event-instance';\nimport { SOURCE_TYPE } from './events-service';\n\n/**\n * @description\n *\n * SignalStore feature for defining event handlers.\n *\n * @usageNotes\n *\n * ```ts\n * import { signalStore, withState } from '@ngrx/signals';\n * import { event, Events, withEventHandlers } from '@ngrx/signals/events';\n *\n * const increment = event('[Counter Page] Increment');\n * const decrement = event('[Counter Page] Decrement');\n *\n * const CounterStore = signalStore(\n * withState({ count: 0 }),\n * withEventHandlers(({ count }, events = inject(Events)) => ({\n * logCount$: events.on(increment, decrement).pipe(\n * tap(({ type }) => console.log(type, count())),\n * ),\n * })),\n * );\n * ```\n */\nexport function withEventHandlers<Input extends SignalStoreFeatureResult>(\n handlersFactory: (\n store: Prettify<\n StateSignals<Input['state']> &\n Input['props'] &\n Input['methods'] &\n WritableStateSource<Prettify<Input['state']>>\n >\n ) => Record<string, Observable<unknown>> | Observable<unknown>[]\n): SignalStoreFeature<Input, EmptyFeatureResult> {\n return signalStoreFeature(\n type<Input>(),\n withHooks({\n onInit(store, dispatcher = inject(Dispatcher)) {\n const handlerSources = handlersFactory(store);\n const handlers = Object.values(handlerSources).map((handlerSource$) =>\n handlerSource$.pipe(\n tap((result) => {\n const [potentialEvent, config] = Array.isArray(result)\n ? result\n : [result];\n\n if (\n isEventInstance(potentialEvent) &&\n !(SOURCE_TYPE in potentialEvent)\n ) {\n dispatcher.dispatch(potentialEvent, config);\n }\n })\n )\n );\n\n merge(...handlers)\n .pipe(takeUntilDestroyed())\n .subscribe();\n },\n })\n );\n}\n","import { inject, untracked } from '@angular/core';\nimport { tap } from 'rxjs';\nimport {\n EmptyFeatureResult,\n getState,\n patchState,\n SignalStoreFeature,\n signalStoreFeature,\n type,\n} from '@ngrx/signals';\nimport { CaseReducerResult } from './case-reducer';\nimport { EventCreator } from './event-creator';\nimport { ReducerEvents } from './events-service';\nimport { withEventHandlers } from './with-event-handlers';\n\n/**\n * @description\n *\n * SignalStore feature for defining state transitions based on dispatched events.\n *\n * @usageNotes\n *\n * ```ts\n * import { signalStore, type, withState } from '@ngrx/signals';\n * import { event, on, withReducer } from '@ngrx/signals/events';\n *\n * const set = event('[Counter Page] Set', type<number>());\n *\n * const CounterStore = signalStore(\n * withState({ count: 0 }),\n * withReducer(\n * on(set, ({ payload }) => ({ count: payload })),\n * ),\n * );\n * ```\n */\nexport function withReducer<State extends object>(\n ...caseReducers: CaseReducerResult<State, EventCreator<string, any>[]>[]\n): SignalStoreFeature<\n { state: State; props: {}; methods: {} },\n EmptyFeatureResult\n> {\n return signalStoreFeature(\n { state: type<State>() },\n withEventHandlers((store, events = inject(ReducerEvents)) =>\n caseReducers.map((caseReducer) =>\n events.on(...caseReducer.events).pipe(\n tap((event) => {\n const state = untracked(() => getState(store));\n const result = caseReducer.reducer(event, state);\n const updaters = Array.isArray(result) ? result : [result];\n\n patchState(store, ...updaters);\n })\n )\n )\n )\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAsBA;;;;AAIG;AACG,SAAU,EAAE,CAIhB,GAAG,IAGF,EAAA;AAED,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAuC;IAC/D,MAAM,MAAM,GAAG,IAAgC;AAE/C,IAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE;AAC5B;;AC5BO,MAAM,MAAM,GAAG,MAAM,CAC1B,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,GAAG,QAAQ,GAAG,EAAE,CAC9D;AACM,MAAM,WAAW,GAAG,MAAM,CAC/B,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,GAAG,aAAa,GAAG,EAAE,CACnE;AAED,MAAe,UAAU,CAAA;AACvB;;AAEG;AACM,IAAA,CAAC,MAAM,IAAI,IAAI,OAAO,EAAkC;AAC9C,IAAA,OAAO;AAE1B,IAAA,WAAA,CAAsB,iBAAmC,EAAA;AACvD,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,iBAAiB,EAAE;AAC7C,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,QAAQ,EAAE,IAAI;AACf,SAAA,CAAC;QACF,IAAI,CAAC,OAAO,GAAG;cACX,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;cACxC,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE;IACjC;IAQA,EAAE,CACA,GAAG,MAAuC,EAAA;AAE1C,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAClE;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;AAEG,MAAO,MAAO,SAAQ,UAAU,CAAA;AACpC,IAAA,WAAA,GAAA;QACE,KAAK,CAAC,MAAM,CAAC;IACf;0HAHW,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAN,uBAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAM,cADO,UAAU,EAAA,CAAA;;2FACvB,MAAM,EAAA,UAAA,EAAA,CAAA;kBADlB,UAAU;mBAAC,EAAE,UAAU,EAAE,UAAU,EAAE;;AAOtC;;;;;;AAMG;AAEG,MAAO,aAAc,SAAQ,UAAU,CAAA;AAC3C,IAAA,WAAA,GAAA;QACE,KAAK,CAAC,aAAa,CAAC;IACtB;0HAHW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,uBAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,UAAU,EAAA,CAAA;;2FACvB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,UAAU,EAAE;;AAOtC,SAAS,YAAY,CACnB,MAAuC,EAAA;AAEvC,IAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACvB,QAAA,OAAO,CAAC,OAAO,KAAK,OAAO;IAC7B;AAEA,IAAA,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC;AAC1C,IAAA,OAAO,MAAM,CAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClD;AAEA,SAAS,iBAAiB,CACxB,MAAuC,EAAA;AAEvC,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;AAC7E;AAEA,SAAS,cAAc,GAAA;IAGrB,OAAO,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAI;AAC1B,QAAA,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;AAChE,QAAA,OAAO,KAAK;AACd,IAAA,CAAC,CAAC;AACJ;;ACjHA;;;;;;;;;;;;;;;;;;;;;AAqBG;MAEU,UAAU,CAAA;AACF,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,gBAAgB,GAAG,MAAM,CAAC,UAAU,EAAE;AACvD,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;IAEF,QAAQ,CACN,KAAqC,EACrC,MAAyB,EAAA;QAEzB,IAAI,IAAI,CAAC,gBAAgB,IAAI,sBAAsB,CAAC,MAAM,CAAC,EAAE;YAC3D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAC5B,KAAK,EACL,MAAM,CAAC,KAAK,KAAK,QAAQ,GAAG,MAAM,GAAG,SAAS,CAC/C;QACH;aAAO;YACL,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AACtC,YAAA,cAAc,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE;IACF;0HArBW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAV,uBAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cADG,UAAU,EAAA,CAAA;;2FACvB,UAAU,EAAA,UAAA,EAAA,CAAA;kBADtB,UAAU;mBAAC,EAAE,UAAU,EAAE,UAAU,EAAE;;AAyBtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCG;SACa,iBAAiB,GAAA;AAC/B,IAAA,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC;AAC5C;AAEA,SAAS,sBAAsB,CAC7B,MAAyB,EAAA;IAEzB,OAAO,MAAM,EAAE,KAAK,KAAK,QAAQ,IAAI,MAAM,EAAE,KAAK,KAAK,QAAQ;AACjE;;ACjFA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACG,SAAU,KAAK,CAAC,IAAY,EAAA;AAChC,IAAA,MAAM,OAAO,GAAG,CAAC,OAAiB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACzD,IAAA,OAAe,CAAC,IAAI,GAAG,IAAI;AAE5B,IAAA,OAAO,OAAwC;AACjD;;ACzBA;;;;;;;;;;;;;;;;;;;;AAoBG;AACG,SAAU,UAAU,CAGxB,MAGD,EAAA;AACC,IAAA,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CACzC,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAI;QACnB,MAAM,SAAS,GAAG,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE;AACnD,QAAA,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE;IAClD,CAAC,EACD,EAAuC,CACxC;AACH;;AC7CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCG;AACG,SAAU,OAAO,CAAC,KAAiB,EAAA;IACvC,OAAO,EAAE,KAAK,EAAE;AAClB;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCG;AACG,SAAU,UAAU,CACxB,KAAiB,EAAA;AAEjB,IAAA,OAAO,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChD;;ACzEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCG;AACG,SAAU,cAAc,CAG5B,MAAkB,EAClB,MAAgC,EAAA;AAGhC,IAAA,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE;QACtE,wBAAwB,CAAC,cAAc,CAAC;IAC1C;IAEA,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IACrD,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;IAE3C,MAAM,WAAW,GAAG,EAGnB;AAED,IAAA,MAAM,QAAQ,GAAG,CAAC,MAAwB,KAAI;QAC5C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YAC9B,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CACvD,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM;AACnC,gBAAA,GAAG,GAAG;gBACN,CAAC,SAAS,GAAG,CAAC,OAAiB,KAC7B,SAAS,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;aACtE,CAAC,EACF,EAAuC,CACxC;QACH;AAEA,QAAA,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;AAClC,IAAA,CAAC;IAED,MAAM,iBAAiB,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACrD,IAAA,MAAM,sBAAsB,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAClE,CAAC,GAAG,EAAE,SAAS,MAAM;AACnB,QAAA,GAAG,GAAG;QACN,CAAC,SAAS,GAAG;AACX,YAAA,KAAK,EAAE,iBAAiB,CAAC,SAAS,CAAC;AACnC,YAAA,UAAU,EAAE,IAAI;AACjB,SAAA;KACF,CAAC,EACF,EAA2B,CAC5B;AACD,IAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,CAAC;AAEzD,IAAA,OAAO,QAAyD;AAClE;;ACjGM,SAAU,eAAe,CAC7B,KAAc,EAAA;AAEd,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK;AACvE;;ACSA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACG,SAAU,iBAAiB,CAC/B,eAOgE,EAAA;AAEhE,IAAA,OAAO,kBAAkB,CACvB,IAAI,EAAS,EACb,SAAS,CAAC;QACR,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,EAAA;AAC3C,YAAA,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAAC;YAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,cAAc,KAChE,cAAc,CAAC,IAAI,CACjB,GAAG,CAAC,CAAC,MAAM,KAAI;gBACb,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM;AACnD,sBAAE;AACF,sBAAE,CAAC,MAAM,CAAC;gBAEZ,IACE,eAAe,CAAC,cAAc,CAAC;AAC/B,oBAAA,EAAE,WAAW,IAAI,cAAc,CAAC,EAChC;AACA,oBAAA,UAAU,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;gBAC7C;YACF,CAAC,CAAC,CACH,CACF;YAED,KAAK,CAAC,GAAG,QAAQ;iBACd,IAAI,CAAC,kBAAkB,EAAE;AACzB,iBAAA,SAAS,EAAE;QAChB,CAAC;AACF,KAAA,CAAC,CACH;AACH;;ACjEA;;;;;;;;;;;;;;;;;;;;AAoBG;AACG,SAAU,WAAW,CACzB,GAAG,YAAqE,EAAA;IAKxE,OAAO,kBAAkB,CACvB,EAAE,KAAK,EAAE,IAAI,EAAS,EAAE,EACxB,iBAAiB,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,KACtD,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,KAC3B,MAAM,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CACnC,GAAG,CAAC,CAAC,KAAK,KAAI;AACZ,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;AAChD,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;AAE1D,QAAA,UAAU,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC;AAChC,IAAA,CAAC,CAAC,CACH,CACF,CACF,CACF;AACH;;AC1DA;;AAEG;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { assertInInjectionContext, inject, Injector, DestroyRef,
|
|
1
|
+
import { assertInInjectionContext, inject, Injector, DestroyRef, effect, untracked } from '@angular/core';
|
|
2
2
|
import { Subject, noop, isObservable } from 'rxjs';
|
|
3
3
|
|
|
4
4
|
function rxMethod(generator, config) {
|
|
@@ -22,11 +22,11 @@ function rxMethod(generator, config) {
|
|
|
22
22
|
console.warn('@ngrx/signals/rxjs-interop: The reactive method was called outside', 'the injection context with a signal or observable. This may lead to', 'a memory leak. Make sure to call it within the injection context', '(e.g. in a constructor or field initializer) or pass an injector', 'explicitly via the config parameter.\n\nFor more information, see:', 'https://ngrx.io/guide/signals/rxjs-integration#reactive-methods-and-injector-hierarchies');
|
|
23
23
|
}
|
|
24
24
|
const instanceInjector = config?.injector ?? callerInjector ?? sourceInjector;
|
|
25
|
-
if (
|
|
25
|
+
if (typeof input === 'function') {
|
|
26
26
|
const watcher = effect(() => {
|
|
27
27
|
const value = input();
|
|
28
28
|
untracked(() => source$.next(value));
|
|
29
|
-
}, { injector: instanceInjector });
|
|
29
|
+
}, { ...(ngDevMode ? { debugName: "watcher" } : {}), injector: instanceInjector });
|
|
30
30
|
sourceSub.add({ unsubscribe: () => watcher.destroy() });
|
|
31
31
|
return watcher;
|
|
32
32
|
}
|
|
@@ -43,7 +43,7 @@ function rxMethod(generator, config) {
|
|
|
43
43
|
return rxMethodFn;
|
|
44
44
|
}
|
|
45
45
|
function isStatic(value) {
|
|
46
|
-
return
|
|
46
|
+
return typeof value !== 'function' && !isObservable(value);
|
|
47
47
|
}
|
|
48
48
|
function getCallerInjector() {
|
|
49
49
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngrx-signals-rxjs-interop.mjs","sources":["../../../../modules/signals/rxjs-interop/src/rx-method.ts","../../../../modules/signals/rxjs-interop/ngrx-signals-rxjs-interop.ts"],"sourcesContent":["import {\n assertInInjectionContext,\n DestroyRef,\n effect,\n inject,\n Injector,\n
|
|
1
|
+
{"version":3,"file":"ngrx-signals-rxjs-interop.mjs","sources":["../../../../modules/signals/rxjs-interop/src/rx-method.ts","../../../../modules/signals/rxjs-interop/ngrx-signals-rxjs-interop.ts"],"sourcesContent":["import {\n assertInInjectionContext,\n DestroyRef,\n effect,\n inject,\n Injector,\n untracked,\n} from '@angular/core';\nimport { isObservable, noop, Observable, Subject } from 'rxjs';\n\ntype RxMethodRef = {\n destroy: () => void;\n};\n\nexport type RxMethod<Input> = ((\n input: Input | (() => Input) | Observable<Input>,\n config?: { injector?: Injector }\n) => RxMethodRef) &\n RxMethodRef;\n\nexport function rxMethod<Input>(\n generator: (source$: Observable<Input>) => Observable<unknown>,\n config?: { injector?: Injector }\n): RxMethod<Input> {\n if (typeof ngDevMode !== 'undefined' && ngDevMode && !config?.injector) {\n assertInInjectionContext(rxMethod);\n }\n\n const sourceInjector = config?.injector ?? inject(Injector);\n const source$ = new Subject<Input>();\n const sourceSub = generator(source$).subscribe();\n sourceInjector.get(DestroyRef).onDestroy(() => sourceSub.unsubscribe());\n\n const rxMethodFn = (\n input: Input | (() => Input) | Observable<Input>,\n config?: { injector?: Injector }\n ): RxMethodRef => {\n if (isStatic(input)) {\n source$.next(input);\n return { destroy: noop };\n }\n\n const callerInjector = getCallerInjector();\n if (\n typeof ngDevMode !== 'undefined' &&\n ngDevMode &&\n config?.injector === undefined &&\n callerInjector === undefined\n ) {\n console.warn(\n '@ngrx/signals/rxjs-interop: The reactive method was called outside',\n 'the injection context with a signal or observable. This may lead to',\n 'a memory leak. Make sure to call it within the injection context',\n '(e.g. in a constructor or field initializer) or pass an injector',\n 'explicitly via the config parameter.\\n\\nFor more information, see:',\n 'https://ngrx.io/guide/signals/rxjs-integration#reactive-methods-and-injector-hierarchies'\n );\n }\n\n const instanceInjector =\n config?.injector ?? callerInjector ?? sourceInjector;\n\n if (typeof input === 'function') {\n const watcher = effect(\n () => {\n const value = input();\n untracked(() => source$.next(value));\n },\n { injector: instanceInjector }\n );\n sourceSub.add({ unsubscribe: () => watcher.destroy() });\n\n return watcher;\n }\n\n const instanceSub = input.subscribe((value) => source$.next(value));\n sourceSub.add(instanceSub);\n\n if (instanceInjector !== sourceInjector) {\n instanceInjector\n .get(DestroyRef)\n .onDestroy(() => instanceSub.unsubscribe());\n }\n\n return { destroy: () => instanceSub.unsubscribe() };\n };\n rxMethodFn.destroy = sourceSub.unsubscribe.bind(sourceSub);\n\n return rxMethodFn;\n}\n\nfunction isStatic<T>(value: T | (() => T) | Observable<T>): value is T {\n return typeof value !== 'function' && !isObservable(value);\n}\n\nfunction getCallerInjector(): Injector | undefined {\n try {\n return inject(Injector);\n } catch {\n return undefined;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAoBM,SAAU,QAAQ,CACtB,SAA8D,EAC9D,MAAgC,EAAA;AAEhC,IAAA,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE;QACtE,wBAAwB,CAAC,QAAQ,CAAC;IACpC;IAEA,MAAM,cAAc,GAAG,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;AAC3D,IAAA,MAAM,OAAO,GAAG,IAAI,OAAO,EAAS;IACpC,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE;AAChD,IAAA,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC;AAEvE,IAAA,MAAM,UAAU,GAAG,CACjB,KAAgD,EAChD,MAAgC,KACjB;AACf,QAAA,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;AACnB,YAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AACnB,YAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;QAC1B;AAEA,QAAA,MAAM,cAAc,GAAG,iBAAiB,EAAE;QAC1C,IACE,OAAO,SAAS,KAAK,WAAW;YAChC,SAAS;YACT,MAAM,EAAE,QAAQ,KAAK,SAAS;YAC9B,cAAc,KAAK,SAAS,EAC5B;AACA,YAAA,OAAO,CAAC,IAAI,CACV,oEAAoE,EACpE,qEAAqE,EACrE,kEAAkE,EAClE,kEAAkE,EAClE,oEAAoE,EACpE,0FAA0F,CAC3F;QACH;QAEA,MAAM,gBAAgB,GACpB,MAAM,EAAE,QAAQ,IAAI,cAAc,IAAI,cAAc;AAEtD,QAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AAC/B,YAAA,MAAM,OAAO,GAAG,MAAM,CACpB,MAAK;AACH,gBAAA,MAAM,KAAK,GAAG,KAAK,EAAE;gBACrB,SAAS,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtC,YAAA,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,SAAA,EAAA,GAAA,EAAA,CAAA,EACC,QAAQ,EAAE,gBAAgB,GAC7B;AACD,YAAA,SAAS,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;AAEvD,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnE,QAAA,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;AAE1B,QAAA,IAAI,gBAAgB,KAAK,cAAc,EAAE;YACvC;iBACG,GAAG,CAAC,UAAU;iBACd,SAAS,CAAC,MAAM,WAAW,CAAC,WAAW,EAAE,CAAC;QAC/C;QAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC,WAAW,EAAE,EAAE;AACrD,IAAA,CAAC;IACD,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;AAE1D,IAAA,OAAO,UAAU;AACnB;AAEA,SAAS,QAAQ,CAAI,KAAoC,EAAA;IACvD,OAAO,OAAO,KAAK,KAAK,UAAU,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AAC5D;AAEA,SAAS,iBAAiB,GAAA;AACxB,IAAA,IAAI;AACF,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,SAAS;IAClB;AACF;;ACrGA;;AAEG;;;;"}
|