@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.
- package/esm2022/index.mjs +12 -0
- package/esm2022/lib/+state/effects.mjs +22 -0
- package/esm2022/lib/+state/state.service.mjs +55 -0
- package/esm2022/lib/models/list.model.mjs +7 -0
- package/esm2022/lib/ngdux-list-state.module.mjs +53 -0
- package/esm2022/lib/services/list-notification-service.mjs +21 -0
- package/esm2022/lib/state-generator/abstract-list-effects.mjs +50 -0
- package/esm2022/lib/state-generator/abstract-list-state.service.mjs +44 -0
- package/esm2022/lib/state-generator/abstract-list.facade.mjs +85 -0
- package/esm2022/lib/state-generator/list-actions.mjs +58 -0
- package/esm2022/lib/state-generator/list-reducer.mjs +104 -0
- package/esm2022/lib/state-generator/list-selectors.mjs +80 -0
- package/esm2022/lib/state-generator/list-state.mjs +18 -0
- package/{esm2020 → esm2022}/ngdux-list.mjs +4 -4
- package/{fesm2020 → fesm2022}/ngdux-list.mjs +540 -432
- package/fesm2022/ngdux-list.mjs.map +1 -0
- package/index.d.ts +11 -9
- package/lib/+state/effects.d.ts +14 -0
- package/lib/+state/state.service.d.ts +22 -0
- package/lib/models/list.model.d.ts +191 -183
- package/lib/ngdux-list-state.module.d.ts +23 -0
- package/lib/services/list-notification-service.d.ts +13 -0
- package/lib/{+state → state-generator}/abstract-list-effects.d.ts +49 -61
- package/lib/{+state → state-generator}/abstract-list-state.service.d.ts +21 -21
- package/lib/{+state → state-generator}/abstract-list.facade.d.ts +45 -46
- package/lib/{+state → state-generator}/list-actions.d.ts +2 -2
- package/lib/{+state → state-generator}/list-reducer.d.ts +10 -10
- package/lib/state-generator/list-selectors.d.ts +4 -0
- package/lib/{+state → state-generator}/list-state.d.ts +12 -12
- package/package.json +9 -102
- package/esm2020/index.mjs +0 -10
- package/esm2020/lib/+state/abstract-list-effects.mjs +0 -71
- package/esm2020/lib/+state/abstract-list-state.service.mjs +0 -44
- package/esm2020/lib/+state/abstract-list.facade.mjs +0 -88
- package/esm2020/lib/+state/list-actions.mjs +0 -60
- package/esm2020/lib/+state/list-reducer.mjs +0 -97
- package/esm2020/lib/+state/list-selectors.mjs +0 -80
- package/esm2020/lib/+state/list-state.mjs +0 -18
- package/esm2020/lib/models/list.model.mjs +0 -4
- package/fesm2015/ngdux-list.mjs +0 -404
- package/fesm2015/ngdux-list.mjs.map +0 -1
- package/fesm2020/ngdux-list.mjs.map +0 -1
- 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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
} & import("@ngrx/store/src/models").TypedAction<string
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
} & import("@ngrx/store/src/models").TypedAction<string>)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
} & import("@ngrx/store/src/models").TypedAction<string>)
|
|
48
|
-
|
|
49
|
-
|
|
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,
|
|
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<
|
|
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").
|
|
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
|
-
|
|
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
|
|
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
|
|
8
|
-
actions: import("../models/list.model").ListActions<T, E, S,
|
|
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": "
|
|
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": "^
|
|
12
|
+
"@angular/core": "^16.0.0",
|
|
13
13
|
"@ngdux/store-common": "^1.0.0",
|
|
14
|
-
"@ngrx/entity": "^
|
|
14
|
+
"@ngrx/entity": "^16.0.0",
|
|
15
|
+
"@ngrx/store": "^16.0.0",
|
|
16
|
+
"@ngrx/effects": "^16.0.0"
|
|
15
17
|
},
|
|
16
|
-
"
|
|
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
|
-
"
|
|
118
|
-
"
|
|
119
|
-
"
|
|
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=
|