@ngdux/list 1.3.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/esm2022/index.mjs +12 -0
  2. package/esm2022/lib/+state/effects.mjs +22 -0
  3. package/esm2022/lib/+state/state.service.mjs +55 -0
  4. package/esm2022/lib/models/list.model.mjs +7 -0
  5. package/esm2022/lib/ngdux-list-state.module.mjs +53 -0
  6. package/esm2022/lib/services/list-notification-service.mjs +21 -0
  7. package/esm2022/lib/state-generator/abstract-list-effects.mjs +50 -0
  8. package/esm2022/lib/state-generator/abstract-list-state.service.mjs +44 -0
  9. package/esm2022/lib/state-generator/abstract-list.facade.mjs +85 -0
  10. package/esm2022/lib/state-generator/list-actions.mjs +58 -0
  11. package/esm2022/lib/state-generator/list-reducer.mjs +104 -0
  12. package/esm2022/lib/state-generator/list-selectors.mjs +80 -0
  13. package/esm2022/lib/state-generator/list-state.mjs +18 -0
  14. package/{esm2020 → esm2022}/ngdux-list.mjs +4 -4
  15. package/{fesm2020 → fesm2022}/ngdux-list.mjs +540 -432
  16. package/fesm2022/ngdux-list.mjs.map +1 -0
  17. package/index.d.ts +11 -9
  18. package/lib/+state/effects.d.ts +14 -0
  19. package/lib/+state/state.service.d.ts +22 -0
  20. package/lib/models/list.model.d.ts +191 -183
  21. package/lib/ngdux-list-state.module.d.ts +23 -0
  22. package/lib/services/list-notification-service.d.ts +13 -0
  23. package/lib/{+state → state-generator}/abstract-list-effects.d.ts +49 -61
  24. package/lib/{+state → state-generator}/abstract-list-state.service.d.ts +21 -21
  25. package/lib/{+state → state-generator}/abstract-list.facade.d.ts +45 -46
  26. package/lib/{+state → state-generator}/list-actions.d.ts +2 -2
  27. package/lib/{+state → state-generator}/list-reducer.d.ts +10 -10
  28. package/lib/state-generator/list-selectors.d.ts +4 -0
  29. package/lib/{+state → state-generator}/list-state.d.ts +12 -12
  30. package/package.json +9 -102
  31. package/esm2020/index.mjs +0 -10
  32. package/esm2020/lib/+state/abstract-list-effects.mjs +0 -71
  33. package/esm2020/lib/+state/abstract-list-state.service.mjs +0 -44
  34. package/esm2020/lib/+state/abstract-list.facade.mjs +0 -88
  35. package/esm2020/lib/+state/list-actions.mjs +0 -60
  36. package/esm2020/lib/+state/list-reducer.mjs +0 -97
  37. package/esm2020/lib/+state/list-selectors.mjs +0 -80
  38. package/esm2020/lib/+state/list-state.mjs +0 -18
  39. package/esm2020/lib/models/list.model.mjs +0 -4
  40. package/fesm2015/ngdux-list.mjs +0 -404
  41. package/fesm2015/ngdux-list.mjs.map +0 -1
  42. package/fesm2020/ngdux-list.mjs.map +0 -1
  43. package/lib/+state/list-selectors.d.ts +0 -4
@@ -0,0 +1,23 @@
1
+ import { ModuleWithProviders } from '@angular/core';
2
+ import { ListNotificationService, ListService } from '@ngdux/data-model-common';
3
+ import { RegisterEffectsService } from '@ngdux/store-common';
4
+ import { Actions } from '@ngrx/effects';
5
+ import { Store } from '@ngrx/store';
6
+ import { ListStateService } from './+state/state.service';
7
+ import { NgduxListStateModuleConfig } from './models/list.model';
8
+ import * as i0 from "@angular/core";
9
+ export declare class NgduxListStateModule<T extends {
10
+ [key: string]: any;
11
+ }, Error = unknown, S extends {
12
+ [key: string]: any;
13
+ } = T, Params = Record<string, string>> {
14
+ constructor(registerEffectsService: RegisterEffectsService, actions$: Actions, store: Store, listStateService: ListStateService<T, Error, S, Params>, featureKeys: string[], services: ListService<T, S, Params>[], notificationServices: ListNotificationService<Error>[]);
15
+ static config<T extends {
16
+ [key: string]: any;
17
+ }, Error = unknown, S extends {
18
+ [key: string]: any;
19
+ } = T, Params = Record<string, string>>(config: NgduxListStateModuleConfig<T, Error, S, Params>): ModuleWithProviders<NgduxListStateModule<T, Error, S, Params>>;
20
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgduxListStateModule, never>;
21
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NgduxListStateModule, never, never, never>;
22
+ static ɵinj: i0.ɵɵInjectorDeclaration<NgduxListStateModule>;
23
+ }
@@ -0,0 +1,13 @@
1
+ import { ErrorDto, ListNotificationService } from '@ngdux/data-model-common';
2
+ import { Observable } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export declare class NotificationServicePlaceholder implements ListNotificationService<ErrorDto> {
5
+ onListErrors(errors: ErrorDto): void;
6
+ onListDelete(ids: string[]): void;
7
+ openConfirmationDialog(data: {
8
+ message: string;
9
+ title: string;
10
+ }): Observable<boolean>;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<NotificationServicePlaceholder, never>;
12
+ static ɵprov: i0.ɵɵInjectableDeclaration<NotificationServicePlaceholder>;
13
+ }
@@ -1,61 +1,49 @@
1
- import { ListNotificationService, ListService } from '@ngdux/data-model-common';
2
- import { Actions } from '@ngrx/effects';
3
- import { Store } from '@ngrx/store';
4
- import { ListActions, ListSelectors } from '../models/list.model';
5
- export declare abstract class AbstractListEffects<T, E, S = T> {
6
- protected readonly actions$: Actions;
7
- protected readonly store: Store;
8
- protected readonly service: ListService<T, S>;
9
- protected readonly listActions: ListActions<T, E, S>;
10
- protected readonly listSelectors: ListSelectors<S, E>;
11
- protected readonly notificationService?: ListNotificationService<E> | undefined;
12
- texts: {
13
- deleteConfirmationTitle: string;
14
- deleteConfirmationMessage: string;
15
- };
16
- reload$: import("rxjs").Observable<import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
17
- loadFirstPage$: import("rxjs").Observable<{
18
- pageNumber: number;
19
- } & import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
20
- loadPreviousPage$: import("rxjs").Observable<{
21
- pageNumber: number;
22
- } & import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
23
- loadNextPage$: import("rxjs").Observable<{
24
- pageNumber: number;
25
- } & import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
26
- changePagingOptions$: import("rxjs").Observable<({
27
- pageNumber: number;
28
- } & import("@ngrx/store/src/models").TypedAction<string>) | ({
29
- pageSize: number;
30
- } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
31
- loadPage$: import("rxjs").Observable<({
32
- resources: S[];
33
- pagingOptions: import("@ngdux/data-model-common").PagingOptions;
34
- } & import("@ngrx/store/src/models").TypedAction<string>) | ({
35
- errors: E;
36
- } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
37
- patch$: import("rxjs").Observable<({
38
- resources: (import("@ngdux/data-model-common").ErrorDto | T)[];
39
- } & import("@ngrx/store/src/models").TypedAction<string>) | ({
40
- errors: E;
41
- } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
42
- showRemovalsDialog$: import("rxjs").Observable<{
43
- resourceIds: string[];
44
- } & import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
45
- delete$: import("rxjs").Observable<({
46
- resourceIds: string[];
47
- } & import("@ngrx/store/src/models").TypedAction<string>) | ({
48
- errors: E;
49
- } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
50
- deleteUsersSuccess$: import("rxjs").Observable<{
51
- resourceIds: string[];
52
- } & import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
53
- errorsHandler$: import("rxjs").Observable<({
54
- errors: E;
55
- } & import("@ngrx/store/src/models").TypedAction<string>) | ({
56
- errors: E;
57
- } & import("@ngrx/store/src/models").TypedAction<string>) | ({
58
- errors: E;
59
- } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
60
- protected constructor(actions$: Actions, store: Store, service: ListService<T, S>, listActions: ListActions<T, E, S>, listSelectors: ListSelectors<S, E>, notificationService?: ListNotificationService<E> | undefined);
61
- }
1
+ import { ListNotificationService, ListService } from '@ngdux/data-model-common';
2
+ import { Actions } from '@ngrx/effects';
3
+ import { Store } from '@ngrx/store';
4
+ import { ListActions, ListSelectors } from '../models/list.model';
5
+ export declare abstract class AbstractListEffects<T, E = unknown, S = T, Params = Record<string, string>> {
6
+ protected readonly actions$: Actions;
7
+ protected readonly store: Store;
8
+ protected readonly service: ListService<T, S, Params>;
9
+ protected readonly listActions: ListActions<T, E, S, Params>;
10
+ protected readonly listSelectors: ListSelectors<S, E, Params>;
11
+ protected readonly notificationService?: ListNotificationService<E> | undefined;
12
+ reload$: import("rxjs").Observable<import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
13
+ loadFirstPage$: import("rxjs").Observable<{
14
+ pageNumber: number;
15
+ } & import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
16
+ loadPreviousPage$: import("rxjs").Observable<{
17
+ pageNumber: number;
18
+ } & import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
19
+ loadNextPage$: import("rxjs").Observable<{
20
+ pageNumber: number;
21
+ } & import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
22
+ loadPage$: import("rxjs").Observable<({
23
+ resources: S[];
24
+ pagingOptions: import("@ngdux/data-model-common").PagingOptions;
25
+ } & import("@ngrx/store/src/models").TypedAction<string>) | ({
26
+ errors: E;
27
+ } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
28
+ patch$: import("rxjs").Observable<({
29
+ resources: (import("@ngdux/data-model-common").ErrorDto | T)[];
30
+ } & import("@ngrx/store/src/models").TypedAction<string>) | ({
31
+ errors: E;
32
+ } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
33
+ delete$: import("rxjs").Observable<({
34
+ resourceIds: string[];
35
+ } & import("@ngrx/store/src/models").TypedAction<string>) | ({
36
+ errors: E;
37
+ } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
38
+ deleteSuccess$: import("rxjs").Observable<{
39
+ resourceIds: string[];
40
+ } & import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
41
+ errorsHandler$: import("rxjs").Observable<({
42
+ errors: E;
43
+ } & import("@ngrx/store/src/models").TypedAction<string>) | ({
44
+ errors: E;
45
+ } & import("@ngrx/store/src/models").TypedAction<string>) | ({
46
+ errors: E;
47
+ } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
48
+ protected constructor(actions$: Actions, store: Store, service: ListService<T, S, Params>, listActions: ListActions<T, E, S, Params>, listSelectors: ListSelectors<S, E, Params>, notificationService?: ListNotificationService<E> | undefined);
49
+ }
@@ -1,21 +1,21 @@
1
- import { ReducerManager } from '@ngrx/store';
2
- import { ListActions, ListSelectors } from '../models/list.model';
3
- import * as i0 from "@angular/core";
4
- export declare abstract class AbstractListReducerManager<T extends {
5
- [key: string]: any;
6
- }, E, S extends {
7
- [key: string]: any;
8
- } = T> {
9
- private readonly reducerManager;
10
- private readonly featureKey;
11
- actions: ListActions<T, E, S>;
12
- selectors: ListSelectors<S, E>;
13
- private entityAdapter;
14
- constructor(reducerManager: ReducerManager, featureKey: string);
15
- protected getActions(): ListActions<T, E, S, Record<string, string>>;
16
- private getEntityAdapter;
17
- protected addReducer(): void;
18
- protected getSelectors(): ListSelectors<S, E>;
19
- static ɵfac: i0.ɵɵFactoryDeclaration<AbstractListReducerManager<any, any, any>, never>;
20
- static ɵprov: i0.ɵɵInjectableDeclaration<AbstractListReducerManager<any, any, any>>;
21
- }
1
+ import { ReducerManager } from '@ngrx/store';
2
+ import { ListActions, ListSelectors } from '../models/list.model';
3
+ import * as i0 from "@angular/core";
4
+ export declare abstract class AbstractListReducerManager<T extends {
5
+ [key: string]: any;
6
+ }, E, S extends {
7
+ [key: string]: any;
8
+ } = T, Params = Record<string, string>> {
9
+ private readonly reducerManager;
10
+ private readonly featureKey;
11
+ actions: ListActions<T, E, S, Params>;
12
+ selectors: ListSelectors<S, E, Params>;
13
+ private entityAdapter;
14
+ constructor(reducerManager: ReducerManager, featureKey: string);
15
+ protected getActions(): ListActions<T, E, S, Params>;
16
+ private getEntityAdapter;
17
+ protected addReducer(): void;
18
+ protected getSelectors(): ListSelectors<S, E, Params>;
19
+ static ɵfac: i0.ɵɵFactoryDeclaration<AbstractListReducerManager<any, any, any, any>, never>;
20
+ static ɵprov: i0.ɵɵInjectableDeclaration<AbstractListReducerManager<any, any, any, any>>;
21
+ }
@@ -1,46 +1,45 @@
1
- import { ActionPayload } from '@ngdux/store-common';
2
- import { Store } from '@ngrx/store';
3
- import { ListActions, ListSelectors } from '../models/list.model';
4
- export declare abstract class AbstractListFacade<T, E, S = T> {
5
- protected readonly store: Store;
6
- private readonly listActions;
7
- private readonly listSelectors;
8
- readonly resources$: import("rxjs").Observable<S[]>;
9
- readonly loadingState$: import("rxjs").Observable<import("@ngdux/data-model-common").RequestState>;
10
- readonly requestState$: import("rxjs").Observable<import("@ngdux/data-model-common").RequestState>;
11
- readonly errors$: import("rxjs").Observable<E | undefined>;
12
- readonly isReady$: import("rxjs").Observable<boolean>;
13
- readonly areSelectedReady$: import("rxjs").Observable<boolean>;
14
- readonly currentPageData$: import("rxjs").Observable<S[]>;
15
- readonly currentPageNumber$: import("rxjs").Observable<number>;
16
- readonly filteringOptions$: import("rxjs").Observable<import("@ngdux/data-model-common").FilteringOptions>;
17
- readonly requestParameters$: import("rxjs").Observable<Record<string, string> | undefined>;
18
- readonly lastPageNumber$: import("rxjs").Observable<number | undefined>;
19
- readonly pagingOptions$: import("rxjs").Observable<import("@ngdux/data-model-common").PagingOptions>;
20
- readonly requestOptions$: import("rxjs").Observable<import("@ngdux/data-model-common").RequestOptions>;
21
- readonly sortingOptions$: import("rxjs").Observable<import("@ngdux/data-model-common").SortingOptions>;
22
- readonly selectedItems$: import("rxjs").Observable<S[]>;
23
- readonly totalCount$: import("rxjs").Observable<number>;
24
- constructor(store: Store, listActions: ListActions<T, E, S>, listSelectors: ListSelectors<S, E>);
25
- setPageSize(props: ActionPayload<ListActions<T, E>['setPageSize']>): void;
26
- setFiltering(props: ActionPayload<ListActions<T, E>['setFiltering']>): void;
27
- setSorting(props: ActionPayload<ListActions<T, E>['setSorting']>): void;
28
- setRequestParameters(props: ActionPayload<ListActions<T, E>['setRequestParams']>): void;
29
- changeFiltering(props: ActionPayload<ListActions<T, E>['changeFiltering']>): void;
30
- changePagingOptions(props: ActionPayload<ListActions<T, E>['changePagingOptions']>): void;
31
- changePageSize(props: ActionPayload<ListActions<T, E>['changePageSize']>): void;
32
- changePageNumber(props: ActionPayload<ListActions<T, E>['changePageNumber']>): void;
33
- changeSelectedResources(props: ActionPayload<ListActions<T, E>['changeSelectedResources']>): void;
34
- changeSorting(props: ActionPayload<ListActions<T, E>['changeSorting']>): void;
35
- changeRequestParams(props: ActionPayload<ListActions<T, E>['changeRequestParams']>): void;
36
- loadPage(): void;
37
- loadFirstPage(): void;
38
- loadNextPage(): void;
39
- loadPreviousPage(): void;
40
- patch(props: ActionPayload<ListActions<T, E>['patch']>): void;
41
- delete(props: ActionPayload<ListActions<T, E>['delete']>): void;
42
- initialize(): void;
43
- reinitialize(): void;
44
- resetRequestState(): void;
45
- showRemovalsConfirmation(): void;
46
- }
1
+ import { ActionPayload } from '@ngdux/store-common';
2
+ import { Store } from '@ngrx/store';
3
+ import { ListActions, ListSelectors } from '../models/list.model';
4
+ export declare abstract class AbstractListFacade<T, E, S = T, Params = Record<string, string>> {
5
+ protected readonly store: Store;
6
+ private readonly listActions;
7
+ private readonly listSelectors;
8
+ readonly resources$: import("rxjs").Observable<S[]>;
9
+ readonly loadingState$: import("rxjs").Observable<import("@ngdux/data-model-common").RequestState>;
10
+ readonly requestState$: import("rxjs").Observable<import("@ngdux/data-model-common").RequestState>;
11
+ readonly errors$: import("rxjs").Observable<E | undefined>;
12
+ readonly isReady$: import("rxjs").Observable<boolean>;
13
+ readonly areSelectedReady$: import("rxjs").Observable<boolean>;
14
+ readonly currentPageData$: import("rxjs").Observable<S[]>;
15
+ readonly currentPageNumber$: import("rxjs").Observable<number>;
16
+ readonly filteringOptions$: import("rxjs").Observable<import("@ngdux/data-model-common").FilteringOptions>;
17
+ readonly requestParameters$: import("rxjs").Observable<Params | undefined>;
18
+ readonly lastPageNumber$: import("rxjs").Observable<number | undefined>;
19
+ readonly pagingOptions$: import("rxjs").Observable<import("@ngdux/data-model-common").PagingOptions>;
20
+ readonly requestOptions$: import("rxjs").Observable<import("@ngdux/data-model-common").RequestOptions<Record<string, string>>>;
21
+ readonly sortingOptions$: import("rxjs").Observable<import("@ngdux/data-model-common").SortingField[]>;
22
+ readonly selectedItems$: import("rxjs").Observable<S[]>;
23
+ readonly totalCount$: import("rxjs").Observable<number>;
24
+ constructor(store: Store, listActions: ListActions<T, E, S, Params>, listSelectors: ListSelectors<S, E, Params>);
25
+ setPageSize(props: ActionPayload<ListActions<T, E, S, Params>['setPageSize']>): void;
26
+ setFiltering(props: ActionPayload<ListActions<T, E, S, Params>['setFiltering']>): void;
27
+ setSorting(props: ActionPayload<ListActions<T, E, S, Params>['setSorting']>): void;
28
+ setRequestParameters(props: ActionPayload<ListActions<T, E, S, Params>['setRequestParams']>): void;
29
+ changeFiltering(props: ActionPayload<ListActions<T, E, S, Params>['changeFiltering']>): void;
30
+ changePagingOptions(props: ActionPayload<ListActions<T, E, S, Params>['changePagingOptions']>): void;
31
+ changePageSize(props: ActionPayload<ListActions<T, E, S, Params>['changePageSize']>): void;
32
+ changePageNumber(props: ActionPayload<ListActions<T, E, S, Params>['changePageNumber']>): void;
33
+ changeSelectedResources(props: ActionPayload<ListActions<T, E, S, Params>['changeSelectedResources']>): void;
34
+ changeSorting(props: ActionPayload<ListActions<T, E, S, Params>['changeSorting']>): void;
35
+ changeRequestParams(props: ActionPayload<ListActions<T, E, S, Params>['changeRequestParams']>): void;
36
+ loadPage(): void;
37
+ loadFirstPage(): void;
38
+ loadNextPage(): void;
39
+ loadPreviousPage(): void;
40
+ patch(props: ActionPayload<ListActions<T, E, S, Params>['patch']>): void;
41
+ delete(props: ActionPayload<ListActions<T, E, S, Params>['delete']>): void;
42
+ initialize(): void;
43
+ reinitialize(): void;
44
+ resetRequestState(): void;
45
+ }
@@ -1,2 +1,2 @@
1
- import { ListActions } from '../models/list.model';
2
- export declare function createListActions<T, E, S = T, Params = Record<string, string>>(featureName: string): ListActions<T, E, S, Params>;
1
+ import { ListActions } from '../models/list.model';
2
+ export declare function createListActions<T, E, S = T, Params = Record<string, string>>(featureName: string): ListActions<T, E, S, Params>;
@@ -1,10 +1,10 @@
1
- import { EntityAdapter } from '@ngrx/entity';
2
- import { ActionReducer, ReducerTypes } from '@ngrx/store';
3
- import { ActionCreator } from '@ngrx/store/src/models';
4
- import { ListActions, ListState } from '../models/list.model';
5
- export declare function createListEntityAdapter<T extends {
6
- [key: string]: any;
7
- }>(idKey?: string): EntityAdapter<T>;
8
- export declare function createListReducer<T, E, S = T>(entityAdapter: EntityAdapter<S>, actions: ListActions<T, E, S>, actionHandlers?: ReducerTypes<ListState<S, E>, ActionCreator[]>[], initialListState?: {
9
- [key: string]: unknown;
10
- }): ActionReducer<ListState<S, E>>;
1
+ import { EntityAdapter } from '@ngrx/entity';
2
+ import { ActionReducer, ReducerTypes } from '@ngrx/store';
3
+ import { ActionCreator } from '@ngrx/store/src/models';
4
+ import { ListActions, ListState } from '../models/list.model';
5
+ export declare function createListEntityAdapter<T extends {
6
+ [key: string]: any;
7
+ }>(idKey?: string): EntityAdapter<T>;
8
+ export declare function createListReducer<T, E, S = T, Params = Record<string, string>>(entityAdapter: EntityAdapter<S>, actions: ListActions<T, E, S, Params>, actionHandlers?: ReducerTypes<ListState<S, E, Params>, ActionCreator[]>[], initialListState?: {
9
+ [key: string]: unknown;
10
+ }): ActionReducer<ListState<S, E, Params>>;
@@ -0,0 +1,4 @@
1
+ import { EntityAdapter } from '@ngrx/entity';
2
+ import { DefaultProjectorFn, MemoizedSelector } from '@ngrx/store';
3
+ import { ListSelectors, ListState } from '../models/list.model';
4
+ export declare function createListSelectors<T, E, Params = Record<string, string>>(entityAdapter: EntityAdapter<T>, getListState: MemoizedSelector<object, ListState<T, E, Params>, DefaultProjectorFn<ListState<T, E, Params>>>): ListSelectors<T, E, Params>;
@@ -1,12 +1,12 @@
1
- import { Action } from '@ngrx/store';
2
- import { ListState } from '../models/list.model';
3
- export declare function createListState<T extends {
4
- [key: string]: any;
5
- }, E, S extends {
6
- [key: string]: any;
7
- } = T>(featureName: string, idKey?: string): {
8
- actions: import("../models/list.model").ListActions<T, E, S, Record<string, string>>;
9
- reducer: (state: ListState<S, E>, action: Action) => ListState<S, E>;
10
- selectors: import("../models/list.model").ListSelectors<S, E>;
11
- entityAdapter: import("@ngrx/entity").EntityAdapter<S>;
12
- };
1
+ import { Action } from '@ngrx/store';
2
+ import { ListState } from '../models/list.model';
3
+ export declare function createListState<T extends {
4
+ [key: string]: any;
5
+ }, E, S extends {
6
+ [key: string]: any;
7
+ } = T, Params = Record<string, string>>(featureName: string, idKey?: string): {
8
+ actions: import("../models/list.model").ListActions<T, E, S, Params>;
9
+ reducer: (state: ListState<S, E, Params>, action: Action) => ListState<S, E, Params>;
10
+ selectors: import("../models/list.model").ListSelectors<S, E, Params>;
11
+ entityAdapter: import("@ngrx/entity").EntityAdapter<S>;
12
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngdux/list",
3
- "version": "1.3.2",
3
+ "version": "2.0.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git@github.com:allanartuso/ngdux.git",
@@ -9,104 +9,13 @@
9
9
  "homepage": "https://github.com/allanartuso/ngdux/tree/master/libs/ngdux/util/store/list#readme",
10
10
  "peerDependencies": {
11
11
  "@ngdux/data-model-common": "^1.0.0",
12
- "@angular/core": "^15.0.0",
12
+ "@angular/core": "^16.0.0",
13
13
  "@ngdux/store-common": "^1.0.0",
14
- "@ngrx/entity": "^15.0.0"
14
+ "@ngrx/entity": "^16.0.0",
15
+ "@ngrx/store": "^16.0.0",
16
+ "@ngrx/effects": "^16.0.0"
15
17
  },
16
- "default": {
17
- "name": "@ngdux/list",
18
- "version": "1.3.1",
19
- "repository": {
20
- "type": "git",
21
- "url": "git@github.com:allanartuso/ngdux.git",
22
- "directory": "/libs/ngdux/util/store/list"
23
- },
24
- "homepage": "https://github.com/allanartuso/ngdux/tree/master/libs/ngdux/util/store/list#readme",
25
- "peerDependencies": {
26
- "@ngdux/data-model-common": "^1.0.0",
27
- "@angular/core": "^15.0.0",
28
- "@ngdux/store-common": "^1.0.0",
29
- "@ngrx/entity": "^15.0.0"
30
- },
31
- "default": {
32
- "name": "@ngdux/list",
33
- "version": "1.3.0",
34
- "repository": {
35
- "type": "git",
36
- "url": "git@github.com:allanartuso/ngdux.git",
37
- "directory": "/libs/ngdux/util/store/list"
38
- },
39
- "homepage": "https://github.com/allanartuso/ngdux/tree/master/libs/ngdux/util/store/list#readme",
40
- "peerDependencies": {
41
- "@ngdux/data-model-common": "^1.0.0",
42
- "@angular/core": "^15.0.0",
43
- "@ngdux/store-common": "^1.0.0",
44
- "@ngrx/entity": "^15.0.0"
45
- },
46
- "default": {
47
- "name": "@ngdux/list",
48
- "version": "1.2.1",
49
- "repository": {
50
- "type": "git",
51
- "url": "git@github.com:allanartuso/ngdux.git",
52
- "directory": "/libs/ngdux/util/store/list"
53
- },
54
- "homepage": "https://github.com/allanartuso/ngdux/tree/master/libs/ngdux/util/store/list#readme",
55
- "peerDependencies": {
56
- "@ngdux/data-model-common": "^1.0.0",
57
- "@angular/core": "^15.0.0",
58
- "@ngdux/store-common": "^1.0.0",
59
- "@ngrx/entity": "^15.0.0"
60
- },
61
- "default": {
62
- "name": "@ngdux/list",
63
- "version": "1.2.0",
64
- "repository": {
65
- "type": "git",
66
- "url": "git@github.com:allanartuso/ngdux.git",
67
- "directory": "/libs/ngdux/util/store/list"
68
- },
69
- "homepage": "https://github.com/allanartuso/ngdux/tree/master/libs/ngdux/util/store/list#readme",
70
- "peerDependencies": {
71
- "@ngdux/data-model-common": "^1.0.0",
72
- "@angular/core": "^15.0.0",
73
- "@ngdux/store-common": "^1.0.0",
74
- "@ngrx/entity": "^15.0.0"
75
- },
76
- "default": {
77
- "name": "@ngdux/list",
78
- "version": "1.1.1",
79
- "repository": {
80
- "type": "git",
81
- "url": "git@github.com:allanartuso/ngdux.git",
82
- "directory": "/libs/ngdux/util/store/list"
83
- },
84
- "homepage": "https://github.com/allanartuso/ngdux/tree/master/libs/ngdux/util/store/list#readme",
85
- "default": {
86
- "name": "@ngdux/list",
87
- "repository": {
88
- "type": "git",
89
- "url": "git@github.com:allanartuso/ngdux.git",
90
- "directory": "/libs/ngdux/util/store/list"
91
- },
92
- "homepage": "https://github.com/allanartuso/ngdux/tree/master/libs/ngdux/util/store/list#readme"
93
- },
94
- "peerDependencies": {
95
- "@ngdux/data-model-common": "^1.0.0",
96
- "@angular/core": "^15.0.0",
97
- "@ngdux/store-common": "^1.0.0",
98
- "@ngrx/entity": "^15.0.0"
99
- }
100
- }
101
- }
102
- }
103
- }
104
- },
105
- "module": "fesm2015/ngdux-list.mjs",
106
- "es2020": "fesm2020/ngdux-list.mjs",
107
- "esm2020": "esm2020/ngdux-list.mjs",
108
- "fesm2020": "fesm2020/ngdux-list.mjs",
109
- "fesm2015": "fesm2015/ngdux-list.mjs",
18
+ "module": "fesm2022/ngdux-list.mjs",
110
19
  "typings": "index.d.ts",
111
20
  "exports": {
112
21
  "./package.json": {
@@ -114,11 +23,9 @@
114
23
  },
115
24
  ".": {
116
25
  "types": "./index.d.ts",
117
- "esm2020": "./esm2020/ngdux-list.mjs",
118
- "es2020": "./fesm2020/ngdux-list.mjs",
119
- "es2015": "./fesm2015/ngdux-list.mjs",
120
- "node": "./fesm2015/ngdux-list.mjs",
121
- "default": "./fesm2020/ngdux-list.mjs"
26
+ "esm2022": "./esm2022/ngdux-list.mjs",
27
+ "esm": "./esm2022/ngdux-list.mjs",
28
+ "default": "./fesm2022/ngdux-list.mjs"
122
29
  }
123
30
  },
124
31
  "sideEffects": false,
package/esm2020/index.mjs DELETED
@@ -1,10 +0,0 @@
1
- export { RequestState } from '@ngdux/data-model-common';
2
- export * from './lib/+state/abstract-list-effects';
3
- export * from './lib/+state/abstract-list-state.service';
4
- export * from './lib/+state/abstract-list.facade';
5
- export * from './lib/+state/list-actions';
6
- export * from './lib/+state/list-reducer';
7
- export * from './lib/+state/list-selectors';
8
- export * from './lib/+state/list-state';
9
- export * from './lib/models/list.model';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nZHV4L3V0aWwvc3RvcmUvbGlzdC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3RCxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RyxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsMENBQTBDLENBQUM7QUFDekQsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMseUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBMaXN0Tm90aWZpY2F0aW9uU2VydmljZSwgTGlzdFNlcnZpY2UsIFJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0U3RhdGUgfSBmcm9tICdAbmdkdXgvZGF0YS1tb2RlbC1jb21tb24nO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi8rc3RhdGUvYWJzdHJhY3QtbGlzdC1lZmZlY3RzJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvK3N0YXRlL2Fic3RyYWN0LWxpc3Qtc3RhdGUuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliLytzdGF0ZS9hYnN0cmFjdC1saXN0LmZhY2FkZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliLytzdGF0ZS9saXN0LWFjdGlvbnMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi8rc3RhdGUvbGlzdC1yZWR1Y2VyJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvK3N0YXRlL2xpc3Qtc2VsZWN0b3JzJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvK3N0YXRlL2xpc3Qtc3RhdGUnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvbGlzdC5tb2RlbCc7XHJcbiJdfQ==
@@ -1,71 +0,0 @@
1
- import { createEffect, ofType } from '@ngrx/effects';
2
- import { select } from '@ngrx/store';
3
- import { of } from 'rxjs';
4
- import { catchError, concatMap, exhaustMap, filter, map, switchMap, tap, withLatestFrom } from 'rxjs/operators';
5
- export class AbstractListEffects {
6
- constructor(actions$, store, service, listActions, listSelectors, notificationService) {
7
- this.actions$ = actions$;
8
- this.store = store;
9
- this.service = service;
10
- this.listActions = listActions;
11
- this.listSelectors = listSelectors;
12
- this.notificationService = notificationService;
13
- this.texts = {
14
- deleteConfirmationTitle: 'Delete resources',
15
- deleteConfirmationMessage: 'Are you sure to delete the selected resources?'
16
- };
17
- this.reload$ = createEffect(() => this.actions$.pipe(ofType(this.listActions.changePageSize, this.listActions.changeSorting, this.listActions.changeFiltering, this.listActions.changeRequestParams, this.listActions.initialize, this.listActions.reset, this.listActions.changePageNumber, this.listActions.patchSuccess, this.listActions.deleteSuccess), map(() => this.listActions.loadPage())));
18
- this.loadFirstPage$ = createEffect(() => this.actions$.pipe(ofType(this.listActions.loadFirstPage), map(() => this.listActions.changePageNumber({ pageNumber: 1 }))));
19
- this.loadPreviousPage$ = createEffect(() => this.actions$.pipe(ofType(this.listActions.loadPreviousPage), withLatestFrom(this.store.pipe(select(this.listSelectors.getCurrentPageNumber))), filter(([, currentPageNumber]) => currentPageNumber > 1), map(([, currentPageNumber]) => this.listActions.changePageNumber({ pageNumber: currentPageNumber - 1 }))));
20
- this.loadNextPage$ = createEffect(() => this.actions$.pipe(ofType(this.listActions.loadNextPage), withLatestFrom(this.store.pipe(select(this.listSelectors.isLastPage)), this.store.pipe(select(this.listSelectors.getCurrentPageNumber))), filter(([, isLastPage]) => !isLastPage), map(([, , currentPageNumber]) => this.listActions.changePageNumber({ pageNumber: currentPageNumber + 1 }))));
21
- this.changePagingOptions$ = createEffect(() => this.actions$.pipe(ofType(this.listActions.changePagingOptions), withLatestFrom(this.store.pipe(select(this.listSelectors.getPagingOptions))), map(([action, pagingOptions]) => {
22
- if (action.pagingOptions.pageSize !== pagingOptions.pageSize) {
23
- return this.listActions.changePageSize({ pageSize: action.pagingOptions.pageSize });
24
- }
25
- else {
26
- return this.listActions.changePageNumber({ pageNumber: action.pagingOptions.page });
27
- }
28
- })));
29
- this.loadPage$ = createEffect(() => this.actions$.pipe(ofType(this.listActions.loadPage), withLatestFrom(this.store.pipe(select(this.listSelectors.getPagingOptions)), this.store.pipe(select(this.listSelectors.getSortingOptions)), this.store.pipe(select(this.listSelectors.getFilteringOptions)), this.store.pipe(select(this.listSelectors.getRequestParameters))), concatMap(([, pagingOptions, sortingOptions, filteringOptions, requestParameters]) => {
30
- return this.service
31
- .loadResources({
32
- pagingOptions,
33
- sortingOptions,
34
- filteringOptions,
35
- requestParameters
36
- })
37
- .pipe(map(resources => this.listActions.loadPageSuccess({
38
- resources,
39
- pagingOptions
40
- })), catchError((errors) => of(this.listActions.loadPageFailure({ errors }))));
41
- })));
42
- this.patch$ = createEffect(() => this.actions$.pipe(ofType(this.listActions.patch), exhaustMap(action => {
43
- if (!this.service.patchResources) {
44
- throw new Error('patchResources not implement in the ListService');
45
- }
46
- return this.service.patchResources(action.resourceIds, action.resource).pipe(map(resources => this.listActions.patchSuccess({ resources })), catchError((errors) => of(this.listActions.patchFailure({ errors }))));
47
- })));
48
- this.showRemovalsDialog$ = createEffect(() => this.actions$.pipe(ofType(this.listActions.showRemovalsConfirmation), switchMap(() => {
49
- if (this.notificationService?.openConfirmationDialog) {
50
- return this.notificationService.openConfirmationDialog({
51
- message: this.texts.deleteConfirmationMessage,
52
- title: this.texts.deleteConfirmationTitle
53
- });
54
- }
55
- return of(true);
56
- }), filter(confirmed => confirmed), withLatestFrom(this.store.pipe(select(this.listSelectors.getSelectedResourceIds))), map(([, resourceIds]) => this.listActions.delete({ resourceIds }))));
57
- this.delete$ = createEffect(() => this.actions$.pipe(ofType(this.listActions.delete), exhaustMap(({ resourceIds }) => {
58
- if (!this.service.deleteResources) {
59
- throw new Error('deleteResources not implement in the ListService');
60
- }
61
- return this.service.deleteResources(resourceIds).pipe(map(() => this.listActions.deleteSuccess({ resourceIds })), catchError((errors) => of(this.listActions.deleteFailure({ errors }))));
62
- })));
63
- this.deleteUsersSuccess$ = createEffect(() => this.actions$.pipe(ofType(this.listActions.deleteSuccess), tap(({ resourceIds }) => {
64
- this.notificationService?.onListDelete(resourceIds);
65
- })), { dispatch: false });
66
- this.errorsHandler$ = createEffect(() => this.actions$.pipe(ofType(this.listActions.loadPageFailure, this.listActions.deleteFailure, this.listActions.patchFailure), tap(({ errors }) => {
67
- this.notificationService?.onListErrors(errors);
68
- })), { dispatch: false });
69
- }
70
- }
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtbGlzdC1lZmZlY3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ2R1eC91dGlsL3N0b3JlL2xpc3Qvc3JjL2xpYi8rc3RhdGUvYWJzdHJhY3QtbGlzdC1lZmZlY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBVyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBUyxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSWhILE1BQU0sT0FBZ0IsbUJBQW1CO0lBd0t2QyxZQUNxQixRQUFpQixFQUNqQixLQUFZLEVBQ1osT0FBMEIsRUFDMUIsV0FBaUMsRUFDakMsYUFBa0MsRUFDbEMsbUJBQWdEO1FBTGhELGFBQVEsR0FBUixRQUFRLENBQVM7UUFDakIsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNaLFlBQU8sR0FBUCxPQUFPLENBQW1CO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFzQjtRQUNqQyxrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFDbEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUE2QjtRQTdLckUsVUFBSyxHQUFHO1lBQ04sdUJBQXVCLEVBQUUsa0JBQWtCO1lBQzNDLHlCQUF5QixFQUFFLGdEQUFnRDtTQUM1RSxDQUFDO1FBRUYsWUFBTyxHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2hCLE1BQU0sQ0FDSixJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFDL0IsSUFB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LENBQ3BCLENBQUM7SUFTQyxDQUFDO0NBQ0wiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMaXN0Tm90aWZpY2F0aW9uU2VydmljZSwgTGlzdFNlcnZpY2UgfSBmcm9tICdAbmdkdXgvZGF0YS1tb2RlbC1jb21tb24nO1xyXG5pbXBvcnQgeyBBY3Rpb25zLCBjcmVhdGVFZmZlY3QsIG9mVHlwZSB9IGZyb20gJ0BuZ3J4L2VmZmVjdHMnO1xyXG5pbXBvcnQgeyBTdG9yZSwgc2VsZWN0IH0gZnJvbSAnQG5ncngvc3RvcmUnO1xyXG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBjb25jYXRNYXAsIGV4aGF1c3RNYXAsIGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRhcCwgd2l0aExhdGVzdEZyb20gfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBMaXN0QWN0aW9ucywgTGlzdFNlbGVjdG9ycyB9IGZyb20gJy4uL21vZGVscy9saXN0Lm1vZGVsJztcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpc3RFZmZlY3RzPFQsIEUsIFMgPSBUPiB7XHJcbiAgdGV4dHMgPSB7XHJcbiAgICBkZWxldGVDb25maXJtYXRpb25UaXRsZTogJ0RlbGV0ZSByZXNvdXJjZXMnLFxyXG4gICAgZGVsZXRlQ29uZmlybWF0aW9uTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB0byBkZWxldGUgdGhlIHNlbGVjdGVkIHJlc291cmNlcz8nXHJcbiAgfTtcclxuXHJcbiAgcmVsb2FkJCA9IGNyZWF0ZUVmZmVjdCgoKSA9PlxyXG4gICAgdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgICBvZlR5cGUoXHJcbiAgICAgICAgdGhpcy5saXN0QWN0aW9ucy5jaGFuZ2VQYWdlU2l6ZSxcclxuICAgICAgICB0aGlzLmxpc3RBY3Rpb25zLmNoYW5nZVNvcnRpbmcsXHJcbiAgICAgICAgdGhpcy5saXN0QWN0aW9ucy5jaGFuZ2VGaWx0ZXJpbmcsXHJcbiAgICAgICAgdGhpcy5saXN0QWN0aW9ucy5jaGFuZ2VSZXF1ZXN0UGFyYW1zLFxyXG4gICAgICAgIHRoaXMubGlzdEFjdGlvbnMuaW5pdGlhbGl6ZSxcclxuICAgICAgICB0aGlzLmxpc3RBY3Rpb25zLnJlc2V0LFxyXG4gICAgICAgIHRoaXMubGlzdEFjdGlvbnMuY2hhbmdlUGFnZU51bWJlcixcclxuICAgICAgICB0aGlzLmxpc3RBY3Rpb25zLnBhdGNoU3VjY2VzcyxcclxuICAgICAgICB0aGlzLmxpc3RBY3Rpb25zLmRlbGV0ZVN1Y2Nlc3NcclxuICAgICAgKSxcclxuICAgICAgbWFwKCgpID0+IHRoaXMubGlzdEFjdGlvbnMubG9hZFBhZ2UoKSlcclxuICAgIClcclxuICApO1xyXG5cclxuICBsb2FkRmlyc3RQYWdlJCA9IGNyZWF0ZUVmZmVjdCgoKSA9PlxyXG4gICAgdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgICBvZlR5cGUodGhpcy5saXN0QWN0aW9ucy5sb2FkRmlyc3RQYWdlKSxcclxuICAgICAgbWFwKCgpID0+IHRoaXMubGlzdEFjdGlvbnMuY2hhbmdlUGFnZU51bWJlcih7IHBhZ2VOdW1iZXI6IDEgfSkpXHJcbiAgICApXHJcbiAgKTtcclxuXHJcbiAgbG9hZFByZXZpb3VzUGFnZSQgPSBjcmVhdGVFZmZlY3QoKCkgPT5cclxuICAgIHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAgICAgb2ZUeXBlKHRoaXMubGlzdEFjdGlvbnMubG9hZFByZXZpb3VzUGFnZSksXHJcbiAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUucGlwZShzZWxlY3QodGhpcy5saXN0U2VsZWN0b3JzLmdldEN1cnJlbnRQYWdlTnVtYmVyKSkpLFxyXG4gICAgICBmaWx0ZXIoKFssIGN1cnJlbnRQYWdlTnVtYmVyXSkgPT4gY3VycmVudFBhZ2VOdW1iZXIgPiAxKSxcclxuICAgICAgbWFwKChbLCBjdXJyZW50UGFnZU51bWJlcl0pID0+IHRoaXMubGlzdEFjdGlvbnMuY2hhbmdlUGFnZU51bWJlcih7IHBhZ2VOdW1iZXI6IGN1cnJlbnRQYWdlTnVtYmVyIC0gMSB9KSlcclxuICAgIClcclxuICApO1xyXG5cclxuICBsb2FkTmV4dFBhZ2UkID0gY3JlYXRlRWZmZWN0KCgpID0+XHJcbiAgICB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICAgIG9mVHlwZSh0aGlzLmxpc3RBY3Rpb25zLmxvYWROZXh0UGFnZSksXHJcbiAgICAgIHdpdGhMYXRlc3RGcm9tKFxyXG4gICAgICAgIHRoaXMuc3RvcmUucGlwZShzZWxlY3QodGhpcy5saXN0U2VsZWN0b3JzLmlzTGFzdFBhZ2UpKSxcclxuICAgICAgICB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KHRoaXMubGlzdFNlbGVjdG9ycy5nZXRDdXJyZW50UGFnZU51bWJlcikpXHJcbiAgICAgICksXHJcbiAgICAgIGZpbHRlcigoWywgaXNMYXN0UGFnZV0pID0+ICFpc0xhc3RQYWdlKSxcclxuICAgICAgbWFwKChbLCAsIGN1cnJlbnRQYWdlTnVtYmVyXSkgPT4gdGhpcy5saXN0QWN0aW9ucy5jaGFuZ2VQYWdlTnVtYmVyKHsgcGFnZU51bWJlcjogY3VycmVudFBhZ2VOdW1iZXIgKyAxIH0pKVxyXG4gICAgKVxyXG4gICk7XHJcblxyXG4gIGNoYW5nZVBhZ2luZ09wdGlvbnMkID0gY3JlYXRlRWZmZWN0KCgpID0+XHJcbiAgICB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICAgIG9mVHlwZSh0aGlzLmxpc3RBY3Rpb25zLmNoYW5nZVBhZ2luZ09wdGlvbnMpLFxyXG4gICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KHRoaXMubGlzdFNlbGVjdG9ycy5nZXRQYWdpbmdPcHRpb25zKSkpLFxyXG4gICAgICBtYXAoKFthY3Rpb24sIHBhZ2luZ09wdGlvbnNdKSA9PiB7XHJcbiAgICAgICAgaWYgKGFjdGlvbi5wYWdpbmdPcHRpb25zLnBhZ2VTaXplICE9PSBwYWdpbmdPcHRpb25zLnBhZ2VTaXplKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5saXN0QWN0aW9ucy5jaGFuZ2VQYWdlU2l6ZSh7IHBhZ2VTaXplOiBhY3Rpb24ucGFnaW5nT3B0aW9ucy5wYWdlU2l6ZSB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMubGlzdEFjdGlvbnMuY2hhbmdlUGFnZU51bWJlcih7IHBhZ2VOdW1iZXI6IGFjdGlvbi5wYWdpbmdPcHRpb25zLnBhZ2UgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gICk7XHJcblxyXG4gIGxvYWRQYWdlJCA9IGNyZWF0ZUVmZmVjdCgoKSA9PlxyXG4gICAgdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgICBvZlR5cGUodGhpcy5saXN0QWN0aW9ucy5sb2FkUGFnZSksXHJcbiAgICAgIHdpdGhMYXRlc3RGcm9tKFxyXG4gICAgICAgIHRoaXMuc3RvcmUucGlwZShzZWxlY3QodGhpcy5saXN0U2VsZWN0b3JzLmdldFBhZ2luZ09wdGlvbnMpKSxcclxuICAgICAgICB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KHRoaXMubGlzdFNlbGVjdG9ycy5nZXRTb3J0aW5nT3B0aW9ucykpLFxyXG4gICAgICAgIHRoaXMuc3RvcmUucGlwZShzZWxlY3QodGhpcy5saXN0U2VsZWN0b3JzLmdldEZpbHRlcmluZ09wdGlvbnMpKSxcclxuICAgICAgICB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KHRoaXMubGlzdFNlbGVjdG9ycy5nZXRSZXF1ZXN0UGFyYW1ldGVycykpXHJcbiAgICAgICksXHJcbiAgICAgIGNvbmNhdE1hcCgoWywgcGFnaW5nT3B0aW9ucywgc29ydGluZ09wdGlvbnMsIGZpbHRlcmluZ09wdGlvbnMsIHJlcXVlc3RQYXJhbWV0ZXJzXSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VcclxuICAgICAgICAgIC5sb2FkUmVzb3VyY2VzKHtcclxuICAgICAgICAgICAgcGFnaW5nT3B0aW9ucyxcclxuICAgICAgICAgICAgc29ydGluZ09wdGlvbnMsXHJcbiAgICAgICAgICAgIGZpbHRlcmluZ09wdGlvbnMsXHJcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcChyZXNvdXJjZXMgPT5cclxuICAgICAgICAgICAgICB0aGlzLmxpc3RBY3Rpb25zLmxvYWRQYWdlU3VjY2Vzcyh7XHJcbiAgICAgICAgICAgICAgICByZXNvdXJjZXMsXHJcbiAgICAgICAgICAgICAgICBwYWdpbmdPcHRpb25zXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JzOiBFKSA9PiBvZih0aGlzLmxpc3RBY3Rpb25zLmxvYWRQYWdlRmFpbHVyZSh7IGVycm9ycyB9KSkpXHJcbiAgICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gICk7XHJcblxyXG4gIHBhdGNoJCA9IGNyZWF0ZUVmZmVjdCgoKSA9PlxyXG4gICAgdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgICBvZlR5cGUodGhpcy5saXN0QWN0aW9ucy5wYXRjaCksXHJcbiAgICAgIGV4aGF1c3RNYXAoYWN0aW9uID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuc2VydmljZS5wYXRjaFJlc291cmNlcykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXRjaFJlc291cmNlcyBub3QgaW1wbGVtZW50IGluIHRoZSBMaXN0U2VydmljZScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5wYXRjaFJlc291cmNlcyhhY3Rpb24ucmVzb3VyY2VJZHMsIGFjdGlvbi5yZXNvdXJjZSkucGlwZShcclxuICAgICAgICAgIG1hcChyZXNvdXJjZXMgPT4gdGhpcy5saXN0QWN0aW9ucy5wYXRjaFN1Y2Nlc3MoeyByZXNvdXJjZXMgfSkpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JzOiBFKSA9PiBvZih0aGlzLmxpc3RBY3Rpb25zLnBhdGNoRmFpbHVyZSh7IGVycm9ycyB9KSkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgIClcclxuICApO1xyXG5cclxuICBzaG93UmVtb3ZhbHNEaWFsb2ckID0gY3JlYXRlRWZmZWN0KCgpID0+XHJcbiAgICB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICAgIG9mVHlwZSh0aGlzLmxpc3RBY3Rpb25zLnNob3dSZW1vdmFsc0NvbmZpcm1hdGlvbiksXHJcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMubm90aWZpY2F0aW9uU2VydmljZT8ub3BlbkNvbmZpcm1hdGlvbkRpYWxvZykge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5vcGVuQ29uZmlybWF0aW9uRGlhbG9nKHtcclxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy50ZXh0cy5kZWxldGVDb25maXJtYXRpb25NZXNzYWdlLFxyXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50ZXh0cy5kZWxldGVDb25maXJtYXRpb25UaXRsZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaWx0ZXIoY29uZmlybWVkID0+IGNvbmZpcm1lZCksXHJcbiAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUucGlwZShzZWxlY3QodGhpcy5saXN0U2VsZWN0b3JzLmdldFNlbGVjdGVkUmVzb3VyY2VJZHMpKSksXHJcbiAgICAgIG1hcCgoWywgcmVzb3VyY2VJZHNdKSA9PiB0aGlzLmxpc3RBY3Rpb25zLmRlbGV0ZSh7IHJlc291cmNlSWRzIH0pKVxyXG4gICAgKVxyXG4gICk7XHJcblxyXG4gIGRlbGV0ZSQgPSBjcmVhdGVFZmZlY3QoKCkgPT5cclxuICAgIHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAgICAgb2ZUeXBlKHRoaXMubGlzdEFjdGlvbnMuZGVsZXRlKSxcclxuICAgICAgZXhoYXVzdE1hcCgoeyByZXNvdXJjZUlkcyB9KSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNlcnZpY2UuZGVsZXRlUmVzb3VyY2VzKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlbGV0ZVJlc291cmNlcyBub3QgaW1wbGVtZW50IGluIHRoZSBMaXN0U2VydmljZScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5kZWxldGVSZXNvdXJjZXMocmVzb3VyY2VJZHMpLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5saXN0QWN0aW9ucy5kZWxldGVTdWNjZXNzKHsgcmVzb3VyY2VJZHMgfSkpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JzOiBFKSA9PiBvZih0aGlzLmxpc3RBY3Rpb25zLmRlbGV0ZUZhaWx1cmUoeyBlcnJvcnMgfSkpKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgKTtcclxuXHJcbiAgZGVsZXRlVXNlcnNTdWNjZXNzJCA9IGNyZWF0ZUVmZmVjdChcclxuICAgICgpID0+XHJcbiAgICAgIHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAgICAgICBvZlR5cGUodGhpcy5saXN0QWN0aW9ucy5kZWxldGVTdWNjZXNzKSxcclxuICAgICAgICB0YXAoKHsgcmVzb3VyY2VJZHMgfSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlPy5vbkxpc3REZWxldGUocmVzb3VyY2VJZHMpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICB7IGRpc3BhdGNoOiBmYWxzZSB9XHJcbiAgKTtcclxuXHJcbiAgZXJyb3JzSGFuZGxlciQgPSBjcmVhdGVFZmZlY3QoXHJcbiAgICAoKSA9PlxyXG4gICAgICB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICAgICAgb2ZUeXBlKHRoaXMubGlzdEFjdGlvbnMubG9hZFBhZ2VGYWlsdXJlLCB0aGlzLmxpc3RBY3Rpb25zLmRlbGV0ZUZhaWx1cmUsIHRoaXMubGlzdEFjdGlvbnMucGF0Y2hGYWlsdXJlKSxcclxuICAgICAgICB0YXAoKHsgZXJyb3JzIH0pID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZT8ub25MaXN0RXJyb3JzKGVycm9ycyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKSxcclxuICAgIHsgZGlzcGF0Y2g6IGZhbHNlIH1cclxuICApO1xyXG5cclxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWN0aW9ucyQ6IEFjdGlvbnMsXHJcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RvcmU6IFN0b3JlLFxyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcnZpY2U6IExpc3RTZXJ2aWNlPFQsIFM+LFxyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGxpc3RBY3Rpb25zOiBMaXN0QWN0aW9uczxULCBFLCBTPixcclxuICAgIHByb3RlY3RlZCByZWFkb25seSBsaXN0U2VsZWN0b3JzOiBMaXN0U2VsZWN0b3JzPFMsIEU+LFxyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vdGlmaWNhdGlvblNlcnZpY2U/OiBMaXN0Tm90aWZpY2F0aW9uU2VydmljZTxFPlxyXG4gICkge31cclxufVxyXG4iXX0=