@ngrx/signals 20.1.0 → 21.0.0-beta.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.
Files changed (110) hide show
  1. package/fesm2022/ngrx-signals-entities.mjs.map +1 -1
  2. package/fesm2022/ngrx-signals-events.mjs +219 -57
  3. package/fesm2022/ngrx-signals-events.mjs.map +1 -1
  4. package/fesm2022/ngrx-signals-rxjs-interop.mjs +4 -4
  5. package/fesm2022/ngrx-signals-rxjs-interop.mjs.map +1 -1
  6. package/fesm2022/ngrx-signals.mjs +11 -8
  7. package/fesm2022/ngrx-signals.mjs.map +1 -1
  8. package/migrations/18_0_0-rc_3-protected-state/index.js +54 -23
  9. package/migrations/18_0_0-rc_3-protected-state/index.js.map +1 -1
  10. package/migrations/18_0_0-rc_3-writablestatesource/index.js +45 -12
  11. package/migrations/18_0_0-rc_3-writablestatesource/index.js.map +1 -1
  12. package/migrations/19_0_0-rc_0-props/index.js +72 -83
  13. package/migrations/19_0_0-rc_0-props/index.js.map +1 -1
  14. package/migrations/21_0_0-beta_0-rename-withEffects-to-withEventHandlers/index.js +103 -0
  15. package/migrations/21_0_0-beta_0-rename-withEffects-to-withEventHandlers/index.js.map +1 -0
  16. package/migrations/migration.json +5 -0
  17. package/package.json +8 -8
  18. package/schematics/ng-add/index.js +5 -5
  19. package/schematics/ng-add/index.js.map +1 -1
  20. package/schematics-core/index.js +1 -1
  21. package/schematics-core/index.js.map +1 -1
  22. package/schematics-core/utility/ast-utils.js +198 -240
  23. package/schematics-core/utility/ast-utils.js.map +1 -1
  24. package/schematics-core/utility/change.js +68 -85
  25. package/schematics-core/utility/change.js.map +1 -1
  26. package/schematics-core/utility/config.js +7 -7
  27. package/schematics-core/utility/config.js.map +1 -1
  28. package/schematics-core/utility/find-component.js +20 -20
  29. package/schematics-core/utility/find-component.js.map +1 -1
  30. package/schematics-core/utility/find-module.js +21 -21
  31. package/schematics-core/utility/find-module.js.map +1 -1
  32. package/schematics-core/utility/json-utilts.js +4 -26
  33. package/schematics-core/utility/json-utilts.js.map +1 -1
  34. package/schematics-core/utility/libs-version.js +1 -1
  35. package/schematics-core/utility/libs-version.js.map +1 -1
  36. package/schematics-core/utility/ngrx-utils.js +110 -141
  37. package/schematics-core/utility/ngrx-utils.js.map +1 -1
  38. package/schematics-core/utility/package.js +2 -3
  39. package/schematics-core/utility/package.js.map +1 -1
  40. package/schematics-core/utility/parse-name.js +3 -3
  41. package/schematics-core/utility/parse-name.js.map +1 -1
  42. package/schematics-core/utility/project.js +13 -13
  43. package/schematics-core/utility/project.js.map +1 -1
  44. package/schematics-core/utility/strings.js +12 -12
  45. package/schematics-core/utility/strings.js.map +1 -1
  46. package/schematics-core/utility/update.js +12 -12
  47. package/schematics-core/utility/update.js.map +1 -1
  48. package/schematics-core/utility/visitors.js +78 -180
  49. package/schematics-core/utility/visitors.js.map +1 -1
  50. package/types/ngrx-signals-entities.d.ts +324 -0
  51. package/types/ngrx-signals-events.d.ts +360 -0
  52. package/types/ngrx-signals-rxjs-interop.d.ts +15 -0
  53. package/{testing/src/unprotected.d.ts → types/ngrx-signals-testing.d.ts} +5 -3
  54. package/types/ngrx-signals.d.ts +332 -0
  55. package/entities/index.d.ts +0 -1
  56. package/entities/src/entity-config.d.ts +0 -17
  57. package/entities/src/helpers.d.ts +0 -25
  58. package/entities/src/index.d.ts +0 -18
  59. package/entities/src/models.d.ts +0 -24
  60. package/entities/src/updaters/add-entities.d.ts +0 -17
  61. package/entities/src/updaters/add-entity.d.ts +0 -17
  62. package/entities/src/updaters/prepend-entities.d.ts +0 -17
  63. package/entities/src/updaters/prepend-entity.d.ts +0 -17
  64. package/entities/src/updaters/remove-all-entities.d.ts +0 -6
  65. package/entities/src/updaters/remove-entities.d.ts +0 -10
  66. package/entities/src/updaters/remove-entity.d.ts +0 -6
  67. package/entities/src/updaters/set-all-entities.d.ts +0 -17
  68. package/entities/src/updaters/set-entities.d.ts +0 -17
  69. package/entities/src/updaters/set-entity.d.ts +0 -17
  70. package/entities/src/updaters/update-all-entities.d.ts +0 -17
  71. package/entities/src/updaters/update-entities.d.ts +0 -56
  72. package/entities/src/updaters/update-entity.d.ts +0 -29
  73. package/entities/src/updaters/upsert-entities.d.ts +0 -17
  74. package/entities/src/updaters/upsert-entity.d.ts +0 -17
  75. package/entities/src/with-entities.d.ts +0 -22
  76. package/events/index.d.ts +0 -1
  77. package/events/src/case-reducer.d.ts +0 -20
  78. package/events/src/dispatcher.d.ts +0 -33
  79. package/events/src/event-creator-group.d.ts +0 -33
  80. package/events/src/event-creator.d.ts +0 -9
  81. package/events/src/event-instance.d.ts +0 -8
  82. package/events/src/events-service.d.ts +0 -47
  83. package/events/src/index.d.ts +0 -9
  84. package/events/src/inject-dispatch.d.ts +0 -46
  85. package/events/src/with-effects.d.ts +0 -28
  86. package/events/src/with-reducer.d.ts +0 -30
  87. package/index.d.ts +0 -1
  88. package/rxjs-interop/index.d.ts +0 -1
  89. package/rxjs-interop/src/index.d.ts +0 -1
  90. package/rxjs-interop/src/rx-method.d.ts +0 -12
  91. package/src/deep-computed.d.ts +0 -2
  92. package/src/deep-signal.d.ts +0 -6
  93. package/src/index.d.ts +0 -16
  94. package/src/signal-method.d.ts +0 -7
  95. package/src/signal-state.d.ts +0 -4
  96. package/src/signal-store-assertions.d.ts +0 -2
  97. package/src/signal-store-feature.d.ts +0 -29
  98. package/src/signal-store-models.d.ts +0 -30
  99. package/src/signal-store.d.ts +0 -115
  100. package/src/state-source.d.ts +0 -23
  101. package/src/ts-helpers.d.ts +0 -11
  102. package/src/with-computed.d.ts +0 -12
  103. package/src/with-feature.d.ts +0 -26
  104. package/src/with-hooks.d.ts +0 -14
  105. package/src/with-linked-state.d.ts +0 -52
  106. package/src/with-methods.d.ts +0 -8
  107. package/src/with-props.d.ts +0 -8
  108. package/src/with-state.d.ts +0 -11
  109. package/testing/index.d.ts +0 -1
  110. package/testing/src/index.d.ts +0 -1
@@ -1,11 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, inject, assertInInjectionContext, Injector, untracked } from '@angular/core';
3
- import { Subject, filter, map, queueScheduler, tap, merge } from 'rxjs';
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[EVENTS].pipe(filterByType(events), withSourceType());
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(() => \/* handle increment event *\/);
59
+ * .subscribe(() => /* handle increment event *\/);
52
60
  * }
53
61
  * }
54
62
  * ```
55
63
  */
56
64
  class Events extends BaseEvents {
57
- /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: Events, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
58
- /** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: Events, providedIn: 'platform' });
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: "20.0.0", ngImport: i0, type: Events, decorators: [{
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
- /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: ReducerEvents, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
66
- /** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: ReducerEvents, providedIn: 'platform' });
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: "20.0.0", ngImport: i0, type: ReducerEvents, decorators: [{
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
- dispatch(event) {
116
- this.reducerEvents[EVENTS].next(event);
117
- queueScheduler.schedule(() => this.events[EVENTS].next(event));
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: "20.0.0", ngImport: i0, type: Dispatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
120
- /** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: Dispatcher, providedIn: 'platform' });
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: "20.0.0", ngImport: i0, type: Dispatcher, decorators: [{
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
- * @experimental
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
- return Object.entries(events).reduce((acc, [eventName, eventCreator]) => ({
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]: (payload) => untracked(() => dispatcher.dispatch(eventCreator(payload))),
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 side effects.
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, withEffects } from '@ngrx/signals/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
- * withEffects(({ count }, events = inject(Events)) => ({
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 withEffects(effectsFactory) {
428
+ function withEventHandlers(handlersFactory) {
263
429
  return signalStoreFeature(type(), withHooks({
264
430
  onInit(store, dispatcher = inject(Dispatcher)) {
265
- const effectSources = effectsFactory(store);
266
- const effects = Object.values(effectSources).map((effectSource$) => effectSource$.pipe(tap((value) => {
267
- if (isEventInstance(value) && !(SOURCE_TYPE in value)) {
268
- dispatcher.dispatch(value);
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(...effects)
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 changes based on dispatched events.
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() }, withHooks({
302
- onInit(store, events = inject(ReducerEvents)) {
303
- const updates = caseReducers.map((caseReducer) => events.on(...caseReducer.events).pipe(tap((event) => {
304
- const state = untracked(() => getState(store));
305
- const result = caseReducer.reducer(event, state);
306
- const updaters = Array.isArray(result) ? result : [result];
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, withEffects, withReducer };
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":"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"}
@@ -1,4 +1,4 @@
1
- import { assertInInjectionContext, inject, Injector, DestroyRef, isSignal, effect, untracked } from '@angular/core';
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 (isSignal(input)) {
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 !isSignal(value) && !isObservable(value);
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 isSignal,\n Signal,\n untracked,\n} from '@angular/core';\nimport { isObservable, noop, Observable, Subject } from 'rxjs';\n\ndeclare const ngDevMode: unknown;\n\ntype RxMethodRef = {\n destroy: () => void;\n};\n\nexport type RxMethod<Input> = ((\n input: Input | Signal<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 | Signal<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 (isSignal(input)) {\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 | Signal<T> | Observable<T>): value is T {\n return !isSignal(value) && !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":";;;AAwBM,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,QAAQ,CAAC,KAAK,CAAC,EAAE;AACnB,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,EACD,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAC/B;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,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACjD;AAEA,SAAS,iBAAiB,GAAA;AACxB,IAAA,IAAI;AACF,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,SAAS;IAClB;AACF;;ACzGA;;AAEG;;;;"}
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;;;;"}