From f819e3c679c156247eb3706ede39cea56f6ee859 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 29 Dec 2020 09:16:39 +0300 Subject: [PATCH 1/8] fix condition for recursive DeepPartial type --- npm/ng-packs/packages/core/src/lib/models/utility.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/models/utility.ts b/npm/ng-packs/packages/core/src/lib/models/utility.ts index f1cfbdb6da..6d9b44ceb6 100644 --- a/npm/ng-packs/packages/core/src/lib/models/utility.ts +++ b/npm/ng-packs/packages/core/src/lib/models/utility.ts @@ -1,14 +1,9 @@ import { TemplateRef, Type } from '@angular/core'; export type DeepPartial = { - [P in keyof T]?: T[P] extends Serializable ? DeepPartial : T[P]; + [P in keyof T]?: T[P] extends Record ? DeepPartial : T[P]; }; -type Serializable = Record< - string | number | symbol, - string | number | boolean | Record ->; - export type InferredInstanceOf = T extends Type ? U : never; export type InferredContextOf = T extends TemplateRef ? U : never; From 27fb31e530309d72b88d896c27263ff138bd6884 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 29 Dec 2020 09:17:34 +0300 Subject: [PATCH 2/8] fix sliceUpdate selector type --- .../packages/core/src/lib/utils/internal-store-utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts index ea4af9ddfb..924c48d988 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts @@ -19,7 +19,7 @@ export class InternalStore { ) => this.state$.pipe(map(selector), distinctUntilChanged(compareFn)); sliceUpdate = ( - selector: (state: DeepPartial) => Slice, + selector: (state: State) => Slice, filterFn = (x: Slice) => x !== undefined, ) => this.update$.pipe(map(selector), filter(filterFn)); From 13e06959243b6acd426f7a40c6ef5cd1ca1f8321 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 29 Dec 2020 09:18:17 +0300 Subject: [PATCH 3/8] make PermissionService props and methods protected --- .../core/src/lib/services/permission.service.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/services/permission.service.ts b/npm/ng-packs/packages/core/src/lib/services/permission.service.ts index c89949b064..c549c5a7a8 100644 --- a/npm/ng-packs/packages/core/src/lib/services/permission.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/permission.service.ts @@ -6,7 +6,7 @@ import { ConfigStateService } from './config-state.service'; @Injectable({ providedIn: 'root' }) export class PermissionService { - constructor(private configState: ConfigStateService) {} + constructor(protected configState: ConfigStateService) {} getGrantedPolicy$(key: string) { return this.getStream().pipe( @@ -19,7 +19,7 @@ export class PermissionService { return this.isPolicyGranted(key, policies); } - private isPolicyGranted(key: string, grantedPolicies: Record) { + protected isPolicyGranted(key: string, grantedPolicies: Record) { if (!key) return true; const orRegexp = /\|\|/g; @@ -43,19 +43,19 @@ export class PermissionService { return this.getPolicy(key, grantedPolicies); } - private getStream() { + protected getStream() { return this.configState.getAll$().pipe(map(this.mapToPolicies)); } - private getSnapshot() { + protected getSnapshot() { return this.mapToPolicies(this.configState.getAll()); } - private mapToPolicies(applicationConfiguration: ApplicationConfigurationDto) { - return snq(() => applicationConfiguration.auth.grantedPolicies); + protected mapToPolicies(applicationConfiguration: ApplicationConfigurationDto) { + return snq(() => applicationConfiguration.auth.grantedPolicies, {}); } - private getPolicy(key: string, grantedPolicies: Record) { + protected getPolicy(key: string, grantedPolicies: Record) { return snq(() => grantedPolicies[key], false); } } From 255922244ae8ebe904c898382391eade72c944dc Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 29 Dec 2020 09:18:48 +0300 Subject: [PATCH 4/8] add mock permission service to core testing lib --- .../core/testing/src/lib/services/index.ts | 1 + .../lib/services/mock-permission.service.ts | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 npm/ng-packs/packages/core/testing/src/lib/services/mock-permission.service.ts diff --git a/npm/ng-packs/packages/core/testing/src/lib/services/index.ts b/npm/ng-packs/packages/core/testing/src/lib/services/index.ts index 24206d7c5d..128750c0bc 100644 --- a/npm/ng-packs/packages/core/testing/src/lib/services/index.ts +++ b/npm/ng-packs/packages/core/testing/src/lib/services/index.ts @@ -1 +1,2 @@ +export * from './mock-permission.service'; export * from './mock-rest.service'; diff --git a/npm/ng-packs/packages/core/testing/src/lib/services/mock-permission.service.ts b/npm/ng-packs/packages/core/testing/src/lib/services/mock-permission.service.ts new file mode 100644 index 0000000000..81bbdcc625 --- /dev/null +++ b/npm/ng-packs/packages/core/testing/src/lib/services/mock-permission.service.ts @@ -0,0 +1,34 @@ +import { ConfigStateService, PermissionService } from '@abp/ng.core'; +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class MockPermissionService extends PermissionService { + constructor(protected configState: ConfigStateService) { + super(configState); + this.grantAllPolicies(); + } + + grantAllPolicies() { + const grantedPolicies = new Proxy( + {}, + { + get() { + return true; + }, + }, + ); + + this.configState['store'].deepPatch({ auth: { grantedPolicies } }); + } + + grantPolicies(keys: string[]) { + const grantedPolicies = keys.reduce((policies, key) => { + policies[key] = true; + return policies; + }, {}); + + this.configState['store'].deepPatch({ auth: { grantedPolicies } }); + } +} From a55c79519f4d591b2fb7c946cbf1d2aef60fa3e5 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 29 Dec 2020 09:19:13 +0300 Subject: [PATCH 5/8] provide MockPermissionService as PermissionService --- .../packages/core/testing/src/lib/core-testing.module.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts b/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts index 7fa32a1b89..adfbaca816 100644 --- a/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts +++ b/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts @@ -4,6 +4,7 @@ import { coreOptionsFactory, CORE_OPTIONS, LIST_QUERY_DEBOUNCE_TIME, + PermissionService, RestService, } from '@abp/ng.core'; import { APP_BASE_HREF } from '@angular/common'; @@ -11,6 +12,7 @@ import { ModuleWithProviders, NgModule } from '@angular/core'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { provideRoutes } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; +import { MockPermissionService } from './services/mock-permission.service'; import { MockRestService } from './services/mock-rest.service'; /** @@ -42,6 +44,10 @@ export class CoreTestingModule { provide: LIST_QUERY_DEBOUNCE_TIME, useValue: listQueryDebounceTime, }, + { + provide: PermissionService, + useClass: MockPermissionService, + }, { provide: RestService, useClass: MockRestService, From f0cdf83357b2a3c4c60df3aae4ee68244da3f452 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 29 Dec 2020 09:21:57 +0300 Subject: [PATCH 6/8] make mock services of core testing public --- npm/ng-packs/packages/core/testing/src/public-api.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/npm/ng-packs/packages/core/testing/src/public-api.ts b/npm/ng-packs/packages/core/testing/src/public-api.ts index 3b48853680..bf95ae9ece 100644 --- a/npm/ng-packs/packages/core/testing/src/public-api.ts +++ b/npm/ng-packs/packages/core/testing/src/public-api.ts @@ -1 +1,2 @@ export * from './lib/core-testing.module'; +export * from './lib/services'; From 2103cb339cae5671a1f6fb2f9813718eb22e842f Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 29 Dec 2020 22:04:42 +0300 Subject: [PATCH 7/8] improve DeepPartial utility type --- .../packages/core/src/lib/models/utility.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/models/utility.ts b/npm/ng-packs/packages/core/src/lib/models/utility.ts index 6d9b44ceb6..a8ff45e319 100644 --- a/npm/ng-packs/packages/core/src/lib/models/utility.ts +++ b/npm/ng-packs/packages/core/src/lib/models/utility.ts @@ -1,8 +1,21 @@ +/* tslint:disable:ban-types */ import { TemplateRef, Type } from '@angular/core'; -export type DeepPartial = { - [P in keyof T]?: T[P] extends Record ? DeepPartial : T[P]; -}; +export type DeepPartial = Partible extends never + ? T + : { + [K in keyof T]?: DeepPartial; + }; + +type Partible = T extends Primitive | Array + ? never + : { + [K in keyof T]: T[K] extends Function ? never : T[K]; + } extends T + ? T + : never; + +export type Primitive = undefined | null | boolean | string | number | bigint | symbol; export type InferredInstanceOf = T extends Type ? U : never; export type InferredContextOf = T extends TemplateRef ? U : never; From e7edc905c352e4d0cf763b7602fec3755ee53829 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 29 Dec 2020 22:09:02 +0300 Subject: [PATCH 8/8] assert generic state to deep partial state --- .../packages/core/src/lib/utils/internal-store-utils.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts index 924c48d988..27a8e9cbcf 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts @@ -19,7 +19,7 @@ export class InternalStore { ) => this.state$.pipe(map(selector), distinctUntilChanged(compareFn)); sliceUpdate = ( - selector: (state: State) => Slice, + selector: (state: DeepPartial) => Slice, filterFn = (x: Slice) => x !== undefined, ) => this.update$.pipe(map(selector), filter(filterFn)); @@ -33,7 +33,7 @@ export class InternalStore { } this.state$.next(patchedState); - this.update$.next(patchedState); + this.update$.next(patchedState as DeepPartial); } deepPatch(state: DeepPartial) { @@ -43,7 +43,7 @@ export class InternalStore { set(state: State) { this.state$.next(state); - this.update$.next(state); + this.update$.next(state as DeepPartial); } reset() {