@angular-architects/ngrx-toolkit 0.0.3 → 0.0.6

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/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # NgRx Toolkit
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/%40angular-architects%2Fngrx-toolkit.svg)](https://www.npmjs.com/package/%40angular-architects%2Fngrx-toolkit)
4
+
3
5
  <p align="center">
4
6
  <img src="https://raw.githubusercontent.com/angular-architects/ngrx-toolkit/main/logo.png" width="320" style="text-align: center">
5
7
  </p>
@@ -8,6 +10,7 @@ NgRx Toolkit is an extension to the NgRx Signals Store. **It is still in beta**
8
10
 
9
11
  - Devtools: Integration into Redux Devtools
10
12
  - Redux: Possibility to use the Redux Pattern (Reducer, Actions, Effects)
13
+ - Redux Connector: Map NgRx Store Actions to a present Signal Store
11
14
 
12
15
  To install it, run
13
16
 
@@ -15,6 +18,20 @@ To install it, run
15
18
  npm i @angular-architects/ngrx-toolkit
16
19
  ```
17
20
 
21
+
22
+ - [NgRx Toolkit](#ngrx-toolkit)
23
+ - [Devtools: `withDevtools()`](#devtools-withdevtools)
24
+ - [Redux: `withRedux()`](#redux-withredux)
25
+ - [DataService `withDataService()`](#dataservice-withdataservice)
26
+ - [DataService with Dynamic Properties](#dataservice-with-dynamic-properties)
27
+ - [Redux Connector for the NgRx Signal Store `createReduxState()`](#redux-connector-for-the-ngrx-signal-store-createreduxstate)
28
+ - [Use a present Signal Store](#use-a-present-signal-store)
29
+ - [Use well-known NgRx Store Actions](#use-well-known-ngrx-store-actions)
30
+ - [Map Actions to Methods](#map-actions-to-methods)
31
+ - [Register an Angular Dependency Injection Provider](#register-an-angular-dependency-injection-provider)
32
+ - [Use the Store in your Component](#use-the-store-in-your-component)
33
+
34
+
18
35
  ## Devtools: `withDevtools()`
19
36
 
20
37
  This extension is very easy to use. Just add it to a `signalStore`. Example:
@@ -217,4 +234,136 @@ export class FlightSearchDynamicComponent {
217
234
  }
218
235
 
219
236
  }
220
- ```
237
+ ```
238
+
239
+ ## Redux Connector for the NgRx Signal Store `createReduxState()`
240
+
241
+ The Redux Connector turns any `signalStore()` into a Gobal State Management Slice following the Redux pattern.
242
+
243
+ It supports:
244
+
245
+ ✅ Well-known NgRx Store Actions \
246
+ ✅ Global Action `dispatch()` \
247
+ ✅ Angular Lazy Loading \
248
+ ✅ Auto-generated `provideNamedStore()` & `injectNamedStore()` Functions \
249
+ ✅ Global Action to Store Method Mappers \
250
+
251
+
252
+ ### Use a present Signal Store
253
+
254
+ ```typescript
255
+ export const FlightStore = signalStore(
256
+ // State
257
+ withEntities({ entity: type<Flight>(), collection: 'flight' }),
258
+ withEntities({ entity: type<number>(), collection: 'hide' }),
259
+ // Selectors
260
+ withComputed(({ flightEntities, hideEntities }) => ({
261
+ filteredFlights: computed(() => flightEntities()
262
+ .filter(flight => !hideEntities().includes(flight.id))),
263
+ flightCount: computed(() => flightEntities().length),
264
+ })),
265
+ // Updater
266
+ withMethods(store => ({
267
+ setFlights: (state: { flights: Flight[] }) => patchState(store,
268
+ setAllEntities(state.flights, { collection: 'flight' })),
269
+ updateFlight: (state: { flight: Flight }) => patchState(store,
270
+ updateEntity({ id: state.flight.id, changes: state.flight }, { collection: 'flight' })),
271
+ clearFlights: () => patchState(store,
272
+ removeAllEntities({ collection: 'flight' })),
273
+ })),
274
+ // Effects
275
+ withMethods((store, flightService = inject(FlightService)) => ({
276
+ loadFlights: reduxMethod<FlightFilter, { flights: Flight[] }>(pipe(
277
+ switchMap(filter => from(
278
+ flightService.load({ from: filter.from, to: filter.to })
279
+ )),
280
+ map(flights => ({ flights })),
281
+ ), store.setFlights),
282
+ })),
283
+ );
284
+ ```
285
+
286
+ ### Use well-known NgRx Store Actions
287
+
288
+ ```typescript
289
+ export const ticketActions = createActionGroup({
290
+ source: 'tickets',
291
+ events: {
292
+ 'flights load': props<FlightFilter>(),
293
+ 'flights loaded': props<{ flights: Flight[] }>(),
294
+ 'flights loaded by passenger': props<{ flights: Flight[] }>(),
295
+ 'flight update': props<{ flight: Flight }>(),
296
+ 'flights clear': emptyProps()
297
+ }
298
+ });
299
+ ```
300
+
301
+ ### Map Actions to Methods
302
+
303
+ ```typescript
304
+ export const { provideFlightStore, injectFlightStore } =
305
+ createReduxState('flight', FlightStore, store => withActionMappers(
306
+ mapAction(
307
+ // Filtered Action
308
+ ticketActions.flightsLoad,
309
+ // Side-Effect
310
+ store.loadFlights,
311
+ // Result Action
312
+ ticketActions.flightsLoaded),
313
+ mapAction(
314
+ // Filtered Actions
315
+ ticketActions.flightsLoaded, ticketActions.flightsLoadedByPassenger,
316
+ // State Updater Method (like Reducers)
317
+ store.setFlights
318
+ ),
319
+ mapAction(ticketActions.flightUpdate, store.updateFlight),
320
+ mapAction(ticketActions.flightsClear, store.clearFlights),
321
+ )
322
+ );
323
+ ```
324
+
325
+ ### Register an Angular Dependency Injection Provider
326
+
327
+ ```typescript
328
+ export const appRoutes: Route[] = [
329
+ {
330
+ path: 'flight-search-redux-connector',
331
+ providers: [provideFlightStore()],
332
+ component: FlightSearchReducConnectorComponent
333
+ },
334
+ ];
335
+ ```
336
+
337
+ ### Use the Store in your Component
338
+
339
+ ```typescript
340
+ @Component({
341
+ standalone: true,
342
+ imports: [
343
+ JsonPipe,
344
+ RouterLink,
345
+ FormsModule,
346
+ FlightCardComponent
347
+ ],
348
+ selector: 'demo-flight-search-redux-connector',
349
+ templateUrl: './flight-search.component.html',
350
+ })
351
+ export class FlightSearchReducConnectorComponent {
352
+ private store = injectFlightStore();
353
+
354
+ protected flights = this.store.flightEntities;
355
+
356
+ protected search() {
357
+ this.store.dispatch(
358
+ ticketActions.flightsLoad({
359
+ from: this.localState.filter.from(),
360
+ to: this.localState.filter.to()
361
+ })
362
+ );
363
+ }
364
+
365
+ protected reset(): void {
366
+ this.store.dispatch(ticketActions.flightsClear());
367
+ }
368
+ }
369
+ ```
package/esm2022/index.mjs CHANGED
@@ -3,4 +3,6 @@ export * from './lib/with-redux';
3
3
  export * from './lib/with-call-state';
4
4
  export * from './lib/with-undo-redo';
5
5
  export * from './lib/with-data-service';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgd2l0aERldnRvb2xzLCBwYXRjaFN0YXRlLCBBY3Rpb24gfSBmcm9tICcuL2xpYi93aXRoLWRldnRvb2xzJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvd2l0aC1yZWR1eCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dpdGgtY2FsbC1zdGF0ZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dpdGgtdW5kby1yZWRvJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvd2l0aC1kYXRhLXNlcnZpY2UnO1xyXG4iXX0=
6
+ export * from './lib/redux-connector';
7
+ export * from './lib/redux-connector/rxjs-interop';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RSxjQUFjLGtCQUFrQixDQUFDO0FBRWpDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHlCQUF5QixDQUFDO0FBRXhDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxvQ0FBb0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IHdpdGhEZXZ0b29scywgcGF0Y2hTdGF0ZSwgQWN0aW9uIH0gZnJvbSAnLi9saWIvd2l0aC1kZXZ0b29scyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dpdGgtcmVkdXgnO1xyXG5cclxuZXhwb3J0ICogZnJvbSAnLi9saWIvd2l0aC1jYWxsLXN0YXRlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvd2l0aC11bmRvLXJlZG8nO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi93aXRoLWRhdGEtc2VydmljZSc7XHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9yZWR1eC1jb25uZWN0b3InO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9yZWR1eC1jb25uZWN0b3Ivcnhqcy1pbnRlcm9wJztcclxuIl19
@@ -0,0 +1,41 @@
1
+ import { ENVIRONMENT_INITIALIZER, inject, makeEnvironmentProviders } from "@angular/core";
2
+ import { SignalReduxStore, injectReduxDispatch } from "./signal-redux-store";
3
+ import { capitalize, isActionCreator } from "./util";
4
+ export function mapAction(...args) {
5
+ let resultMethod = args.pop();
6
+ let storeMethod = args.pop();
7
+ if (isActionCreator(storeMethod)) {
8
+ args.push(storeMethod);
9
+ storeMethod = resultMethod || storeMethod;
10
+ resultMethod = undefined;
11
+ }
12
+ const types = args.map((creator) => creator.type);
13
+ return {
14
+ types,
15
+ storeMethod,
16
+ resultMethod
17
+ };
18
+ }
19
+ export function withActionMappers(...mappers) {
20
+ return mappers;
21
+ }
22
+ export function createReduxState(storeName, signalStore, withActionMappers) {
23
+ const isRootProvider = signalStore?.ɵprov?.providedIn === 'root';
24
+ return {
25
+ [`provide${capitalize(storeName)}Store`]: (connectReduxDevtools = false) => makeEnvironmentProviders([
26
+ isRootProvider ? [] : signalStore,
27
+ {
28
+ provide: ENVIRONMENT_INITIALIZER,
29
+ multi: true,
30
+ useFactory: (signalReduxStore = inject(SignalReduxStore), store = inject(signalStore)) => () => {
31
+ if (connectReduxDevtools) {
32
+ // addStoreToReduxDevtools(store, storeName, false);
33
+ }
34
+ signalReduxStore.connectFeatureStore(withActionMappers(store));
35
+ }
36
+ }
37
+ ]),
38
+ [`inject${capitalize(storeName)}Store`]: () => Object.assign(inject(signalStore), { dispatch: injectReduxDispatch() })
39
+ };
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXJlZHV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3J4LXRvb2xraXQvc3JjL2xpYi9yZWR1eC1jb25uZWN0b3IvY3JlYXRlLXJlZHV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHMUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFxQnJELE1BQU0sVUFBVSxTQUFTLENBR3ZCLEdBQUcsSUFJRjtJQUVELElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQTJELENBQUM7SUFDdkYsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBa0UsQ0FBQztJQUU3RixJQUFJLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFBRTtRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZCLFdBQVcsR0FBRyxZQUFZLElBQUksV0FBVyxDQUFDO1FBQzFDLFlBQVksR0FBRyxTQUFTLENBQUM7S0FDMUI7SUFFRCxNQUFNLEtBQUssR0FBSSxJQUE0QixDQUFDLEdBQUcsQ0FDN0MsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2lCLENBQUM7SUFFN0MsT0FBTztRQUNMLEtBQUs7UUFDTCxXQUFXO1FBQ1gsWUFBWTtLQUNiLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixHQUFHLE9BQWlEO0lBRXBELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBSTlCLFNBQW9CLEVBQ3BCLFdBQWtCLEVBQ2xCLGlCQUEyRjtJQUUzRixNQUFNLGNBQWMsR0FBSSxXQUFtQixFQUFFLEtBQUssRUFBRSxVQUFVLEtBQUssTUFBTSxDQUFDO0lBQzFFLE9BQU87UUFDTCxDQUFDLFVBQVUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLG9CQUFvQixHQUFHLEtBQUssRUFBRSxFQUFFLENBQUMsd0JBQXdCLENBQUM7WUFDbkcsY0FBYyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVc7WUFDaEM7Z0JBQ0UsT0FBTyxFQUFFLHVCQUF1QjtnQkFDaEMsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsVUFBVSxFQUFFLENBQ1YsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQzNDLEtBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQzNCLEVBQUUsQ0FBQyxHQUFHLEVBQUU7b0JBQ1IsSUFBSSxvQkFBb0IsRUFBRTt3QkFDeEIsb0RBQW9EO3FCQUNyRDtvQkFDRCxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FDbEMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQ3pCLENBQUM7Z0JBQ0osQ0FBQzthQUNGO1NBQ0YsQ0FBQztRQUNGLENBQUMsU0FBUyxVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQzFELE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFDbkIsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxDQUNwQztLQUNvQyxDQUFDO0FBQzFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTlZJUk9OTUVOVF9JTklUSUFMSVpFUiwgaW5qZWN0LCBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBBY3Rpb25DcmVhdG9yLCBBY3Rpb25UeXBlIH0gZnJvbSBcIkBuZ3J4L3N0b3JlL3NyYy9tb2RlbHNcIjtcclxuaW1wb3J0IHsgQ3JlYXRlUmVkdXhTdGF0ZSwgRXh0cmFjdEFjdGlvblR5cGVzLCBNYXBwZXJUeXBlcywgU3RvcmUgfSBmcm9tIFwiLi9tb2RlbFwiO1xyXG5pbXBvcnQgeyBTaWduYWxSZWR1eFN0b3JlLCBpbmplY3RSZWR1eERpc3BhdGNoIH0gZnJvbSBcIi4vc2lnbmFsLXJlZHV4LXN0b3JlXCI7XHJcbmltcG9ydCB7IGNhcGl0YWxpemUsIGlzQWN0aW9uQ3JlYXRvciB9IGZyb20gXCIuL3V0aWxcIjtcclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWFwQWN0aW9uPFxyXG4gIENyZWF0b3JzIGV4dGVuZHMgcmVhZG9ubHkgQWN0aW9uQ3JlYXRvcltdXHJcbj4oXHJcbiAgLi4uYXJnczogW1xyXG4gICAgLi4uY3JlYXRvcnM6IENyZWF0b3JzLFxyXG4gICAgc3RvcmVNZXRob2Q6IChhY3Rpb246IEFjdGlvblR5cGU8Q3JlYXRvcnNbbnVtYmVyXT4pID0+IHVua25vd25cclxuICBdXHJcbik6IE1hcHBlclR5cGVzPENyZWF0b3JzPjtcclxuZXhwb3J0IGZ1bmN0aW9uIG1hcEFjdGlvbjxcclxuICBDcmVhdG9ycyBleHRlbmRzIHJlYWRvbmx5IEFjdGlvbkNyZWF0b3JbXSxcclxuICBUXHJcbj4oXHJcbiAgLi4uYXJnczogW1xyXG4gICAgLi4uY3JlYXRvcnM6IENyZWF0b3JzLFxyXG4gICAgc3RvcmVNZXRob2Q6IChhY3Rpb246IEFjdGlvblR5cGU8Q3JlYXRvcnNbbnVtYmVyXT4sIHJlc3VsdE1ldGhvZDogKGlucHV0OiBUKSA9PiB1bmtub3duKSA9PiB1bmtub3duLFxyXG4gICAgcmVzdWx0TWV0aG9kOiAoaW5wdXQ6IFQpID0+IHVua25vd25cclxuICBdXHJcbik6IE1hcHBlclR5cGVzPENyZWF0b3JzPjtcclxuZXhwb3J0IGZ1bmN0aW9uIG1hcEFjdGlvbjxcclxuICBDcmVhdG9ycyBleHRlbmRzIHJlYWRvbmx5IEFjdGlvbkNyZWF0b3JbXVxyXG4+KFxyXG4gIC4uLmFyZ3M6IFtcclxuICAgIC4uLmNyZWF0b3JzOiBDcmVhdG9ycyxcclxuICAgIHN0b3JlTWV0aG9kOiAoYWN0aW9uOiBBY3Rpb25UeXBlPENyZWF0b3JzW251bWJlcl0+KSA9PiB1bmtub3duLFxyXG4gICAgcmVzdWx0TWV0aG9kPzogKGlucHV0OiB1bmtub3duKSA9PiB1bmtub3duXHJcbiAgXVxyXG4pOiBNYXBwZXJUeXBlczxDcmVhdG9ycz4ge1xyXG4gIGxldCByZXN1bHRNZXRob2QgPSBhcmdzLnBvcCgpIGFzIHVua25vd24gYXMgKChpbnB1dDogdW5rbm93bikgPT4gdW5rbm93biApIHwgdW5kZWZpbmVkO1xyXG4gIGxldCBzdG9yZU1ldGhvZCA9IGFyZ3MucG9wKCkgYXMgdW5rbm93biBhcyAoYWN0aW9uOiBBY3Rpb25UeXBlPENyZWF0b3JzW251bWJlcl0+KSA9PiB1bmtub3duO1xyXG5cclxuICBpZiAoaXNBY3Rpb25DcmVhdG9yKHN0b3JlTWV0aG9kKSkge1xyXG4gICAgYXJncy5wdXNoKHN0b3JlTWV0aG9kKTtcclxuICAgIHN0b3JlTWV0aG9kID0gcmVzdWx0TWV0aG9kIHx8IHN0b3JlTWV0aG9kO1xyXG4gICAgcmVzdWx0TWV0aG9kID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdHlwZXMgPSAoYXJncyBhcyB1bmtub3duIGFzIENyZWF0b3JzKS5tYXAoXHJcbiAgICAoY3JlYXRvcikgPT4gY3JlYXRvci50eXBlXHJcbiAgKSBhcyB1bmtub3duIGFzIEV4dHJhY3RBY3Rpb25UeXBlczxDcmVhdG9ycz47XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlcyxcclxuICAgIHN0b3JlTWV0aG9kLFxyXG4gICAgcmVzdWx0TWV0aG9kXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhBY3Rpb25NYXBwZXJzKFxyXG4gIC4uLm1hcHBlcnM6IE1hcHBlclR5cGVzPEFjdGlvbkNyZWF0b3I8YW55LCBhbnk+W10+W11cclxuKTogTWFwcGVyVHlwZXM8QWN0aW9uQ3JlYXRvcjxhbnksIGFueT5bXT5bXSB7XHJcbiAgcmV0dXJuIG1hcHBlcnM7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWR1eFN0YXRlPFxyXG4gIFN0b3JlTmFtZSBleHRlbmRzIHN0cmluZyxcclxuICBTVE9SRSBleHRlbmRzIFN0b3JlXHJcbj4oXHJcbiAgc3RvcmVOYW1lOiBTdG9yZU5hbWUsXHJcbiAgc2lnbmFsU3RvcmU6IFNUT1JFLFxyXG4gIHdpdGhBY3Rpb25NYXBwZXJzOiAoc3RvcmU6IEluc3RhbmNlVHlwZTxTVE9SRT4pID0+IE1hcHBlclR5cGVzPEFjdGlvbkNyZWF0b3I8YW55LCBhbnk+W10+W10sXHJcbik6IENyZWF0ZVJlZHV4U3RhdGU8U3RvcmVOYW1lLCBTVE9SRT4ge1xyXG4gIGNvbnN0IGlzUm9vdFByb3ZpZGVyID0gKHNpZ25hbFN0b3JlIGFzIGFueSk/Lsm1cHJvdj8ucHJvdmlkZWRJbiA9PT0gJ3Jvb3QnO1xyXG4gIHJldHVybiB7XHJcbiAgICBbYHByb3ZpZGUke2NhcGl0YWxpemUoc3RvcmVOYW1lKX1TdG9yZWBdOiAoY29ubmVjdFJlZHV4RGV2dG9vbHMgPSBmYWxzZSkgPT4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcclxuICAgICAgaXNSb290UHJvdmlkZXI/IFtdIDogc2lnbmFsU3RvcmUsXHJcbiAgICAgIHtcclxuICAgICAgICBwcm92aWRlOiBFTlZJUk9OTUVOVF9JTklUSUFMSVpFUixcclxuICAgICAgICBtdWx0aTogdHJ1ZSxcclxuICAgICAgICB1c2VGYWN0b3J5OiAoXHJcbiAgICAgICAgICBzaWduYWxSZWR1eFN0b3JlID0gaW5qZWN0KFNpZ25hbFJlZHV4U3RvcmUpLFxyXG4gICAgICAgICAgc3RvcmUgPSBpbmplY3Qoc2lnbmFsU3RvcmUpXHJcbiAgICAgICAgKSA9PiAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoY29ubmVjdFJlZHV4RGV2dG9vbHMpIHtcclxuICAgICAgICAgICAgLy8gYWRkU3RvcmVUb1JlZHV4RGV2dG9vbHMoc3RvcmUsIHN0b3JlTmFtZSwgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2lnbmFsUmVkdXhTdG9yZS5jb25uZWN0RmVhdHVyZVN0b3JlKFxyXG4gICAgICAgICAgICB3aXRoQWN0aW9uTWFwcGVycyhzdG9yZSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBdKSxcclxuICAgIFtgaW5qZWN0JHtjYXBpdGFsaXplKHN0b3JlTmFtZSl9U3RvcmVgXTogKCkgPT4gT2JqZWN0LmFzc2lnbihcclxuICAgICAgaW5qZWN0KHNpZ25hbFN0b3JlKSxcclxuICAgICAgeyBkaXNwYXRjaDogaW5qZWN0UmVkdXhEaXNwYXRjaCgpIH1cclxuICAgIClcclxuICB9IGFzIENyZWF0ZVJlZHV4U3RhdGU8U3RvcmVOYW1lLCBTVE9SRT47XHJcbn1cclxuIl19
@@ -0,0 +1,2 @@
1
+ export { createReduxState, mapAction, withActionMappers } from './create-redux';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvbGliL3JlZHV4LWNvbm5lY3Rvci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuZXhwb3J0IHsgY3JlYXRlUmVkdXhTdGF0ZSwgbWFwQWN0aW9uLCB3aXRoQWN0aW9uTWFwcGVycyB9IGZyb20gJy4vY3JlYXRlLXJlZHV4JztcclxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvbGliL3JlZHV4LWNvbm5lY3Rvci9tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW52aXJvbm1lbnRQcm92aWRlcnMsIFNpZ25hbCwgVHlwZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IERlZXBTaWduYWwgfSBmcm9tIFwiQG5ncngvc2lnbmFscy9zcmMvZGVlcC1zaWduYWxcIjtcclxuaW1wb3J0IHsgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0IH0gZnJvbSBcIkBuZ3J4L3NpZ25hbHMvc3JjL3NpZ25hbC1zdG9yZS1tb2RlbHNcIjtcclxuaW1wb3J0IHsgU3RhdGVTaWduYWwgfSBmcm9tIFwiQG5ncngvc2lnbmFscy9zcmMvc3RhdGUtc2lnbmFsXCI7XHJcbmltcG9ydCB7IEFjdGlvbiwgQWN0aW9uQ3JlYXRvciwgQWN0aW9uVHlwZSwgUHJldHRpZnkgfSBmcm9tIFwiQG5ncngvc3RvcmUvc3JjL21vZGVsc1wiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBVbnN1YnNjcmliYWJsZSB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5cclxuZXhwb3J0IHR5cGUgSW5jbHVkZVByb3BUeXBlPFQsIFYsIFdpdGhOZXZlcnMgPVxyXG4gIHsgW0sgaW4ga2V5b2YgVF06IEV4Y2x1ZGU8VFtLXSwgdW5kZWZpbmVkPiBleHRlbmRzIFZcclxuICAgID8gVFtLXSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XHJcbiAgICAgID8gSW5jbHVkZVByb3BUeXBlPFRbS10sIFY+XHJcbiAgICAgIDogVFtLXVxyXG4gICAgOiBuZXZlclxyXG4gIH0+ID0gUHJldHRpZnk8XHJcbiAgICBQaWNrPFxyXG4gICAgICBXaXRoTmV2ZXJzLFxyXG4gICAgICB7IFtLIGluIGtleW9mIFdpdGhOZXZlcnNdOiBXaXRoTmV2ZXJzW0tdIGV4dGVuZHMgbmV2ZXJcclxuICAgICAgICA/IG5ldmVyXHJcbiAgICAgICAgOiBLIGV4dGVuZHMgc3RyaW5nXHJcbiAgICAgICAgICA/IEtcclxuICAgICAgICAgIDogbmV2ZXJcclxuICAgICAgfVtrZXlvZiBXaXRoTmV2ZXJzXVxyXG4gICAgPlxyXG4gID47XHJcblxyXG5leHBvcnQgdHlwZSBTdG9yZSA9IFR5cGU8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiBTdGF0ZVNpZ25hbDxTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRbJ3N0YXRlJ10+PjtcclxuXHJcbmV4cG9ydCB0eXBlIENyZWF0ZVJlZHV4U3RhdGU8XHJcbiAgU3RvcmVOYW1lIGV4dGVuZHMgc3RyaW5nLFxyXG4gIFNUT1JFIGV4dGVuZHMgU3RvcmVcclxuPiA9IHtcclxuICBbSyBpbiBTdG9yZU5hbWUgYXMgYHByb3ZpZGUke0NhcGl0YWxpemU8Sz59U3RvcmVgXTogKGNvbm5lY3RSZWR1eERldnRvb2xzPzogYm9vbGVhbikgPT4gRW52aXJvbm1lbnRQcm92aWRlcnNcclxufSAmIHtcclxuICBbSyBpbiBTdG9yZU5hbWUgYXMgYGluamVjdCR7Q2FwaXRhbGl6ZTxLPn1TdG9yZWBdOiAoKSA9PiBJbmplY3RhYmxlUmVkdXhTbGljZTxTVE9SRT5cclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIFNlbGVjdG9yczxTVE9SRSBleHRlbmRzIFN0b3JlPiA9IEluY2x1ZGVQcm9wVHlwZTxJbnN0YW5jZVR5cGU8U1RPUkU+LCBTaWduYWw8dW5rbm93bj4gfCBEZWVwU2lnbmFsPHVua25vd24+PjtcclxuZXhwb3J0IHR5cGUgRGlzcGF0Y2ggPSB7IGRpc3BhdGNoOiAoaW5wdXQ6IEFjdGlvbiB8IE9ic2VydmFibGU8QWN0aW9uPiB8IFNpZ25hbDxBY3Rpb24+KSA9PiBVbnN1YnNjcmliYWJsZSB9O1xyXG5leHBvcnQgdHlwZSBJbmplY3RhYmxlUmVkdXhTbGljZTxTVE9SRSBleHRlbmRzIFN0b3JlPiA9IFNlbGVjdG9yczxTVE9SRT4gJiBEaXNwYXRjaDtcclxuXHJcbmV4cG9ydCB0eXBlIEV4dHJhY3RBY3Rpb25UeXBlczxDcmVhdG9ycyBleHRlbmRzIHJlYWRvbmx5IEFjdGlvbkNyZWF0b3JbXT4gPSB7XHJcbiAgW0tleSBpbiBrZXlvZiBDcmVhdG9yc106IENyZWF0b3JzW0tleV0gZXh0ZW5kcyBBY3Rpb25DcmVhdG9yPGluZmVyIFQ+XHJcbiAgICA/IFRcclxuICAgIDogbmV2ZXI7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbk1ldGhvZDxULCBWIGV4dGVuZHMgQWN0aW9uID0gQWN0aW9uPiB7XHJcbiAgKGFjdGlvbjogVik6IFQ7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVNZXRob2Q8XHJcbiAgQ3JlYXRvcnMgZXh0ZW5kcyByZWFkb25seSBBY3Rpb25DcmVhdG9yW10sXHJcbiAgUmVzdWx0U3RhdGUgPSB1bmtub3duLFxyXG4+IHtcclxuICAoXHJcbiAgICBhY3Rpb246IEFjdGlvblR5cGU8Q3JlYXRvcnNbbnVtYmVyXT5cclxuICApOiBSZXN1bHRTdGF0ZTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNYXBwZXJUeXBlczxcclxuICBDcmVhdG9ycyBleHRlbmRzIHJlYWRvbmx5IEFjdGlvbkNyZWF0b3JbXVxyXG4+IHtcclxuICB0eXBlczogRXh0cmFjdEFjdGlvblR5cGVzPENyZWF0b3JzPixcclxuICBzdG9yZU1ldGhvZDogU3RvcmVNZXRob2Q8Q3JlYXRvcnM+LFxyXG4gIHJlc3VsdE1ldGhvZD86ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd25cclxufVxyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export { reduxMethod } from './redux-method';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvbGliL3JlZHV4LWNvbm5lY3Rvci9yeGpzLWludGVyb3AvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmV4cG9ydCB7IHJlZHV4TWV0aG9kIH0gZnJvbSAnLi9yZWR1eC1tZXRob2QnO1xyXG4iXX0=
@@ -0,0 +1,22 @@
1
+ import { Injector, inject } from "@angular/core";
2
+ import { rxMethod } from "@ngrx/signals/rxjs-interop";
3
+ import { map, pipe } from "rxjs";
4
+ export function reduxMethod(generator, resultMethodOrConfig, config) {
5
+ const injector = inject(Injector);
6
+ if (typeof resultMethodOrConfig === 'function') {
7
+ let unsubscribable;
8
+ const inputResultFn = ((input, resultMethod = resultMethodOrConfig) => {
9
+ const rxMethodWithResult = rxMethod(pipe(generator, map(resultMethod)), {
10
+ ...(config || {}),
11
+ injector: config?.injector || injector
12
+ });
13
+ const rxWithInput = rxMethodWithResult(input);
14
+ unsubscribable = { unsubscribe: rxWithInput.unsubscribe.bind(rxWithInput) };
15
+ return rxWithInput;
16
+ });
17
+ inputResultFn.unsubscribe = () => unsubscribable?.unsubscribe();
18
+ return inputResultFn;
19
+ }
20
+ return rxMethod(generator, resultMethodOrConfig);
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdXgtbWV0aG9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3J4LXRvb2xraXQvc3JjL2xpYi9yZWR1eC1jb25uZWN0b3Ivcnhqcy1pbnRlcm9wL3JlZHV4LW1ldGhvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUE4QixHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBcUI3RCxNQUFNLFVBQVUsV0FBVyxDQUN6QixTQUFrRSxFQUNsRSxvQkFFQyxFQUNELE1BRUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFbEMsSUFBSSxPQUFPLG9CQUFvQixLQUFLLFVBQVUsRUFBRTtRQUM5QyxJQUFJLGNBQThCLENBQUM7UUFDbkMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUNyQixLQUEyQixFQUMzQixZQUFZLEdBQUcsb0JBQW9CLEVBQ25DLEVBQUU7WUFFRixNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBUSxJQUFJLENBQzdDLFNBQVMsRUFDVCxHQUFHLENBQUMsWUFBWSxDQUFDLENBQ2xCLEVBQUU7Z0JBQ0QsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7Z0JBQ2pCLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxJQUFJLFFBQVE7YUFDdkMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsY0FBYyxHQUFHLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFFNUUsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQyxDQUErQyxDQUFDO1FBRWpELGFBQWEsQ0FBQyxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBRWhFLE9BQU8sYUFBYSxDQUFDO0tBQ3RCO0lBRUQsT0FBTyxRQUFRLENBQVEsU0FBUyxFQUFFLG9CQUFvQixDQUFDLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yLCBTaWduYWwsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IHJ4TWV0aG9kIH0gZnJvbSBcIkBuZ3J4L3NpZ25hbHMvcnhqcy1pbnRlcm9wXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFVuc3Vic2NyaWJhYmxlLCBtYXAsIHBpcGUgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuXHJcbnR5cGUgUnhNZXRob2RJbnB1dDxJbnB1dD4gPSBJbnB1dCB8IE9ic2VydmFibGU8SW5wdXQ+IHwgU2lnbmFsPElucHV0PjtcclxuXHJcbnR5cGUgUnhNZXRob2Q8SW5wdXQsIE1ldGhvZElucHV0ID0gSW5wdXQsIE1ldGhvZFJlc3VsdCA9IHVua25vd24+ID0gKChcclxuICBpbnB1dDogUnhNZXRob2RJbnB1dDxJbnB1dD4sXHJcbiAgcmVzdWx0TWV0aG9kOiAoaW5wdXQ6IE1ldGhvZElucHV0KSA9PiBNZXRob2RSZXN1bHRcclxuKSA9PiBVbnN1YnNjcmliYWJsZSkgJiBVbnN1YnNjcmliYWJsZTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZWR1eE1ldGhvZDxJbnB1dCwgTWV0aG9kSW5wdXQgPSBJbnB1dD4oXHJcbiAgZ2VuZXJhdG9yOiAoc291cmNlJDogT2JzZXJ2YWJsZTxJbnB1dD4pID0+IE9ic2VydmFibGU8TWV0aG9kSW5wdXQ+LFxyXG4gIGNvbmZpZz86IHsgaW5qZWN0b3I/OiBJbmplY3RvciB9XHJcbik6IFJ4TWV0aG9kPElucHV0LCBNZXRob2RJbnB1dD47XHJcbmV4cG9ydCBmdW5jdGlvbiByZWR1eE1ldGhvZDxJbnB1dCwgTWV0aG9kSW5wdXQgPSBJbnB1dCwgTWV0aG9kUmVzdWx0ID0gdW5rbm93bj4oXHJcbiAgZ2VuZXJhdG9yOiAoc291cmNlJDogT2JzZXJ2YWJsZTxJbnB1dD4pID0+IE9ic2VydmFibGU8TWV0aG9kSW5wdXQ+LFxyXG4gIHJlc3VsdE1ldGhvZDogKGlucHV0OiBNZXRob2RJbnB1dCkgPT4gTWV0aG9kUmVzdWx0LFxyXG4gIGNvbmZpZz86IHtcclxuICAgIGluamVjdG9yPzogSW5qZWN0b3JcclxuICB9XHJcbik6IFJ4TWV0aG9kPElucHV0LCBNZXRob2RJbnB1dCwgTWV0aG9kUmVzdWx0PjtcclxuZXhwb3J0IGZ1bmN0aW9uIHJlZHV4TWV0aG9kPElucHV0LCBNZXRob2RJbnB1dCA9IElucHV0LCBNZXRob2RSZXN1bHQgPSB1bmtub3duPihcclxuICBnZW5lcmF0b3I6IChzb3VyY2UkOiBPYnNlcnZhYmxlPElucHV0PikgPT4gT2JzZXJ2YWJsZTxNZXRob2RJbnB1dD4sXHJcbiAgcmVzdWx0TWV0aG9kT3JDb25maWc/OiAoKGlucHV0OiBNZXRob2RJbnB1dCkgPT4gTWV0aG9kUmVzdWx0KSB8IHtcclxuICAgIGluamVjdG9yPzogSW5qZWN0b3JcclxuICB9LFxyXG4gIGNvbmZpZz86IHtcclxuICAgIGluamVjdG9yPzogSW5qZWN0b3JcclxuICB9XHJcbik6IFJ4TWV0aG9kPElucHV0LCBNZXRob2RJbnB1dCwgTWV0aG9kUmVzdWx0PiAge1xyXG4gIGNvbnN0IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcclxuXHJcbiAgaWYgKHR5cGVvZiByZXN1bHRNZXRob2RPckNvbmZpZyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgbGV0IHVuc3Vic2NyaWJhYmxlOiBVbnN1YnNjcmliYWJsZTtcclxuICAgIGNvbnN0IGlucHV0UmVzdWx0Rm4gPSAoKFxyXG4gICAgICBpbnB1dDogUnhNZXRob2RJbnB1dDxJbnB1dD4sXHJcbiAgICAgIHJlc3VsdE1ldGhvZCA9IHJlc3VsdE1ldGhvZE9yQ29uZmlnXHJcbiAgICApID0+IHtcclxuXHJcbiAgICAgIGNvbnN0IHJ4TWV0aG9kV2l0aFJlc3VsdCA9IHJ4TWV0aG9kPElucHV0PihwaXBlKFxyXG4gICAgICAgIGdlbmVyYXRvcixcclxuICAgICAgICBtYXAocmVzdWx0TWV0aG9kKVxyXG4gICAgICApLCB7XHJcbiAgICAgICAgLi4uKGNvbmZpZyB8fCB7fSksXHJcbiAgICAgICAgaW5qZWN0b3I6IGNvbmZpZz8uaW5qZWN0b3IgfHwgaW5qZWN0b3JcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IHJ4V2l0aElucHV0ID0gcnhNZXRob2RXaXRoUmVzdWx0KGlucHV0KTtcclxuICAgICAgdW5zdWJzY3JpYmFibGUgPSB7IHVuc3Vic2NyaWJlOiByeFdpdGhJbnB1dC51bnN1YnNjcmliZS5iaW5kKHJ4V2l0aElucHV0KSB9O1xyXG5cclxuICAgICAgcmV0dXJuIHJ4V2l0aElucHV0O1xyXG4gICAgfSkgYXMgUnhNZXRob2Q8SW5wdXQsIE1ldGhvZElucHV0LCBNZXRob2RSZXN1bHQ+O1xyXG5cclxuICAgIGlucHV0UmVzdWx0Rm4udW5zdWJzY3JpYmUgPSAoKSA9PiB1bnN1YnNjcmliYWJsZT8udW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICByZXR1cm4gaW5wdXRSZXN1bHRGbjtcclxuICB9XHJcblxyXG4gIHJldHVybiByeE1ldGhvZDxJbnB1dD4oZ2VuZXJhdG9yLCByZXN1bHRNZXRob2RPckNvbmZpZyk7XHJcbn1cclxuIl19
@@ -0,0 +1,43 @@
1
+ import { Injectable, inject } from "@angular/core";
2
+ import { rxMethod } from "@ngrx/signals/rxjs-interop";
3
+ import { pipe, tap } from "rxjs";
4
+ import { isUnsubscribable } from "./util";
5
+ import * as i0 from "@angular/core";
6
+ export class SignalReduxStore {
7
+ constructor() {
8
+ this.mapperDict = {};
9
+ this.dispatch = rxMethod(pipe(tap((action) => {
10
+ const callbacks = this.mapperDict[action.type];
11
+ if (callbacks?.storeMethod) {
12
+ if (isUnsubscribable(callbacks.storeMethod) &&
13
+ callbacks.resultMethod) {
14
+ return callbacks.storeMethod(action, (a) => {
15
+ const resultAction = callbacks.resultMethod?.(a);
16
+ this.dispatch(resultAction);
17
+ });
18
+ }
19
+ return callbacks?.storeMethod(action);
20
+ }
21
+ return;
22
+ })));
23
+ }
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+ connectFeatureStore(mappers) {
26
+ mappers.forEach(mapper => mapper.types.forEach(action => this.mapperDict[action] = {
27
+ storeMethod: mapper.storeMethod,
28
+ resultMethod: mapper.resultMethod
29
+ }));
30
+ }
31
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: SignalReduxStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
32
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: SignalReduxStore, providedIn: 'root' }); }
33
+ }
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: SignalReduxStore, decorators: [{
35
+ type: Injectable,
36
+ args: [{
37
+ providedIn: 'root'
38
+ }]
39
+ }] });
40
+ export function injectReduxDispatch() {
41
+ return inject(SignalReduxStore).dispatch;
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXJlZHV4LXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3J4LXRvb2xraXQvc3JjL2xpYi9yZWR1eC1jb25uZWN0b3Ivc2lnbmFsLXJlZHV4LXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVqQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxRQUFRLENBQUM7O0FBTTFDLE1BQU0sT0FBTyxnQkFBZ0I7SUFIN0I7UUFJVSxlQUFVLEdBR2IsRUFBRSxDQUFDO1FBRVIsYUFBUSxHQUFHLFFBQVEsQ0FBUyxJQUFJLENBQzlCLEdBQUcsQ0FBQyxDQUFDLE1BQWMsRUFBRSxFQUFFO1lBQ3JCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksU0FBUyxFQUFFLFdBQVcsRUFBRTtnQkFDMUIsSUFDRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO29CQUN2QyxTQUFTLENBQUMsWUFBWSxFQUN0QjtvQkFDQSxPQUFPLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUU7d0JBQ2pELE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQVcsQ0FBQzt3QkFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDOUIsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBRUQsT0FBTyxTQUFTLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3ZDO1lBRUQsT0FBTztRQUNULENBQUMsQ0FBQyxDQUNILENBQUMsQ0FBQztLQWFKO0lBWEMsOERBQThEO0lBQzlELG1CQUFtQixDQUFDLE9BQWlEO1FBQ25FLE9BQU8sQ0FBQyxPQUFPLENBQ2IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDNUIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHO1lBQ2xDLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztZQUMvQixZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7U0FDbEMsQ0FDRixDQUNGLENBQUM7SUFDSixDQUFDOzhHQXJDVSxnQkFBZ0I7a0hBQWhCLGdCQUFnQixjQUZmLE1BQU07OzJGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7O0FBeUNELE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IHJ4TWV0aG9kIH0gZnJvbSBcIkBuZ3J4L3NpZ25hbHMvcnhqcy1pbnRlcm9wXCI7XHJcbmltcG9ydCB7IEFjdGlvbiwgQWN0aW9uQ3JlYXRvciB9IGZyb20gXCJAbmdyeC9zdG9yZVwiO1xyXG5pbXBvcnQgeyBwaXBlLCB0YXAgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBNYXBwZXJUeXBlcyB9IGZyb20gXCIuL21vZGVsXCI7XHJcbmltcG9ydCB7IGlzVW5zdWJzY3JpYmFibGUgfSBmcm9tIFwiLi91dGlsXCI7XHJcblxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2lnbmFsUmVkdXhTdG9yZSB7XHJcbiAgcHJpdmF0ZSBtYXBwZXJEaWN0OiBSZWNvcmQ8c3RyaW5nLCB7XHJcbiAgICBzdG9yZU1ldGhvZDogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bixcclxuICAgIHJlc3VsdE1ldGhvZD86ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24sXHJcbiAgfT4gPSB7fTtcclxuXHJcbiAgZGlzcGF0Y2ggPSByeE1ldGhvZDxBY3Rpb24+KHBpcGUoXHJcbiAgICB0YXAoKGFjdGlvbjogQWN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMubWFwcGVyRGljdFthY3Rpb24udHlwZV07XHJcbiAgICAgIGlmIChjYWxsYmFja3M/LnN0b3JlTWV0aG9kKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgaXNVbnN1YnNjcmliYWJsZShjYWxsYmFja3Muc3RvcmVNZXRob2QpICYmXHJcbiAgICAgICAgICBjYWxsYmFja3MucmVzdWx0TWV0aG9kXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzLnN0b3JlTWV0aG9kKGFjdGlvbiwgKGE6IEFjdGlvbikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHRBY3Rpb24gPSBjYWxsYmFja3MucmVzdWx0TWV0aG9kPy4oYSkgYXMgQWN0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoKHJlc3VsdEFjdGlvbik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjYWxsYmFja3M/LnN0b3JlTWV0aG9kKGFjdGlvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH0pXHJcbiAgKSk7XHJcblxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgY29ubmVjdEZlYXR1cmVTdG9yZShtYXBwZXJzOiBNYXBwZXJUeXBlczxBY3Rpb25DcmVhdG9yPGFueSwgYW55PltdPltdKTogdm9pZCB7XHJcbiAgICBtYXBwZXJzLmZvckVhY2goXHJcbiAgICAgIG1hcHBlciA9PiBtYXBwZXIudHlwZXMuZm9yRWFjaChcclxuICAgICAgICBhY3Rpb24gPT4gdGhpcy5tYXBwZXJEaWN0W2FjdGlvbl0gPSB7XHJcbiAgICAgICAgICBzdG9yZU1ldGhvZDogbWFwcGVyLnN0b3JlTWV0aG9kLFxyXG4gICAgICAgICAgcmVzdWx0TWV0aG9kOiBtYXBwZXIucmVzdWx0TWV0aG9kXHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFJlZHV4RGlzcGF0Y2goKSB7XHJcbiAgcmV0dXJuIGluamVjdChTaWduYWxSZWR1eFN0b3JlKS5kaXNwYXRjaDtcclxufVxyXG4iXX0=
@@ -0,0 +1,13 @@
1
+ export function isUnsubscribable(fn) {
2
+ return !!fn?.unsubscribe;
3
+ }
4
+ export function capitalize(str) {
5
+ return str ? str[0].toUpperCase() + str.substring(1) : str;
6
+ }
7
+ export function isActionCreator(action) {
8
+ return (typeof action === 'function' &&
9
+ action &&
10
+ action.type &&
11
+ typeof action.type === 'string');
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvcmVkdXgtY29ubmVjdG9yL3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixFQUE0QjtJQUU1QixPQUFPLENBQUMsQ0FBRSxFQUFnQyxFQUFFLFdBQVcsQ0FBQztBQUMxRCxDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxHQUFXO0lBQ3BDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzdELENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQVc7SUFDekMsT0FBTyxDQUNMLE9BQU8sTUFBTSxLQUFLLFVBQVU7UUFDNUIsTUFBTTtRQUNOLE1BQU0sQ0FBQyxJQUFJO1FBQ1gsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FDaEMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3Rpb24gfSBmcm9tICdAbmdyeC9zdG9yZSc7XHJcbmltcG9ydCB7IFVuc3Vic2NyaWJhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVW5zdWJzY3JpYmFibGU8RiBleHRlbmRzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24+KFxyXG4gIGZuOiBGIHwgKEYgJiBVbnN1YnNjcmliYWJsZSlcclxuKTogZm4gaXMgRiAmIFVuc3Vic2NyaWJhYmxlIHtcclxuICByZXR1cm4gISEoZm4gYXMgYW55IGFzIEYgJiBVbnN1YnNjcmliYWJsZSk/LnVuc3Vic2NyaWJlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIHN0ciA/IHN0clswXS50b1VwcGVyQ2FzZSgpICsgc3RyLnN1YnN0cmluZygxKSA6IHN0cjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQWN0aW9uQ3JlYXRvcihhY3Rpb246IGFueSk6IGFjdGlvbiBpcyBBY3Rpb24ge1xyXG4gIHJldHVybiAoXHJcbiAgICB0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nICYmXHJcbiAgICBhY3Rpb24gJiZcclxuICAgIGFjdGlvbi50eXBlICYmXHJcbiAgICB0eXBlb2YgYWN0aW9uLnR5cGUgPT09ICdzdHJpbmcnXHJcbiAgKTtcclxufVxyXG4iXX0=
@@ -17,6 +17,7 @@ export function getDataServiceKeys(options) {
17
17
  const setCurrentKey = options.collection ? `setCurrent${capitalize(options.collection)}` : 'setCurrent';
18
18
  const createKey = options.collection ? `create${capitalize(options.collection)}` : 'create';
19
19
  const updateKey = options.collection ? `update${capitalize(options.collection)}` : 'update';
20
+ const updateAllKey = options.collection ? `updateAll${capitalize(options.collection)}` : 'updateAll';
20
21
  const deleteKey = options.collection ? `delete${capitalize(options.collection)}` : 'delete';
21
22
  // TODO: Take these from @ngrx/signals/entities, when they are exported
22
23
  const entitiesKey = options.collection ? `${options.collection}Entities` : 'entities';
@@ -37,13 +38,14 @@ export function getDataServiceKeys(options) {
37
38
  setCurrentKey,
38
39
  createKey,
39
40
  updateKey,
41
+ updateAllKey,
40
42
  deleteKey
41
43
  };
42
44
  }
43
45
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
46
  export function withDataService(options) {
45
47
  const { dataServiceType, filter, collection: prefix } = options;
46
- const { entitiesKey, filterKey, loadKey, selectedEntitiesKey, selectedIdsKey, updateFilterKey, updateSelectedKey, currentKey, createKey, updateKey, deleteKey, loadByIdKey, setCurrentKey } = getDataServiceKeys(options);
48
+ const { entitiesKey, filterKey, loadKey, selectedEntitiesKey, selectedIdsKey, updateFilterKey, updateSelectedKey, currentKey, createKey, updateKey, updateAllKey, deleteKey, loadByIdKey, setCurrentKey } = getDataServiceKeys(options);
47
49
  const { callStateKey } = getCallStateKeys({ collection: prefix });
48
50
  return signalStoreFeature(withState(() => ({
49
51
  [filterKey]: filter,
@@ -127,6 +129,18 @@ export function withDataService(options) {
127
129
  throw e;
128
130
  }
129
131
  },
132
+ [updateAllKey]: async (entities) => {
133
+ store[callStateKey] && patchState(store, setLoading(prefix));
134
+ try {
135
+ const result = await dataService.updateAll(entities);
136
+ patchState(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));
137
+ store[callStateKey] && patchState(store, setLoaded(prefix));
138
+ }
139
+ catch (e) {
140
+ store[callStateKey] && patchState(store, setError(e, prefix));
141
+ throw e;
142
+ }
143
+ },
130
144
  [deleteKey]: async (entity) => {
131
145
  patchState(store, { [currentKey]: entity });
132
146
  store[callStateKey] && patchState(store, setLoading(prefix));
@@ -144,4 +158,4 @@ export function withDataService(options) {
144
158
  };
145
159
  }));
146
160
  }
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kYXRhLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvbGliL3dpdGgtZGF0YS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBeUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQXNCLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6SCxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsY0FBYyxFQUFZLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFnQnpHLE1BQU0sVUFBVSxVQUFVLENBQUMsR0FBVztJQUNsQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQWdDO0lBQy9ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDaEYsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUMzRyxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxVQUFVLENB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QUFZLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2lCQUMvRDtnQkFDRCxPQUFPLENBQUMsRUFBRTtvQkFDTixLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQzlELE1BQU0sQ0FBQyxDQUFDO2lCQUNYO1lBQ0wsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDLENBQUMsQ0FDTCxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3ZpZGVyVG9rZW4sIFNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNpZ25hbFN0b3JlRmVhdHVyZSwgcGF0Y2hTdGF0ZSwgc2lnbmFsU3RvcmVGZWF0dXJlLCB3aXRoQ29tcHV0ZWQsIHdpdGhNZXRob2RzLCB3aXRoU3RhdGUgfSBmcm9tIFwiQG5ncngvc2lnbmFsc1wiO1xyXG5pbXBvcnQgeyBDYWxsU3RhdGUsIGdldENhbGxTdGF0ZUtleXMsIHNldEVycm9yLCBzZXRMb2FkZWQsIHNldExvYWRpbmcgfSBmcm9tIFwiLi93aXRoLWNhbGwtc3RhdGVcIjtcclxuaW1wb3J0IHsgc2V0QWxsRW50aXRpZXMsIEVudGl0eUlkLCBhZGRFbnRpdHksIHVwZGF0ZUVudGl0eSwgcmVtb3ZlRW50aXR5IH0gZnJvbSBcIkBuZ3J4L3NpZ25hbHMvZW50aXRpZXNcIjtcclxuaW1wb3J0IHsgRW50aXR5U3RhdGUsIE5hbWVkRW50aXR5U2lnbmFscyB9IGZyb20gXCJAbmdyeC9zaWduYWxzL2VudGl0aWVzL3NyYy9tb2RlbHNcIjtcclxuaW1wb3J0IHsgU3RhdGVTaWduYWwgfSBmcm9tIFwiQG5ncngvc2lnbmFscy9zcmMvc3RhdGUtc2lnbmFsXCI7XHJcbmltcG9ydCB7IEVtdHB5IH0gZnJvbSBcIi4vc2hhcmVkL2VtcHR5XCI7XHJcblxyXG5leHBvcnQgdHlwZSBGaWx0ZXIgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuZXhwb3J0IHR5cGUgRW50aXR5ID0geyBpZDogRW50aXR5SWQgfTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVNlcnZpY2U8RSBleHRlbmRzIEVudGl0eSwgRiBleHRlbmRzIEZpbHRlcj4ge1xyXG4gICAgbG9hZChmaWx0ZXI6IEYpOiBQcm9taXNlPEVbXT47XHJcbiAgICBsb2FkQnlJZChpZDogRW50aXR5SWQpOiBQcm9taXNlPEU+O1xyXG4gICAgY3JlYXRlKGVudGl0eTogRSk6IFByb21pc2U8RT47XHJcbiAgICB1cGRhdGUoZW50aXR5OiBFKTogUHJvbWlzZTxFPjtcclxuICAgIGRlbGV0ZShlbnRpdHk6IEUpOiBQcm9taXNlPHZvaWQ+O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gc3RyID8gc3RyWzBdLnRvVXBwZXJDYXNlKCkgKyBzdHIuc3Vic3RyaW5nKDEpIDogc3RyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YVNlcnZpY2VLZXlzKG9wdGlvbnM6IHsgY29sbGVjdGlvbj86IHN0cmluZyB9KSB7XHJcbiAgICBjb25zdCBmaWx0ZXJLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgJHtvcHRpb25zLmNvbGxlY3Rpb259RmlsdGVyYCA6ICdmaWx0ZXInO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRJZHNLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgc2VsZWN0ZWQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1JZHNgIDogJ3NlbGVjdGVkSWRzJztcclxuICAgIGNvbnN0IHNlbGVjdGVkRW50aXRpZXNLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgc2VsZWN0ZWQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1FbnRpdGllc2AgOiAnc2VsZWN0ZWRFbnRpdGllcyc7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlRmlsdGVyS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYHVwZGF0ZSR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfUZpbHRlcmAgOiAndXBkYXRlRmlsdGVyJztcclxuICAgIGNvbnN0IHVwZGF0ZVNlbGVjdGVkS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYHVwZGF0ZVNlbGVjdGVkJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9RW50aXRpZXNgIDogJ3VwZGF0ZVNlbGVjdGVkJztcclxuICAgIGNvbnN0IGxvYWRLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgbG9hZCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfUVudGl0aWVzYCA6ICdsb2FkJztcclxuXHJcbiAgICBjb25zdCBjdXJyZW50S2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYGN1cnJlbnQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1gIDogJ2N1cnJlbnQnO1xyXG4gICAgY29uc3QgbG9hZEJ5SWRLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgbG9hZCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfUJ5SWRgIDogJ2xvYWRCeUlkJztcclxuICAgIGNvbnN0IHNldEN1cnJlbnRLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgc2V0Q3VycmVudCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfWAgOiAnc2V0Q3VycmVudCc7XHJcbiAgICBjb25zdCBjcmVhdGVLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgY3JlYXRlJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9YCA6ICdjcmVhdGUnO1xyXG4gICAgY29uc3QgdXBkYXRlS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYHVwZGF0ZSR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfWAgOiAndXBkYXRlJztcclxuICAgIGNvbnN0IGRlbGV0ZUtleSA9IG9wdGlvbnMuY29sbGVjdGlvbiA/IGBkZWxldGUke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1gIDogJ2RlbGV0ZSc7XHJcblxyXG4gICAgLy8gVE9ETzogVGFrZSB0aGVzZSBmcm9tIEBuZ3J4L3NpZ25hbHMvZW50aXRpZXMsIHdoZW4gdGhleSBhcmUgZXhwb3J0ZWRcclxuICAgIGNvbnN0IGVudGl0aWVzS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufUVudGl0aWVzYCA6ICdlbnRpdGllcyc7XHJcbiAgICBjb25zdCBlbnRpdHlNYXBLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgJHtvcHRpb25zLmNvbGxlY3Rpb259RW50aXR5TWFwYCA6ICdlbnRpdHlNYXAnO1xyXG4gICAgY29uc3QgaWRzS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufUlkc2AgOiAnaWRzJztcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGZpbHRlcktleSxcclxuICAgICAgICBzZWxlY3RlZElkc0tleSxcclxuICAgICAgICBzZWxlY3RlZEVudGl0aWVzS2V5LFxyXG4gICAgICAgIHVwZGF0ZUZpbHRlcktleSxcclxuICAgICAgICB1cGRhdGVTZWxlY3RlZEtleSxcclxuICAgICAgICBsb2FkS2V5LFxyXG4gICAgICAgIGVudGl0aWVzS2V5LFxyXG4gICAgICAgIGVudGl0eU1hcEtleSxcclxuICAgICAgICBpZHNLZXksXHJcblxyXG4gICAgICAgIGN1cnJlbnRLZXksXHJcbiAgICAgICAgbG9hZEJ5SWRLZXksXHJcbiAgICAgICAgc2V0Q3VycmVudEtleSxcclxuICAgICAgICBjcmVhdGVLZXksXHJcbiAgICAgICAgdXBkYXRlS2V5LFxyXG4gICAgICAgIGRlbGV0ZUtleVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTmFtZWREYXRhU2VydmljZVN0YXRlPEUgZXh0ZW5kcyBFbnRpdHksIEYgZXh0ZW5kcyBGaWx0ZXIsIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+ID1cclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGAke0t9RmlsdGVyYF06IEY7XHJcbiAgICB9ICYge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYHNlbGVjdGVkJHtDYXBpdGFsaXplPEs+fUlkc2BdOiBSZWNvcmQ8RW50aXR5SWQsIGJvb2xlYW4+O1xyXG4gICAgfSAmIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBjdXJyZW50JHtDYXBpdGFsaXplPEs+fWBdOiBFO1xyXG4gICAgfVxyXG5cclxuZXhwb3J0IHR5cGUgRGF0YVNlcnZpY2VTdGF0ZTxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyPiA9IHtcclxuICAgIGZpbHRlcjogRjtcclxuICAgIHNlbGVjdGVkSWRzOiBSZWNvcmQ8RW50aXR5SWQsIGJvb2xlYW4+O1xyXG4gICAgY3VycmVudDogRTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTmFtZWREYXRhU2VydmljZVNpZ25hbHM8RSBleHRlbmRzIEVudGl0eSwgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4gPVxyXG4gICAge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYHNlbGVjdGVkJHtDYXBpdGFsaXplPEs+fUVudGl0aWVzYF06IFNpZ25hbDxFW10+O1xyXG4gICAgfVxyXG5cclxuZXhwb3J0IHR5cGUgRGF0YVNlcnZpY2VTaWduYWxzPEUgZXh0ZW5kcyBFbnRpdHk+ID1cclxuICAgIHtcclxuICAgICAgICBzZWxlY3RlZEVudGl0aWVzOiBTaWduYWw8RVtdPjtcclxuICAgIH1cclxuXHJcbmV4cG9ydCB0eXBlIE5hbWVkRGF0YVNlcnZpY2VNZXRob2RzPEUgZXh0ZW5kcyBFbnRpdHksIEYgZXh0ZW5kcyBGaWx0ZXIsIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+ID1cclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGB1cGRhdGUke0NhcGl0YWxpemU8Sz59RmlsdGVyYF06IChmaWx0ZXI6IEYpID0+IHZvaWQ7XHJcbiAgICB9ICZcclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGB1cGRhdGVTZWxlY3RlZCR7Q2FwaXRhbGl6ZTxLPn1FbnRpdGllc2BdOiAoaWQ6IEVudGl0eUlkLCBzZWxlY3RlZDogYm9vbGVhbikgPT4gdm9pZDtcclxuICAgIH0gJlxyXG4gICAge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYGxvYWQke0NhcGl0YWxpemU8Sz59RW50aXRpZXNgXTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcclxuICAgIH0gJlxyXG5cclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBzZXRDdXJyZW50JHtDYXBpdGFsaXplPEs+fWBdOiAoZW50aXR5OiBFKSA9PiB2b2lkO1xyXG4gICAgfSAmXHJcbiAgICB7XHJcbiAgICAgICAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgbG9hZCR7Q2FwaXRhbGl6ZTxLPn1CeUlkYF06IChpZDogRW50aXR5SWQpID0+IFByb21pc2U8dm9pZD47XHJcbiAgICB9ICZcclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBjcmVhdGUke0NhcGl0YWxpemU8Sz59YF06IChlbnRpdHk6IEUpID0+IFByb21pc2U8dm9pZD47XHJcbiAgICB9ICZcclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGB1cGRhdGUke0NhcGl0YWxpemU8Sz59YF06IChlbnRpdHk6IEUpID0+IFByb21pc2U8dm9pZD47XHJcbiAgICB9ICZcclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBkZWxldGUke0NhcGl0YWxpemU8Sz59YF06IChlbnRpdHk6IEUpID0+IFByb21pc2U8dm9pZD47XHJcbiAgICB9O1xyXG5cclxuXHJcbmV4cG9ydCB0eXBlIERhdGFTZXJ2aWNlTWV0aG9kczxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyPiA9XHJcbiAgICB7XHJcbiAgICAgICAgdXBkYXRlRmlsdGVyOiAoZmlsdGVyOiBGKSA9PiB2b2lkO1xyXG4gICAgICAgIHVwZGF0ZVNlbGVjdGVkOiAoaWQ6IEVudGl0eUlkLCBzZWxlY3RlZDogYm9vbGVhbikgPT4gdm9pZDtcclxuICAgICAgICBsb2FkOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xyXG5cclxuICAgICAgICBzZXRDdXJyZW50KGVudGl0eTogRSk6IHZvaWQ7XHJcbiAgICAgICAgbG9hZEJ5SWQoaWQ6IEVudGl0eUlkKTogUHJvbWlzZTx2b2lkPjtcclxuICAgICAgICBjcmVhdGUoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPjtcclxuICAgICAgICB1cGRhdGUoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPjtcclxuICAgICAgICBkZWxldGUoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPjtcclxuICAgIH1cclxuXHJcbmV4cG9ydCB0eXBlIEVtcHR5ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gd2l0aERhdGFTZXJ2aWNlPEUgZXh0ZW5kcyBFbnRpdHksIEYgZXh0ZW5kcyBGaWx0ZXIsIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+KG9wdGlvbnM6IHsgZGF0YVNlcnZpY2VUeXBlOiBQcm92aWRlclRva2VuPERhdGFTZXJ2aWNlPEUsIEY+PiwgZmlsdGVyOiBGLCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uIH0pOiBTaWduYWxTdG9yZUZlYXR1cmU8XHJcbiAgICB7XHJcbiAgICAgICAgc3RhdGU6IEVtdHB5LFxyXG4gICAgICAgIC8vIFRoZXNlIGFsdGVybmF0aXZlcyBicmVhayB0eXBlIGluZmVyZW5jZTogXHJcbiAgICAgICAgLy8gc3RhdGU6IHsgY2FsbFN0YXRlOiBDYWxsU3RhdGUgfSAmIE5hbWVkRW50aXR5U3RhdGU8RSwgQ29sbGVjdGlvbj4sXHJcbiAgICAgICAgLy8gc3RhdGU6IE5hbWVkRW50aXR5U3RhdGU8RSwgQ29sbGVjdGlvbj4sXHJcblxyXG4gICAgICAgIHNpZ25hbHM6IE5hbWVkRW50aXR5U2lnbmFsczxFLCBDb2xsZWN0aW9uPixcclxuICAgICAgICBtZXRob2RzOiBFbXRweSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgc3RhdGU6IE5hbWVkRGF0YVNlcnZpY2VTdGF0ZTxFLCBGLCBDb2xsZWN0aW9uPlxyXG4gICAgICAgIHNpZ25hbHM6IE5hbWVkRGF0YVNlcnZpY2VTaWduYWxzPEUsIENvbGxlY3Rpb24+XHJcbiAgICAgICAgbWV0aG9kczogTmFtZWREYXRhU2VydmljZU1ldGhvZHM8RSwgRiwgQ29sbGVjdGlvbj5cclxuICAgIH1cclxuPjtcclxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEYXRhU2VydmljZTxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyPihvcHRpb25zOiB7IGRhdGFTZXJ2aWNlVHlwZTogUHJvdmlkZXJUb2tlbjxEYXRhU2VydmljZTxFLCBGPj4sIGZpbHRlcjogRiB9KTogU2lnbmFsU3RvcmVGZWF0dXJlPFxyXG4gICAge1xyXG4gICAgICAgIHN0YXRlOiB7IGNhbGxTdGF0ZTogQ2FsbFN0YXRlIH0gJiBFbnRpdHlTdGF0ZTxFPlxyXG4gICAgICAgIHNpZ25hbHM6IEVtdHB5LFxyXG4gICAgICAgIG1ldGhvZHM6IEVtdHB5LFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBzdGF0ZTogRGF0YVNlcnZpY2VTdGF0ZTxFLCBGPlxyXG4gICAgICAgIHNpZ25hbHM6IERhdGFTZXJ2aWNlU2lnbmFsczxFPlxyXG4gICAgICAgIG1ldGhvZHM6IERhdGFTZXJ2aWNlTWV0aG9kczxFLCBGPlxyXG4gICAgfT47XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG5leHBvcnQgZnVuY3Rpb24gd2l0aERhdGFTZXJ2aWNlPEUgZXh0ZW5kcyBFbnRpdHksIEYgZXh0ZW5kcyBGaWx0ZXIsIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+KG9wdGlvbnM6IHsgZGF0YVNlcnZpY2VUeXBlOiBQcm92aWRlclRva2VuPERhdGFTZXJ2aWNlPEUsIEY+PiwgZmlsdGVyOiBGLCBjb2xsZWN0aW9uPzogQ29sbGVjdGlvbiB9KTogU2lnbmFsU3RvcmVGZWF0dXJlPGFueSwgYW55PiB7XHJcbiAgICBjb25zdCB7IGRhdGFTZXJ2aWNlVHlwZSwgZmlsdGVyLCBjb2xsZWN0aW9uOiBwcmVmaXggfSA9IG9wdGlvbnM7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgICAgZW50aXRpZXNLZXksXHJcbiAgICAgICAgZmlsdGVyS2V5LFxyXG4gICAgICAgIGxvYWRLZXksXHJcbiAgICAgICAgc2VsZWN0ZWRFbnRpdGllc0tleSxcclxuICAgICAgICBzZWxlY3RlZElkc0tleSxcclxuICAgICAgICB1cGRhdGVGaWx0ZXJLZXksXHJcbiAgICAgICAgdXBkYXRlU2VsZWN0ZWRLZXksXHJcblxyXG4gICAgICAgIGN1cnJlbnRLZXksXHJcbiAgICAgICAgY3JlYXRlS2V5LFxyXG4gICAgICAgIHVwZGF0ZUtleSxcclxuICAgICAgICBkZWxldGVLZXksXHJcbiAgICAgICAgbG9hZEJ5SWRLZXksXHJcbiAgICAgICAgc2V0Q3VycmVudEtleVxyXG4gICAgfSA9IGdldERhdGFTZXJ2aWNlS2V5cyhvcHRpb25zKTtcclxuXHJcbiAgICBjb25zdCB7IGNhbGxTdGF0ZUtleSB9ID0gZ2V0Q2FsbFN0YXRlS2V5cyh7IGNvbGxlY3Rpb246IHByZWZpeCB9KTtcclxuXHJcbiAgICByZXR1cm4gc2lnbmFsU3RvcmVGZWF0dXJlKFxyXG4gICAgICAgIHdpdGhTdGF0ZSgoKSA9PiAoe1xyXG4gICAgICAgICAgICBbZmlsdGVyS2V5XTogZmlsdGVyLFxyXG4gICAgICAgICAgICBbc2VsZWN0ZWRJZHNLZXldOiB7fSBhcyBSZWNvcmQ8RW50aXR5SWQsIGJvb2xlYW4+LFxyXG4gICAgICAgICAgICBbY3VycmVudEtleV06IHVuZGVmaW5lZCBhcyBFIHwgdW5kZWZpbmVkXHJcbiAgICAgICAgfSkpLFxyXG4gICAgICAgIHdpdGhDb21wdXRlZCgoc3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVudGl0aWVzID0gc3RvcmVbZW50aXRpZXNLZXldIGFzIFNpZ25hbDxFW10+O1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZElkcyA9IHN0b3JlW3NlbGVjdGVkSWRzS2V5XSBhcyBTaWduYWw8UmVjb3JkPEVudGl0eUlkLCBib29sZWFuPj47XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkRW50aXRpZXNLZXldOiBjb21wdXRlZCgoKSA9PiBlbnRpdGllcygpLmZpbHRlcihlID0+IHNlbGVjdGVkSWRzKClbZS5pZF0pKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgd2l0aE1ldGhvZHMoKHN0b3JlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIFN0YXRlU2lnbmFsPG9iamVjdD4pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YVNlcnZpY2UgPSBpbmplY3QoZGF0YVNlcnZpY2VUeXBlKVxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgW3VwZGF0ZUZpbHRlcktleV06IChmaWx0ZXI6IEYpOiB2b2lkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtmaWx0ZXJLZXldOiBmaWx0ZXIgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgW3VwZGF0ZVNlbGVjdGVkS2V5XTogKGlkOiBFbnRpdHlJZCwgc2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCAoc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRJZHNLZXldOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZVtzZWxlY3RlZElkc0tleV0gYXMgUmVjb3JkPEVudGl0eUlkLCBib29sZWFuPixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF06IHNlbGVjdGVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIFtsb2FkS2V5XTogYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IHN0b3JlW2ZpbHRlcktleV0gYXMgU2lnbmFsPEY+O1xyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGluZyhwcmVmaXgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGF0YVNlcnZpY2UubG9hZChmaWx0ZXIoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHByZWZpeCA/IHNldEFsbEVudGl0aWVzKHJlc3VsdCwgeyBjb2xsZWN0aW9uOiBwcmVmaXggfSkgOiBzZXRBbGxFbnRpdGllcyhyZXN1bHQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkZWQocHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0RXJyb3IoZSwgcHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIFtsb2FkQnlJZEtleV06IGFzeW5jIChpZDogRW50aXR5SWQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRpbmcocHJlZml4KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBkYXRhU2VydmljZS5sb2FkQnlJZChpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGVkKHByZWZpeCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtjdXJyZW50S2V5XTogY3VycmVudCB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRFcnJvcihlLCBwcmVmaXgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgW3NldEN1cnJlbnRLZXldOiAoY3VycmVudDogRSk6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2N1cnJlbnRLZXldOiBjdXJyZW50IH0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIFtjcmVhdGVLZXldOiBhc3luYyAoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IGVudGl0eSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRpbmcocHJlZml4KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBkYXRhU2VydmljZS5jcmVhdGUoZW50aXR5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IGNyZWF0ZWQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHByZWZpeCA/IGFkZEVudGl0eShjcmVhdGVkLCB7IGNvbGxlY3Rpb246IHByZWZpeCB9KSA6IGFkZEVudGl0eShjcmVhdGVkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGVkKHByZWZpeCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldEVycm9yKGUsIHByZWZpeCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBbdXBkYXRlS2V5XTogYXN5bmMgKGVudGl0eTogRSk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2N1cnJlbnRLZXldOiBlbnRpdHkgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkaW5nKHByZWZpeCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgZGF0YVNlcnZpY2UudXBkYXRlKGVudGl0eSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2N1cnJlbnRLZXldOiB1cGRhdGVkIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaHkgZG8gd2UgbmVlZCB0aGlzIGNhc3QgdG8gUGFydGlhbDxFbnRpdHk+P1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVBcmcgPSB7IGlkOiB1cGRhdGVkLmlkLCBjaGFuZ2VzOiB1cGRhdGVkIGFzIFBhcnRpYWw8RW50aXR5PiB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCBwcmVmaXggPyB1cGRhdGVFbnRpdHkodXBkYXRlQXJnLCB7IGNvbGxlY3Rpb246IHByZWZpeCB9KSA6IHVwZGF0ZUVudGl0eSh1cGRhdGVBcmcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkZWQocHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0RXJyb3IoZSwgcHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIFtkZWxldGVLZXldOiBhc3luYyAoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IGVudGl0eSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRpbmcocHJlZml4KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRhdGFTZXJ2aWNlLmRlbGV0ZShlbnRpdHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtjdXJyZW50S2V5XTogdW5kZWZpbmVkIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCBwcmVmaXggPyByZW1vdmVFbnRpdHkoZW50aXR5LmlkLCB7IGNvbGxlY3Rpb246IHByZWZpeCB9KSA6IHJlbW92ZUVudGl0eShlbnRpdHkuaWQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkZWQocHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0RXJyb3IoZSwgcHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxufSJdfQ==
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kYXRhLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvbGliL3dpdGgtZGF0YS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBeUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQXNCLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6SCxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsY0FBYyxFQUFZLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFpQnpHLE1BQU0sVUFBVSxVQUFVLENBQUMsR0FBVztJQUNsQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQWdDO0lBQy9ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDaEYsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUMzRyxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxVQUFVLENB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LENBQUM7b0JBQzlELE1BQU0sQ0FBQyxDQUFDO2lCQUNYO1lBQ0wsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDLENBQUMsQ0FDTCxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3ZpZGVyVG9rZW4sIFNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNpZ25hbFN0b3JlRmVhdHVyZSwgcGF0Y2hTdGF0ZSwgc2lnbmFsU3RvcmVGZWF0dXJlLCB3aXRoQ29tcHV0ZWQsIHdpdGhNZXRob2RzLCB3aXRoU3RhdGUgfSBmcm9tIFwiQG5ncngvc2lnbmFsc1wiO1xyXG5pbXBvcnQgeyBDYWxsU3RhdGUsIGdldENhbGxTdGF0ZUtleXMsIHNldEVycm9yLCBzZXRMb2FkZWQsIHNldExvYWRpbmcgfSBmcm9tIFwiLi93aXRoLWNhbGwtc3RhdGVcIjtcclxuaW1wb3J0IHsgc2V0QWxsRW50aXRpZXMsIEVudGl0eUlkLCBhZGRFbnRpdHksIHVwZGF0ZUVudGl0eSwgcmVtb3ZlRW50aXR5IH0gZnJvbSBcIkBuZ3J4L3NpZ25hbHMvZW50aXRpZXNcIjtcclxuaW1wb3J0IHsgRW50aXR5U3RhdGUsIE5hbWVkRW50aXR5U2lnbmFscyB9IGZyb20gXCJAbmdyeC9zaWduYWxzL2VudGl0aWVzL3NyYy9tb2RlbHNcIjtcclxuaW1wb3J0IHsgU3RhdGVTaWduYWwgfSBmcm9tIFwiQG5ncngvc2lnbmFscy9zcmMvc3RhdGUtc2lnbmFsXCI7XHJcbmltcG9ydCB7IEVtdHB5IH0gZnJvbSBcIi4vc2hhcmVkL2VtcHR5XCI7XHJcblxyXG5leHBvcnQgdHlwZSBGaWx0ZXIgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuZXhwb3J0IHR5cGUgRW50aXR5ID0geyBpZDogRW50aXR5SWQgfTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVNlcnZpY2U8RSBleHRlbmRzIEVudGl0eSwgRiBleHRlbmRzIEZpbHRlcj4ge1xyXG4gICAgbG9hZChmaWx0ZXI6IEYpOiBQcm9taXNlPEVbXT47XHJcbiAgICBsb2FkQnlJZChpZDogRW50aXR5SWQpOiBQcm9taXNlPEU+O1xyXG4gICAgY3JlYXRlKGVudGl0eTogRSk6IFByb21pc2U8RT47XHJcbiAgICB1cGRhdGUoZW50aXR5OiBFKTogUHJvbWlzZTxFPjtcclxuICAgIHVwZGF0ZUFsbChlbnRpdHk6IEVbXSk6IFByb21pc2U8RVtdPjtcclxuICAgIGRlbGV0ZShlbnRpdHk6IEUpOiBQcm9taXNlPHZvaWQ+O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gc3RyID8gc3RyWzBdLnRvVXBwZXJDYXNlKCkgKyBzdHIuc3Vic3RyaW5nKDEpIDogc3RyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YVNlcnZpY2VLZXlzKG9wdGlvbnM6IHsgY29sbGVjdGlvbj86IHN0cmluZyB9KSB7XHJcbiAgICBjb25zdCBmaWx0ZXJLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgJHtvcHRpb25zLmNvbGxlY3Rpb259RmlsdGVyYCA6ICdmaWx0ZXInO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRJZHNLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgc2VsZWN0ZWQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1JZHNgIDogJ3NlbGVjdGVkSWRzJztcclxuICAgIGNvbnN0IHNlbGVjdGVkRW50aXRpZXNLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgc2VsZWN0ZWQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1FbnRpdGllc2AgOiAnc2VsZWN0ZWRFbnRpdGllcyc7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlRmlsdGVyS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYHVwZGF0ZSR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfUZpbHRlcmAgOiAndXBkYXRlRmlsdGVyJztcclxuICAgIGNvbnN0IHVwZGF0ZVNlbGVjdGVkS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYHVwZGF0ZVNlbGVjdGVkJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9RW50aXRpZXNgIDogJ3VwZGF0ZVNlbGVjdGVkJztcclxuICAgIGNvbnN0IGxvYWRLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgbG9hZCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfUVudGl0aWVzYCA6ICdsb2FkJztcclxuXHJcbiAgICBjb25zdCBjdXJyZW50S2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYGN1cnJlbnQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1gIDogJ2N1cnJlbnQnO1xyXG4gICAgY29uc3QgbG9hZEJ5SWRLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgbG9hZCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfUJ5SWRgIDogJ2xvYWRCeUlkJztcclxuICAgIGNvbnN0IHNldEN1cnJlbnRLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgc2V0Q3VycmVudCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfWAgOiAnc2V0Q3VycmVudCc7XHJcbiAgICBjb25zdCBjcmVhdGVLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgY3JlYXRlJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9YCA6ICdjcmVhdGUnO1xyXG4gICAgY29uc3QgdXBkYXRlS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYHVwZGF0ZSR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfWAgOiAndXBkYXRlJztcclxuICAgIGNvbnN0IHVwZGF0ZUFsbEtleSA9IG9wdGlvbnMuY29sbGVjdGlvbiA/IGB1cGRhdGVBbGwke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1gIDogJ3VwZGF0ZUFsbCc7XHJcbiAgICBjb25zdCBkZWxldGVLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgZGVsZXRlJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9YCA6ICdkZWxldGUnO1xyXG5cclxuICAgIC8vIFRPRE86IFRha2UgdGhlc2UgZnJvbSBAbmdyeC9zaWduYWxzL2VudGl0aWVzLCB3aGVuIHRoZXkgYXJlIGV4cG9ydGVkXHJcbiAgICBjb25zdCBlbnRpdGllc0tleSA9IG9wdGlvbnMuY29sbGVjdGlvbiA/IGAke29wdGlvbnMuY29sbGVjdGlvbn1FbnRpdGllc2AgOiAnZW50aXRpZXMnO1xyXG4gICAgY29uc3QgZW50aXR5TWFwS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufUVudGl0eU1hcGAgOiAnZW50aXR5TWFwJztcclxuICAgIGNvbnN0IGlkc0tleSA9IG9wdGlvbnMuY29sbGVjdGlvbiA/IGAke29wdGlvbnMuY29sbGVjdGlvbn1JZHNgIDogJ2lkcyc7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBmaWx0ZXJLZXksXHJcbiAgICAgICAgc2VsZWN0ZWRJZHNLZXksXHJcbiAgICAgICAgc2VsZWN0ZWRFbnRpdGllc0tleSxcclxuICAgICAgICB1cGRhdGVGaWx0ZXJLZXksXHJcbiAgICAgICAgdXBkYXRlU2VsZWN0ZWRLZXksXHJcbiAgICAgICAgbG9hZEtleSxcclxuICAgICAgICBlbnRpdGllc0tleSxcclxuICAgICAgICBlbnRpdHlNYXBLZXksXHJcbiAgICAgICAgaWRzS2V5LFxyXG5cclxuICAgICAgICBjdXJyZW50S2V5LFxyXG4gICAgICAgIGxvYWRCeUlkS2V5LFxyXG4gICAgICAgIHNldEN1cnJlbnRLZXksXHJcbiAgICAgICAgY3JlYXRlS2V5LFxyXG4gICAgICAgIHVwZGF0ZUtleSxcclxuICAgICAgICB1cGRhdGVBbGxLZXksXHJcbiAgICAgICAgZGVsZXRlS2V5XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBOYW1lZERhdGFTZXJ2aWNlU3RhdGU8RSBleHRlbmRzIEVudGl0eSwgRiBleHRlbmRzIEZpbHRlciwgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4gPVxyXG4gICAge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYCR7S31GaWx0ZXJgXTogRjtcclxuICAgIH0gJiB7XHJcbiAgICAgICAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgc2VsZWN0ZWQke0NhcGl0YWxpemU8Sz59SWRzYF06IFJlY29yZDxFbnRpdHlJZCwgYm9vbGVhbj47XHJcbiAgICB9ICYge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYGN1cnJlbnQke0NhcGl0YWxpemU8Sz59YF06IEU7XHJcbiAgICB9XHJcblxyXG5leHBvcnQgdHlwZSBEYXRhU2VydmljZVN0YXRlPEUgZXh0ZW5kcyBFbnRpdHksIEYgZXh0ZW5kcyBGaWx0ZXI+ID0ge1xyXG4gICAgZmlsdGVyOiBGO1xyXG4gICAgc2VsZWN0ZWRJZHM6IFJlY29yZDxFbnRpdHlJZCwgYm9vbGVhbj47XHJcbiAgICBjdXJyZW50OiBFO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBOYW1lZERhdGFTZXJ2aWNlU2lnbmFsczxFIGV4dGVuZHMgRW50aXR5LCBDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nPiA9XHJcbiAgICB7XHJcbiAgICAgICAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgc2VsZWN0ZWQke0NhcGl0YWxpemU8Sz59RW50aXRpZXNgXTogU2lnbmFsPEVbXT47XHJcbiAgICB9XHJcblxyXG5leHBvcnQgdHlwZSBEYXRhU2VydmljZVNpZ25hbHM8RSBleHRlbmRzIEVudGl0eT4gPVxyXG4gICAge1xyXG4gICAgICAgIHNlbGVjdGVkRW50aXRpZXM6IFNpZ25hbDxFW10+O1xyXG4gICAgfVxyXG5cclxuZXhwb3J0IHR5cGUgTmFtZWREYXRhU2VydmljZU1ldGhvZHM8RSBleHRlbmRzIEVudGl0eSwgRiBleHRlbmRzIEZpbHRlciwgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4gPVxyXG4gICAge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYHVwZGF0ZSR7Q2FwaXRhbGl6ZTxLPn1GaWx0ZXJgXTogKGZpbHRlcjogRikgPT4gdm9pZDtcclxuICAgIH0gJlxyXG4gICAge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYHVwZGF0ZVNlbGVjdGVkJHtDYXBpdGFsaXplPEs+fUVudGl0aWVzYF06IChpZDogRW50aXR5SWQsIHNlbGVjdGVkOiBib29sZWFuKSA9PiB2b2lkO1xyXG4gICAgfSAmXHJcbiAgICB7XHJcbiAgICAgICAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgbG9hZCR7Q2FwaXRhbGl6ZTxLPn1FbnRpdGllc2BdOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xyXG4gICAgfSAmXHJcblxyXG4gICAge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYHNldEN1cnJlbnQke0NhcGl0YWxpemU8Sz59YF06IChlbnRpdHk6IEUpID0+IHZvaWQ7XHJcbiAgICB9ICZcclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBsb2FkJHtDYXBpdGFsaXplPEs+fUJ5SWRgXTogKGlkOiBFbnRpdHlJZCkgPT4gUHJvbWlzZTx2b2lkPjtcclxuICAgIH0gJlxyXG4gICAge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYGNyZWF0ZSR7Q2FwaXRhbGl6ZTxLPn1gXTogKGVudGl0eTogRSkgPT4gUHJvbWlzZTx2b2lkPjtcclxuICAgIH0gJlxyXG4gICAge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYHVwZGF0ZSR7Q2FwaXRhbGl6ZTxLPn1gXTogKGVudGl0eTogRSkgPT4gUHJvbWlzZTx2b2lkPjtcclxuICAgIH0gJlxyXG4gICAge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYHVwZGF0ZUFsbCR7Q2FwaXRhbGl6ZTxLPn1gXTogKGVudGl0eTogRVtdKSA9PiBQcm9taXNlPHZvaWQ+O1xyXG4gICAgfSAmXHJcbiAgICB7XHJcbiAgICAgICAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgZGVsZXRlJHtDYXBpdGFsaXplPEs+fWBdOiAoZW50aXR5OiBFKSA9PiBQcm9taXNlPHZvaWQ+O1xyXG4gICAgfTtcclxuXHJcblxyXG5leHBvcnQgdHlwZSBEYXRhU2VydmljZU1ldGhvZHM8RSBleHRlbmRzIEVudGl0eSwgRiBleHRlbmRzIEZpbHRlcj4gPVxyXG4gICAge1xyXG4gICAgICAgIHVwZGF0ZUZpbHRlcjogKGZpbHRlcjogRikgPT4gdm9pZDtcclxuICAgICAgICB1cGRhdGVTZWxlY3RlZDogKGlkOiBFbnRpdHlJZCwgc2VsZWN0ZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XHJcbiAgICAgICAgbG9hZDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcclxuXHJcbiAgICAgICAgc2V0Q3VycmVudChlbnRpdHk6IEUpOiB2b2lkO1xyXG4gICAgICAgIGxvYWRCeUlkKGlkOiBFbnRpdHlJZCk6IFByb21pc2U8dm9pZD47XHJcbiAgICAgICAgY3JlYXRlKGVudGl0eTogRSk6IFByb21pc2U8dm9pZD47XHJcbiAgICAgICAgdXBkYXRlKGVudGl0eTogRSk6IFByb21pc2U8dm9pZD47XHJcbiAgICAgICAgdXBkYXRlQWxsKGVudGl0aWVzOiBFW10pOiBQcm9taXNlPHZvaWQ+O1xyXG4gICAgICAgIGRlbGV0ZShlbnRpdHk6IEUpOiBQcm9taXNlPHZvaWQ+O1xyXG4gICAgfVxyXG5cclxuZXhwb3J0IHR5cGUgRW1wdHkgPSBSZWNvcmQ8c3RyaW5nLCBuZXZlcj5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB3aXRoRGF0YVNlcnZpY2U8RSBleHRlbmRzIEVudGl0eSwgRiBleHRlbmRzIEZpbHRlciwgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4ob3B0aW9uczogeyBkYXRhU2VydmljZVR5cGU6IFByb3ZpZGVyVG9rZW48RGF0YVNlcnZpY2U8RSwgRj4+LCBmaWx0ZXI6IEYsIGNvbGxlY3Rpb246IENvbGxlY3Rpb24gfSk6IFNpZ25hbFN0b3JlRmVhdHVyZTxcclxuICAgIHtcclxuICAgICAgICBzdGF0ZTogRW10cHksXHJcbiAgICAgICAgLy8gVGhlc2UgYWx0ZXJuYXRpdmVzIGJyZWFrIHR5cGUgaW5mZXJlbmNlOlxyXG4gICAgICAgIC8vIHN0YXRlOiB7IGNhbGxTdGF0ZTogQ2FsbFN0YXRlIH0gJiBOYW1lZEVudGl0eVN0YXRlPEUsIENvbGxlY3Rpb24+LFxyXG4gICAgICAgIC8vIHN0YXRlOiBOYW1lZEVudGl0eVN0YXRlPEUsIENvbGxlY3Rpb24+LFxyXG5cclxuICAgICAgICBzaWduYWxzOiBOYW1lZEVudGl0eVNpZ25hbHM8RSwgQ29sbGVjdGlvbj4sXHJcbiAgICAgICAgbWV0aG9kczogRW10cHksXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHN0YXRlOiBOYW1lZERhdGFTZXJ2aWNlU3RhdGU8RSwgRiwgQ29sbGVjdGlvbj5cclxuICAgICAgICBzaWduYWxzOiBOYW1lZERhdGFTZXJ2aWNlU2lnbmFsczxFLCBDb2xsZWN0aW9uPlxyXG4gICAgICAgIG1ldGhvZHM6IE5hbWVkRGF0YVNlcnZpY2VNZXRob2RzPEUsIEYsIENvbGxlY3Rpb24+XHJcbiAgICB9XHJcbj47XHJcbmV4cG9ydCBmdW5jdGlvbiB3aXRoRGF0YVNlcnZpY2U8RSBleHRlbmRzIEVudGl0eSwgRiBleHRlbmRzIEZpbHRlcj4ob3B0aW9uczogeyBkYXRhU2VydmljZVR5cGU6IFByb3ZpZGVyVG9rZW48RGF0YVNlcnZpY2U8RSwgRj4+LCBmaWx0ZXI6IEYgfSk6IFNpZ25hbFN0b3JlRmVhdHVyZTxcclxuICAgIHtcclxuICAgICAgICBzdGF0ZTogeyBjYWxsU3RhdGU6IENhbGxTdGF0ZSB9ICYgRW50aXR5U3RhdGU8RT5cclxuICAgICAgICBzaWduYWxzOiBFbXRweSxcclxuICAgICAgICBtZXRob2RzOiBFbXRweSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgc3RhdGU6IERhdGFTZXJ2aWNlU3RhdGU8RSwgRj5cclxuICAgICAgICBzaWduYWxzOiBEYXRhU2VydmljZVNpZ25hbHM8RT5cclxuICAgICAgICBtZXRob2RzOiBEYXRhU2VydmljZU1ldGhvZHM8RSwgRj5cclxuICAgIH0+O1xyXG5cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEYXRhU2VydmljZTxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyLCBDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nPihvcHRpb25zOiB7IGRhdGFTZXJ2aWNlVHlwZTogUHJvdmlkZXJUb2tlbjxEYXRhU2VydmljZTxFLCBGPj4sIGZpbHRlcjogRiwgY29sbGVjdGlvbj86IENvbGxlY3Rpb24gfSk6IFNpZ25hbFN0b3JlRmVhdHVyZTxhbnksIGFueT4ge1xyXG4gICAgY29uc3QgeyBkYXRhU2VydmljZVR5cGUsIGZpbHRlciwgY29sbGVjdGlvbjogcHJlZml4IH0gPSBvcHRpb25zO1xyXG4gICAgY29uc3Qge1xyXG4gICAgICAgIGVudGl0aWVzS2V5LFxyXG4gICAgICAgIGZpbHRlcktleSxcclxuICAgICAgICBsb2FkS2V5LFxyXG4gICAgICAgIHNlbGVjdGVkRW50aXRpZXNLZXksXHJcbiAgICAgICAgc2VsZWN0ZWRJZHNLZXksXHJcbiAgICAgICAgdXBkYXRlRmlsdGVyS2V5LFxyXG4gICAgICAgIHVwZGF0ZVNlbGVjdGVkS2V5LFxyXG5cclxuICAgICAgICBjdXJyZW50S2V5LFxyXG4gICAgICAgIGNyZWF0ZUtleSxcclxuICAgICAgICB1cGRhdGVLZXksXHJcbiAgICAgICAgdXBkYXRlQWxsS2V5LFxyXG4gICAgICAgIGRlbGV0ZUtleSxcclxuICAgICAgICBsb2FkQnlJZEtleSxcclxuICAgICAgICBzZXRDdXJyZW50S2V5XHJcbiAgICB9ID0gZ2V0RGF0YVNlcnZpY2VLZXlzKG9wdGlvbnMpO1xyXG5cclxuICAgIGNvbnN0IHsgY2FsbFN0YXRlS2V5IH0gPSBnZXRDYWxsU3RhdGVLZXlzKHsgY29sbGVjdGlvbjogcHJlZml4IH0pO1xyXG5cclxuICAgIHJldHVybiBzaWduYWxTdG9yZUZlYXR1cmUoXHJcbiAgICAgICAgd2l0aFN0YXRlKCgpID0+ICh7XHJcbiAgICAgICAgICAgIFtmaWx0ZXJLZXldOiBmaWx0ZXIsXHJcbiAgICAgICAgICAgIFtzZWxlY3RlZElkc0tleV06IHt9IGFzIFJlY29yZDxFbnRpdHlJZCwgYm9vbGVhbj4sXHJcbiAgICAgICAgICAgIFtjdXJyZW50S2V5XTogdW5kZWZpbmVkIGFzIEUgfCB1bmRlZmluZWRcclxuICAgICAgICB9KSksXHJcbiAgICAgICAgd2l0aENvbXB1dGVkKChzdG9yZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZW50aXRpZXMgPSBzdG9yZVtlbnRpdGllc0tleV0gYXMgU2lnbmFsPEVbXT47XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gc3RvcmVbc2VsZWN0ZWRJZHNLZXldIGFzIFNpZ25hbDxSZWNvcmQ8RW50aXR5SWQsIGJvb2xlYW4+PjtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRFbnRpdGllc0tleV06IGNvbXB1dGVkKCgpID0+IGVudGl0aWVzKCkuZmlsdGVyKGUgPT4gc2VsZWN0ZWRJZHMoKVtlLmlkXSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICB3aXRoTWV0aG9kcygoc3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgU3RhdGVTaWduYWw8b2JqZWN0PikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhU2VydmljZSA9IGluamVjdChkYXRhU2VydmljZVR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBbdXBkYXRlRmlsdGVyS2V5XTogKGZpbHRlcjogRik6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2ZpbHRlcktleV06IGZpbHRlciB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBbdXBkYXRlU2VsZWN0ZWRLZXldOiAoaWQ6IEVudGl0eUlkLCBzZWxlY3RlZDogYm9vbGVhbik6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIChzdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZElkc0tleV06IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlW3NlbGVjdGVkSWRzS2V5XSBhcyBSZWNvcmQ8RW50aXR5SWQsIGJvb2xlYW4+LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXTogc2VsZWN0ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgW2xvYWRLZXldOiBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gc3RvcmVbZmlsdGVyS2V5XSBhcyBTaWduYWw8Rj47XHJcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkaW5nKHByZWZpeCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYXRhU2VydmljZS5sb2FkKGZpbHRlcigpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgcHJlZml4ID8gc2V0QWxsRW50aXRpZXMocmVzdWx0LCB7IGNvbGxlY3Rpb246IHByZWZpeCB9KSA6IHNldEFsbEVudGl0aWVzKHJlc3VsdCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRlZChwcmVmaXgpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRFcnJvcihlLCBwcmVmaXgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgW2xvYWRCeUlkS2V5XTogYXN5bmMgKGlkOiBFbnRpdHlJZCk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGluZyhwcmVmaXgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGRhdGFTZXJ2aWNlLmxvYWRCeUlkKGlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkZWQocHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2N1cnJlbnRLZXldOiBjdXJyZW50IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldEVycm9yKGUsIHByZWZpeCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBbc2V0Q3VycmVudEtleV06IChjdXJyZW50OiBFKTogdm9pZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IGN1cnJlbnQgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgW2NyZWF0ZUtleV06IGFzeW5jIChlbnRpdHk6IEUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtjdXJyZW50S2V5XTogZW50aXR5IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGluZyhwcmVmaXgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGRhdGFTZXJ2aWNlLmNyZWF0ZShlbnRpdHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtjdXJyZW50S2V5XTogY3JlYXRlZCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgcHJlZml4ID8gYWRkRW50aXR5KGNyZWF0ZWQsIHsgY29sbGVjdGlvbjogcHJlZml4IH0pIDogYWRkRW50aXR5KGNyZWF0ZWQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkZWQocHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0RXJyb3IoZSwgcHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIFt1cGRhdGVLZXldOiBhc3luYyAoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IGVudGl0eSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRpbmcocHJlZml4KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBkYXRhU2VydmljZS51cGRhdGUoZW50aXR5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IHVwZGF0ZWQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoeSBkbyB3ZSBuZWVkIHRoaXMgY2FzdCB0byBQYXJ0aWFsPEVudGl0eT4/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUFyZyA9IHsgaWQ6IHVwZGF0ZWQuaWQsIGNoYW5nZXM6IHVwZGF0ZWQgYXMgUGFydGlhbDxFbnRpdHk+IH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHByZWZpeCA/IHVwZGF0ZUVudGl0eSh1cGRhdGVBcmcsIHsgY29sbGVjdGlvbjogcHJlZml4IH0pIDogdXBkYXRlRW50aXR5KHVwZGF0ZUFyZykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRlZChwcmVmaXgpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRFcnJvcihlLCBwcmVmaXgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgW3VwZGF0ZUFsbEtleV06IGFzeW5jIChlbnRpdGllczogRVtdKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGluZyhwcmVmaXgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGF0YVNlcnZpY2UudXBkYXRlQWxsKGVudGl0aWVzKTtcclxuICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCBwcmVmaXggPyBzZXRBbGxFbnRpdGllcyhyZXN1bHQsIHsgY29sbGVjdGlvbjogcHJlZml4IH0pIDogc2V0QWxsRW50aXRpZXMocmVzdWx0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkZWQocHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldEVycm9yKGUsIHByZWZpeCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBbZGVsZXRlS2V5XTogYXN5bmMgKGVudGl0eTogRSk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2N1cnJlbnRLZXldOiBlbnRpdHkgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkaW5nKHByZWZpeCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkYXRhU2VydmljZS5kZWxldGUoZW50aXR5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IHVuZGVmaW5lZCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgcHJlZml4ID8gcmVtb3ZlRW50aXR5KGVudGl0eS5pZCwgeyBjb2xsZWN0aW9uOiBwcmVmaXggfSkgOiByZW1vdmVFbnRpdHkoZW50aXR5LmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGVkKHByZWZpeCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldEVycm9yKGUsIHByZWZpeCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbn1cclxuIl19
@@ -1,8 +1,10 @@
1
1
  import { patchState as patchState$1, withState, withComputed, signalStoreFeature, withMethods, withHooks } from '@ngrx/signals';
2
- import { signal, effect, PLATFORM_ID, inject, computed, isSignal, untracked } from '@angular/core';
2
+ import * as i0 from '@angular/core';
3
+ import { signal, effect, PLATFORM_ID, inject, computed, isSignal, untracked, Injectable, ENVIRONMENT_INITIALIZER, makeEnvironmentProviders, Injector } from '@angular/core';
3
4
  import { isPlatformServer } from '@angular/common';
4
- import { Subject } from 'rxjs';
5
+ import { Subject, tap, pipe, map } from 'rxjs';
5
6
  import { setAllEntities, addEntity, updateEntity, removeEntity } from '@ngrx/signals/entities';
7
+ import { rxMethod } from '@ngrx/signals/rxjs-interop';
6
8
 
7
9
  const storeRegistry = signal({});
8
10
  let currentActionNames = new Set();
@@ -235,22 +237,23 @@ function setError(error, prop) {
235
237
  }
236
238
  }
237
239
 
238
- function capitalize(str) {
240
+ function capitalize$1(str) {
239
241
  return str ? str[0].toUpperCase() + str.substring(1) : str;
240
242
  }
241
243
  function getDataServiceKeys(options) {
242
244
  const filterKey = options.collection ? `${options.collection}Filter` : 'filter';
243
- const selectedIdsKey = options.collection ? `selected${capitalize(options.collection)}Ids` : 'selectedIds';
244
- const selectedEntitiesKey = options.collection ? `selected${capitalize(options.collection)}Entities` : 'selectedEntities';
245
- const updateFilterKey = options.collection ? `update${capitalize(options.collection)}Filter` : 'updateFilter';
246
- const updateSelectedKey = options.collection ? `updateSelected${capitalize(options.collection)}Entities` : 'updateSelected';
247
- const loadKey = options.collection ? `load${capitalize(options.collection)}Entities` : 'load';
248
- const currentKey = options.collection ? `current${capitalize(options.collection)}` : 'current';
249
- const loadByIdKey = options.collection ? `load${capitalize(options.collection)}ById` : 'loadById';
250
- const setCurrentKey = options.collection ? `setCurrent${capitalize(options.collection)}` : 'setCurrent';
251
- const createKey = options.collection ? `create${capitalize(options.collection)}` : 'create';
252
- const updateKey = options.collection ? `update${capitalize(options.collection)}` : 'update';
253
- const deleteKey = options.collection ? `delete${capitalize(options.collection)}` : 'delete';
245
+ const selectedIdsKey = options.collection ? `selected${capitalize$1(options.collection)}Ids` : 'selectedIds';
246
+ const selectedEntitiesKey = options.collection ? `selected${capitalize$1(options.collection)}Entities` : 'selectedEntities';
247
+ const updateFilterKey = options.collection ? `update${capitalize$1(options.collection)}Filter` : 'updateFilter';
248
+ const updateSelectedKey = options.collection ? `updateSelected${capitalize$1(options.collection)}Entities` : 'updateSelected';
249
+ const loadKey = options.collection ? `load${capitalize$1(options.collection)}Entities` : 'load';
250
+ const currentKey = options.collection ? `current${capitalize$1(options.collection)}` : 'current';
251
+ const loadByIdKey = options.collection ? `load${capitalize$1(options.collection)}ById` : 'loadById';
252
+ const setCurrentKey = options.collection ? `setCurrent${capitalize$1(options.collection)}` : 'setCurrent';
253
+ const createKey = options.collection ? `create${capitalize$1(options.collection)}` : 'create';
254
+ const updateKey = options.collection ? `update${capitalize$1(options.collection)}` : 'update';
255
+ const updateAllKey = options.collection ? `updateAll${capitalize$1(options.collection)}` : 'updateAll';
256
+ const deleteKey = options.collection ? `delete${capitalize$1(options.collection)}` : 'delete';
254
257
  // TODO: Take these from @ngrx/signals/entities, when they are exported
255
258
  const entitiesKey = options.collection ? `${options.collection}Entities` : 'entities';
256
259
  const entityMapKey = options.collection ? `${options.collection}EntityMap` : 'entityMap';
@@ -270,13 +273,14 @@ function getDataServiceKeys(options) {
270
273
  setCurrentKey,
271
274
  createKey,
272
275
  updateKey,
276
+ updateAllKey,
273
277
  deleteKey
274
278
  };
275
279
  }
276
280
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
277
281
  function withDataService(options) {
278
282
  const { dataServiceType, filter, collection: prefix } = options;
279
- const { entitiesKey, filterKey, loadKey, selectedEntitiesKey, selectedIdsKey, updateFilterKey, updateSelectedKey, currentKey, createKey, updateKey, deleteKey, loadByIdKey, setCurrentKey } = getDataServiceKeys(options);
283
+ const { entitiesKey, filterKey, loadKey, selectedEntitiesKey, selectedIdsKey, updateFilterKey, updateSelectedKey, currentKey, createKey, updateKey, updateAllKey, deleteKey, loadByIdKey, setCurrentKey } = getDataServiceKeys(options);
280
284
  const { callStateKey } = getCallStateKeys({ collection: prefix });
281
285
  return signalStoreFeature(withState(() => ({
282
286
  [filterKey]: filter,
@@ -360,6 +364,18 @@ function withDataService(options) {
360
364
  throw e;
361
365
  }
362
366
  },
367
+ [updateAllKey]: async (entities) => {
368
+ store[callStateKey] && patchState$1(store, setLoading(prefix));
369
+ try {
370
+ const result = await dataService.updateAll(entities);
371
+ patchState$1(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));
372
+ store[callStateKey] && patchState$1(store, setLoaded(prefix));
373
+ }
374
+ catch (e) {
375
+ store[callStateKey] && patchState$1(store, setError(e, prefix));
376
+ throw e;
377
+ }
378
+ },
363
379
  [deleteKey]: async (entity) => {
364
380
  patchState$1(store, { [currentKey]: entity });
365
381
  store[callStateKey] && patchState$1(store, setLoading(prefix));
@@ -383,7 +399,7 @@ const defaultOptions = {
383
399
  };
384
400
  function getUndoRedoKeys(collections) {
385
401
  if (collections) {
386
- return collections.flatMap(c => [`${c}EntityMap`, `${c}Ids`, `selected${capitalize(c)}Ids`, `${c}Filter`]);
402
+ return collections.flatMap(c => [`${c}EntityMap`, `${c}Ids`, `selected${capitalize$1(c)}Ids`, `${c}Filter`]);
387
403
  }
388
404
  return ['entityMap', 'ids', 'selectedIds', 'filter'];
389
405
  }
@@ -468,9 +484,117 @@ function withUndoRedo(options = {}) {
468
484
  }));
469
485
  }
470
486
 
487
+ function isUnsubscribable(fn) {
488
+ return !!fn?.unsubscribe;
489
+ }
490
+ function capitalize(str) {
491
+ return str ? str[0].toUpperCase() + str.substring(1) : str;
492
+ }
493
+ function isActionCreator(action) {
494
+ return (typeof action === 'function' &&
495
+ action &&
496
+ action.type &&
497
+ typeof action.type === 'string');
498
+ }
499
+
500
+ class SignalReduxStore {
501
+ constructor() {
502
+ this.mapperDict = {};
503
+ this.dispatch = rxMethod(pipe(tap((action) => {
504
+ const callbacks = this.mapperDict[action.type];
505
+ if (callbacks?.storeMethod) {
506
+ if (isUnsubscribable(callbacks.storeMethod) &&
507
+ callbacks.resultMethod) {
508
+ return callbacks.storeMethod(action, (a) => {
509
+ const resultAction = callbacks.resultMethod?.(a);
510
+ this.dispatch(resultAction);
511
+ });
512
+ }
513
+ return callbacks?.storeMethod(action);
514
+ }
515
+ return;
516
+ })));
517
+ }
518
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
519
+ connectFeatureStore(mappers) {
520
+ mappers.forEach(mapper => mapper.types.forEach(action => this.mapperDict[action] = {
521
+ storeMethod: mapper.storeMethod,
522
+ resultMethod: mapper.resultMethod
523
+ }));
524
+ }
525
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: SignalReduxStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
526
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: SignalReduxStore, providedIn: 'root' }); }
527
+ }
528
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: SignalReduxStore, decorators: [{
529
+ type: Injectable,
530
+ args: [{
531
+ providedIn: 'root'
532
+ }]
533
+ }] });
534
+ function injectReduxDispatch() {
535
+ return inject(SignalReduxStore).dispatch;
536
+ }
537
+
538
+ function mapAction(...args) {
539
+ let resultMethod = args.pop();
540
+ let storeMethod = args.pop();
541
+ if (isActionCreator(storeMethod)) {
542
+ args.push(storeMethod);
543
+ storeMethod = resultMethod || storeMethod;
544
+ resultMethod = undefined;
545
+ }
546
+ const types = args.map((creator) => creator.type);
547
+ return {
548
+ types,
549
+ storeMethod,
550
+ resultMethod
551
+ };
552
+ }
553
+ function withActionMappers(...mappers) {
554
+ return mappers;
555
+ }
556
+ function createReduxState(storeName, signalStore, withActionMappers) {
557
+ const isRootProvider = signalStore?.ɵprov?.providedIn === 'root';
558
+ return {
559
+ [`provide${capitalize(storeName)}Store`]: (connectReduxDevtools = false) => makeEnvironmentProviders([
560
+ isRootProvider ? [] : signalStore,
561
+ {
562
+ provide: ENVIRONMENT_INITIALIZER,
563
+ multi: true,
564
+ useFactory: (signalReduxStore = inject(SignalReduxStore), store = inject(signalStore)) => () => {
565
+ if (connectReduxDevtools) {
566
+ // addStoreToReduxDevtools(store, storeName, false);
567
+ }
568
+ signalReduxStore.connectFeatureStore(withActionMappers(store));
569
+ }
570
+ }
571
+ ]),
572
+ [`inject${capitalize(storeName)}Store`]: () => Object.assign(inject(signalStore), { dispatch: injectReduxDispatch() })
573
+ };
574
+ }
575
+
576
+ function reduxMethod(generator, resultMethodOrConfig, config) {
577
+ const injector = inject(Injector);
578
+ if (typeof resultMethodOrConfig === 'function') {
579
+ let unsubscribable;
580
+ const inputResultFn = ((input, resultMethod = resultMethodOrConfig) => {
581
+ const rxMethodWithResult = rxMethod(pipe(generator, map(resultMethod)), {
582
+ ...(config || {}),
583
+ injector: config?.injector || injector
584
+ });
585
+ const rxWithInput = rxMethodWithResult(input);
586
+ unsubscribable = { unsubscribe: rxWithInput.unsubscribe.bind(rxWithInput) };
587
+ return rxWithInput;
588
+ });
589
+ inputResultFn.unsubscribe = () => unsubscribable?.unsubscribe();
590
+ return inputResultFn;
591
+ }
592
+ return rxMethod(generator, resultMethodOrConfig);
593
+ }
594
+
471
595
  /**
472
596
  * Generated bundle index. Do not edit.
473
597
  */
474
598
 
475
- export { capitalize, getCallStateKeys, getDataServiceKeys, getUndoRedoKeys, noPayload, patchState, payload, setError, setLoaded, setLoading, withCallState, withDataService, withDevtools, withRedux, withUndoRedo };
599
+ export { capitalize$1 as capitalize, createReduxState, getCallStateKeys, getDataServiceKeys, getUndoRedoKeys, mapAction, noPayload, patchState, payload, reduxMethod, setError, setLoaded, setLoading, withActionMappers, withCallState, withDataService, withDevtools, withRedux, withUndoRedo };
476
600
  //# sourceMappingURL=angular-architects-ngrx-toolkit.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"angular-architects-ngrx-toolkit.mjs","sources":["../../../../libs/ngrx-toolkit/src/lib/with-devtools.ts","../../../../libs/ngrx-toolkit/src/lib/assertions/assertions.ts","../../../../libs/ngrx-toolkit/src/lib/with-redux.ts","../../../../libs/ngrx-toolkit/src/lib/with-call-state.ts","../../../../libs/ngrx-toolkit/src/lib/with-data-service.ts","../../../../libs/ngrx-toolkit/src/lib/with-undo-redo.ts","../../../../libs/ngrx-toolkit/src/angular-architects-ngrx-toolkit.ts"],"sourcesContent":["import {\r\n patchState as originalPatchState,\r\n SignalStoreFeature,\r\n} from '@ngrx/signals';\r\nimport { SignalStoreFeatureResult } from '@ngrx/signals/src/signal-store-models';\r\nimport { effect, inject, PLATFORM_ID, signal, Signal } from '@angular/core';\r\nimport { isPlatformServer } from '@angular/common';\r\n\r\ndeclare global {\r\n interface Window {\r\n __REDUX_DEVTOOLS_EXTENSION__:\r\n | {\r\n connect: (options: { name: string }) => {\r\n send: (action: Action, state: Record<string, unknown>) => void;\r\n };\r\n }\r\n | undefined;\r\n }\r\n}\r\n\r\ntype EmptyFeatureResult = { state: {}; signals: {}; methods: {} };\r\nexport type Action = { type: string };\r\n\r\nconst storeRegistry = signal<Record<string, Signal<unknown>>>({});\r\n\r\nlet currentActionNames = new Set<string>();\r\n\r\nlet synchronizationInitialized = false;\r\n\r\nfunction initSynchronization() {\r\n effect(() => {\r\n if (!connection) {\r\n return;\r\n }\r\n\r\n const stores = storeRegistry();\r\n const rootState: Record<string, unknown> = {};\r\n for (const name in stores) {\r\n const store = stores[name];\r\n rootState[name] = store();\r\n }\r\n\r\n const names = Array.from(currentActionNames);\r\n const type = names.length ? names.join(', ') : 'Store Update';\r\n currentActionNames = new Set<string>();\r\n\r\n connection.send({ type }, rootState);\r\n });\r\n}\r\n\r\nfunction getValueFromSymbol(obj: unknown, symbol: symbol) {\r\n if (typeof obj === 'object' && obj && symbol in obj) {\r\n return (obj as { [key: symbol]: any })[symbol];\r\n }\r\n}\r\n\r\nfunction getStoreSignal(store: unknown): Signal<unknown> {\r\n const [signalStateKey] = Object.getOwnPropertySymbols(store);\r\n if (!signalStateKey) {\r\n throw new Error('Cannot find State Signal');\r\n }\r\n\r\n return getValueFromSymbol(store, signalStateKey);\r\n}\r\n\r\ntype ConnectResponse = {\r\n send: (action: Action, state: Record<string, unknown>) => void;\r\n};\r\nlet connection: ConnectResponse | undefined;\r\n\r\n/**\r\n * required for testing. is not exported during build\r\n */\r\nexport function reset() {\r\n connection = undefined;\r\n synchronizationInitialized = false;\r\n storeRegistry.set({});\r\n}\r\n\r\n/**\r\n * @param name store's name as it should appear in the DevTools\r\n */\r\nexport function withDevtools<Input extends SignalStoreFeatureResult>(\r\n name: string\r\n): SignalStoreFeature<Input, EmptyFeatureResult> {\r\n return (store) => {\r\n const isServer = isPlatformServer(inject(PLATFORM_ID));\r\n if (isServer) {\r\n return store;\r\n }\r\n\r\n const extensions = window.__REDUX_DEVTOOLS_EXTENSION__;\r\n if (!extensions) {\r\n return store;\r\n }\r\n\r\n if (!connection) {\r\n connection = extensions.connect({\r\n name: 'NgRx Signal Store',\r\n });\r\n }\r\n\r\n const storeSignal = getStoreSignal(store);\r\n storeRegistry.update((value) => ({\r\n ...value,\r\n [name]: storeSignal,\r\n }));\r\n\r\n if (!synchronizationInitialized) {\r\n initSynchronization();\r\n synchronizationInitialized = true;\r\n }\r\n\r\n return store;\r\n };\r\n}\r\n\r\ntype PatchFn = typeof originalPatchState extends (\r\n arg1: infer First,\r\n ...args: infer Rest\r\n) => infer Returner\r\n ? (state: First, action: string, ...rest: Rest) => Returner\r\n : never;\r\n\r\nexport const patchState: PatchFn = (state, action, ...rest) => {\r\n currentActionNames.add(action);\r\n return originalPatchState(state, ...rest);\r\n};\r\n","import { ActionsFnSpecs } from '../with-redux';\r\n\r\nexport function assertActionFnSpecs(\r\n obj: unknown\r\n): asserts obj is ActionsFnSpecs {\r\n if (!obj || typeof obj !== 'object') {\r\n throw new Error('%o is not an Action Specification');\r\n }\r\n}\r\n","import { Observable, Subject, Subscription } from 'rxjs';\r\nimport { SignalStoreFeature } from '@ngrx/signals';\r\nimport {\r\n EmptyFeatureResult,\r\n SignalStoreFeatureResult,\r\n} from '@ngrx/signals/src/signal-store-models';\r\nimport { StateSignal } from '@ngrx/signals/src/state-signal';\r\nimport { assertActionFnSpecs } from './assertions/assertions';\r\nimport { effect } from '@angular/core';\r\n\r\n/** Actions **/\r\n\r\ntype Payload = Record<string, unknown>;\r\n\r\ntype ActionFn<\r\n Type extends string = string,\r\n ActionPayload extends Payload = Payload\r\n> = ((payload: ActionPayload) => ActionPayload & { type: Type }) & {\r\n type: Type;\r\n};\r\n\r\ntype ActionFns = Record<string, ActionFn>;\r\n\r\nexport type ActionsFnSpecs = Record<string, Payload>;\r\n\r\ntype ActionFnCreator<Spec extends ActionsFnSpecs> = {\r\n [ActionName in keyof Spec]: ((\r\n payload: Spec[ActionName]\r\n ) => Spec[ActionName] & { type: ActionName }) & { type: ActionName & string };\r\n};\r\n\r\ntype ActionFnPayload<Action> = Action extends (payload: infer Payload) => void\r\n ? Payload\r\n : never;\r\n\r\ntype ActionFnsCreator<Spec extends ActionsFnSpecs> = Spec extends {\r\n private: Record<string, Payload>;\r\n public: Record<string, Payload>;\r\n}\r\n ? ActionFnCreator<Spec['private']> & ActionFnCreator<Spec['public']>\r\n : ActionFnCreator<Spec>;\r\n\r\ntype PublicActionFns<Spec extends ActionsFnSpecs> = Spec extends {\r\n public: Record<string, Payload>;\r\n}\r\n ? ActionFnCreator<Spec['public']>\r\n : ActionFnCreator<Spec>;\r\n\r\nexport function payload<Type extends Payload>(): Type {\r\n return {} as Type;\r\n}\r\n\r\nexport const noPayload = {};\r\n\r\n/** Reducer **/\r\n\r\ntype ReducerFunction<ReducerAction, State> = (\r\n action: ActionFnPayload<ReducerAction>,\r\n state: State\r\n) => void;\r\n\r\ntype ReducerFactory<StateActionFns extends ActionFns, State> = (\r\n actions: StateActionFns,\r\n on: <ReducerAction extends { type: string }>(\r\n action: ReducerAction,\r\n reducerFn: ReducerFunction<ActionFnPayload<ReducerAction>, State>\r\n ) => void\r\n) => void;\r\n\r\n/** Effect **/\r\n\r\ntype EffectsFactory<StateActionFns extends ActionFns> = (\r\n actions: StateActionFns,\r\n create: <EffectAction extends { type: string }>(\r\n action: EffectAction\r\n ) => Observable<ActionFnPayload<EffectAction>>\r\n) => Record<string, Observable<unknown>>;\r\n\r\nfunction createActionFns<Spec extends ActionsFnSpecs>(\r\n actionFnSpecs: Spec,\r\n reducerRegistry: Record<\r\n string,\r\n (payload: ActionFnPayload<unknown>, state: unknown) => void\r\n >,\r\n effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>>,\r\n state: unknown\r\n) {\r\n const actionFns: Record<string, ActionFn> = {};\r\n\r\n for (const type in actionFnSpecs) {\r\n const actionFn = (payload: Payload) => {\r\n const fullPayload = { ...payload, type };\r\n const reducer = reducerRegistry[type];\r\n if (reducer) {\r\n (reducer as (payload: unknown, state: unknown) => void)(\r\n fullPayload as unknown,\r\n state\r\n );\r\n }\r\n const effectSubject = effectsRegistry[type];\r\n if (effectSubject) {\r\n (effectSubject as unknown as Subject<unknown>).next(fullPayload);\r\n }\r\n return fullPayload;\r\n };\r\n actionFn.type = type.toString();\r\n actionFns[type] = actionFn;\r\n }\r\n\r\n return actionFns;\r\n}\r\n\r\nfunction createPublicAndAllActionsFns<Spec extends ActionsFnSpecs>(\r\n actionFnSpecs: Spec,\r\n reducerRegistry: Record<\r\n string,\r\n (payload: ActionFnPayload<unknown>, state: unknown) => void\r\n >,\r\n effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>>,\r\n state: unknown\r\n): { all: ActionFns; publics: ActionFns } {\r\n if ('public' in actionFnSpecs || 'private' in actionFnSpecs) {\r\n const privates = actionFnSpecs['private'] || {};\r\n const publics = actionFnSpecs['public'] || {};\r\n\r\n assertActionFnSpecs(privates);\r\n assertActionFnSpecs(publics);\r\n\r\n const privateActionFns = createActionFns(\r\n privates,\r\n reducerRegistry,\r\n effectsRegistry,\r\n state\r\n );\r\n const publicActionFns = createActionFns(\r\n publics,\r\n reducerRegistry,\r\n effectsRegistry,\r\n state\r\n );\r\n\r\n return {\r\n all: { ...privateActionFns, ...publicActionFns },\r\n publics: publicActionFns,\r\n };\r\n }\r\n\r\n const actionFns = createActionFns(\r\n actionFnSpecs,\r\n reducerRegistry,\r\n effectsRegistry,\r\n state\r\n );\r\n\r\n return { all: actionFns, publics: actionFns };\r\n}\r\n\r\nfunction fillReducerRegistry(\r\n reducer: ReducerFactory<ActionFns, unknown>,\r\n actionFns: ActionFns,\r\n reducerRegistry: Record<\r\n string,\r\n (payload: ActionFnPayload<unknown>, state: unknown) => void\r\n >\r\n) {\r\n function on(\r\n action: { type: string },\r\n reducerFn: (payload: ActionFnPayload<unknown>, state: unknown) => void\r\n ) {\r\n reducerRegistry[action.type] = reducerFn;\r\n }\r\n\r\n reducer(actionFns, on);\r\n\r\n return reducerRegistry;\r\n}\r\n\r\nfunction fillEffects(\r\n effects: EffectsFactory<ActionFns>,\r\n actionFns: ActionFns,\r\n effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>> = {}\r\n): Observable<unknown>[] {\r\n function create(action: { type: string }) {\r\n const subject = new Subject<ActionFnPayload<unknown>>();\r\n effectsRegistry[action.type] = subject;\r\n return subject.asObservable();\r\n }\r\n\r\n const effectObservables = effects(actionFns, create);\r\n return Object.values(effectObservables);\r\n}\r\n\r\nfunction startSubscriptions(observables: Observable<unknown>[]) {\r\n return observables.map((observable) => observable.subscribe());\r\n}\r\n\r\nfunction processRedux<Spec extends ActionsFnSpecs, ReturnType>(\r\n actionFnSpecs: Spec,\r\n reducer: ReducerFactory<ActionFns, unknown>,\r\n effects: EffectsFactory<ActionFns>,\r\n store: unknown\r\n) {\r\n const reducerRegistry: Record<\r\n string,\r\n (payload: ActionFnPayload<unknown>, state: unknown) => void\r\n > = {};\r\n const effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>> = {};\r\n const actionsMap = createPublicAndAllActionsFns(\r\n actionFnSpecs,\r\n reducerRegistry,\r\n effectsRegistry,\r\n store\r\n );\r\n const actionFns = actionsMap.all;\r\n const publicActionsFns = actionsMap.publics;\r\n\r\n fillReducerRegistry(reducer, actionFns, reducerRegistry);\r\n const effectObservables = fillEffects(effects, actionFns, effectsRegistry);\r\n const subscriptions = startSubscriptions(effectObservables);\r\n\r\n return {\r\n methods: publicActionsFns as ReturnType,\r\n subscriptions: subscriptions,\r\n };\r\n}\r\n\r\n/**\r\n * @param redux redux\r\n *\r\n * properties do not start with `with` since they are not extension functions on their own.\r\n *\r\n * no dependency to NgRx\r\n *\r\n * actions are passed to reducer and effects, but it is also possible to use other actions.\r\n * effects provide forAction and do not return anything. that is important because effects should stay inaccessible\r\n */\r\nexport function withRedux<\r\n Spec extends ActionsFnSpecs,\r\n Input extends SignalStoreFeatureResult,\r\n StateActionFns extends ActionFnsCreator<Spec> = ActionFnsCreator<Spec>,\r\n PublicStoreActionFns extends PublicActionFns<Spec> = PublicActionFns<Spec>\r\n>(redux: {\r\n actions: Spec;\r\n reducer: ReducerFactory<StateActionFns, StateSignal<Input['state']>>;\r\n effects: EffectsFactory<StateActionFns>;\r\n}): SignalStoreFeature<\r\n Input,\r\n EmptyFeatureResult & { methods: PublicStoreActionFns }\r\n> {\r\n return (store) => {\r\n const { methods, subscriptions } = processRedux<Spec, PublicStoreActionFns>(\r\n redux.actions,\r\n redux.reducer as ReducerFactory<ActionFns, unknown>,\r\n redux.effects as EffectsFactory<ActionFns>,\r\n store\r\n );\r\n return {\r\n ...store,\r\n methods,\r\n };\r\n };\r\n}\r\n","import { Signal, computed } from '@angular/core';\r\nimport {\r\n SignalStoreFeature,\r\n signalStoreFeature,\r\n withComputed,\r\n withState,\r\n} from '@ngrx/signals';\r\nimport { Emtpy } from './shared/empty';\r\n\r\nexport type CallState = 'init' | 'loading' | 'loaded' | { error: string };\r\n\r\nexport type NamedCallStateSlice<Collection extends string> = {\r\n [K in Collection as `${K}CallState`]: CallState;\r\n};\r\n\r\nexport type CallStateSlice = {\r\n callState: CallState\r\n}\r\n\r\nexport type NamedCallStateSignals<Prop extends string> = {\r\n [K in Prop as `${K}Loading`]: Signal<boolean>;\r\n} & {\r\n [K in Prop as `${K}Loaded`]: Signal<boolean>;\r\n } & {\r\n [K in Prop as `${K}Error`]: Signal<string | null>;\r\n } \r\n\r\nexport type CallStateSignals = {\r\n loading: Signal<boolean>;\r\n loaded: Signal<boolean>;\r\n error: Signal<string | null>\r\n} \r\n\r\nexport function getCallStateKeys(config?: { collection?: string }) {\r\n const prop = config?.collection;\r\n return {\r\n callStateKey: prop ? `${config.collection}CallState` : 'callState',\r\n loadingKey: prop ? `${config.collection}Loading` : 'loading',\r\n loadedKey: prop ? `${config.collection}Loaded` : 'loaded',\r\n errorKey: prop ? `${config.collection}Error` : 'error',\r\n };\r\n}\r\n\r\nexport function withCallState<Collection extends string>(config: {\r\n collection: Collection;\r\n}): SignalStoreFeature<\r\n { state: Emtpy, signals: Emtpy, methods: Emtpy },\r\n {\r\n state: NamedCallStateSlice<Collection>,\r\n signals: NamedCallStateSignals<Collection>,\r\n methods: Emtpy\r\n }\r\n>;\r\nexport function withCallState(): SignalStoreFeature<\r\n { state: Emtpy, signals: Emtpy, methods: Emtpy },\r\n {\r\n state: CallStateSlice,\r\n signals: CallStateSignals,\r\n methods: Emtpy\r\n }\r\n>;\r\nexport function withCallState<Collection extends string>(config?: {\r\n collection: Collection;\r\n}): SignalStoreFeature {\r\n const { callStateKey, errorKey, loadedKey, loadingKey } =\r\n getCallStateKeys(config);\r\n\r\n return signalStoreFeature(\r\n withState({ [callStateKey]: 'init' }),\r\n withComputed((state: Record<string, Signal<unknown>>) => {\r\n\r\n const callState = state[callStateKey] as Signal<CallState>;\r\n\r\n return {\r\n [loadingKey]: computed(() => callState() === 'loading'),\r\n [loadedKey]: computed(() => callState() === 'loaded'),\r\n [errorKey]: computed(() => {\r\n const v = callState();\r\n return typeof v === 'object' ? v.error : null;\r\n })\r\n }\r\n })\r\n );\r\n}\r\n\r\nexport function setLoading<Prop extends string>(\r\n prop?: Prop\r\n): NamedCallStateSlice<Prop> | CallStateSlice {\r\n if (prop) {\r\n return { [`${prop}CallState`]: 'loading' } as NamedCallStateSlice<Prop>;\r\n }\r\n\r\n return { callState: 'loading' };\r\n}\r\n\r\nexport function setLoaded<Prop extends string>(\r\n prop?: Prop\r\n): NamedCallStateSlice<Prop> | CallStateSlice {\r\n\r\n if (prop) {\r\n return { [`${prop}CallState`]: 'loaded' } as NamedCallStateSlice<Prop>;\r\n }\r\n else {\r\n return { callState: 'loaded' };\r\n\r\n }\r\n}\r\n\r\nexport function setError<Prop extends string>(\r\n error: unknown,\r\n prop?: Prop,\r\n ): NamedCallStateSlice<Prop> | CallStateSlice {\r\n\r\n let errorMessage = '';\r\n\r\n if (!error) {\r\n errorMessage = '';\r\n }\r\n else if (typeof error === 'object' && 'message' in error) {\r\n errorMessage = String(error.message);\r\n }\r\n else {\r\n errorMessage = String(error);\r\n }\r\n \r\n\r\n if (prop) {\r\n return { [`${prop}CallState`]: { error: errorMessage } } as NamedCallStateSlice<Prop>;\r\n }\r\n else {\r\n return { callState: { error: errorMessage } };\r\n }\r\n}\r\n","import { ProviderToken, Signal, computed, inject } from \"@angular/core\";\r\nimport { SignalStoreFeature, patchState, signalStoreFeature, withComputed, withMethods, withState } from \"@ngrx/signals\";\r\nimport { CallState, getCallStateKeys, setError, setLoaded, setLoading } from \"./with-call-state\";\r\nimport { setAllEntities, EntityId, addEntity, updateEntity, removeEntity } from \"@ngrx/signals/entities\";\r\nimport { EntityState, NamedEntitySignals } from \"@ngrx/signals/entities/src/models\";\r\nimport { StateSignal } from \"@ngrx/signals/src/state-signal\";\r\nimport { Emtpy } from \"./shared/empty\";\r\n\r\nexport type Filter = Record<string, unknown>;\r\nexport type Entity = { id: EntityId };\r\n\r\nexport interface DataService<E extends Entity, F extends Filter> {\r\n load(filter: F): Promise<E[]>;\r\n loadById(id: EntityId): Promise<E>;\r\n create(entity: E): Promise<E>;\r\n update(entity: E): Promise<E>;\r\n delete(entity: E): Promise<void>;\r\n}\r\n\r\nexport function capitalize(str: string): string {\r\n return str ? str[0].toUpperCase() + str.substring(1) : str;\r\n}\r\n\r\nexport function getDataServiceKeys(options: { collection?: string }) {\r\n const filterKey = options.collection ? `${options.collection}Filter` : 'filter';\r\n const selectedIdsKey = options.collection ? `selected${capitalize(options.collection)}Ids` : 'selectedIds';\r\n const selectedEntitiesKey = options.collection ? `selected${capitalize(options.collection)}Entities` : 'selectedEntities';\r\n\r\n const updateFilterKey = options.collection ? `update${capitalize(options.collection)}Filter` : 'updateFilter';\r\n const updateSelectedKey = options.collection ? `updateSelected${capitalize(options.collection)}Entities` : 'updateSelected';\r\n const loadKey = options.collection ? `load${capitalize(options.collection)}Entities` : 'load';\r\n\r\n const currentKey = options.collection ? `current${capitalize(options.collection)}` : 'current';\r\n const loadByIdKey = options.collection ? `load${capitalize(options.collection)}ById` : 'loadById';\r\n const setCurrentKey = options.collection ? `setCurrent${capitalize(options.collection)}` : 'setCurrent';\r\n const createKey = options.collection ? `create${capitalize(options.collection)}` : 'create';\r\n const updateKey = options.collection ? `update${capitalize(options.collection)}` : 'update';\r\n const deleteKey = options.collection ? `delete${capitalize(options.collection)}` : 'delete';\r\n\r\n // TODO: Take these from @ngrx/signals/entities, when they are exported\r\n const entitiesKey = options.collection ? `${options.collection}Entities` : 'entities';\r\n const entityMapKey = options.collection ? `${options.collection}EntityMap` : 'entityMap';\r\n const idsKey = options.collection ? `${options.collection}Ids` : 'ids';\r\n\r\n return {\r\n filterKey,\r\n selectedIdsKey,\r\n selectedEntitiesKey,\r\n updateFilterKey,\r\n updateSelectedKey,\r\n loadKey,\r\n entitiesKey,\r\n entityMapKey,\r\n idsKey,\r\n\r\n currentKey,\r\n loadByIdKey,\r\n setCurrentKey,\r\n createKey,\r\n updateKey,\r\n deleteKey\r\n };\r\n}\r\n\r\nexport type NamedDataServiceState<E extends Entity, F extends Filter, Collection extends string> =\r\n {\r\n [K in Collection as `${K}Filter`]: F;\r\n } & {\r\n [K in Collection as `selected${Capitalize<K>}Ids`]: Record<EntityId, boolean>;\r\n } & {\r\n [K in Collection as `current${Capitalize<K>}`]: E;\r\n }\r\n\r\nexport type DataServiceState<E extends Entity, F extends Filter> = {\r\n filter: F;\r\n selectedIds: Record<EntityId, boolean>;\r\n current: E;\r\n}\r\n\r\nexport type NamedDataServiceSignals<E extends Entity, Collection extends string> =\r\n {\r\n [K in Collection as `selected${Capitalize<K>}Entities`]: Signal<E[]>;\r\n }\r\n\r\nexport type DataServiceSignals<E extends Entity> =\r\n {\r\n selectedEntities: Signal<E[]>;\r\n }\r\n\r\nexport type NamedDataServiceMethods<E extends Entity, F extends Filter, Collection extends string> =\r\n {\r\n [K in Collection as `update${Capitalize<K>}Filter`]: (filter: F) => void;\r\n } &\r\n {\r\n [K in Collection as `updateSelected${Capitalize<K>}Entities`]: (id: EntityId, selected: boolean) => void;\r\n } &\r\n {\r\n [K in Collection as `load${Capitalize<K>}Entities`]: () => Promise<void>;\r\n } &\r\n\r\n {\r\n [K in Collection as `setCurrent${Capitalize<K>}`]: (entity: E) => void;\r\n } &\r\n {\r\n [K in Collection as `load${Capitalize<K>}ById`]: (id: EntityId) => Promise<void>;\r\n } &\r\n {\r\n [K in Collection as `create${Capitalize<K>}`]: (entity: E) => Promise<void>;\r\n } &\r\n {\r\n [K in Collection as `update${Capitalize<K>}`]: (entity: E) => Promise<void>;\r\n } &\r\n {\r\n [K in Collection as `delete${Capitalize<K>}`]: (entity: E) => Promise<void>;\r\n };\r\n\r\n\r\nexport type DataServiceMethods<E extends Entity, F extends Filter> =\r\n {\r\n updateFilter: (filter: F) => void;\r\n updateSelected: (id: EntityId, selected: boolean) => void;\r\n load: () => Promise<void>;\r\n\r\n setCurrent(entity: E): void;\r\n loadById(id: EntityId): Promise<void>;\r\n create(entity: E): Promise<void>;\r\n update(entity: E): Promise<void>;\r\n delete(entity: E): Promise<void>;\r\n }\r\n\r\nexport type Empty = Record<string, never>\r\n\r\nexport function withDataService<E extends Entity, F extends Filter, Collection extends string>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F, collection: Collection }): SignalStoreFeature<\r\n {\r\n state: Emtpy,\r\n // These alternatives break type inference: \r\n // state: { callState: CallState } & NamedEntityState<E, Collection>,\r\n // state: NamedEntityState<E, Collection>,\r\n\r\n signals: NamedEntitySignals<E, Collection>,\r\n methods: Emtpy,\r\n },\r\n {\r\n state: NamedDataServiceState<E, F, Collection>\r\n signals: NamedDataServiceSignals<E, Collection>\r\n methods: NamedDataServiceMethods<E, F, Collection>\r\n }\r\n>;\r\nexport function withDataService<E extends Entity, F extends Filter>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F }): SignalStoreFeature<\r\n {\r\n state: { callState: CallState } & EntityState<E>\r\n signals: Emtpy,\r\n methods: Emtpy,\r\n },\r\n {\r\n state: DataServiceState<E, F>\r\n signals: DataServiceSignals<E>\r\n methods: DataServiceMethods<E, F>\r\n }>;\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function withDataService<E extends Entity, F extends Filter, Collection extends string>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F, collection?: Collection }): SignalStoreFeature<any, any> {\r\n const { dataServiceType, filter, collection: prefix } = options;\r\n const {\r\n entitiesKey,\r\n filterKey,\r\n loadKey,\r\n selectedEntitiesKey,\r\n selectedIdsKey,\r\n updateFilterKey,\r\n updateSelectedKey,\r\n\r\n currentKey,\r\n createKey,\r\n updateKey,\r\n deleteKey,\r\n loadByIdKey,\r\n setCurrentKey\r\n } = getDataServiceKeys(options);\r\n\r\n const { callStateKey } = getCallStateKeys({ collection: prefix });\r\n\r\n return signalStoreFeature(\r\n withState(() => ({\r\n [filterKey]: filter,\r\n [selectedIdsKey]: {} as Record<EntityId, boolean>,\r\n [currentKey]: undefined as E | undefined\r\n })),\r\n withComputed((store: Record<string, unknown>) => {\r\n const entities = store[entitiesKey] as Signal<E[]>;\r\n const selectedIds = store[selectedIdsKey] as Signal<Record<EntityId, boolean>>;\r\n\r\n return {\r\n [selectedEntitiesKey]: computed(() => entities().filter(e => selectedIds()[e.id]))\r\n }\r\n }),\r\n withMethods((store: Record<string, unknown> & StateSignal<object>) => {\r\n const dataService = inject(dataServiceType)\r\n return {\r\n [updateFilterKey]: (filter: F): void => {\r\n patchState(store, { [filterKey]: filter });\r\n },\r\n [updateSelectedKey]: (id: EntityId, selected: boolean): void => {\r\n patchState(store, (state: Record<string, unknown>) => ({\r\n [selectedIdsKey]: {\r\n ...state[selectedIdsKey] as Record<EntityId, boolean>,\r\n [id]: selected,\r\n }\r\n }));\r\n },\r\n [loadKey]: async (): Promise<void> => {\r\n const filter = store[filterKey] as Signal<F>;\r\n store[callStateKey] && patchState(store, setLoading(prefix));\r\n\r\n try {\r\n const result = await dataService.load(filter());\r\n patchState(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));\r\n store[callStateKey] && patchState(store, setLoaded(prefix));\r\n }\r\n catch (e) {\r\n store[callStateKey] && patchState(store, setError(e, prefix));\r\n throw e;\r\n }\r\n },\r\n [loadByIdKey]: async (id: EntityId): Promise<void> => {\r\n store[callStateKey] && patchState(store, setLoading(prefix));\r\n\r\n try {\r\n const current = await dataService.loadById(id);\r\n store[callStateKey] && patchState(store, setLoaded(prefix));\r\n patchState(store, { [currentKey]: current });\r\n }\r\n catch (e) {\r\n store[callStateKey] && patchState(store, setError(e, prefix));\r\n throw e;\r\n }\r\n },\r\n [setCurrentKey]: (current: E): void => {\r\n patchState(store, { [currentKey]: current });\r\n },\r\n [createKey]: async (entity: E): Promise<void> => {\r\n patchState(store, { [currentKey]: entity });\r\n store[callStateKey] && patchState(store, setLoading(prefix));\r\n\r\n try {\r\n const created = await dataService.create(entity);\r\n patchState(store, { [currentKey]: created });\r\n patchState(store, prefix ? addEntity(created, { collection: prefix }) : addEntity(created));\r\n store[callStateKey] && patchState(store, setLoaded(prefix));\r\n }\r\n catch (e) {\r\n store[callStateKey] && patchState(store, setError(e, prefix));\r\n throw e;\r\n }\r\n },\r\n [updateKey]: async (entity: E): Promise<void> => {\r\n patchState(store, { [currentKey]: entity });\r\n store[callStateKey] && patchState(store, setLoading(prefix));\r\n\r\n try {\r\n const updated = await dataService.update(entity);\r\n patchState(store, { [currentKey]: updated });\r\n // Why do we need this cast to Partial<Entity>?\r\n const updateArg = { id: updated.id, changes: updated as Partial<Entity> };\r\n patchState(store, prefix ? updateEntity(updateArg, { collection: prefix }) : updateEntity(updateArg));\r\n store[callStateKey] && patchState(store, setLoaded(prefix));\r\n }\r\n catch (e) {\r\n store[callStateKey] && patchState(store, setError(e, prefix));\r\n throw e;\r\n }\r\n },\r\n [deleteKey]: async (entity: E): Promise<void> => {\r\n patchState(store, { [currentKey]: entity });\r\n store[callStateKey] && patchState(store, setLoading(prefix));\r\n\r\n try {\r\n await dataService.delete(entity);\r\n patchState(store, { [currentKey]: undefined });\r\n patchState(store, prefix ? removeEntity(entity.id, { collection: prefix }) : removeEntity(entity.id));\r\n store[callStateKey] && patchState(store, setLoaded(prefix));\r\n }\r\n catch (e) {\r\n store[callStateKey] && patchState(store, setError(e, prefix));\r\n throw e;\r\n }\r\n },\r\n };\r\n })\r\n );\r\n}","import { SignalStoreFeature, patchState, signalStoreFeature, withComputed, withHooks, withMethods } from \"@ngrx/signals\";\r\nimport { EntityId, EntityMap, EntityState } from \"@ngrx/signals/entities\";\r\nimport { Signal, effect, signal, untracked, isSignal } from \"@angular/core\";\r\nimport { EntitySignals, NamedEntitySignals } from \"@ngrx/signals/entities/src/models\";\r\nimport { Entity, capitalize } from \"./with-data-service\";\r\nimport { Emtpy } from \"./shared/empty\";\r\n\r\nexport type StackItem = Record<string, unknown>;\r\n\r\nexport type NormalizedUndoRedoOptions = {\r\n maxStackSize: number;\r\n collections?: string[]\r\n}\r\n\r\nconst defaultOptions: NormalizedUndoRedoOptions = {\r\n maxStackSize: 100\r\n};\r\n\r\nexport type NamedUndoRedoState<Collection extends string> = {\r\n [K in Collection as `${K}EntityMap`]: EntityMap<Entity>;\r\n} & {\r\n [K in Collection as `${K}Ids`]: EntityId[];\r\n }\r\n\r\nexport type NamedUndoRedoSignals<Collection extends string> = {\r\n [K in Collection as `${K}Entities`]: Signal<Entity[]>\r\n}\r\n\r\nexport function getUndoRedoKeys(collections?: string[]): string[] {\r\n if (collections) {\r\n return collections.flatMap(c => [`${c}EntityMap`, `${c}Ids`, `selected${capitalize(c)}Ids`, `${c}Filter`])\r\n }\r\n return ['entityMap', 'ids', 'selectedIds', 'filter'];\r\n}\r\n\r\nexport function withUndoRedo<Collection extends string>(options?: { maxStackSize?: number; collections: Collection[] }): SignalStoreFeature<\r\n {\r\n state: Emtpy,\r\n // This alternative breaks type inference:\r\n // state: NamedEntityState<Entity, Collection>\r\n signals: NamedEntitySignals<Entity, Collection>,\r\n methods: Emtpy\r\n },\r\n {\r\n state: Emtpy,\r\n signals: {\r\n canUndo: Signal<boolean>,\r\n canRedo: Signal<boolean>\r\n },\r\n methods: {\r\n undo: () => void,\r\n redo: () => void\r\n }\r\n }>;\r\n\r\nexport function withUndoRedo(options?: { maxStackSize?: number }): SignalStoreFeature<\r\n {\r\n state: EntityState<Entity>,\r\n signals: EntitySignals<Entity>,\r\n methods: Emtpy\r\n },\r\n {\r\n state: Emtpy,\r\n signals: {\r\n canUndo: Signal<boolean>,\r\n canRedo: Signal<boolean>\r\n },\r\n methods: {\r\n undo: () => void,\r\n redo: () => void\r\n }\r\n }>;\r\n\r\nexport function withUndoRedo<Collection extends string>(options: {\r\n maxStackSize?: number;\r\n collections?: Collection[]\r\n} = {}): \r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nSignalStoreFeature<any, any> {\r\n let previous: StackItem | null = null;\r\n let skipOnce = false;\r\n\r\n const normalized = {\r\n ...defaultOptions,\r\n ...options\r\n };\r\n\r\n //\r\n // Design Decision: This feature has its own\r\n // internal state.\r\n //\r\n\r\n const undoStack: StackItem[] = [];\r\n const redoStack: StackItem[] = [];\r\n\r\n const canUndo = signal(false);\r\n const canRedo = signal(false);\r\n\r\n const updateInternal = () => {\r\n canUndo.set(undoStack.length !== 0);\r\n canRedo.set(redoStack.length !== 0);\r\n };\r\n\r\n const keys = getUndoRedoKeys(normalized?.collections);\r\n\r\n return signalStoreFeature(\r\n\r\n withComputed(() => ({\r\n canUndo: canUndo.asReadonly(),\r\n canRedo: canRedo.asReadonly()\r\n })),\r\n withMethods((store) => ({\r\n undo(): void {\r\n const item = undoStack.pop();\r\n\r\n if (item && previous) {\r\n redoStack.push(previous);\r\n }\r\n\r\n if (item) {\r\n skipOnce = true;\r\n patchState(store, item);\r\n previous = item;\r\n }\r\n\r\n updateInternal();\r\n },\r\n redo(): void {\r\n const item = redoStack.pop();\r\n\r\n if (item && previous) {\r\n undoStack.push(previous);\r\n }\r\n\r\n if (item) {\r\n skipOnce = true;\r\n patchState(store, item);\r\n previous = item;\r\n }\r\n\r\n updateInternal();\r\n }\r\n })),\r\n withHooks({\r\n onInit(store: Record<string, unknown>) {\r\n effect(() => {\r\n\r\n const cand = keys.reduce((acc, key) => {\r\n const s = store[key];\r\n if (s && isSignal(s)) {\r\n return {\r\n ...acc,\r\n [key]: s()\r\n }\r\n }\r\n return acc;\r\n }, {});\r\n\r\n if (skipOnce) {\r\n skipOnce = false;\r\n return;\r\n }\r\n\r\n // Clear redoStack after recorded action\r\n redoStack.splice(0);\r\n\r\n if (previous) {\r\n undoStack.push(previous);\r\n }\r\n\r\n if (redoStack.length > normalized.maxStackSize) {\r\n undoStack.unshift();\r\n }\r\n\r\n previous = cand;\r\n\r\n // Don't propogate current reactive context\r\n untracked(() => updateInternal());\r\n })\r\n }\r\n })\r\n\r\n )\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["originalPatchState","patchState"],"mappings":"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"}
1
+ {"version":3,"file":"angular-architects-ngrx-toolkit.mjs","sources":["../../../../libs/ngrx-toolkit/src/lib/with-devtools.ts","../../../../libs/ngrx-toolkit/src/lib/assertions/assertions.ts","../../../../libs/ngrx-toolkit/src/lib/with-redux.ts","../../../../libs/ngrx-toolkit/src/lib/with-call-state.ts","../../../../libs/ngrx-toolkit/src/lib/with-data-service.ts","../../../../libs/ngrx-toolkit/src/lib/with-undo-redo.ts","../../../../libs/ngrx-toolkit/src/lib/redux-connector/util.ts","../../../../libs/ngrx-toolkit/src/lib/redux-connector/signal-redux-store.ts","../../../../libs/ngrx-toolkit/src/lib/redux-connector/create-redux.ts","../../../../libs/ngrx-toolkit/src/lib/redux-connector/rxjs-interop/redux-method.ts","../../../../libs/ngrx-toolkit/src/angular-architects-ngrx-toolkit.ts"],"sourcesContent":["import {\r\n patchState as originalPatchState,\r\n SignalStoreFeature,\r\n} from '@ngrx/signals';\r\nimport { SignalStoreFeatureResult } from '@ngrx/signals/src/signal-store-models';\r\nimport { effect, inject, PLATFORM_ID, signal, Signal } from '@angular/core';\r\nimport { isPlatformServer } from '@angular/common';\r\n\r\ndeclare global {\r\n interface Window {\r\n __REDUX_DEVTOOLS_EXTENSION__:\r\n | {\r\n connect: (options: { name: string }) => {\r\n send: (action: Action, state: Record<string, unknown>) => void;\r\n };\r\n }\r\n | undefined;\r\n }\r\n}\r\n\r\ntype EmptyFeatureResult = { state: {}; signals: {}; methods: {} };\r\nexport type Action = { type: string };\r\n\r\nconst storeRegistry = signal<Record<string, Signal<unknown>>>({});\r\n\r\nlet currentActionNames = new Set<string>();\r\n\r\nlet synchronizationInitialized = false;\r\n\r\nfunction initSynchronization() {\r\n effect(() => {\r\n if (!connection) {\r\n return;\r\n }\r\n\r\n const stores = storeRegistry();\r\n const rootState: Record<string, unknown> = {};\r\n for (const name in stores) {\r\n const store = stores[name];\r\n rootState[name] = store();\r\n }\r\n\r\n const names = Array.from(currentActionNames);\r\n const type = names.length ? names.join(', ') : 'Store Update';\r\n currentActionNames = new Set<string>();\r\n\r\n connection.send({ type }, rootState);\r\n });\r\n}\r\n\r\nfunction getValueFromSymbol(obj: unknown, symbol: symbol) {\r\n if (typeof obj === 'object' && obj && symbol in obj) {\r\n return (obj as { [key: symbol]: any })[symbol];\r\n }\r\n}\r\n\r\nfunction getStoreSignal(store: unknown): Signal<unknown> {\r\n const [signalStateKey] = Object.getOwnPropertySymbols(store);\r\n if (!signalStateKey) {\r\n throw new Error('Cannot find State Signal');\r\n }\r\n\r\n return getValueFromSymbol(store, signalStateKey);\r\n}\r\n\r\ntype ConnectResponse = {\r\n send: (action: Action, state: Record<string, unknown>) => void;\r\n};\r\nlet connection: ConnectResponse | undefined;\r\n\r\n/**\r\n * required for testing. is not exported during build\r\n */\r\nexport function reset() {\r\n connection = undefined;\r\n synchronizationInitialized = false;\r\n storeRegistry.set({});\r\n}\r\n\r\n/**\r\n * @param name store's name as it should appear in the DevTools\r\n */\r\nexport function withDevtools<Input extends SignalStoreFeatureResult>(\r\n name: string\r\n): SignalStoreFeature<Input, EmptyFeatureResult> {\r\n return (store) => {\r\n const isServer = isPlatformServer(inject(PLATFORM_ID));\r\n if (isServer) {\r\n return store;\r\n }\r\n\r\n const extensions = window.__REDUX_DEVTOOLS_EXTENSION__;\r\n if (!extensions) {\r\n return store;\r\n }\r\n\r\n if (!connection) {\r\n connection = extensions.connect({\r\n name: 'NgRx Signal Store',\r\n });\r\n }\r\n\r\n const storeSignal = getStoreSignal(store);\r\n storeRegistry.update((value) => ({\r\n ...value,\r\n [name]: storeSignal,\r\n }));\r\n\r\n if (!synchronizationInitialized) {\r\n initSynchronization();\r\n synchronizationInitialized = true;\r\n }\r\n\r\n return store;\r\n };\r\n}\r\n\r\ntype PatchFn = typeof originalPatchState extends (\r\n arg1: infer First,\r\n ...args: infer Rest\r\n) => infer Returner\r\n ? (state: First, action: string, ...rest: Rest) => Returner\r\n : never;\r\n\r\nexport const patchState: PatchFn = (state, action, ...rest) => {\r\n currentActionNames.add(action);\r\n return originalPatchState(state, ...rest);\r\n};\r\n","import { ActionsFnSpecs } from '../with-redux';\r\n\r\nexport function assertActionFnSpecs(\r\n obj: unknown\r\n): asserts obj is ActionsFnSpecs {\r\n if (!obj || typeof obj !== 'object') {\r\n throw new Error('%o is not an Action Specification');\r\n }\r\n}\r\n","import { Observable, Subject, Subscription } from 'rxjs';\r\nimport { SignalStoreFeature } from '@ngrx/signals';\r\nimport {\r\n EmptyFeatureResult,\r\n SignalStoreFeatureResult,\r\n} from '@ngrx/signals/src/signal-store-models';\r\nimport { StateSignal } from '@ngrx/signals/src/state-signal';\r\nimport { assertActionFnSpecs } from './assertions/assertions';\r\nimport { effect } from '@angular/core';\r\n\r\n/** Actions **/\r\n\r\ntype Payload = Record<string, unknown>;\r\n\r\ntype ActionFn<\r\n Type extends string = string,\r\n ActionPayload extends Payload = Payload\r\n> = ((payload: ActionPayload) => ActionPayload & { type: Type }) & {\r\n type: Type;\r\n};\r\n\r\ntype ActionFns = Record<string, ActionFn>;\r\n\r\nexport type ActionsFnSpecs = Record<string, Payload>;\r\n\r\ntype ActionFnCreator<Spec extends ActionsFnSpecs> = {\r\n [ActionName in keyof Spec]: ((\r\n payload: Spec[ActionName]\r\n ) => Spec[ActionName] & { type: ActionName }) & { type: ActionName & string };\r\n};\r\n\r\ntype ActionFnPayload<Action> = Action extends (payload: infer Payload) => void\r\n ? Payload\r\n : never;\r\n\r\ntype ActionFnsCreator<Spec extends ActionsFnSpecs> = Spec extends {\r\n private: Record<string, Payload>;\r\n public: Record<string, Payload>;\r\n}\r\n ? ActionFnCreator<Spec['private']> & ActionFnCreator<Spec['public']>\r\n : ActionFnCreator<Spec>;\r\n\r\ntype PublicActionFns<Spec extends ActionsFnSpecs> = Spec extends {\r\n public: Record<string, Payload>;\r\n}\r\n ? ActionFnCreator<Spec['public']>\r\n : ActionFnCreator<Spec>;\r\n\r\nexport function payload<Type extends Payload>(): Type {\r\n return {} as Type;\r\n}\r\n\r\nexport const noPayload = {};\r\n\r\n/** Reducer **/\r\n\r\ntype ReducerFunction<ReducerAction, State> = (\r\n action: ActionFnPayload<ReducerAction>,\r\n state: State\r\n) => void;\r\n\r\ntype ReducerFactory<StateActionFns extends ActionFns, State> = (\r\n actions: StateActionFns,\r\n on: <ReducerAction extends { type: string }>(\r\n action: ReducerAction,\r\n reducerFn: ReducerFunction<ActionFnPayload<ReducerAction>, State>\r\n ) => void\r\n) => void;\r\n\r\n/** Effect **/\r\n\r\ntype EffectsFactory<StateActionFns extends ActionFns> = (\r\n actions: StateActionFns,\r\n create: <EffectAction extends { type: string }>(\r\n action: EffectAction\r\n ) => Observable<ActionFnPayload<EffectAction>>\r\n) => Record<string, Observable<unknown>>;\r\n\r\nfunction createActionFns<Spec extends ActionsFnSpecs>(\r\n actionFnSpecs: Spec,\r\n reducerRegistry: Record<\r\n string,\r\n (payload: ActionFnPayload<unknown>, state: unknown) => void\r\n >,\r\n effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>>,\r\n state: unknown\r\n) {\r\n const actionFns: Record<string, ActionFn> = {};\r\n\r\n for (const type in actionFnSpecs) {\r\n const actionFn = (payload: Payload) => {\r\n const fullPayload = { ...payload, type };\r\n const reducer = reducerRegistry[type];\r\n if (reducer) {\r\n (reducer as (payload: unknown, state: unknown) => void)(\r\n fullPayload as unknown,\r\n state\r\n );\r\n }\r\n const effectSubject = effectsRegistry[type];\r\n if (effectSubject) {\r\n (effectSubject as unknown as Subject<unknown>).next(fullPayload);\r\n }\r\n return fullPayload;\r\n };\r\n actionFn.type = type.toString();\r\n actionFns[type] = actionFn;\r\n }\r\n\r\n return actionFns;\r\n}\r\n\r\nfunction createPublicAndAllActionsFns<Spec extends ActionsFnSpecs>(\r\n actionFnSpecs: Spec,\r\n reducerRegistry: Record<\r\n string,\r\n (payload: ActionFnPayload<unknown>, state: unknown) => void\r\n >,\r\n effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>>,\r\n state: unknown\r\n): { all: ActionFns; publics: ActionFns } {\r\n if ('public' in actionFnSpecs || 'private' in actionFnSpecs) {\r\n const privates = actionFnSpecs['private'] || {};\r\n const publics = actionFnSpecs['public'] || {};\r\n\r\n assertActionFnSpecs(privates);\r\n assertActionFnSpecs(publics);\r\n\r\n const privateActionFns = createActionFns(\r\n privates,\r\n reducerRegistry,\r\n effectsRegistry,\r\n state\r\n );\r\n const publicActionFns = createActionFns(\r\n publics,\r\n reducerRegistry,\r\n effectsRegistry,\r\n state\r\n );\r\n\r\n return {\r\n all: { ...privateActionFns, ...publicActionFns },\r\n publics: publicActionFns,\r\n };\r\n }\r\n\r\n const actionFns = createActionFns(\r\n actionFnSpecs,\r\n reducerRegistry,\r\n effectsRegistry,\r\n state\r\n );\r\n\r\n return { all: actionFns, publics: actionFns };\r\n}\r\n\r\nfunction fillReducerRegistry(\r\n reducer: ReducerFactory<ActionFns, unknown>,\r\n actionFns: ActionFns,\r\n reducerRegistry: Record<\r\n string,\r\n (payload: ActionFnPayload<unknown>, state: unknown) => void\r\n >\r\n) {\r\n function on(\r\n action: { type: string },\r\n reducerFn: (payload: ActionFnPayload<unknown>, state: unknown) => void\r\n ) {\r\n reducerRegistry[action.type] = reducerFn;\r\n }\r\n\r\n reducer(actionFns, on);\r\n\r\n return reducerRegistry;\r\n}\r\n\r\nfunction fillEffects(\r\n effects: EffectsFactory<ActionFns>,\r\n actionFns: ActionFns,\r\n effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>> = {}\r\n): Observable<unknown>[] {\r\n function create(action: { type: string }) {\r\n const subject = new Subject<ActionFnPayload<unknown>>();\r\n effectsRegistry[action.type] = subject;\r\n return subject.asObservable();\r\n }\r\n\r\n const effectObservables = effects(actionFns, create);\r\n return Object.values(effectObservables);\r\n}\r\n\r\nfunction startSubscriptions(observables: Observable<unknown>[]) {\r\n return observables.map((observable) => observable.subscribe());\r\n}\r\n\r\nfunction processRedux<Spec extends ActionsFnSpecs, ReturnType>(\r\n actionFnSpecs: Spec,\r\n reducer: ReducerFactory<ActionFns, unknown>,\r\n effects: EffectsFactory<ActionFns>,\r\n store: unknown\r\n) {\r\n const reducerRegistry: Record<\r\n string,\r\n (payload: ActionFnPayload<unknown>, state: unknown) => void\r\n > = {};\r\n const effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>> = {};\r\n const actionsMap = createPublicAndAllActionsFns(\r\n actionFnSpecs,\r\n reducerRegistry,\r\n effectsRegistry,\r\n store\r\n );\r\n const actionFns = actionsMap.all;\r\n const publicActionsFns = actionsMap.publics;\r\n\r\n fillReducerRegistry(reducer, actionFns, reducerRegistry);\r\n const effectObservables = fillEffects(effects, actionFns, effectsRegistry);\r\n const subscriptions = startSubscriptions(effectObservables);\r\n\r\n return {\r\n methods: publicActionsFns as ReturnType,\r\n subscriptions: subscriptions,\r\n };\r\n}\r\n\r\n/**\r\n * @param redux redux\r\n *\r\n * properties do not start with `with` since they are not extension functions on their own.\r\n *\r\n * no dependency to NgRx\r\n *\r\n * actions are passed to reducer and effects, but it is also possible to use other actions.\r\n * effects provide forAction and do not return anything. that is important because effects should stay inaccessible\r\n */\r\nexport function withRedux<\r\n Spec extends ActionsFnSpecs,\r\n Input extends SignalStoreFeatureResult,\r\n StateActionFns extends ActionFnsCreator<Spec> = ActionFnsCreator<Spec>,\r\n PublicStoreActionFns extends PublicActionFns<Spec> = PublicActionFns<Spec>\r\n>(redux: {\r\n actions: Spec;\r\n reducer: ReducerFactory<StateActionFns, StateSignal<Input['state']>>;\r\n effects: EffectsFactory<StateActionFns>;\r\n}): SignalStoreFeature<\r\n Input,\r\n EmptyFeatureResult & { methods: PublicStoreActionFns }\r\n> {\r\n return (store) => {\r\n const { methods, subscriptions } = processRedux<Spec, PublicStoreActionFns>(\r\n redux.actions,\r\n redux.reducer as ReducerFactory<ActionFns, unknown>,\r\n redux.effects as EffectsFactory<ActionFns>,\r\n store\r\n );\r\n return {\r\n ...store,\r\n methods,\r\n };\r\n };\r\n}\r\n","import { Signal, computed } from '@angular/core';\r\nimport {\r\n SignalStoreFeature,\r\n signalStoreFeature,\r\n withComputed,\r\n withState,\r\n} from '@ngrx/signals';\r\nimport { Emtpy } from './shared/empty';\r\n\r\nexport type CallState = 'init' | 'loading' | 'loaded' | { error: string };\r\n\r\nexport type NamedCallStateSlice<Collection extends string> = {\r\n [K in Collection as `${K}CallState`]: CallState;\r\n};\r\n\r\nexport type CallStateSlice = {\r\n callState: CallState\r\n}\r\n\r\nexport type NamedCallStateSignals<Prop extends string> = {\r\n [K in Prop as `${K}Loading`]: Signal<boolean>;\r\n} & {\r\n [K in Prop as `${K}Loaded`]: Signal<boolean>;\r\n } & {\r\n [K in Prop as `${K}Error`]: Signal<string | null>;\r\n } \r\n\r\nexport type CallStateSignals = {\r\n loading: Signal<boolean>;\r\n loaded: Signal<boolean>;\r\n error: Signal<string | null>\r\n} \r\n\r\nexport function getCallStateKeys(config?: { collection?: string }) {\r\n const prop = config?.collection;\r\n return {\r\n callStateKey: prop ? `${config.collection}CallState` : 'callState',\r\n loadingKey: prop ? `${config.collection}Loading` : 'loading',\r\n loadedKey: prop ? `${config.collection}Loaded` : 'loaded',\r\n errorKey: prop ? `${config.collection}Error` : 'error',\r\n };\r\n}\r\n\r\nexport function withCallState<Collection extends string>(config: {\r\n collection: Collection;\r\n}): SignalStoreFeature<\r\n { state: Emtpy, signals: Emtpy, methods: Emtpy },\r\n {\r\n state: NamedCallStateSlice<Collection>,\r\n signals: NamedCallStateSignals<Collection>,\r\n methods: Emtpy\r\n }\r\n>;\r\nexport function withCallState(): SignalStoreFeature<\r\n { state: Emtpy, signals: Emtpy, methods: Emtpy },\r\n {\r\n state: CallStateSlice,\r\n signals: CallStateSignals,\r\n methods: Emtpy\r\n }\r\n>;\r\nexport function withCallState<Collection extends string>(config?: {\r\n collection: Collection;\r\n}): SignalStoreFeature {\r\n const { callStateKey, errorKey, loadedKey, loadingKey } =\r\n getCallStateKeys(config);\r\n\r\n return signalStoreFeature(\r\n withState({ [callStateKey]: 'init' }),\r\n withComputed((state: Record<string, Signal<unknown>>) => {\r\n\r\n const callState = state[callStateKey] as Signal<CallState>;\r\n\r\n return {\r\n [loadingKey]: computed(() => callState() === 'loading'),\r\n [loadedKey]: computed(() => callState() === 'loaded'),\r\n [errorKey]: computed(() => {\r\n const v = callState();\r\n return typeof v === 'object' ? v.error : null;\r\n })\r\n }\r\n })\r\n );\r\n}\r\n\r\nexport function setLoading<Prop extends string>(\r\n prop?: Prop\r\n): NamedCallStateSlice<Prop> | CallStateSlice {\r\n if (prop) {\r\n return { [`${prop}CallState`]: 'loading' } as NamedCallStateSlice<Prop>;\r\n }\r\n\r\n return { callState: 'loading' };\r\n}\r\n\r\nexport function setLoaded<Prop extends string>(\r\n prop?: Prop\r\n): NamedCallStateSlice<Prop> | CallStateSlice {\r\n\r\n if (prop) {\r\n return { [`${prop}CallState`]: 'loaded' } as NamedCallStateSlice<Prop>;\r\n }\r\n else {\r\n return { callState: 'loaded' };\r\n\r\n }\r\n}\r\n\r\nexport function setError<Prop extends string>(\r\n error: unknown,\r\n prop?: Prop,\r\n ): NamedCallStateSlice<Prop> | CallStateSlice {\r\n\r\n let errorMessage = '';\r\n\r\n if (!error) {\r\n errorMessage = '';\r\n }\r\n else if (typeof error === 'object' && 'message' in error) {\r\n errorMessage = String(error.message);\r\n }\r\n else {\r\n errorMessage = String(error);\r\n }\r\n \r\n\r\n if (prop) {\r\n return { [`${prop}CallState`]: { error: errorMessage } } as NamedCallStateSlice<Prop>;\r\n }\r\n else {\r\n return { callState: { error: errorMessage } };\r\n }\r\n}\r\n","import { ProviderToken, Signal, computed, inject } from \"@angular/core\";\r\nimport { SignalStoreFeature, patchState, signalStoreFeature, withComputed, withMethods, withState } from \"@ngrx/signals\";\r\nimport { CallState, getCallStateKeys, setError, setLoaded, setLoading } from \"./with-call-state\";\r\nimport { setAllEntities, EntityId, addEntity, updateEntity, removeEntity } from \"@ngrx/signals/entities\";\r\nimport { EntityState, NamedEntitySignals } from \"@ngrx/signals/entities/src/models\";\r\nimport { StateSignal } from \"@ngrx/signals/src/state-signal\";\r\nimport { Emtpy } from \"./shared/empty\";\r\n\r\nexport type Filter = Record<string, unknown>;\r\nexport type Entity = { id: EntityId };\r\n\r\nexport interface DataService<E extends Entity, F extends Filter> {\r\n load(filter: F): Promise<E[]>;\r\n loadById(id: EntityId): Promise<E>;\r\n create(entity: E): Promise<E>;\r\n update(entity: E): Promise<E>;\r\n updateAll(entity: E[]): Promise<E[]>;\r\n delete(entity: E): Promise<void>;\r\n}\r\n\r\nexport function capitalize(str: string): string {\r\n return str ? str[0].toUpperCase() + str.substring(1) : str;\r\n}\r\n\r\nexport function getDataServiceKeys(options: { collection?: string }) {\r\n const filterKey = options.collection ? `${options.collection}Filter` : 'filter';\r\n const selectedIdsKey = options.collection ? `selected${capitalize(options.collection)}Ids` : 'selectedIds';\r\n const selectedEntitiesKey = options.collection ? `selected${capitalize(options.collection)}Entities` : 'selectedEntities';\r\n\r\n const updateFilterKey = options.collection ? `update${capitalize(options.collection)}Filter` : 'updateFilter';\r\n const updateSelectedKey = options.collection ? `updateSelected${capitalize(options.collection)}Entities` : 'updateSelected';\r\n const loadKey = options.collection ? `load${capitalize(options.collection)}Entities` : 'load';\r\n\r\n const currentKey = options.collection ? `current${capitalize(options.collection)}` : 'current';\r\n const loadByIdKey = options.collection ? `load${capitalize(options.collection)}ById` : 'loadById';\r\n const setCurrentKey = options.collection ? `setCurrent${capitalize(options.collection)}` : 'setCurrent';\r\n const createKey = options.collection ? `create${capitalize(options.collection)}` : 'create';\r\n const updateKey = options.collection ? `update${capitalize(options.collection)}` : 'update';\r\n const updateAllKey = options.collection ? `updateAll${capitalize(options.collection)}` : 'updateAll';\r\n const deleteKey = options.collection ? `delete${capitalize(options.collection)}` : 'delete';\r\n\r\n // TODO: Take these from @ngrx/signals/entities, when they are exported\r\n const entitiesKey = options.collection ? `${options.collection}Entities` : 'entities';\r\n const entityMapKey = options.collection ? `${options.collection}EntityMap` : 'entityMap';\r\n const idsKey = options.collection ? `${options.collection}Ids` : 'ids';\r\n\r\n return {\r\n filterKey,\r\n selectedIdsKey,\r\n selectedEntitiesKey,\r\n updateFilterKey,\r\n updateSelectedKey,\r\n loadKey,\r\n entitiesKey,\r\n entityMapKey,\r\n idsKey,\r\n\r\n currentKey,\r\n loadByIdKey,\r\n setCurrentKey,\r\n createKey,\r\n updateKey,\r\n updateAllKey,\r\n deleteKey\r\n };\r\n}\r\n\r\nexport type NamedDataServiceState<E extends Entity, F extends Filter, Collection extends string> =\r\n {\r\n [K in Collection as `${K}Filter`]: F;\r\n } & {\r\n [K in Collection as `selected${Capitalize<K>}Ids`]: Record<EntityId, boolean>;\r\n } & {\r\n [K in Collection as `current${Capitalize<K>}`]: E;\r\n }\r\n\r\nexport type DataServiceState<E extends Entity, F extends Filter> = {\r\n filter: F;\r\n selectedIds: Record<EntityId, boolean>;\r\n current: E;\r\n}\r\n\r\nexport type NamedDataServiceSignals<E extends Entity, Collection extends string> =\r\n {\r\n [K in Collection as `selected${Capitalize<K>}Entities`]: Signal<E[]>;\r\n }\r\n\r\nexport type DataServiceSignals<E extends Entity> =\r\n {\r\n selectedEntities: Signal<E[]>;\r\n }\r\n\r\nexport type NamedDataServiceMethods<E extends Entity, F extends Filter, Collection extends string> =\r\n {\r\n [K in Collection as `update${Capitalize<K>}Filter`]: (filter: F) => void;\r\n } &\r\n {\r\n [K in Collection as `updateSelected${Capitalize<K>}Entities`]: (id: EntityId, selected: boolean) => void;\r\n } &\r\n {\r\n [K in Collection as `load${Capitalize<K>}Entities`]: () => Promise<void>;\r\n } &\r\n\r\n {\r\n [K in Collection as `setCurrent${Capitalize<K>}`]: (entity: E) => void;\r\n } &\r\n {\r\n [K in Collection as `load${Capitalize<K>}ById`]: (id: EntityId) => Promise<void>;\r\n } &\r\n {\r\n [K in Collection as `create${Capitalize<K>}`]: (entity: E) => Promise<void>;\r\n } &\r\n {\r\n [K in Collection as `update${Capitalize<K>}`]: (entity: E) => Promise<void>;\r\n } &\r\n {\r\n [K in Collection as `updateAll${Capitalize<K>}`]: (entity: E[]) => Promise<void>;\r\n } &\r\n {\r\n [K in Collection as `delete${Capitalize<K>}`]: (entity: E) => Promise<void>;\r\n };\r\n\r\n\r\nexport type DataServiceMethods<E extends Entity, F extends Filter> =\r\n {\r\n updateFilter: (filter: F) => void;\r\n updateSelected: (id: EntityId, selected: boolean) => void;\r\n load: () => Promise<void>;\r\n\r\n setCurrent(entity: E): void;\r\n loadById(id: EntityId): Promise<void>;\r\n create(entity: E): Promise<void>;\r\n update(entity: E): Promise<void>;\r\n updateAll(entities: E[]): Promise<void>;\r\n delete(entity: E): Promise<void>;\r\n }\r\n\r\nexport type Empty = Record<string, never>\r\n\r\nexport function withDataService<E extends Entity, F extends Filter, Collection extends string>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F, collection: Collection }): SignalStoreFeature<\r\n {\r\n state: Emtpy,\r\n // These alternatives break type inference:\r\n // state: { callState: CallState } & NamedEntityState<E, Collection>,\r\n // state: NamedEntityState<E, Collection>,\r\n\r\n signals: NamedEntitySignals<E, Collection>,\r\n methods: Emtpy,\r\n },\r\n {\r\n state: NamedDataServiceState<E, F, Collection>\r\n signals: NamedDataServiceSignals<E, Collection>\r\n methods: NamedDataServiceMethods<E, F, Collection>\r\n }\r\n>;\r\nexport function withDataService<E extends Entity, F extends Filter>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F }): SignalStoreFeature<\r\n {\r\n state: { callState: CallState } & EntityState<E>\r\n signals: Emtpy,\r\n methods: Emtpy,\r\n },\r\n {\r\n state: DataServiceState<E, F>\r\n signals: DataServiceSignals<E>\r\n methods: DataServiceMethods<E, F>\r\n }>;\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function withDataService<E extends Entity, F extends Filter, Collection extends string>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F, collection?: Collection }): SignalStoreFeature<any, any> {\r\n const { dataServiceType, filter, collection: prefix } = options;\r\n const {\r\n entitiesKey,\r\n filterKey,\r\n loadKey,\r\n selectedEntitiesKey,\r\n selectedIdsKey,\r\n updateFilterKey,\r\n updateSelectedKey,\r\n\r\n currentKey,\r\n createKey,\r\n updateKey,\r\n updateAllKey,\r\n deleteKey,\r\n loadByIdKey,\r\n setCurrentKey\r\n } = getDataServiceKeys(options);\r\n\r\n const { callStateKey } = getCallStateKeys({ collection: prefix });\r\n\r\n return signalStoreFeature(\r\n withState(() => ({\r\n [filterKey]: filter,\r\n [selectedIdsKey]: {} as Record<EntityId, boolean>,\r\n [currentKey]: undefined as E | undefined\r\n })),\r\n withComputed((store: Record<string, unknown>) => {\r\n const entities = store[entitiesKey] as Signal<E[]>;\r\n const selectedIds = store[selectedIdsKey] as Signal<Record<EntityId, boolean>>;\r\n\r\n return {\r\n [selectedEntitiesKey]: computed(() => entities().filter(e => selectedIds()[e.id]))\r\n }\r\n }),\r\n withMethods((store: Record<string, unknown> & StateSignal<object>) => {\r\n const dataService = inject(dataServiceType)\r\n return {\r\n [updateFilterKey]: (filter: F): void => {\r\n patchState(store, { [filterKey]: filter });\r\n },\r\n [updateSelectedKey]: (id: EntityId, selected: boolean): void => {\r\n patchState(store, (state: Record<string, unknown>) => ({\r\n [selectedIdsKey]: {\r\n ...state[selectedIdsKey] as Record<EntityId, boolean>,\r\n [id]: selected,\r\n }\r\n }));\r\n },\r\n [loadKey]: async (): Promise<void> => {\r\n const filter = store[filterKey] as Signal<F>;\r\n store[callStateKey] && patchState(store, setLoading(prefix));\r\n\r\n try {\r\n const result = await dataService.load(filter());\r\n patchState(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));\r\n store[callStateKey] && patchState(store, setLoaded(prefix));\r\n }\r\n catch (e) {\r\n store[callStateKey] && patchState(store, setError(e, prefix));\r\n throw e;\r\n }\r\n },\r\n [loadByIdKey]: async (id: EntityId): Promise<void> => {\r\n store[callStateKey] && patchState(store, setLoading(prefix));\r\n\r\n try {\r\n const current = await dataService.loadById(id);\r\n store[callStateKey] && patchState(store, setLoaded(prefix));\r\n patchState(store, { [currentKey]: current });\r\n }\r\n catch (e) {\r\n store[callStateKey] && patchState(store, setError(e, prefix));\r\n throw e;\r\n }\r\n },\r\n [setCurrentKey]: (current: E): void => {\r\n patchState(store, { [currentKey]: current });\r\n },\r\n [createKey]: async (entity: E): Promise<void> => {\r\n patchState(store, { [currentKey]: entity });\r\n store[callStateKey] && patchState(store, setLoading(prefix));\r\n\r\n try {\r\n const created = await dataService.create(entity);\r\n patchState(store, { [currentKey]: created });\r\n patchState(store, prefix ? addEntity(created, { collection: prefix }) : addEntity(created));\r\n store[callStateKey] && patchState(store, setLoaded(prefix));\r\n }\r\n catch (e) {\r\n store[callStateKey] && patchState(store, setError(e, prefix));\r\n throw e;\r\n }\r\n },\r\n [updateKey]: async (entity: E): Promise<void> => {\r\n patchState(store, { [currentKey]: entity });\r\n store[callStateKey] && patchState(store, setLoading(prefix));\r\n\r\n try {\r\n const updated = await dataService.update(entity);\r\n patchState(store, { [currentKey]: updated });\r\n // Why do we need this cast to Partial<Entity>?\r\n const updateArg = { id: updated.id, changes: updated as Partial<Entity> };\r\n patchState(store, prefix ? updateEntity(updateArg, { collection: prefix }) : updateEntity(updateArg));\r\n store[callStateKey] && patchState(store, setLoaded(prefix));\r\n }\r\n catch (e) {\r\n store[callStateKey] && patchState(store, setError(e, prefix));\r\n throw e;\r\n }\r\n },\r\n [updateAllKey]: async (entities: E[]): Promise<void> => {\r\n store[callStateKey] && patchState(store, setLoading(prefix));\r\n\r\n try {\r\n const result = await dataService.updateAll(entities);\r\n patchState(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));\r\n store[callStateKey] && patchState(store, setLoaded(prefix));\r\n }\r\n catch (e) {\r\n store[callStateKey] && patchState(store, setError(e, prefix));\r\n throw e;\r\n }\r\n },\r\n [deleteKey]: async (entity: E): Promise<void> => {\r\n patchState(store, { [currentKey]: entity });\r\n store[callStateKey] && patchState(store, setLoading(prefix));\r\n\r\n try {\r\n await dataService.delete(entity);\r\n patchState(store, { [currentKey]: undefined });\r\n patchState(store, prefix ? removeEntity(entity.id, { collection: prefix }) : removeEntity(entity.id));\r\n store[callStateKey] && patchState(store, setLoaded(prefix));\r\n }\r\n catch (e) {\r\n store[callStateKey] && patchState(store, setError(e, prefix));\r\n throw e;\r\n }\r\n },\r\n };\r\n })\r\n );\r\n}\r\n","import { SignalStoreFeature, patchState, signalStoreFeature, withComputed, withHooks, withMethods } from \"@ngrx/signals\";\r\nimport { EntityId, EntityMap, EntityState } from \"@ngrx/signals/entities\";\r\nimport { Signal, effect, signal, untracked, isSignal } from \"@angular/core\";\r\nimport { EntitySignals, NamedEntitySignals } from \"@ngrx/signals/entities/src/models\";\r\nimport { Entity, capitalize } from \"./with-data-service\";\r\nimport { Emtpy } from \"./shared/empty\";\r\n\r\nexport type StackItem = Record<string, unknown>;\r\n\r\nexport type NormalizedUndoRedoOptions = {\r\n maxStackSize: number;\r\n collections?: string[]\r\n}\r\n\r\nconst defaultOptions: NormalizedUndoRedoOptions = {\r\n maxStackSize: 100\r\n};\r\n\r\nexport type NamedUndoRedoState<Collection extends string> = {\r\n [K in Collection as `${K}EntityMap`]: EntityMap<Entity>;\r\n} & {\r\n [K in Collection as `${K}Ids`]: EntityId[];\r\n }\r\n\r\nexport type NamedUndoRedoSignals<Collection extends string> = {\r\n [K in Collection as `${K}Entities`]: Signal<Entity[]>\r\n}\r\n\r\nexport function getUndoRedoKeys(collections?: string[]): string[] {\r\n if (collections) {\r\n return collections.flatMap(c => [`${c}EntityMap`, `${c}Ids`, `selected${capitalize(c)}Ids`, `${c}Filter`])\r\n }\r\n return ['entityMap', 'ids', 'selectedIds', 'filter'];\r\n}\r\n\r\nexport function withUndoRedo<Collection extends string>(options?: { maxStackSize?: number; collections: Collection[] }): SignalStoreFeature<\r\n {\r\n state: Emtpy,\r\n // This alternative breaks type inference:\r\n // state: NamedEntityState<Entity, Collection>\r\n signals: NamedEntitySignals<Entity, Collection>,\r\n methods: Emtpy\r\n },\r\n {\r\n state: Emtpy,\r\n signals: {\r\n canUndo: Signal<boolean>,\r\n canRedo: Signal<boolean>\r\n },\r\n methods: {\r\n undo: () => void,\r\n redo: () => void\r\n }\r\n }>;\r\n\r\nexport function withUndoRedo(options?: { maxStackSize?: number }): SignalStoreFeature<\r\n {\r\n state: EntityState<Entity>,\r\n signals: EntitySignals<Entity>,\r\n methods: Emtpy\r\n },\r\n {\r\n state: Emtpy,\r\n signals: {\r\n canUndo: Signal<boolean>,\r\n canRedo: Signal<boolean>\r\n },\r\n methods: {\r\n undo: () => void,\r\n redo: () => void\r\n }\r\n }>;\r\n\r\nexport function withUndoRedo<Collection extends string>(options: {\r\n maxStackSize?: number;\r\n collections?: Collection[]\r\n} = {}): \r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nSignalStoreFeature<any, any> {\r\n let previous: StackItem | null = null;\r\n let skipOnce = false;\r\n\r\n const normalized = {\r\n ...defaultOptions,\r\n ...options\r\n };\r\n\r\n //\r\n // Design Decision: This feature has its own\r\n // internal state.\r\n //\r\n\r\n const undoStack: StackItem[] = [];\r\n const redoStack: StackItem[] = [];\r\n\r\n const canUndo = signal(false);\r\n const canRedo = signal(false);\r\n\r\n const updateInternal = () => {\r\n canUndo.set(undoStack.length !== 0);\r\n canRedo.set(redoStack.length !== 0);\r\n };\r\n\r\n const keys = getUndoRedoKeys(normalized?.collections);\r\n\r\n return signalStoreFeature(\r\n\r\n withComputed(() => ({\r\n canUndo: canUndo.asReadonly(),\r\n canRedo: canRedo.asReadonly()\r\n })),\r\n withMethods((store) => ({\r\n undo(): void {\r\n const item = undoStack.pop();\r\n\r\n if (item && previous) {\r\n redoStack.push(previous);\r\n }\r\n\r\n if (item) {\r\n skipOnce = true;\r\n patchState(store, item);\r\n previous = item;\r\n }\r\n\r\n updateInternal();\r\n },\r\n redo(): void {\r\n const item = redoStack.pop();\r\n\r\n if (item && previous) {\r\n undoStack.push(previous);\r\n }\r\n\r\n if (item) {\r\n skipOnce = true;\r\n patchState(store, item);\r\n previous = item;\r\n }\r\n\r\n updateInternal();\r\n }\r\n })),\r\n withHooks({\r\n onInit(store: Record<string, unknown>) {\r\n effect(() => {\r\n\r\n const cand = keys.reduce((acc, key) => {\r\n const s = store[key];\r\n if (s && isSignal(s)) {\r\n return {\r\n ...acc,\r\n [key]: s()\r\n }\r\n }\r\n return acc;\r\n }, {});\r\n\r\n if (skipOnce) {\r\n skipOnce = false;\r\n return;\r\n }\r\n\r\n // Clear redoStack after recorded action\r\n redoStack.splice(0);\r\n\r\n if (previous) {\r\n undoStack.push(previous);\r\n }\r\n\r\n if (redoStack.length > normalized.maxStackSize) {\r\n undoStack.unshift();\r\n }\r\n\r\n previous = cand;\r\n\r\n // Don't propogate current reactive context\r\n untracked(() => updateInternal());\r\n })\r\n }\r\n })\r\n\r\n )\r\n}\r\n","import { Action } from '@ngrx/store';\r\nimport { Unsubscribable } from 'rxjs';\r\n\r\n\r\nexport function isUnsubscribable<F extends (...args: unknown[]) => unknown>(\r\n fn: F | (F & Unsubscribable)\r\n): fn is F & Unsubscribable {\r\n return !!(fn as any as F & Unsubscribable)?.unsubscribe;\r\n}\r\n\r\nexport function capitalize(str: string): string {\r\n return str ? str[0].toUpperCase() + str.substring(1) : str;\r\n}\r\n\r\nexport function isActionCreator(action: any): action is Action {\r\n return (\r\n typeof action === 'function' &&\r\n action &&\r\n action.type &&\r\n typeof action.type === 'string'\r\n );\r\n}\r\n","import { Injectable, inject } from \"@angular/core\";\r\nimport { rxMethod } from \"@ngrx/signals/rxjs-interop\";\r\nimport { Action, ActionCreator } from \"@ngrx/store\";\r\nimport { pipe, tap } from \"rxjs\";\r\nimport { MapperTypes } from \"./model\";\r\nimport { isUnsubscribable } from \"./util\";\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SignalReduxStore {\r\n private mapperDict: Record<string, {\r\n storeMethod: (...args: unknown[]) => unknown,\r\n resultMethod?: (...args: unknown[]) => unknown,\r\n }> = {};\r\n\r\n dispatch = rxMethod<Action>(pipe(\r\n tap((action: Action) => {\r\n const callbacks = this.mapperDict[action.type];\r\n if (callbacks?.storeMethod) {\r\n if (\r\n isUnsubscribable(callbacks.storeMethod) &&\r\n callbacks.resultMethod\r\n ) {\r\n return callbacks.storeMethod(action, (a: Action) => {\r\n const resultAction = callbacks.resultMethod?.(a) as Action;\r\n this.dispatch(resultAction);\r\n });\r\n }\r\n\r\n return callbacks?.storeMethod(action);\r\n }\r\n\r\n return;\r\n })\r\n ));\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n connectFeatureStore(mappers: MapperTypes<ActionCreator<any, any>[]>[]): void {\r\n mappers.forEach(\r\n mapper => mapper.types.forEach(\r\n action => this.mapperDict[action] = {\r\n storeMethod: mapper.storeMethod,\r\n resultMethod: mapper.resultMethod\r\n }\r\n )\r\n );\r\n }\r\n}\r\n\r\nexport function injectReduxDispatch() {\r\n return inject(SignalReduxStore).dispatch;\r\n}\r\n","import { ENVIRONMENT_INITIALIZER, inject, makeEnvironmentProviders } from \"@angular/core\";\r\nimport { ActionCreator, ActionType } from \"@ngrx/store/src/models\";\r\nimport { CreateReduxState, ExtractActionTypes, MapperTypes, Store } from \"./model\";\r\nimport { SignalReduxStore, injectReduxDispatch } from \"./signal-redux-store\";\r\nimport { capitalize, isActionCreator } from \"./util\";\r\n\r\n\r\nexport function mapAction<\r\n Creators extends readonly ActionCreator[]\r\n>(\r\n ...args: [\r\n ...creators: Creators,\r\n storeMethod: (action: ActionType<Creators[number]>) => unknown\r\n ]\r\n): MapperTypes<Creators>;\r\nexport function mapAction<\r\n Creators extends readonly ActionCreator[],\r\n T\r\n>(\r\n ...args: [\r\n ...creators: Creators,\r\n storeMethod: (action: ActionType<Creators[number]>, resultMethod: (input: T) => unknown) => unknown,\r\n resultMethod: (input: T) => unknown\r\n ]\r\n): MapperTypes<Creators>;\r\nexport function mapAction<\r\n Creators extends readonly ActionCreator[]\r\n>(\r\n ...args: [\r\n ...creators: Creators,\r\n storeMethod: (action: ActionType<Creators[number]>) => unknown,\r\n resultMethod?: (input: unknown) => unknown\r\n ]\r\n): MapperTypes<Creators> {\r\n let resultMethod = args.pop() as unknown as ((input: unknown) => unknown ) | undefined;\r\n let storeMethod = args.pop() as unknown as (action: ActionType<Creators[number]>) => unknown;\r\n\r\n if (isActionCreator(storeMethod)) {\r\n args.push(storeMethod);\r\n storeMethod = resultMethod || storeMethod;\r\n resultMethod = undefined;\r\n }\r\n\r\n const types = (args as unknown as Creators).map(\r\n (creator) => creator.type\r\n ) as unknown as ExtractActionTypes<Creators>;\r\n\r\n return {\r\n types,\r\n storeMethod,\r\n resultMethod\r\n };\r\n}\r\n\r\nexport function withActionMappers(\r\n ...mappers: MapperTypes<ActionCreator<any, any>[]>[]\r\n): MapperTypes<ActionCreator<any, any>[]>[] {\r\n return mappers;\r\n}\r\n\r\nexport function createReduxState<\r\n StoreName extends string,\r\n STORE extends Store\r\n>(\r\n storeName: StoreName,\r\n signalStore: STORE,\r\n withActionMappers: (store: InstanceType<STORE>) => MapperTypes<ActionCreator<any, any>[]>[],\r\n): CreateReduxState<StoreName, STORE> {\r\n const isRootProvider = (signalStore as any)?.ɵprov?.providedIn === 'root';\r\n return {\r\n [`provide${capitalize(storeName)}Store`]: (connectReduxDevtools = false) => makeEnvironmentProviders([\r\n isRootProvider? [] : signalStore,\r\n {\r\n provide: ENVIRONMENT_INITIALIZER,\r\n multi: true,\r\n useFactory: (\r\n signalReduxStore = inject(SignalReduxStore),\r\n store = inject(signalStore)\r\n ) => () => {\r\n if (connectReduxDevtools) {\r\n // addStoreToReduxDevtools(store, storeName, false);\r\n }\r\n signalReduxStore.connectFeatureStore(\r\n withActionMappers(store)\r\n );\r\n }\r\n }\r\n ]),\r\n [`inject${capitalize(storeName)}Store`]: () => Object.assign(\r\n inject(signalStore),\r\n { dispatch: injectReduxDispatch() }\r\n )\r\n } as CreateReduxState<StoreName, STORE>;\r\n}\r\n","import { Injector, Signal, inject } from \"@angular/core\";\r\nimport { rxMethod } from \"@ngrx/signals/rxjs-interop\";\r\nimport { Observable, Unsubscribable, map, pipe } from \"rxjs\";\r\n\r\n\r\ntype RxMethodInput<Input> = Input | Observable<Input> | Signal<Input>;\r\n\r\ntype RxMethod<Input, MethodInput = Input, MethodResult = unknown> = ((\r\n input: RxMethodInput<Input>,\r\n resultMethod: (input: MethodInput) => MethodResult\r\n) => Unsubscribable) & Unsubscribable;\r\n\r\nexport function reduxMethod<Input, MethodInput = Input>(\r\n generator: (source$: Observable<Input>) => Observable<MethodInput>,\r\n config?: { injector?: Injector }\r\n): RxMethod<Input, MethodInput>;\r\nexport function reduxMethod<Input, MethodInput = Input, MethodResult = unknown>(\r\n generator: (source$: Observable<Input>) => Observable<MethodInput>,\r\n resultMethod: (input: MethodInput) => MethodResult,\r\n config?: {\r\n injector?: Injector\r\n }\r\n): RxMethod<Input, MethodInput, MethodResult>;\r\nexport function reduxMethod<Input, MethodInput = Input, MethodResult = unknown>(\r\n generator: (source$: Observable<Input>) => Observable<MethodInput>,\r\n resultMethodOrConfig?: ((input: MethodInput) => MethodResult) | {\r\n injector?: Injector\r\n },\r\n config?: {\r\n injector?: Injector\r\n }\r\n): RxMethod<Input, MethodInput, MethodResult> {\r\n const injector = inject(Injector);\r\n\r\n if (typeof resultMethodOrConfig === 'function') {\r\n let unsubscribable: Unsubscribable;\r\n const inputResultFn = ((\r\n input: RxMethodInput<Input>,\r\n resultMethod = resultMethodOrConfig\r\n ) => {\r\n\r\n const rxMethodWithResult = rxMethod<Input>(pipe(\r\n generator,\r\n map(resultMethod)\r\n ), {\r\n ...(config || {}),\r\n injector: config?.injector || injector\r\n });\r\n const rxWithInput = rxMethodWithResult(input);\r\n unsubscribable = { unsubscribe: rxWithInput.unsubscribe.bind(rxWithInput) };\r\n\r\n return rxWithInput;\r\n }) as RxMethod<Input, MethodInput, MethodResult>;\r\n\r\n inputResultFn.unsubscribe = () => unsubscribable?.unsubscribe();\r\n\r\n return inputResultFn;\r\n }\r\n\r\n return rxMethod<Input>(generator, resultMethodOrConfig);\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["originalPatchState","capitalize","patchState"],"mappings":";;;;;;;;AAuBA,MAAM,aAAa,GAAG,MAAM,CAAkC,EAAE,CAAC,CAAC;AAElE,IAAI,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE3C,IAAI,0BAA0B,GAAG,KAAK,CAAC;AAEvC,SAAS,mBAAmB,GAAA;IAC1B,MAAM,CAAC,MAAK;QACV,IAAI,CAAC,UAAU,EAAE;YACf,OAAO;AACR,SAAA;AAED,QAAA,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,SAAS,GAA4B,EAAE,CAAC;AAC9C,QAAA,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;AACzB,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AAC3B,YAAA,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;AAC3B,SAAA;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAC7C,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC;AAC9D,QAAA,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;QAEvC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;AACvC,KAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAY,EAAE,MAAc,EAAA;IACtD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE;AACnD,QAAA,OAAQ,GAA8B,CAAC,MAAM,CAAC,CAAC;AAChD,KAAA;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAA;IACpC,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,CAAC,cAAc,EAAE;AACnB,QAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAC7C,KAAA;AAED,IAAA,OAAO,kBAAkB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AACnD,CAAC;AAKD,IAAI,UAAuC,CAAC;AAE5C;;AAEG;SACa,KAAK,GAAA;IACnB,UAAU,GAAG,SAAS,CAAC;IACvB,0BAA0B,GAAG,KAAK,CAAC;AACnC,IAAA,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;AAEG;AACG,SAAU,YAAY,CAC1B,IAAY,EAAA;IAEZ,OAAO,CAAC,KAAK,KAAI;QACf,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AACvD,QAAA,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;AAED,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,4BAA4B,CAAC;QACvD,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;QAED,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC;AAC9B,gBAAA,IAAI,EAAE,mBAAmB;AAC1B,aAAA,CAAC,CAAC;AACJ,SAAA;AAED,QAAA,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1C,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM;AAC/B,YAAA,GAAG,KAAK;YACR,CAAC,IAAI,GAAG,WAAW;AACpB,SAAA,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,0BAA0B,EAAE;AAC/B,YAAA,mBAAmB,EAAE,CAAC;YACtB,0BAA0B,GAAG,IAAI,CAAC;AACnC,SAAA;AAED,QAAA,OAAO,KAAK,CAAC;AACf,KAAC,CAAC;AACJ,CAAC;AASM,MAAM,UAAU,GAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,KAAI;AAC5D,IAAA,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC/B,IAAA,OAAOA,YAAkB,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;AAC5C;;AC7HM,SAAU,mBAAmB,CACjC,GAAY,EAAA;AAEZ,IAAA,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AACnC,QAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACtD,KAAA;AACH;;SCwCgB,OAAO,GAAA;AACrB,IAAA,OAAO,EAAU,CAAC;AACpB,CAAC;AAEM,MAAM,SAAS,GAAG,GAAG;AA0B5B,SAAS,eAAe,CACtB,aAAmB,EACnB,eAGC,EACD,eAAkE,EAClE,KAAc,EAAA;IAEd,MAAM,SAAS,GAA6B,EAAE,CAAC;AAE/C,IAAA,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;AAChC,QAAA,MAAM,QAAQ,GAAG,CAAC,OAAgB,KAAI;YACpC,MAAM,WAAW,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;AACzC,YAAA,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;AACtC,YAAA,IAAI,OAAO,EAAE;AACV,gBAAA,OAAsD,CACrD,WAAsB,EACtB,KAAK,CACN,CAAC;AACH,aAAA;AACD,YAAA,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;AAC5C,YAAA,IAAI,aAAa,EAAE;AAChB,gBAAA,aAA6C,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAClE,aAAA;AACD,YAAA,OAAO,WAAW,CAAC;AACrB,SAAC,CAAC;AACF,QAAA,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAChC,QAAA,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;AAC5B,KAAA;AAED,IAAA,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,4BAA4B,CACnC,aAAmB,EACnB,eAGC,EACD,eAAkE,EAClE,KAAc,EAAA;AAEd,IAAA,IAAI,QAAQ,IAAI,aAAa,IAAI,SAAS,IAAI,aAAa,EAAE;QAC3D,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAE9C,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAE7B,QAAA,MAAM,gBAAgB,GAAG,eAAe,CACtC,QAAQ,EACR,eAAe,EACf,eAAe,EACf,KAAK,CACN,CAAC;AACF,QAAA,MAAM,eAAe,GAAG,eAAe,CACrC,OAAO,EACP,eAAe,EACf,eAAe,EACf,KAAK,CACN,CAAC;QAEF,OAAO;AACL,YAAA,GAAG,EAAE,EAAE,GAAG,gBAAgB,EAAE,GAAG,eAAe,EAAE;AAChD,YAAA,OAAO,EAAE,eAAe;SACzB,CAAC;AACH,KAAA;AAED,IAAA,MAAM,SAAS,GAAG,eAAe,CAC/B,aAAa,EACb,eAAe,EACf,eAAe,EACf,KAAK,CACN,CAAC;IAEF,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAA2C,EAC3C,SAAoB,EACpB,eAGC,EAAA;AAED,IAAA,SAAS,EAAE,CACT,MAAwB,EACxB,SAAsE,EAAA;AAEtE,QAAA,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;KAC1C;AAED,IAAA,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAEvB,IAAA,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAClB,OAAkC,EAClC,SAAoB,EACpB,kBAAqE,EAAE,EAAA;IAEvE,SAAS,MAAM,CAAC,MAAwB,EAAA;AACtC,QAAA,MAAM,OAAO,GAAG,IAAI,OAAO,EAA4B,CAAC;AACxD,QAAA,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;AACvC,QAAA,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;KAC/B;IAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACrD,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAkC,EAAA;AAC5D,IAAA,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,YAAY,CACnB,aAAmB,EACnB,OAA2C,EAC3C,OAAkC,EAClC,KAAc,EAAA;IAEd,MAAM,eAAe,GAGjB,EAAE,CAAC;IACP,MAAM,eAAe,GAAsD,EAAE,CAAC;AAC9E,IAAA,MAAM,UAAU,GAAG,4BAA4B,CAC7C,aAAa,EACb,eAAe,EACf,eAAe,EACf,KAAK,CACN,CAAC;AACF,IAAA,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC;AACjC,IAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC;AAE5C,IAAA,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IACzD,MAAM,iBAAiB,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAC3E,IAAA,MAAM,aAAa,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAE5D,OAAO;AACL,QAAA,OAAO,EAAE,gBAA8B;AACvC,QAAA,aAAa,EAAE,aAAa;KAC7B,CAAC;AACJ,CAAC;AAED;;;;;;;;;AASG;AACG,SAAU,SAAS,CAKvB,KAID,EAAA;IAIC,OAAO,CAAC,KAAK,KAAI;QACf,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,YAAY,CAC7C,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,OAA6C,EACnD,KAAK,CAAC,OAAoC,EAC1C,KAAK,CACN,CAAC;QACF,OAAO;AACL,YAAA,GAAG,KAAK;YACR,OAAO;SACR,CAAC;AACJ,KAAC,CAAC;AACJ;;ACpOM,SAAU,gBAAgB,CAAC,MAAgC,EAAA;AAC/D,IAAA,MAAM,IAAI,GAAG,MAAM,EAAE,UAAU,CAAC;IAChC,OAAO;AACL,QAAA,YAAY,EAAE,IAAI,GAAI,CAAA,EAAG,MAAM,CAAC,UAAU,CAAA,SAAA,CAAW,GAAG,WAAW;AACnE,QAAA,UAAU,EAAE,IAAI,GAAG,CAAA,EAAG,MAAM,CAAC,UAAU,CAAA,OAAA,CAAS,GAAG,SAAS;AAC5D,QAAA,SAAS,EAAE,IAAI,GAAG,CAAA,EAAG,MAAM,CAAC,UAAU,CAAA,MAAA,CAAQ,GAAG,QAAQ;AACzD,QAAA,QAAQ,EAAE,IAAI,GAAG,CAAA,EAAG,MAAM,CAAC,UAAU,CAAA,KAAA,CAAO,GAAG,OAAO;KACvD,CAAC;AACJ,CAAC;AAoBK,SAAU,aAAa,CAA4B,MAExD,EAAA;AACC,IAAA,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,GACrD,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAE3B,IAAA,OAAO,kBAAkB,CACvB,SAAS,CAAC,EAAE,CAAC,YAAY,GAAG,MAAM,EAAE,CAAC,EACrC,YAAY,CAAC,CAAC,KAAsC,KAAI;AAEtD,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAsB,CAAC;QAE3D,OAAO;AACL,YAAA,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,SAAS,EAAE,KAAK,SAAS,CAAC;AACvD,YAAA,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,SAAS,EAAE,KAAK,QAAQ,CAAC;AACrD,YAAA,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAK;AACxB,gBAAA,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;AACtB,gBAAA,OAAO,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;AAChD,aAAC,CAAC;SACH,CAAA;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAEK,SAAU,UAAU,CACxB,IAAW,EAAA;AAEX,IAAA,IAAI,IAAI,EAAE;QACR,OAAO,EAAE,CAAC,CAAG,EAAA,IAAI,WAAW,GAAG,SAAS,EAA+B,CAAC;AACzE,KAAA;AAED,IAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC;AAEK,SAAU,SAAS,CACvB,IAAW,EAAA;AAGX,IAAA,IAAI,IAAI,EAAE;QACR,OAAO,EAAE,CAAC,CAAG,EAAA,IAAI,WAAW,GAAG,QAAQ,EAA+B,CAAC;AACxE,KAAA;AACI,SAAA;AACH,QAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAEhC,KAAA;AACH,CAAC;AAEe,SAAA,QAAQ,CACtB,KAAc,EACd,IAAW,EAAA;IAGT,IAAI,YAAY,GAAG,EAAE,CAAC;IAEtB,IAAI,CAAC,KAAK,EAAE;QACV,YAAY,GAAG,EAAE,CAAC;AACnB,KAAA;SACI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE;AACxD,QAAA,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACtC,KAAA;AACI,SAAA;AACH,QAAA,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,KAAA;AAGD,IAAA,IAAI,IAAI,EAAE;AACR,QAAA,OAAO,EAAE,CAAC,CAAG,EAAA,IAAI,CAAW,SAAA,CAAA,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,EAA+B,CAAC;AACvF,KAAA;AACI,SAAA;QACH,OAAO,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC;AAC/C,KAAA;AACL;;AChHM,SAAUC,YAAU,CAAC,GAAW,EAAA;IAClC,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAC/D,CAAC;AAEK,SAAU,kBAAkB,CAAC,OAAgC,EAAA;AAC/D,IAAA,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,CAAG,EAAA,OAAO,CAAC,UAAU,CAAA,MAAA,CAAQ,GAAG,QAAQ,CAAC;IAChF,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,GAAG,CAAW,QAAA,EAAAA,YAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA,GAAA,CAAK,GAAG,aAAa,CAAC;IAC3G,MAAM,mBAAmB,GAAG,OAAO,CAAC,UAAU,GAAG,CAAW,QAAA,EAAAA,YAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA,QAAA,CAAU,GAAG,kBAAkB,CAAC;IAE1H,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,GAAG,CAAS,MAAA,EAAAA,YAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA,MAAA,CAAQ,GAAG,cAAc,CAAC;IAC9G,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,GAAG,CAAiB,cAAA,EAAAA,YAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA,QAAA,CAAU,GAAG,gBAAgB,CAAC;IAC5H,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,GAAG,CAAO,IAAA,EAAAA,YAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA,QAAA,CAAU,GAAG,MAAM,CAAC;IAE9F,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,CAAU,OAAA,EAAAA,YAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA,CAAE,GAAG,SAAS,CAAC;IAC/F,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,CAAO,IAAA,EAAAA,YAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA,IAAA,CAAM,GAAG,UAAU,CAAC;IAClG,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,GAAG,CAAa,UAAA,EAAAA,YAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA,CAAE,GAAG,YAAY,CAAC;IACxG,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,CAAS,MAAA,EAAAA,YAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA,CAAE,GAAG,QAAQ,CAAC;IAC5F,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,CAAS,MAAA,EAAAA,YAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA,CAAE,GAAG,QAAQ,CAAC;IAC5F,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,GAAG,CAAY,SAAA,EAAAA,YAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA,CAAE,GAAG,WAAW,CAAC;IACrG,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,CAAS,MAAA,EAAAA,YAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA,CAAE,GAAG,QAAQ,CAAC;;AAG5F,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,CAAG,EAAA,OAAO,CAAC,UAAU,CAAA,QAAA,CAAU,GAAG,UAAU,CAAC;AACtF,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,GAAG,CAAG,EAAA,OAAO,CAAC,UAAU,CAAA,SAAA,CAAW,GAAG,WAAW,CAAC;AACzF,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,CAAG,EAAA,OAAO,CAAC,UAAU,CAAA,GAAA,CAAK,GAAG,KAAK,CAAC;IAEvE,OAAO;QACH,SAAS;QACT,cAAc;QACd,mBAAmB;QACnB,eAAe;QACf,iBAAiB;QACjB,OAAO;QACP,WAAW;QACX,YAAY;QACZ,MAAM;QAEN,UAAU;QACV,WAAW;QACX,aAAa;QACb,SAAS;QACT,SAAS;QACT,YAAY;QACZ,SAAS;KACZ,CAAC;AACN,CAAC;AAsGD;AACM,SAAU,eAAe,CAAgE,OAAkG,EAAA;IAC7L,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;AAChE,IAAA,MAAM,EACF,WAAW,EACX,SAAS,EACT,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,iBAAiB,EAEjB,UAAU,EACV,SAAS,EACT,SAAS,EACT,YAAY,EACZ,SAAS,EACT,WAAW,EACX,aAAa,EAChB,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAEhC,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,gBAAgB,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;AAElE,IAAA,OAAO,kBAAkB,CACrB,SAAS,CAAC,OAAO;QACb,CAAC,SAAS,GAAG,MAAM;QACnB,CAAC,cAAc,GAAG,EAA+B;QACjD,CAAC,UAAU,GAAG,SAA0B;AAC3C,KAAA,CAAC,CAAC,EACH,YAAY,CAAC,CAAC,KAA8B,KAAI;AAC5C,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAgB,CAAC;AACnD,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAsC,CAAC;QAE/E,OAAO;YACH,CAAC,mBAAmB,GAAG,QAAQ,CAAC,MAAM,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACrF,CAAA;AACL,KAAC,CAAC,EACF,WAAW,CAAC,CAAC,KAAoD,KAAI;AACjE,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC,CAAA;QAC3C,OAAO;AACH,YAAA,CAAC,eAAe,GAAG,CAAC,MAAS,KAAU;gBACnCC,YAAU,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC,CAAC;aAC9C;YACD,CAAC,iBAAiB,GAAG,CAAC,EAAY,EAAE,QAAiB,KAAU;gBAC3DA,YAAU,CAAC,KAAK,EAAE,CAAC,KAA8B,MAAM;oBACnD,CAAC,cAAc,GAAG;wBACd,GAAG,KAAK,CAAC,cAAc,CAA8B;wBACrD,CAAC,EAAE,GAAG,QAAQ;AACjB,qBAAA;AACJ,iBAAA,CAAC,CAAC,CAAC;aACP;AACD,YAAA,CAAC,OAAO,GAAG,YAA0B;AACjC,gBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAc,CAAC;AAC7C,gBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBAE7D,IAAI;oBACA,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;oBAChDA,YAAU,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;AACpG,oBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/D,iBAAA;AACD,gBAAA,OAAO,CAAC,EAAE;AACN,oBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9D,oBAAA,MAAM,CAAC,CAAC;AACX,iBAAA;aACJ;AACD,YAAA,CAAC,WAAW,GAAG,OAAO,EAAY,KAAmB;AACjD,gBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBAE7D,IAAI;oBACA,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC/C,oBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC5DA,YAAU,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,EAAE,CAAC,CAAC;AAChD,iBAAA;AACD,gBAAA,OAAO,CAAC,EAAE;AACN,oBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9D,oBAAA,MAAM,CAAC,CAAC;AACX,iBAAA;aACJ;AACD,YAAA,CAAC,aAAa,GAAG,CAAC,OAAU,KAAU;gBAClCA,YAAU,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,EAAE,CAAC,CAAC;aAChD;AACD,YAAA,CAAC,SAAS,GAAG,OAAO,MAAS,KAAmB;gBAC5CA,YAAU,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,GAAG,MAAM,EAAE,CAAC,CAAC;AAC5C,gBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBAE7D,IAAI;oBACA,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACjDA,YAAU,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,EAAE,CAAC,CAAC;oBAC7CA,YAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5F,oBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/D,iBAAA;AACD,gBAAA,OAAO,CAAC,EAAE;AACN,oBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9D,oBAAA,MAAM,CAAC,CAAC;AACX,iBAAA;aACJ;AACD,YAAA,CAAC,SAAS,GAAG,OAAO,MAAS,KAAmB;gBAC5CA,YAAU,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,GAAG,MAAM,EAAE,CAAC,CAAC;AAC5C,gBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBAE7D,IAAI;oBACA,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACjDA,YAAU,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,EAAE,CAAC,CAAC;;AAE7C,oBAAA,MAAM,SAAS,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAA0B,EAAE,CAAC;oBAC1EA,YAAU,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;AACtG,oBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/D,iBAAA;AACD,gBAAA,OAAO,CAAC,EAAE;AACN,oBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9D,oBAAA,MAAM,CAAC,CAAC;AACX,iBAAA;aACJ;AACD,YAAA,CAAC,YAAY,GAAG,OAAO,QAAa,KAAmB;AACrD,gBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBAE7D,IAAI;oBACF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;oBACrDA,YAAU,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;AACpG,oBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7D,iBAAA;AACD,gBAAA,OAAO,CAAC,EAAE;AACR,oBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9D,oBAAA,MAAM,CAAC,CAAC;AACT,iBAAA;aACF;AACD,YAAA,CAAC,SAAS,GAAG,OAAO,MAAS,KAAmB;gBAC5CA,YAAU,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,GAAG,MAAM,EAAE,CAAC,CAAC;AAC5C,gBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBAE7D,IAAI;AACA,oBAAA,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACjCA,YAAU,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,GAAG,SAAS,EAAE,CAAC,CAAC;AAC/C,oBAAAA,YAAU,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AACtG,oBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/D,iBAAA;AACD,gBAAA,OAAO,CAAC,EAAE;AACN,oBAAA,KAAK,CAAC,YAAY,CAAC,IAAIA,YAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9D,oBAAA,MAAM,CAAC,CAAC;AACX,iBAAA;aACJ;SACJ,CAAC;KACL,CAAC,CACL,CAAC;AACN;;ACzSA,MAAM,cAAc,GAA8B;AAC9C,IAAA,YAAY,EAAE,GAAG;CACpB,CAAC;AAYI,SAAU,eAAe,CAAC,WAAsB,EAAA;AAClD,IAAA,IAAI,WAAW,EAAE;AACb,QAAA,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAA,EAAG,CAAC,CAAA,SAAA,CAAW,EAAE,CAAA,EAAG,CAAC,CAAA,GAAA,CAAK,EAAE,CAAA,QAAA,EAAWD,YAAU,CAAC,CAAC,CAAC,CAAK,GAAA,CAAA,EAAE,CAAG,EAAA,CAAC,CAAQ,MAAA,CAAA,CAAC,CAAC,CAAA;AAC7G,KAAA;IACD,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC;AAwCe,SAAA,YAAY,CAA4B,OAAA,GAGpD,EAAE,EAAA;IAGF,IAAI,QAAQ,GAAqB,IAAI,CAAC;IACtC,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,IAAA,MAAM,UAAU,GAAG;AACf,QAAA,GAAG,cAAc;AACjB,QAAA,GAAG,OAAO;KACb,CAAC;;;;;IAOF,MAAM,SAAS,GAAgB,EAAE,CAAC;IAClC,MAAM,SAAS,GAAgB,EAAE,CAAC;AAElC,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE9B,MAAM,cAAc,GAAG,MAAK;QACxB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;AACxC,KAAC,CAAC;IAEF,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAEtD,IAAA,OAAO,kBAAkB,CAErB,YAAY,CAAC,OAAO;AAChB,QAAA,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;AAC7B,QAAA,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;KAChC,CAAC,CAAC,EACH,WAAW,CAAC,CAAC,KAAK,MAAM;QACpB,IAAI,GAAA;AACA,YAAA,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC;YAE7B,IAAI,IAAI,IAAI,QAAQ,EAAE;AAClB,gBAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC5B,aAAA;AAED,YAAA,IAAI,IAAI,EAAE;gBACN,QAAQ,GAAG,IAAI,CAAC;AAChB,gBAAAC,YAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBACxB,QAAQ,GAAG,IAAI,CAAC;AACnB,aAAA;AAED,YAAA,cAAc,EAAE,CAAC;SACpB;QACD,IAAI,GAAA;AACA,YAAA,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC;YAE7B,IAAI,IAAI,IAAI,QAAQ,EAAE;AAClB,gBAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC5B,aAAA;AAED,YAAA,IAAI,IAAI,EAAE;gBACN,QAAQ,GAAG,IAAI,CAAC;AAChB,gBAAAA,YAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBACxB,QAAQ,GAAG,IAAI,CAAC;AACnB,aAAA;AAED,YAAA,cAAc,EAAE,CAAC;SACpB;KACJ,CAAC,CAAC,EACH,SAAS,CAAC;AACN,QAAA,MAAM,CAAC,KAA8B,EAAA;YACjC,MAAM,CAAC,MAAK;gBAER,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAI;AAClC,oBAAA,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AACrB,oBAAA,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE;wBAClB,OAAO;AACH,4BAAA,GAAG,GAAG;AACN,4BAAA,CAAC,GAAG,GAAG,CAAC,EAAE;yBACb,CAAA;AACJ,qBAAA;AACD,oBAAA,OAAO,GAAG,CAAC;iBACd,EAAE,EAAE,CAAC,CAAC;AAEP,gBAAA,IAAI,QAAQ,EAAE;oBACV,QAAQ,GAAG,KAAK,CAAC;oBACjB,OAAO;AACV,iBAAA;;AAGD,gBAAA,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAEpB,gBAAA,IAAI,QAAQ,EAAE;AACV,oBAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC5B,iBAAA;AAED,gBAAA,IAAI,SAAS,CAAC,MAAM,GAAG,UAAU,CAAC,YAAY,EAAE;oBAC5C,SAAS,CAAC,OAAO,EAAE,CAAC;AACvB,iBAAA;gBAED,QAAQ,GAAG,IAAI,CAAC;;AAGhB,gBAAA,SAAS,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC;AACtC,aAAC,CAAC,CAAA;SACL;AACJ,KAAA,CAAC,CAEL,CAAA;AACL;;ACnLM,SAAU,gBAAgB,CAC9B,EAA4B,EAAA;AAE5B,IAAA,OAAO,CAAC,CAAE,EAAgC,EAAE,WAAW,CAAC;AAC1D,CAAC;AAEK,SAAU,UAAU,CAAC,GAAW,EAAA;IACpC,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAC7D,CAAC;AAEK,SAAU,eAAe,CAAC,MAAW,EAAA;AACzC,IAAA,QACE,OAAO,MAAM,KAAK,UAAU;QAC5B,MAAM;AACN,QAAA,MAAM,CAAC,IAAI;AACX,QAAA,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAC/B;AACJ;;MCVa,gBAAgB,CAAA;AAH7B,IAAA,WAAA,GAAA;QAIU,IAAU,CAAA,UAAA,GAGb,EAAE,CAAC;QAER,IAAQ,CAAA,QAAA,GAAG,QAAQ,CAAS,IAAI,CAC9B,GAAG,CAAC,CAAC,MAAc,KAAI;YACrB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,SAAS,EAAE,WAAW,EAAE;AAC1B,gBAAA,IACE,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC;oBACvC,SAAS,CAAC,YAAY,EACtB;oBACA,OAAO,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAS,KAAI;wBACjD,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,GAAG,CAAC,CAAW,CAAC;AAC3D,wBAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAC9B,qBAAC,CAAC,CAAC;AACJ,iBAAA;AAED,gBAAA,OAAO,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;AACvC,aAAA;YAED,OAAO;SACR,CAAC,CACH,CAAC,CAAC;AAaJ,KAAA;;AAVC,IAAA,mBAAmB,CAAC,OAAiD,EAAA;QACnE,OAAO,CAAC,OAAO,CACb,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAC5B,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG;YAClC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;AAClC,SAAA,CACF,CACF,CAAC;KACH;8GArCU,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;SAyCe,mBAAmB,GAAA;AACjC,IAAA,OAAO,MAAM,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC;AAC3C;;AC5BgB,SAAA,SAAS,CAGvB,GAAG,IAIF,EAAA;AAED,IAAA,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,EAA2D,CAAC;AACvF,IAAA,IAAI,WAAW,GAAG,IAAI,CAAC,GAAG,EAAkE,CAAC;AAE7F,IAAA,IAAI,eAAe,CAAC,WAAW,CAAC,EAAE;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACvB,QAAA,WAAW,GAAG,YAAY,IAAI,WAAW,CAAC;QAC1C,YAAY,GAAG,SAAS,CAAC;AAC1B,KAAA;AAED,IAAA,MAAM,KAAK,GAAI,IAA4B,CAAC,GAAG,CAC7C,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CACiB,CAAC;IAE7C,OAAO;QACL,KAAK;QACL,WAAW;QACX,YAAY;KACb,CAAC;AACJ,CAAC;AAEe,SAAA,iBAAiB,CAC/B,GAAG,OAAiD,EAAA;AAEpD,IAAA,OAAO,OAAO,CAAC;AACjB,CAAC;SAEe,gBAAgB,CAI9B,SAAoB,EACpB,WAAkB,EAClB,iBAA2F,EAAA;IAE3F,MAAM,cAAc,GAAI,WAAmB,EAAE,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC;IAC1E,OAAO;AACL,QAAA,CAAC,UAAU,UAAU,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,oBAAoB,GAAG,KAAK,KAAK,wBAAwB,CAAC;AACnG,YAAA,cAAc,GAAE,EAAE,GAAG,WAAW;AAChC,YAAA;AACE,gBAAA,OAAO,EAAE,uBAAuB;AAChC,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,UAAU,EAAE,CACV,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,EAC3C,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,KACxB,MAAK;AACR,oBAAA,IAAI,oBAAoB,EAAE;;AAEzB,qBAAA;oBACD,gBAAgB,CAAC,mBAAmB,CAClC,iBAAiB,CAAC,KAAK,CAAC,CACzB,CAAC;iBACH;AACF,aAAA;SACF,CAAC;QACF,CAAC,CAAA,MAAA,EAAS,UAAU,CAAC,SAAS,CAAC,CAAO,KAAA,CAAA,GAAG,MAAM,MAAM,CAAC,MAAM,CAC1D,MAAM,CAAC,WAAW,CAAC,EACnB,EAAE,QAAQ,EAAE,mBAAmB,EAAE,EAAE,CACpC;KACoC,CAAC;AAC1C;;SCtEgB,WAAW,CACzB,SAAkE,EAClE,oBAEC,EACD,MAEC,EAAA;AAED,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAElC,IAAA,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAAE;AAC9C,QAAA,IAAI,cAA8B,CAAC;QACnC,MAAM,aAAa,IAAI,CACrB,KAA2B,EAC3B,YAAY,GAAG,oBAAoB,KACjC;AAEF,YAAA,MAAM,kBAAkB,GAAG,QAAQ,CAAQ,IAAI,CAC7C,SAAS,EACT,GAAG,CAAC,YAAY,CAAC,CAClB,EAAE;AACD,gBAAA,IAAI,MAAM,IAAI,EAAE;AAChB,gBAAA,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,QAAQ;AACvC,aAAA,CAAC,CAAC;AACH,YAAA,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAC9C,YAAA,cAAc,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;AAE5E,YAAA,OAAO,WAAW,CAAC;AACrB,SAAC,CAA+C,CAAC;QAEjD,aAAa,CAAC,WAAW,GAAG,MAAM,cAAc,EAAE,WAAW,EAAE,CAAC;AAEhE,QAAA,OAAO,aAAa,CAAC;AACtB,KAAA;AAED,IAAA,OAAO,QAAQ,CAAQ,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAC1D;;AC5DA;;AAEG;;;;"}
package/index.d.ts CHANGED
@@ -3,3 +3,5 @@ export * from './lib/with-redux';
3
3
  export * from './lib/with-call-state';
4
4
  export * from './lib/with-undo-redo';
5
5
  export * from './lib/with-data-service';
6
+ export * from './lib/redux-connector';
7
+ export * from './lib/redux-connector/rxjs-interop';
@@ -0,0 +1,13 @@
1
+ import { ActionCreator, ActionType } from "@ngrx/store/src/models";
2
+ import { CreateReduxState, MapperTypes, Store } from "./model";
3
+ export declare function mapAction<Creators extends readonly ActionCreator[]>(...args: [
4
+ ...creators: Creators,
5
+ storeMethod: (action: ActionType<Creators[number]>) => unknown
6
+ ]): MapperTypes<Creators>;
7
+ export declare function mapAction<Creators extends readonly ActionCreator[], T>(...args: [
8
+ ...creators: Creators,
9
+ storeMethod: (action: ActionType<Creators[number]>, resultMethod: (input: T) => unknown) => unknown,
10
+ resultMethod: (input: T) => unknown
11
+ ]): MapperTypes<Creators>;
12
+ export declare function withActionMappers(...mappers: MapperTypes<ActionCreator<any, any>[]>[]): MapperTypes<ActionCreator<any, any>[]>[];
13
+ export declare function createReduxState<StoreName extends string, STORE extends Store>(storeName: StoreName, signalStore: STORE, withActionMappers: (store: InstanceType<STORE>) => MapperTypes<ActionCreator<any, any>[]>[]): CreateReduxState<StoreName, STORE>;
@@ -0,0 +1 @@
1
+ export { createReduxState, mapAction, withActionMappers } from './create-redux';
@@ -0,0 +1,36 @@
1
+ import { EnvironmentProviders, Signal, Type } from "@angular/core";
2
+ import { DeepSignal } from "@ngrx/signals/src/deep-signal";
3
+ import { SignalStoreFeatureResult } from "@ngrx/signals/src/signal-store-models";
4
+ import { StateSignal } from "@ngrx/signals/src/state-signal";
5
+ import { Action, ActionCreator, ActionType, Prettify } from "@ngrx/store/src/models";
6
+ import { Observable, Unsubscribable } from "rxjs";
7
+ export type IncludePropType<T, V, WithNevers = {
8
+ [K in keyof T]: Exclude<T[K], undefined> extends V ? T[K] extends Record<string, unknown> ? IncludePropType<T[K], V> : T[K] : never;
9
+ }> = Prettify<Pick<WithNevers, {
10
+ [K in keyof WithNevers]: WithNevers[K] extends never ? never : K extends string ? K : never;
11
+ }[keyof WithNevers]>>;
12
+ export type Store = Type<Record<string, unknown> & StateSignal<SignalStoreFeatureResult['state']>>;
13
+ export type CreateReduxState<StoreName extends string, STORE extends Store> = {
14
+ [K in StoreName as `provide${Capitalize<K>}Store`]: (connectReduxDevtools?: boolean) => EnvironmentProviders;
15
+ } & {
16
+ [K in StoreName as `inject${Capitalize<K>}Store`]: () => InjectableReduxSlice<STORE>;
17
+ };
18
+ export type Selectors<STORE extends Store> = IncludePropType<InstanceType<STORE>, Signal<unknown> | DeepSignal<unknown>>;
19
+ export type Dispatch = {
20
+ dispatch: (input: Action | Observable<Action> | Signal<Action>) => Unsubscribable;
21
+ };
22
+ export type InjectableReduxSlice<STORE extends Store> = Selectors<STORE> & Dispatch;
23
+ export type ExtractActionTypes<Creators extends readonly ActionCreator[]> = {
24
+ [Key in keyof Creators]: Creators[Key] extends ActionCreator<infer T> ? T : never;
25
+ };
26
+ export interface ActionMethod<T, V extends Action = Action> {
27
+ (action: V): T;
28
+ }
29
+ export interface StoreMethod<Creators extends readonly ActionCreator[], ResultState = unknown> {
30
+ (action: ActionType<Creators[number]>): ResultState;
31
+ }
32
+ export interface MapperTypes<Creators extends readonly ActionCreator[]> {
33
+ types: ExtractActionTypes<Creators>;
34
+ storeMethod: StoreMethod<Creators>;
35
+ resultMethod?: (...args: unknown[]) => unknown;
36
+ }
@@ -0,0 +1 @@
1
+ export { reduxMethod } from './redux-method';
@@ -0,0 +1,11 @@
1
+ import { Injector, Signal } from "@angular/core";
2
+ import { Observable, Unsubscribable } from "rxjs";
3
+ type RxMethodInput<Input> = Input | Observable<Input> | Signal<Input>;
4
+ type RxMethod<Input, MethodInput = Input, MethodResult = unknown> = ((input: RxMethodInput<Input>, resultMethod: (input: MethodInput) => MethodResult) => Unsubscribable) & Unsubscribable;
5
+ export declare function reduxMethod<Input, MethodInput = Input>(generator: (source$: Observable<Input>) => Observable<MethodInput>, config?: {
6
+ injector?: Injector;
7
+ }): RxMethod<Input, MethodInput>;
8
+ export declare function reduxMethod<Input, MethodInput = Input, MethodResult = unknown>(generator: (source$: Observable<Input>) => Observable<MethodInput>, resultMethod: (input: MethodInput) => MethodResult, config?: {
9
+ injector?: Injector;
10
+ }): RxMethod<Input, MethodInput, MethodResult>;
11
+ export {};
@@ -0,0 +1,11 @@
1
+ import { Action, ActionCreator } from "@ngrx/store";
2
+ import { MapperTypes } from "./model";
3
+ import * as i0 from "@angular/core";
4
+ export declare class SignalReduxStore {
5
+ private mapperDict;
6
+ dispatch: ((input: Action | import("rxjs").Observable<Action> | import("@angular/core").Signal<Action>) => import("rxjs").Unsubscribable) & import("rxjs").Unsubscribable;
7
+ connectFeatureStore(mappers: MapperTypes<ActionCreator<any, any>[]>[]): void;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<SignalReduxStore, never>;
9
+ static ɵprov: i0.ɵɵInjectableDeclaration<SignalReduxStore>;
10
+ }
11
+ export declare function injectReduxDispatch(): ((input: Action | import("rxjs").Observable<Action> | import("@angular/core").Signal<Action>) => import("rxjs").Unsubscribable) & import("rxjs").Unsubscribable;
@@ -0,0 +1,5 @@
1
+ import { Action } from '@ngrx/store';
2
+ import { Unsubscribable } from 'rxjs';
3
+ export declare function isUnsubscribable<F extends (...args: unknown[]) => unknown>(fn: F | (F & Unsubscribable)): fn is F & Unsubscribable;
4
+ export declare function capitalize(str: string): string;
5
+ export declare function isActionCreator(action: any): action is Action;
@@ -13,6 +13,7 @@ export interface DataService<E extends Entity, F extends Filter> {
13
13
  loadById(id: EntityId): Promise<E>;
14
14
  create(entity: E): Promise<E>;
15
15
  update(entity: E): Promise<E>;
16
+ updateAll(entity: E[]): Promise<E[]>;
16
17
  delete(entity: E): Promise<void>;
17
18
  }
18
19
  export declare function capitalize(str: string): string;
@@ -33,6 +34,7 @@ export declare function getDataServiceKeys(options: {
33
34
  setCurrentKey: string;
34
35
  createKey: string;
35
36
  updateKey: string;
37
+ updateAllKey: string;
36
38
  deleteKey: string;
37
39
  };
38
40
  export type NamedDataServiceState<E extends Entity, F extends Filter, Collection extends string> = {
@@ -67,6 +69,8 @@ export type NamedDataServiceMethods<E extends Entity, F extends Filter, Collecti
67
69
  [K in Collection as `create${Capitalize<K>}`]: (entity: E) => Promise<void>;
68
70
  } & {
69
71
  [K in Collection as `update${Capitalize<K>}`]: (entity: E) => Promise<void>;
72
+ } & {
73
+ [K in Collection as `updateAll${Capitalize<K>}`]: (entity: E[]) => Promise<void>;
70
74
  } & {
71
75
  [K in Collection as `delete${Capitalize<K>}`]: (entity: E) => Promise<void>;
72
76
  };
@@ -78,6 +82,7 @@ export type DataServiceMethods<E extends Entity, F extends Filter> = {
78
82
  loadById(id: EntityId): Promise<void>;
79
83
  create(entity: E): Promise<void>;
80
84
  update(entity: E): Promise<void>;
85
+ updateAll(entities: E[]): Promise<void>;
81
86
  delete(entity: E): Promise<void>;
82
87
  };
83
88
  export type Empty = Record<string, never>;
package/package.json CHANGED
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "name": "@angular-architects/ngrx-toolkit",
3
- "version": "0.0.3",
3
+ "version": "0.0.6",
4
+ "license": "MIT",
5
+ "repository": {
6
+ "type": "GitHub",
7
+ "url": "https://github.com/angular-architects/ngrx-toolkit"
8
+ },
4
9
  "peerDependencies": {
5
10
  "@angular/common": "^17.0.0",
6
11
  "@angular/core": "^17.0.0",