From 8c997d1e4e14e448c16cbffe69fffb1773a72f25 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 20 Dec 2019 17:36:30 +0300 Subject: [PATCH 01/46] feat(identity): create route-wrapper.component --- .../lib/components/route-wrapper.component.ts | 18 ++++++++++++++++++ .../src/lib/identity-routing.module.ts | 19 +++++++++++++------ .../identity/src/lib/identity.module.ts | 3 ++- 3 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 npm/ng-packs/packages/identity/src/lib/components/route-wrapper.component.ts diff --git a/npm/ng-packs/packages/identity/src/lib/components/route-wrapper.component.ts b/npm/ng-packs/packages/identity/src/lib/components/route-wrapper.component.ts new file mode 100644 index 0000000000..cb28bdfb36 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/components/route-wrapper.component.ts @@ -0,0 +1,18 @@ +import { Type, Component, OnInit } from '@angular/core'; +import { Router, ActivatedRoute } from '@angular/router'; + +@Component({ + selector: 'identity-route-wrapper', + template: ` + + `, +}) +export class RouteWrapperComponent implements OnInit { + defaultComponent: Type; + + constructor(private route: ActivatedRoute) {} + + ngOnInit() { + this.defaultComponent = this.route.snapshot.data.component.default; + } +} diff --git a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts index 96764a09ad..661dd61f42 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts @@ -1,8 +1,9 @@ -import { AuthGuard, DynamicLayoutComponent, PermissionGuard } from '@abp/ng.core'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { AuthGuard, DynamicLayoutComponent, PermissionGuard, ABP, CoreModule } from '@abp/ng.core'; +import { NgModule, Type } from '@angular/core'; +import { RouterModule, Routes, Router, ActivatedRoute } from '@angular/router'; import { RolesComponent } from './components/roles/roles.component'; import { UsersComponent } from './components/users/users.component'; +import { RouteWrapperComponent } from './components/route-wrapper.component'; const routes: Routes = [ { path: '', redirectTo: 'roles', pathMatch: 'full' }, @@ -13,8 +14,14 @@ const routes: Routes = [ children: [ { path: 'roles', - component: RolesComponent, - data: { requiredPolicy: 'AbpIdentity.Roles' }, + component: RouteWrapperComponent, + data: { + requiredPolicy: 'AbpIdentity.Roles', + component: { + key: 'AbpIdentity.Roles', + default: RolesComponent, + } as ABP.ComponentData, + }, }, { path: 'users', @@ -26,7 +33,7 @@ const routes: Routes = [ ]; @NgModule({ - imports: [RouterModule.forChild(routes)], + imports: [RouterModule.forChild(routes), CoreModule], exports: [RouterModule], }) export class IdentityRoutingModule {} diff --git a/npm/ng-packs/packages/identity/src/lib/identity.module.ts b/npm/ng-packs/packages/identity/src/lib/identity.module.ts index 15b1b1c7cb..f80f11296b 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity.module.ts @@ -10,9 +10,10 @@ import { UsersComponent } from './components/users/users.component'; import { PermissionManagementModule } from '@abp/ng.permission-management'; import { TableModule } from 'primeng/table'; import { NgxValidateCoreModule } from '@ngx-validate/core'; +import { RouteWrapperComponent } from './components/route-wrapper.component'; @NgModule({ - declarations: [RolesComponent, UsersComponent], + declarations: [RolesComponent, UsersComponent, RouteWrapperComponent], imports: [ NgxsModule.forFeature([IdentityState]), CoreModule, From 51fc0ec255b3fa80deba76224401a37203ea38e0 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 20 Dec 2019 17:36:51 +0300 Subject: [PATCH 02/46] feat(core): add component data interface --- npm/ng-packs/packages/core/src/lib/models/common.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/npm/ng-packs/packages/core/src/lib/models/common.ts b/npm/ng-packs/packages/core/src/lib/models/common.ts index 95bf490e91..dd0bae45ec 100644 --- a/npm/ng-packs/packages/core/src/lib/models/common.ts +++ b/npm/ng-packs/packages/core/src/lib/models/common.ts @@ -1,5 +1,6 @@ import { Config } from './config'; import { eLayoutType } from '../enums/common'; +import { Type } from '@angular/core'; export namespace ABP { export interface Root { @@ -47,4 +48,9 @@ export namespace ABP { export interface Dictionary { [key: string]: T; } + + export interface ComponentData { + key: string; + default: Type; + } } From 4d44e3b4a2ba61160ab941ea52e7a85b5005b615 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 23 Dec 2019 13:07:30 +0300 Subject: [PATCH 03/46] refactor(core): move route-wrapper.component from identity and remaned replaceable-route-container.component --- .../packages/core/src/lib/components/index.ts | 1 + .../replaceable-route-container.component.ts} | 4 ++-- .../packages/core/src/lib/core.module.ts | 3 +++ .../src/lib/identity-routing.module.ts | 22 ++++++++++++++----- .../identity/src/lib/identity.module.ts | 3 +-- 5 files changed, 24 insertions(+), 9 deletions(-) rename npm/ng-packs/packages/{identity/src/lib/components/route-wrapper.component.ts => core/src/lib/components/replaceable-route-container.component.ts} (77%) diff --git a/npm/ng-packs/packages/core/src/lib/components/index.ts b/npm/ng-packs/packages/core/src/lib/components/index.ts index d54b2d2175..da3c72a69f 100644 --- a/npm/ng-packs/packages/core/src/lib/components/index.ts +++ b/npm/ng-packs/packages/core/src/lib/components/index.ts @@ -1,2 +1,3 @@ export * from './dynamic-layout.component'; +export * from './replaceable-route-container.component'; export * from './router-outlet.component'; diff --git a/npm/ng-packs/packages/identity/src/lib/components/route-wrapper.component.ts b/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts similarity index 77% rename from npm/ng-packs/packages/identity/src/lib/components/route-wrapper.component.ts rename to npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts index cb28bdfb36..70332eeddf 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/route-wrapper.component.ts +++ b/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts @@ -2,12 +2,12 @@ import { Type, Component, OnInit } from '@angular/core'; import { Router, ActivatedRoute } from '@angular/router'; @Component({ - selector: 'identity-route-wrapper', + selector: 'abp-replaceable-route-container', template: ` `, }) -export class RouteWrapperComponent implements OnInit { +export class ReplaceableRouteContainerComponent implements OnInit { defaultComponent: Type; constructor(private route: ActivatedRoute) {} diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index ab24c6beff..d53f90da13 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -29,6 +29,7 @@ import { ProfileState } from './states/profile.state'; import { SessionState } from './states/session.state'; import { getInitialData, localeInitializer } from './utils/initial-utils'; import './utils/date-extensions'; +import { ReplaceableRouteContainerComponent } from './components/replaceable-route-container.component'; @NgModule({ imports: [ @@ -43,6 +44,7 @@ import './utils/date-extensions'; RouterModule, ], declarations: [ + ReplaceableRouteContainerComponent, RouterOutletComponent, DynamicLayoutComponent, AutofocusDirective, @@ -77,6 +79,7 @@ import './utils/date-extensions'; LocalizationPipe, StopPropagationDirective, AbstractNgModelComponent, + ReplaceableRouteContainerComponent, ], providers: [LocalizationPipe], entryComponents: [RouterOutletComponent, DynamicLayoutComponent], diff --git a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts index 661dd61f42..3f82cf69f2 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts @@ -1,9 +1,15 @@ -import { AuthGuard, DynamicLayoutComponent, PermissionGuard, ABP, CoreModule } from '@abp/ng.core'; +import { + AuthGuard, + DynamicLayoutComponent, + PermissionGuard, + ABP, + CoreModule, + ReplaceableRouteContainerComponent, +} from '@abp/ng.core'; import { NgModule, Type } from '@angular/core'; import { RouterModule, Routes, Router, ActivatedRoute } from '@angular/router'; import { RolesComponent } from './components/roles/roles.component'; import { UsersComponent } from './components/users/users.component'; -import { RouteWrapperComponent } from './components/route-wrapper.component'; const routes: Routes = [ { path: '', redirectTo: 'roles', pathMatch: 'full' }, @@ -14,7 +20,7 @@ const routes: Routes = [ children: [ { path: 'roles', - component: RouteWrapperComponent, + component: ReplaceableRouteContainerComponent, data: { requiredPolicy: 'AbpIdentity.Roles', component: { @@ -25,8 +31,14 @@ const routes: Routes = [ }, { path: 'users', - component: UsersComponent, - data: { requiredPolicy: 'AbpIdentity.Users' }, + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'AbpIdentity.Users', + component: { + key: 'AbpIdentity.Roles', + default: UsersComponent, + } as ABP.ComponentData, + }, }, ], }, diff --git a/npm/ng-packs/packages/identity/src/lib/identity.module.ts b/npm/ng-packs/packages/identity/src/lib/identity.module.ts index f80f11296b..15b1b1c7cb 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity.module.ts @@ -10,10 +10,9 @@ import { UsersComponent } from './components/users/users.component'; import { PermissionManagementModule } from '@abp/ng.permission-management'; import { TableModule } from 'primeng/table'; import { NgxValidateCoreModule } from '@ngx-validate/core'; -import { RouteWrapperComponent } from './components/route-wrapper.component'; @NgModule({ - declarations: [RolesComponent, UsersComponent, RouteWrapperComponent], + declarations: [RolesComponent, UsersComponent], imports: [ NgxsModule.forFeature([IdentityState]), CoreModule, From b9cdc461feb77b0cee39a4af3bbaf9a979c98d91 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 23 Dec 2019 14:22:29 +0300 Subject: [PATCH 04/46] feat(core): create replaceable components state #2404 --- .../packages/core/src/lib/actions/index.ts | 3 +- .../actions/replaceable-components.actions.ts | 6 +++ .../packages/core/src/lib/core.module.ts | 3 +- .../packages/core/src/lib/models/index.ts | 5 ++- .../src/lib/models/replaceable-components.ts | 12 +++++ .../packages/core/src/lib/states/index.ts | 5 ++- .../states/replaceable-components.state.ts | 44 +++++++++++++++++++ 7 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts create mode 100644 npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts create mode 100644 npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts diff --git a/npm/ng-packs/packages/core/src/lib/actions/index.ts b/npm/ng-packs/packages/core/src/lib/actions/index.ts index cf05aac81d..46269fd60a 100644 --- a/npm/ng-packs/packages/core/src/lib/actions/index.ts +++ b/npm/ng-packs/packages/core/src/lib/actions/index.ts @@ -1,5 +1,6 @@ export * from './config.actions'; export * from './loader.actions'; export * from './profile.actions'; +export * from './replaceable-components.actions'; export * from './rest.actions'; -export * from './session.actions'; +export * from './session.actions'; \ No newline at end of file diff --git a/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts b/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts new file mode 100644 index 0000000000..b5f6480b2a --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts @@ -0,0 +1,6 @@ +import { ReplaceableComponents } from '../models/replaceable-components'; + +export class AddReplaceableComponent { + static readonly type = '[ReplaceableComponents] Add'; + constructor(public payload: ReplaceableComponents.Data | ReplaceableComponents.Data[]) {} +} diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index d53f90da13..983fad2125 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -30,10 +30,11 @@ import { SessionState } from './states/session.state'; import { getInitialData, localeInitializer } from './utils/initial-utils'; import './utils/date-extensions'; import { ReplaceableRouteContainerComponent } from './components/replaceable-route-container.component'; +import { ReplaceableComponentsState } from './states/replaceable-components.state'; @NgModule({ imports: [ - NgxsModule.forFeature([ProfileState, SessionState, ConfigState]), + NgxsModule.forFeature([ReplaceableComponentsState, ProfileState, SessionState, ConfigState]), NgxsRouterPluginModule.forRoot(), NgxsStoragePluginModule.forRoot({ key: ['SessionState'] }), OAuthModule.forRoot(), diff --git a/npm/ng-packs/packages/core/src/lib/models/index.ts b/npm/ng-packs/packages/core/src/lib/models/index.ts index 63302c9ab8..213218d811 100644 --- a/npm/ng-packs/packages/core/src/lib/models/index.ts +++ b/npm/ng-packs/packages/core/src/lib/models/index.ts @@ -1,6 +1,7 @@ export * from './application-configuration'; export * from './common'; export * from './config'; -export * from './rest'; -export * from './session'; export * from './profile'; +export * from './replaceable-components'; +export * from './rest'; +export * from './session'; \ No newline at end of file diff --git a/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts b/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts new file mode 100644 index 0000000000..8f46faf01e --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts @@ -0,0 +1,12 @@ +import { Type } from '@angular/core'; + +export namespace ReplaceableComponents { + export interface State { + replaceableComponents: Data[]; + } + + export interface Data { + component: Type; + key: string; + } +} diff --git a/npm/ng-packs/packages/core/src/lib/states/index.ts b/npm/ng-packs/packages/core/src/lib/states/index.ts index b7626c2842..d70de13d43 100644 --- a/npm/ng-packs/packages/core/src/lib/states/index.ts +++ b/npm/ng-packs/packages/core/src/lib/states/index.ts @@ -1,3 +1,4 @@ -export * from './profile.state'; +export * from "./replaceable-components.state"; export * from './config.state'; -export * from './session.state'; +export * from './profile.state'; +export * from './session.state'; \ No newline at end of file diff --git a/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts new file mode 100644 index 0000000000..7391f79ec2 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts @@ -0,0 +1,44 @@ +import { State, Action, StateContext, Selector, createSelector } from '@ngxs/store'; +import { AddReplaceableComponent } from '../actions/replaceable-components.actions'; +import { ReplaceableComponents } from '../models/replaceable-components'; +import snq from 'snq'; + +@State({ + name: 'ReplaceableComponentsState', + defaults: { replaceableComponents: [] } as ReplaceableComponents.State, +}) +export class ReplaceableComponentsState { + @Selector() + static getAll({ + replaceableComponents, + }: ReplaceableComponents.State): ReplaceableComponents.Data[] { + return replaceableComponents || []; + } + + static getOne(key: string) { + const selector = createSelector( + [ReplaceableComponentsState], + ({ replaceableComponents }: ReplaceableComponents.State) => { + return snq(() => replaceableComponents.find(component => component.key === key)); + }, + ); + + return selector; + } + + @Action(AddReplaceableComponent) + replaceableComponentsAction( + { getState, patchState }: StateContext, + { payload }: AddReplaceableComponent, + ) { + if (!Array.isArray(payload)) { + payload = [payload]; + } + + const { replaceableComponents } = getState(); + + patchState({ + replaceableComponents: [...replaceableComponents, ...payload], + }); + } +} From 8cb5843a2ab640097ff866f52e43e223af4f4f9b Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 24 Dec 2019 10:20:28 +0300 Subject: [PATCH 05/46] chore: add homepage and repo information to all package json files --- npm/ng-packs/package.json | 11 ++++++++--- npm/ng-packs/packages/account-config/package.json | 5 +++++ npm/ng-packs/packages/account/package.json | 5 +++++ npm/ng-packs/packages/core/package.json | 5 +++++ npm/ng-packs/packages/feature-management/package.json | 5 +++++ npm/ng-packs/packages/identity-config/package.json | 5 +++++ npm/ng-packs/packages/identity/package.json | 5 +++++ .../packages/permission-management/package.json | 5 +++++ .../packages/setting-management-config/package.json | 5 +++++ npm/ng-packs/packages/setting-management/package.json | 5 +++++ .../packages/tenant-management-config/package.json | 5 +++++ npm/ng-packs/packages/tenant-management/package.json | 5 +++++ npm/ng-packs/packages/theme-basic/package.json | 5 +++++ npm/ng-packs/packages/theme-shared/package.json | 5 +++++ 14 files changed, 73 insertions(+), 3 deletions(-) diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index f66eb74303..920fe7a595 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -1,4 +1,9 @@ { + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "scripts": { "ng": "ng", "abpng": "abpng", @@ -30,11 +35,11 @@ "@abp/ng.theme.basic": "^1.1.1", "@abp/ng.theme.shared": "^1.1.1", "@angular-builders/jest": "^8.2.0", - "@angular-devkit/build-angular": "~0.803.20", - "@angular-devkit/build-ng-packagr": "~0.803.20", + "@angular-devkit/build-angular": "~0.803.21", + "@angular-devkit/build-ng-packagr": "~0.803.21", "@angular/animations": "~8.2.14", "@angular/cdk": "^8.2.3", - "@angular/cli": "~8.3.18", + "@angular/cli": "~8.3.21", "@angular/common": "~8.2.14", "@angular/compiler": "~8.2.14", "@angular/compiler-cli": "~8.2.14", diff --git a/npm/ng-packs/packages/account-config/package.json b/npm/ng-packs/packages/account-config/package.json index ccfc3cc841..aeb8d2b697 100644 --- a/npm/ng-packs/packages/account-config/package.json +++ b/npm/ng-packs/packages/account-config/package.json @@ -1,6 +1,11 @@ { "name": "@abp/ng.account.config", "version": "1.1.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "publishConfig": { "access": "public" } diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index 81049e297d..88f866d5a4 100644 --- a/npm/ng-packs/packages/account/package.json +++ b/npm/ng-packs/packages/account/package.json @@ -1,6 +1,11 @@ { "name": "@abp/ng.account", "version": "1.1.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "dependencies": { "@abp/ng.account.config": "^1.1.1", "@abp/ng.theme.shared": "^1.1.1" diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index ff8ad4d268..10063989b5 100644 --- a/npm/ng-packs/packages/core/package.json +++ b/npm/ng-packs/packages/core/package.json @@ -1,6 +1,11 @@ { "name": "@abp/ng.core", "version": "1.1.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "dependencies": { "@ngxs/router-plugin": "^3.5.1", "@ngxs/storage-plugin": "^3.5.1", diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json index 036fc3a7cc..38cd5ffa9c 100644 --- a/npm/ng-packs/packages/feature-management/package.json +++ b/npm/ng-packs/packages/feature-management/package.json @@ -1,6 +1,11 @@ { "name": "@abp/ng.feature-management", "version": "1.1.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "dependencies": { "@abp/ng.theme.shared": "^1.1.1" }, diff --git a/npm/ng-packs/packages/identity-config/package.json b/npm/ng-packs/packages/identity-config/package.json index 2635e021b8..c4a75d9fec 100644 --- a/npm/ng-packs/packages/identity-config/package.json +++ b/npm/ng-packs/packages/identity-config/package.json @@ -1,6 +1,11 @@ { "name": "@abp/ng.identity.config", "version": "1.1.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "publishConfig": { "access": "public" } diff --git a/npm/ng-packs/packages/identity/package.json b/npm/ng-packs/packages/identity/package.json index d6496e9266..0bebdd32b8 100644 --- a/npm/ng-packs/packages/identity/package.json +++ b/npm/ng-packs/packages/identity/package.json @@ -1,6 +1,11 @@ { "name": "@abp/ng.identity", "version": "1.1.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "dependencies": { "@abp/ng.identity.config": "^1.1.1", "@abp/ng.permission-management": "^1.1.1", diff --git a/npm/ng-packs/packages/permission-management/package.json b/npm/ng-packs/packages/permission-management/package.json index c73b5ef95c..cc7fdddf2f 100644 --- a/npm/ng-packs/packages/permission-management/package.json +++ b/npm/ng-packs/packages/permission-management/package.json @@ -1,6 +1,11 @@ { "name": "@abp/ng.permission-management", "version": "1.1.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "dependencies": { "@abp/ng.theme.shared": "^1.1.1" }, diff --git a/npm/ng-packs/packages/setting-management-config/package.json b/npm/ng-packs/packages/setting-management-config/package.json index 9ae896ed79..5f1606f414 100644 --- a/npm/ng-packs/packages/setting-management-config/package.json +++ b/npm/ng-packs/packages/setting-management-config/package.json @@ -1,6 +1,11 @@ { "name": "@abp/ng.setting-management.config", "version": "1.1.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "publishConfig": { "access": "public" } diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index 237f712dbb..6144b81903 100644 --- a/npm/ng-packs/packages/setting-management/package.json +++ b/npm/ng-packs/packages/setting-management/package.json @@ -1,6 +1,11 @@ { "name": "@abp/ng.setting-management", "version": "1.1.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "dependencies": { "@abp/ng.setting-management.config": "^1.1.1", "@abp/ng.theme.shared": "^1.1.1" diff --git a/npm/ng-packs/packages/tenant-management-config/package.json b/npm/ng-packs/packages/tenant-management-config/package.json index d7751ef32c..9bbc6c48c7 100644 --- a/npm/ng-packs/packages/tenant-management-config/package.json +++ b/npm/ng-packs/packages/tenant-management-config/package.json @@ -1,6 +1,11 @@ { "name": "@abp/ng.tenant-management.config", "version": "1.1.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "publishConfig": { "access": "public" } diff --git a/npm/ng-packs/packages/tenant-management/package.json b/npm/ng-packs/packages/tenant-management/package.json index de09a11ca4..0467507227 100644 --- a/npm/ng-packs/packages/tenant-management/package.json +++ b/npm/ng-packs/packages/tenant-management/package.json @@ -1,6 +1,11 @@ { "name": "@abp/ng.tenant-management", "version": "1.1.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "dependencies": { "@abp/ng.feature-management": "^1.1.1", "@abp/ng.tenant-management.config": "^1.1.1", diff --git a/npm/ng-packs/packages/theme-basic/package.json b/npm/ng-packs/packages/theme-basic/package.json index 945be5c580..079b52ed22 100644 --- a/npm/ng-packs/packages/theme-basic/package.json +++ b/npm/ng-packs/packages/theme-basic/package.json @@ -1,6 +1,11 @@ { "name": "@abp/ng.theme.basic", "version": "1.1.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "dependencies": { "@abp/ng.theme.shared": "^1.1.1" }, diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index 25806969b0..9972b3cfd1 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -1,6 +1,11 @@ { "name": "@abp/ng.theme.shared", "version": "1.1.1", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, "dependencies": { "@abp/ng.core": "^1.1.1", "@angular/cdk": "^8.2.3", From 2fc59ea05ba74cde9075db668d7cee75440ebb58 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 24 Dec 2019 13:41:38 +0300 Subject: [PATCH 06/46] feat(core): improve replaceable-route-container component #2404 --- .../replaceable-route-container.component.ts | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts b/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts index 70332eeddf..af4805177d 100644 --- a/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts +++ b/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts @@ -1,18 +1,43 @@ -import { Type, Component, OnInit } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; +import { Component, OnDestroy, OnInit, Type } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Store } from '@ngxs/store'; +import { distinctUntilChanged } from 'rxjs/operators'; +import { ABP } from '../models/common'; +import { ReplaceableComponents } from '../models/replaceable-components'; +import { ReplaceableComponentsState } from '../states/replaceable-components.state'; +import { takeUntilDestroy } from '../utils/rxjs-utils'; @Component({ selector: 'abp-replaceable-route-container', template: ` - + `, }) -export class ReplaceableRouteContainerComponent implements OnInit { +export class ReplaceableRouteContainerComponent implements OnInit, OnDestroy { defaultComponent: Type; - constructor(private route: ActivatedRoute) {} + componentKey: string; + + externalComponent: Type; + + constructor(private route: ActivatedRoute, private store: Store) {} ngOnInit() { - this.defaultComponent = this.route.snapshot.data.component.default; + if (!this.defaultComponent) { + this.defaultComponent = this.route.snapshot.data.component.default; + } + + if (!this.componentKey) { + this.componentKey = (this.route.snapshot.data.component as ABP.ComponentData).key; + } + + this.store + .select(ReplaceableComponentsState.getComponent(this.componentKey)) + .pipe(takeUntilDestroy(this), distinctUntilChanged()) + .subscribe(({ component } = {} as ReplaceableComponents.ReplaceableComponent) => { + this.externalComponent = component; + }); } + + ngOnDestroy() {} } From a22d50fc165e740b82e5f3e8ccd9693905a5d22f Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 24 Dec 2019 13:42:41 +0300 Subject: [PATCH 07/46] refactor(core): change parameter type of addReplaceableComponent action #2404 --- .../actions/replaceable-components.actions.ts | 2 +- .../packages/core/src/lib/core.module.ts | 6 ++++- .../src/lib/models/replaceable-components.ts | 4 ++-- .../states/replaceable-components.state.ts | 24 ++++++++++++------- .../src/lib/identity-routing.module.ts | 4 ++-- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts b/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts index b5f6480b2a..e611459960 100644 --- a/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts +++ b/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts @@ -2,5 +2,5 @@ import { ReplaceableComponents } from '../models/replaceable-components'; export class AddReplaceableComponent { static readonly type = '[ReplaceableComponents] Add'; - constructor(public payload: ReplaceableComponents.Data | ReplaceableComponents.Data[]) {} + constructor(public payload: ReplaceableComponents.ReplaceableComponent) {} } diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index 983fad2125..34b4825488 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -83,7 +83,11 @@ import { ReplaceableComponentsState } from './states/replaceable-components.stat ReplaceableRouteContainerComponent, ], providers: [LocalizationPipe], - entryComponents: [RouterOutletComponent, DynamicLayoutComponent], + entryComponents: [ + RouterOutletComponent, + DynamicLayoutComponent, + ReplaceableRouteContainerComponent, + ], }) export class CoreModule { static forRoot(options = {} as ABP.Root): ModuleWithProviders { diff --git a/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts b/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts index 8f46faf01e..43e8b83382 100644 --- a/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts +++ b/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts @@ -2,10 +2,10 @@ import { Type } from '@angular/core'; export namespace ReplaceableComponents { export interface State { - replaceableComponents: Data[]; + replaceableComponents: ReplaceableComponent[]; } - export interface Data { + export interface ReplaceableComponent { component: Type; key: string; } diff --git a/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts index 7391f79ec2..e6d52d7c4a 100644 --- a/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts +++ b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts @@ -11,15 +11,15 @@ export class ReplaceableComponentsState { @Selector() static getAll({ replaceableComponents, - }: ReplaceableComponents.State): ReplaceableComponents.Data[] { + }: ReplaceableComponents.State): ReplaceableComponents.ReplaceableComponent[] { return replaceableComponents || []; } - static getOne(key: string) { + static getComponent(key: string) { const selector = createSelector( [ReplaceableComponentsState], - ({ replaceableComponents }: ReplaceableComponents.State) => { - return snq(() => replaceableComponents.find(component => component.key === key)); + (state: ReplaceableComponents.State): ReplaceableComponents.ReplaceableComponent => { + return snq(() => state.replaceableComponents.find(component => component.key === key)); }, ); @@ -31,14 +31,20 @@ export class ReplaceableComponentsState { { getState, patchState }: StateContext, { payload }: AddReplaceableComponent, ) { - if (!Array.isArray(payload)) { - payload = [payload]; - } + let { replaceableComponents } = getState(); + + if (replaceableComponents && replaceableComponents.length) { + const index = replaceableComponents.findIndex(component => component.key === payload.key); - const { replaceableComponents } = getState(); + if (index > -1) { + replaceableComponents[index] = payload; + } + } else { + replaceableComponents = [...replaceableComponents, payload]; + } patchState({ - replaceableComponents: [...replaceableComponents, ...payload], + replaceableComponents, }); } } diff --git a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts index 3f82cf69f2..e012a21acf 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts @@ -24,7 +24,7 @@ const routes: Routes = [ data: { requiredPolicy: 'AbpIdentity.Roles', component: { - key: 'AbpIdentity.Roles', + key: 'Identity.RolesComponent', default: RolesComponent, } as ABP.ComponentData, }, @@ -35,7 +35,7 @@ const routes: Routes = [ data: { requiredPolicy: 'AbpIdentity.Users', component: { - key: 'AbpIdentity.Roles', + key: 'Identity.UsersComponent', default: UsersComponent, } as ABP.ComponentData, }, From e39dd3439b92685c6a0e9321216aaa75274ca58d Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 25 Dec 2019 18:27:20 +0300 Subject: [PATCH 08/46] refactor(permission-management): move visible logics to visible setter from ngOnChanges --- .../permission-management.component.ts | 61 +++++++------------ 1 file changed, 21 insertions(+), 40 deletions(-) diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts index 6600c1bc7c..222aebc2d7 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts @@ -1,17 +1,7 @@ -import { - Component, - EventEmitter, - Input, - OnChanges, - OnInit, - Output, - Renderer2, - SimpleChanges, - TrackByFunction, -} from '@angular/core'; +import { Component, EventEmitter, Input, Output, Renderer2, TrackByFunction } from '@angular/core'; import { Select, Store } from '@ngxs/store'; -import { from, Observable } from 'rxjs'; -import { map, pluck, take, finalize } from 'rxjs/operators'; +import { Observable } from 'rxjs'; +import { finalize, map, pluck, take, tap } from 'rxjs/operators'; import { GetPermissions, UpdatePermissions } from '../actions/permission-management.actions'; import { PermissionManagement } from '../models/permission-management'; import { PermissionManagementState } from '../states/permission-management.state'; @@ -23,8 +13,9 @@ type PermissionWithMargin = PermissionManagement.Permission & { @Component({ selector: 'abp-permission-management', templateUrl: './permission-management.component.html', + exportAs: 'abpPermissionManagement', }) -export class PermissionManagementComponent implements OnInit, OnChanges { +export class PermissionManagementComponent { @Input() providerName: string; @@ -42,13 +33,15 @@ export class PermissionManagementComponent implements OnInit, OnChanges { } set visible(value: boolean) { - if (!this.selectedGroup) return; - - this._visible = value; - this.visibleChange.emit(value); - - if (!value) { + if (value) { + this.openModal().subscribe(() => { + this._visible = true; + this.visibleChange.emit(true); + }); + } else { this.selectedGroup = null; + this._visible = false; + this.visibleChange.emit(false); } } @@ -94,8 +87,6 @@ export class PermissionManagementComponent implements OnInit, OnChanges { constructor(private store: Store, private renderer: Renderer2) {} - ngOnInit(): void {} - getChecked(name: string) { return (this.permissions.find(per => per.name === name) || { isGranted: false }).isGranted; } @@ -237,36 +228,26 @@ export class PermissionManagementComponent implements OnInit, OnChanges { throw new Error('Provider Key and Provider Name are required.'); } - this.store + return this.store .dispatch( new GetPermissions({ providerKey: this.providerKey, providerName: this.providerName, }), ) - .pipe(pluck('PermissionManagementState', 'permissionRes')) - .subscribe((permissionRes: PermissionManagement.Response) => { - this.selectedGroup = permissionRes.groups[0]; - this.permissions = getPermissions(permissionRes.groups); - - this.visible = true; - }); + .pipe( + pluck('PermissionManagementState', 'permissionRes'), + tap((permissionRes: PermissionManagement.Response) => { + this.selectedGroup = permissionRes.groups[0]; + this.permissions = getPermissions(permissionRes.groups); + }), + ); } initModal() { this.setTabCheckboxState(); this.setGrantCheckboxState(); } - - ngOnChanges({ visible }: SimpleChanges): void { - if (!visible) return; - - if (visible.currentValue) { - this.openModal(); - } else if (visible.currentValue === false && this.visible) { - this.visible = false; - } - } } function findMargin( From 2eb9e6b946fb74f931515dbcca7bfe6b79654f9e Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 25 Dec 2019 18:28:40 +0300 Subject: [PATCH 09/46] refactor(core): remove unnecessary if blocks #2404 --- .../replaceable-route-container.component.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts b/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts index af4805177d..80a56cfb04 100644 --- a/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts +++ b/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts @@ -23,13 +23,9 @@ export class ReplaceableRouteContainerComponent implements OnInit, OnDestroy { constructor(private route: ActivatedRoute, private store: Store) {} ngOnInit() { - if (!this.defaultComponent) { - this.defaultComponent = this.route.snapshot.data.component.default; - } - - if (!this.componentKey) { - this.componentKey = (this.route.snapshot.data.component as ABP.ComponentData).key; - } + this.defaultComponent = this.route.snapshot.data.replaceableComponent.defaultComponent; + this.componentKey = (this.route.snapshot.data + .replaceableComponent as ReplaceableComponents.RouteData).key; this.store .select(ReplaceableComponentsState.getComponent(this.componentKey)) From 31c224c9f9c015e94877d1eba382d1cd415704c7 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 25 Dec 2019 18:30:01 +0300 Subject: [PATCH 10/46] feat(core): add init directive --- ...eplaceable-template-container.component.ts | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 npm/ng-packs/packages/core/src/lib/components/replaceable-template-container.component.ts diff --git a/npm/ng-packs/packages/core/src/lib/components/replaceable-template-container.component.ts b/npm/ng-packs/packages/core/src/lib/components/replaceable-template-container.component.ts new file mode 100644 index 0000000000..bd54cd2ee1 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/components/replaceable-template-container.component.ts @@ -0,0 +1,108 @@ +import { + Component, + EventEmitter, + Inject, + Input, + OnDestroy, + OnInit, + Output, + TemplateRef, + Type, + Attribute, + Renderer2, +} from '@angular/core'; +import { Store } from '@ngxs/store'; +import { distinctUntilChanged, filter } from 'rxjs/operators'; +import { ABP } from '../models/common'; +import { ReplaceableComponents } from '../models/replaceable-components'; +import { ReplaceableComponentsState } from '../states/replaceable-components.state'; +import { takeUntilDestroy } from '../utils/rxjs-utils'; +import compare from 'just-compare'; +import snq from 'snq'; + +@Component({ + selector: 'abp-replaceable-template-container', + template: ` + + + `, + exportAs: 'abpReplaceableTemplateContainer', + providers: [{ provide: 'INPUTS', useValue: {} }], +}) +export class ReplaceableTemplateContainerComponent implements OnInit, OnDestroy { + @Input() + defaultTemplate: TemplateRef; + + @Input() + inputs: ReplaceableComponents.ReplaceableTemplateInput[] = []; + + @Output() + readonly writableInputsChange = new EventEmitter(); + + @Output() + readonly externalComponentInit = new EventEmitter(); + + @Output() + readonly defaultTemplateInit = new EventEmitter(); + + externalComponent: Type = null; // externalComponent must equal to null + + initDefaultTemplate = (ref: any) => { + console.warn(ref); + }; + + constructor( + @Attribute('componentKey') private componentKey: string, + @Inject('INPUTS') public inputsProvider: ABP.Dictionary, + private store: Store, + private renderer: Renderer2, + ) {} + + ngOnInit() { + this.store + .select(ReplaceableComponentsState.getComponent(this.componentKey)) + .pipe( + takeUntilDestroy(this), + filter( + (res = {} as ReplaceableComponents.ReplaceableComponent) => + !compare(this.externalComponent, res.component), + ), + ) + .subscribe(({ component } = {} as ReplaceableComponents.ReplaceableComponent) => { + console.warn('STOREDAN DATA GELDI!!'); + this.externalComponent = component; + if (component) { + this.externalComponentInit.emit(); + } else { + this.defaultTemplateInit.emit(); + } + }); + + this.defineProperties(); + } + + defineProperties() { + const writableInputs = this.inputs + .filter(input => input.writable) + .reduce((acc, val) => ({ ...acc, [val.key]: val.value }), {}); + + this.inputs.forEach((input, index) => { + Object.defineProperty(this.inputsProvider, this.inputs[index].key, { + get: () => this.inputs[index].value, + ...(this.inputs[index].writable && { + set: newValue => { + writableInputs[input.key] = newValue; + this.writableInputsChange.emit(writableInputs); + this.inputs[index] = { ...this.inputs[index], value: newValue }; + }, + }), + enumerable: true, + configurable: true, + }); + }); + } + + ngOnDestroy() {} +} From 11b2781906d4726e7f31c9468a1c2a7340fbd4f0 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 25 Dec 2019 18:30:01 +0300 Subject: [PATCH 11/46] feat(core): add init directive #2404 --- ...eplaceable-template-container.component.ts | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 npm/ng-packs/packages/core/src/lib/components/replaceable-template-container.component.ts diff --git a/npm/ng-packs/packages/core/src/lib/components/replaceable-template-container.component.ts b/npm/ng-packs/packages/core/src/lib/components/replaceable-template-container.component.ts new file mode 100644 index 0000000000..bd54cd2ee1 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/components/replaceable-template-container.component.ts @@ -0,0 +1,108 @@ +import { + Component, + EventEmitter, + Inject, + Input, + OnDestroy, + OnInit, + Output, + TemplateRef, + Type, + Attribute, + Renderer2, +} from '@angular/core'; +import { Store } from '@ngxs/store'; +import { distinctUntilChanged, filter } from 'rxjs/operators'; +import { ABP } from '../models/common'; +import { ReplaceableComponents } from '../models/replaceable-components'; +import { ReplaceableComponentsState } from '../states/replaceable-components.state'; +import { takeUntilDestroy } from '../utils/rxjs-utils'; +import compare from 'just-compare'; +import snq from 'snq'; + +@Component({ + selector: 'abp-replaceable-template-container', + template: ` + + + `, + exportAs: 'abpReplaceableTemplateContainer', + providers: [{ provide: 'INPUTS', useValue: {} }], +}) +export class ReplaceableTemplateContainerComponent implements OnInit, OnDestroy { + @Input() + defaultTemplate: TemplateRef; + + @Input() + inputs: ReplaceableComponents.ReplaceableTemplateInput[] = []; + + @Output() + readonly writableInputsChange = new EventEmitter(); + + @Output() + readonly externalComponentInit = new EventEmitter(); + + @Output() + readonly defaultTemplateInit = new EventEmitter(); + + externalComponent: Type = null; // externalComponent must equal to null + + initDefaultTemplate = (ref: any) => { + console.warn(ref); + }; + + constructor( + @Attribute('componentKey') private componentKey: string, + @Inject('INPUTS') public inputsProvider: ABP.Dictionary, + private store: Store, + private renderer: Renderer2, + ) {} + + ngOnInit() { + this.store + .select(ReplaceableComponentsState.getComponent(this.componentKey)) + .pipe( + takeUntilDestroy(this), + filter( + (res = {} as ReplaceableComponents.ReplaceableComponent) => + !compare(this.externalComponent, res.component), + ), + ) + .subscribe(({ component } = {} as ReplaceableComponents.ReplaceableComponent) => { + console.warn('STOREDAN DATA GELDI!!'); + this.externalComponent = component; + if (component) { + this.externalComponentInit.emit(); + } else { + this.defaultTemplateInit.emit(); + } + }); + + this.defineProperties(); + } + + defineProperties() { + const writableInputs = this.inputs + .filter(input => input.writable) + .reduce((acc, val) => ({ ...acc, [val.key]: val.value }), {}); + + this.inputs.forEach((input, index) => { + Object.defineProperty(this.inputsProvider, this.inputs[index].key, { + get: () => this.inputs[index].value, + ...(this.inputs[index].writable && { + set: newValue => { + writableInputs[input.key] = newValue; + this.writableInputsChange.emit(writableInputs); + this.inputs[index] = { ...this.inputs[index], value: newValue }; + }, + }), + enumerable: true, + configurable: true, + }); + }); + } + + ngOnDestroy() {} +} From 38c555e4c6558a7c8c323c16f410b31d031cf0f5 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 25 Dec 2019 18:34:08 +0300 Subject: [PATCH 12/46] Revert "feat(core): add init directive #2404" This reverts commit 11b2781906d4726e7f31c9468a1c2a7340fbd4f0. --- ...eplaceable-template-container.component.ts | 108 ------------------ 1 file changed, 108 deletions(-) delete mode 100644 npm/ng-packs/packages/core/src/lib/components/replaceable-template-container.component.ts diff --git a/npm/ng-packs/packages/core/src/lib/components/replaceable-template-container.component.ts b/npm/ng-packs/packages/core/src/lib/components/replaceable-template-container.component.ts deleted file mode 100644 index bd54cd2ee1..0000000000 --- a/npm/ng-packs/packages/core/src/lib/components/replaceable-template-container.component.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { - Component, - EventEmitter, - Inject, - Input, - OnDestroy, - OnInit, - Output, - TemplateRef, - Type, - Attribute, - Renderer2, -} from '@angular/core'; -import { Store } from '@ngxs/store'; -import { distinctUntilChanged, filter } from 'rxjs/operators'; -import { ABP } from '../models/common'; -import { ReplaceableComponents } from '../models/replaceable-components'; -import { ReplaceableComponentsState } from '../states/replaceable-components.state'; -import { takeUntilDestroy } from '../utils/rxjs-utils'; -import compare from 'just-compare'; -import snq from 'snq'; - -@Component({ - selector: 'abp-replaceable-template-container', - template: ` - - - `, - exportAs: 'abpReplaceableTemplateContainer', - providers: [{ provide: 'INPUTS', useValue: {} }], -}) -export class ReplaceableTemplateContainerComponent implements OnInit, OnDestroy { - @Input() - defaultTemplate: TemplateRef; - - @Input() - inputs: ReplaceableComponents.ReplaceableTemplateInput[] = []; - - @Output() - readonly writableInputsChange = new EventEmitter(); - - @Output() - readonly externalComponentInit = new EventEmitter(); - - @Output() - readonly defaultTemplateInit = new EventEmitter(); - - externalComponent: Type = null; // externalComponent must equal to null - - initDefaultTemplate = (ref: any) => { - console.warn(ref); - }; - - constructor( - @Attribute('componentKey') private componentKey: string, - @Inject('INPUTS') public inputsProvider: ABP.Dictionary, - private store: Store, - private renderer: Renderer2, - ) {} - - ngOnInit() { - this.store - .select(ReplaceableComponentsState.getComponent(this.componentKey)) - .pipe( - takeUntilDestroy(this), - filter( - (res = {} as ReplaceableComponents.ReplaceableComponent) => - !compare(this.externalComponent, res.component), - ), - ) - .subscribe(({ component } = {} as ReplaceableComponents.ReplaceableComponent) => { - console.warn('STOREDAN DATA GELDI!!'); - this.externalComponent = component; - if (component) { - this.externalComponentInit.emit(); - } else { - this.defaultTemplateInit.emit(); - } - }); - - this.defineProperties(); - } - - defineProperties() { - const writableInputs = this.inputs - .filter(input => input.writable) - .reduce((acc, val) => ({ ...acc, [val.key]: val.value }), {}); - - this.inputs.forEach((input, index) => { - Object.defineProperty(this.inputsProvider, this.inputs[index].key, { - get: () => this.inputs[index].value, - ...(this.inputs[index].writable && { - set: newValue => { - writableInputs[input.key] = newValue; - this.writableInputsChange.emit(writableInputs); - this.inputs[index] = { ...this.inputs[index], value: newValue }; - }, - }), - enumerable: true, - configurable: true, - }); - }); - } - - ngOnDestroy() {} -} From 5ae10717d73b1d76711dcd68201ed6b0609c4112 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 25 Dec 2019 18:34:33 +0300 Subject: [PATCH 13/46] feat(core): add init directive #2404 --- .../core/src/lib/directives/init.directive.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 npm/ng-packs/packages/core/src/lib/directives/init.directive.ts diff --git a/npm/ng-packs/packages/core/src/lib/directives/init.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/init.directive.ts new file mode 100644 index 0000000000..ba55523757 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/directives/init.directive.ts @@ -0,0 +1,12 @@ +import { Directive, Output, EventEmitter, ElementRef, AfterViewInit } from '@angular/core'; + +@Directive({ selector: '[abpInit]' }) +export class InitDirective implements AfterViewInit { + @Output('abpInit') readonly init = new EventEmitter>(); + + constructor(private elRef: ElementRef) {} + + ngAfterViewInit() { + this.init.emit(this.elRef); + } +} From 57403b86d163b0a54ed01e3fff99cfcda05da95f Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 25 Dec 2019 18:37:06 +0300 Subject: [PATCH 14/46] feat(core): create replaceable-template directive #2404 --- .../packages/core/src/lib/core.module.ts | 16 ++- .../packages/core/src/lib/directives/index.ts | 2 + .../replaceable-template.directive.ts | 118 ++++++++++++++++++ 3 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index 34b4825488..8a7f9bac57 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -31,6 +31,8 @@ import { getInitialData, localeInitializer } from './utils/initial-utils'; import './utils/date-extensions'; import { ReplaceableRouteContainerComponent } from './components/replaceable-route-container.component'; import { ReplaceableComponentsState } from './states/replaceable-components.state'; +import { InitDirective } from './directives/init.directive'; +import { ReplaceableTemplateDirective } from './directives/replaceable-template.directive'; @NgModule({ imports: [ @@ -46,6 +48,7 @@ import { ReplaceableComponentsState } from './states/replaceable-components.stat ], declarations: [ ReplaceableRouteContainerComponent, + ReplaceableTemplateContainerComponent, RouterOutletComponent, DynamicLayoutComponent, AutofocusDirective, @@ -54,6 +57,7 @@ import { ReplaceableComponentsState } from './states/replaceable-components.stat FormSubmitDirective, LocalizationPipe, SortPipe, + InitDirective, PermissionDirective, VisibilityDirective, InputEventDebounceDirective, @@ -68,19 +72,21 @@ import { ReplaceableComponentsState } from './states/replaceable-components.stat RouterModule, RouterOutletComponent, DynamicLayoutComponent, + AbstractNgModelComponent, + ReplaceableRouteContainerComponent, AutofocusDirective, EllipsisDirective, ForDirective, FormSubmitDirective, - LocalizationPipe, - SortPipe, + InitDirective, PermissionDirective, VisibilityDirective, InputEventDebounceDirective, - LocalizationPipe, + ReplaceableTemplateDirective, StopPropagationDirective, - AbstractNgModelComponent, - ReplaceableRouteContainerComponent, + LocalizationPipe, + SortPipe, + LocalizationPipe, ], providers: [LocalizationPipe], entryComponents: [ diff --git a/npm/ng-packs/packages/core/src/lib/directives/index.ts b/npm/ng-packs/packages/core/src/lib/directives/index.ts index 7edf1b5f76..f191cfcef5 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/index.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/index.ts @@ -2,5 +2,7 @@ export * from './autofocus.directive'; export * from './ellipsis.directive'; export * from './for.directive'; export * from './form-submit.directive'; +export * from './init.directive'; export * from './permission.directive'; +export * from './replaceable-template.directive'; export * from './visibility.directive'; diff --git a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts new file mode 100644 index 0000000000..7af076e6b4 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts @@ -0,0 +1,118 @@ +import { + ComponentFactoryResolver, + Directive, + Injector, + Input, + OnDestroy, + OnInit, + TemplateRef, + Type, + ViewContainerRef, + SimpleChanges, +} from '@angular/core'; +import { Store } from '@ngxs/store'; +import compare from 'just-compare'; +import { filter } from 'rxjs/operators'; +import { ReplaceableComponents } from '../models/replaceable-components'; +import { ReplaceableComponentsState } from '../states/replaceable-components.state'; +import { takeUntilDestroy } from '../utils/rxjs-utils'; + +@Directive({ selector: '[abpReplaceableTemplate]' }) +export class ReplaceableTemplateDirective implements OnInit, OnDestroy { + private context = {}; + + @Input('abpReplaceableTemplate') + data: { inputs: any; outputs: any; componentKey: string }; + + providedData = { inputs: {}, outputs: {} } as { inputs: any; outputs: any; componentKey: string }; + + externalComponent: Type = null; // externalComponent must equal to null + + defaultComponentRef: any; + + constructor( + private injector: Injector, + private templateRef: TemplateRef, + private cfRes: ComponentFactoryResolver, + private vcRef: ViewContainerRef, + private store: Store, + ) { + this.context = { + initTemplate: ref => { + this.defaultComponentRef = ref; + this.setDefaultComponentInputs(); + setTimeout(() => { + ref.providerKey = 'admin'; + ref.visible = true; + }, 5000); + }, + }; + } + + ngOnInit() { + this.store + .select(ReplaceableComponentsState.getComponent(this.data.componentKey)) + .pipe( + filter( + (res = {} as ReplaceableComponents.ReplaceableComponent) => + !compare(res.component, this.externalComponent), + ), + takeUntilDestroy(this), + ) + .subscribe((res = {} as ReplaceableComponents.ReplaceableComponent) => { + this.vcRef.clear(); + this.externalComponent = res.component; + + if (res.component) { + this.setProvidedData(); + const customInjector = Injector.create({ + providers: [{ provide: 'REPLACEABLE_DATA', useValue: this.providedData }], + parent: this.injector, + }); + this.vcRef.createComponent( + this.cfRes.resolveComponentFactory(res.component), + 0, + customInjector, + ); + } else { + this.vcRef.createEmbeddedView(this.templateRef, this.context); + } + }); + } + + ngOnChanges(changes: SimpleChanges) { + console.log(changes); + } + + ngOnDestroy() {} + + setDefaultComponentInputs() { + if (!this.defaultComponentRef) return; + } + + setProvidedData() { + Object.defineProperties(this.providedData.inputs, { + ...Object.keys(this.data.inputs).reduce( + (acc, key) => ({ + ...acc, + [key]: { + enumerable: true, + configurable: true, + get: () => this.data.inputs[key].value, + ...(this.data.inputs[key].twoWay && { + set: newValue => { + this.data.inputs[key].value = newValue; + this.data.outputs[`${key}Change`](newValue); + }, + }), + }, + }), + {}, + ), + }); + + this.providedData.outputs = this.data.outputs; + + console.warn(this.providedData); + } +} From 3c6ceb7388180e71cd6182df0324896da530138e Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 26 Dec 2019 16:09:51 +0300 Subject: [PATCH 15/46] feat(core): add default component input and output mapping process to replaceable template directive #2404 --- .../replaceable-template.directive.ts | 54 ++++++++++++++----- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts index 7af076e6b4..309dbbcb23 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts @@ -3,33 +3,42 @@ import { Directive, Injector, Input, + OnChanges, OnDestroy, OnInit, + SimpleChanges, TemplateRef, Type, ViewContainerRef, - SimpleChanges, } from '@angular/core'; import { Store } from '@ngxs/store'; -import compare from 'just-compare'; +import { Subscription } from 'rxjs'; import { filter } from 'rxjs/operators'; +import { ABP } from '../models/common'; import { ReplaceableComponents } from '../models/replaceable-components'; import { ReplaceableComponentsState } from '../states/replaceable-components.state'; import { takeUntilDestroy } from '../utils/rxjs-utils'; +import compare from 'just-compare'; +import snq from 'snq'; @Directive({ selector: '[abpReplaceableTemplate]' }) -export class ReplaceableTemplateDirective implements OnInit, OnDestroy { +export class ReplaceableTemplateDirective implements OnInit, OnDestroy, OnChanges { private context = {}; @Input('abpReplaceableTemplate') data: { inputs: any; outputs: any; componentKey: string }; - providedData = { inputs: {}, outputs: {} } as { inputs: any; outputs: any; componentKey: string }; + providedData = { inputs: {}, outputs: {} } as ReplaceableComponents.ReplaceableTemplateData< + any, + any + >; externalComponent: Type = null; // externalComponent must equal to null defaultComponentRef: any; + defaultComponentSubscriptions = {} as ABP.Dictionary; + constructor( private injector: Injector, private templateRef: TemplateRef, @@ -39,12 +48,12 @@ export class ReplaceableTemplateDirective implements OnInit, OnDestroy { ) { this.context = { initTemplate: ref => { + Object.keys(this.defaultComponentSubscriptions).forEach(key => { + this.defaultComponentSubscriptions[key].unsubscribe(); + }); + this.defaultComponentSubscriptions = {} as ABP.Dictionary; this.defaultComponentRef = ref; this.setDefaultComponentInputs(); - setTimeout(() => { - ref.providerKey = 'admin'; - ref.visible = true; - }, 5000); }, }; } @@ -81,16 +90,37 @@ export class ReplaceableTemplateDirective implements OnInit, OnDestroy { } ngOnChanges(changes: SimpleChanges) { - console.log(changes); + if (snq(() => changes.data.currentValue.inputs) && this.defaultComponentRef) { + this.setDefaultComponentInputs(); + } } ngOnDestroy() {} setDefaultComponentInputs() { - if (!this.defaultComponentRef) return; + if (!this.defaultComponentRef || !this.data.inputs) return; + + for (const key in this.data.inputs) { + if (this.data.inputs.hasOwnProperty(key)) { + if (!compare(this.defaultComponentRef[key], this.data.inputs[key].value)) { + this.defaultComponentRef[key] = this.data.inputs[key].value; + + if (this.data.inputs[key].twoWay && !this.defaultComponentSubscriptions[key]) { + this.defaultComponentSubscriptions[key] = this.defaultComponentRef[ + `${key}Change` + ].subscribe(value => { + this.data.outputs[`${key}Change`](value); + }); + } + } + } + } } setProvidedData() { + this.providedData = { ...this.data, inputs: {} }; + + if (!this.providedData.inputs) return; Object.defineProperties(this.providedData.inputs, { ...Object.keys(this.data.inputs).reduce( (acc, key) => ({ @@ -110,9 +140,5 @@ export class ReplaceableTemplateDirective implements OnInit, OnDestroy { {}, ), }); - - this.providedData.outputs = this.data.outputs; - - console.warn(this.providedData); } } From 1fe3b35076c5daddf9edc2a8396b62288cf105da Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 26 Dec 2019 16:11:14 +0300 Subject: [PATCH 16/46] feat(core): add ExtractFromGeneric type to ABP namespace #2404 --- npm/ng-packs/packages/core/src/lib/models/common.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/models/common.ts b/npm/ng-packs/packages/core/src/lib/models/common.ts index dd0bae45ec..6661572893 100644 --- a/npm/ng-packs/packages/core/src/lib/models/common.ts +++ b/npm/ng-packs/packages/core/src/lib/models/common.ts @@ -1,6 +1,5 @@ -import { Config } from './config'; import { eLayoutType } from '../enums/common'; -import { Type } from '@angular/core'; +import { Config } from './config'; export namespace ABP { export interface Root { @@ -49,8 +48,5 @@ export namespace ABP { [key: string]: T; } - export interface ComponentData { - key: string; - default: Type; - } + export type ExtractFromGeneric = Generic extends Array ? X : Generic; } From 56861e745404132b78d19ef8c6ee5a903cdba4e5 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 26 Dec 2019 16:11:59 +0300 Subject: [PATCH 17/46] feat(core): add replaceable template types #2404 --- .../packages/core/src/lib/core.module.ts | 2 +- .../src/lib/models/replaceable-components.ts | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index 8a7f9bac57..a3fc08c7e2 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -48,7 +48,6 @@ import { ReplaceableTemplateDirective } from './directives/replaceable-template. ], declarations: [ ReplaceableRouteContainerComponent, - ReplaceableTemplateContainerComponent, RouterOutletComponent, DynamicLayoutComponent, AutofocusDirective, @@ -62,6 +61,7 @@ import { ReplaceableTemplateDirective } from './directives/replaceable-template. VisibilityDirective, InputEventDebounceDirective, StopPropagationDirective, + ReplaceableTemplateDirective, AbstractNgModelComponent, ], exports: [ diff --git a/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts b/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts index 43e8b83382..fb7e813791 100644 --- a/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts +++ b/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts @@ -1,4 +1,5 @@ import { Type } from '@angular/core'; +import { ABP } from './common'; export namespace ReplaceableComponents { export interface State { @@ -9,4 +10,23 @@ export namespace ReplaceableComponents { component: Type; key: string; } + + export interface ReplaceableTemplateData { + inputs: ReplaceableTemplateInputs; + outputs: ReplaceableTemplateOutputs; + componentKey: string; + } + + export type ReplaceableTemplateInputs = { + [K in keyof T]: T[K]; + }; + + export type ReplaceableTemplateOutputs = { + [K in keyof T]: (value: ABP.ExtractFromGeneric) => void; + }; + + export interface RouteData { + key: string; + defaultComponent: Type; + } } From ae16916ae2b03dfc25d9c4c5ceeb559dee34bde2 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 26 Dec 2019 16:17:45 +0300 Subject: [PATCH 18/46] fix(permission-management): fix twice executing problem of visible setter --- .../src/lib/components/permission-management.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts index 222aebc2d7..af9382fc0c 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts @@ -25,7 +25,7 @@ export class PermissionManagementComponent { @Input() hideBadges = false; - protected _visible; + protected _visible = false; @Input() get visible(): boolean { @@ -33,6 +33,8 @@ export class PermissionManagementComponent { } set visible(value: boolean) { + if (value === this._visible) return; + if (value) { this.openModal().subscribe(() => { this._visible = true; From 148aaece405b8a466ed6b13f54fba0f4084914e9 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 26 Dec 2019 16:19:31 +0300 Subject: [PATCH 19/46] feat(permission-management): add permission management component inputs and outputs interfaces --- .../components/permission-management.component.ts | 11 +++++++---- .../src/lib/models/permission-management.ts | 13 +++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts index af9382fc0c..e61e838ff1 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts @@ -15,15 +15,18 @@ type PermissionWithMargin = PermissionManagement.Permission & { templateUrl: './permission-management.component.html', exportAs: 'abpPermissionManagement', }) -export class PermissionManagementComponent { +export class PermissionManagementComponent + implements + PermissionManagement.PermissionManagementComponentInputs, + PermissionManagement.PermissionManagementComponentOutputs { @Input() - providerName: string; + readonly providerName: string; @Input() - providerKey: string; + readonly providerKey: string; @Input() - hideBadges = false; + readonly hideBadges = false; protected _visible = false; diff --git a/npm/ng-packs/packages/permission-management/src/lib/models/permission-management.ts b/npm/ng-packs/packages/permission-management/src/lib/models/permission-management.ts index cf5d3b2371..b1fe25dd44 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/models/permission-management.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/models/permission-management.ts @@ -1,3 +1,5 @@ +import { EventEmitter } from '@angular/core'; + export namespace PermissionManagement { export interface State { permissionRes: Response; @@ -34,4 +36,15 @@ export namespace PermissionManagement { export interface UpdateRequest { permissions: MinimumPermission[]; } + + export interface PermissionManagementComponentInputs { + visible: boolean; + readonly providerName: string; + readonly providerKey: string; + readonly hideBadges: boolean; + } + + export interface PermissionManagementComponentOutputs { + readonly visibleChange: EventEmitter; + } } From 99fec57220c9cea7d73774e07bb36346d1c09075 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 26 Dec 2019 17:16:44 +0300 Subject: [PATCH 20/46] fix(core): fix condition errors #2404 --- .../lib/directives/replaceable-template.directive.ts | 8 ++++++-- .../src/lib/states/replaceable-components.state.ts | 12 ++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts index 309dbbcb23..35dabc52a5 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts @@ -33,12 +33,14 @@ export class ReplaceableTemplateDirective implements OnInit, OnDestroy, OnChange any >; - externalComponent: Type = null; // externalComponent must equal to null + externalComponent: Type; defaultComponentRef: any; defaultComponentSubscriptions = {} as ABP.Dictionary; + initialized = false; + constructor( private injector: Injector, private templateRef: TemplateRef, @@ -64,7 +66,7 @@ export class ReplaceableTemplateDirective implements OnInit, OnDestroy, OnChange .pipe( filter( (res = {} as ReplaceableComponents.ReplaceableComponent) => - !compare(res.component, this.externalComponent), + !this.initialized || !compare(res.component, this.externalComponent), ), takeUntilDestroy(this), ) @@ -86,6 +88,8 @@ export class ReplaceableTemplateDirective implements OnInit, OnDestroy, OnChange } else { this.vcRef.createEmbeddedView(this.templateRef, this.context); } + + this.initialized = true; }); } diff --git a/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts index e6d52d7c4a..41c69df94f 100644 --- a/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts +++ b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts @@ -33,12 +33,12 @@ export class ReplaceableComponentsState { ) { let { replaceableComponents } = getState(); - if (replaceableComponents && replaceableComponents.length) { - const index = replaceableComponents.findIndex(component => component.key === payload.key); - - if (index > -1) { - replaceableComponents[index] = payload; - } + const index = snq( + () => replaceableComponents.findIndex(component => component.key === payload.key), + -1, + ); + if (index > -1) { + replaceableComponents[index] = payload; } else { replaceableComponents = [...replaceableComponents, payload]; } From 68f5acae33f6a5e994f8f5b06a3f7613cc9e848b Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 26 Dec 2019 17:31:27 +0300 Subject: [PATCH 21/46] feat(identity): make permission management component replaceable #2404 --- .../lib/components/roles/roles.component.html | 34 +++++++++- .../lib/components/roles/roles.component.ts | 4 ++ .../lib/components/users/users.component.html | 62 ++++++++++++++++--- .../lib/components/users/users.component.ts | 4 ++ 4 files changed, 93 insertions(+), 11 deletions(-) diff --git a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html index 99569afefc..53041b6284 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html +++ b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html @@ -163,9 +163,39 @@ + + + diff --git a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts index 48bbe5964f..eda7835f45 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts +++ b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts @@ -49,6 +49,10 @@ export class RolesComponent implements OnInit { @ViewChild('formRef', { static: false, read: ElementRef }) formRef: ElementRef; + onVisiblePermissionChange = event => { + this.visiblePermissions = event; + }; + constructor( private confirmationService: ConfirmationService, private fb: FormBuilder, diff --git a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html index 41d8244697..fbe24e1442 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html +++ b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html @@ -12,7 +12,8 @@ type="button" (click)="add()" > - {{ 'AbpIdentity::NewUser' | abpLocalization }} + + {{ 'AbpIdentity::NewUser' | abpLocalization }} @@ -59,12 +60,21 @@ {{ 'AbpIdentity::Actions' | abpLocalization }} {{ 'AbpIdentity::UserName' | abpLocalization }} - + {{ 'AbpIdentity::EmailAddress' | abpLocalization }} - + {{ 'AbpIdentity::PhoneNumber' | abpLocalization }} @@ -86,7 +96,11 @@ {{ 'AbpIdentity::Actions' | abpLocalization }}
-
@@ -142,7 +162,9 @@
- +
@@ -166,7 +188,12 @@
- +
@@ -210,7 +237,9 @@ [attr.id]="'roles-' + i" [formControl]="roleGroup.controls[roles[i].name]" /> - +
@@ -229,5 +258,20 @@ - + diff --git a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts index f258c5147b..a6dccf86b7 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts +++ b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts @@ -69,6 +69,10 @@ export class UsersComponent implements OnInit { trackByFn: TrackByFunction = (index, item) => Object.keys(item)[0] || index; + onVisiblePermissionChange = event => { + this.visiblePermissions = event; + }; + get roleGroups(): FormGroup[] { return snq(() => (this.form.get('roleNames') as FormArray).controls as FormGroup[], []); } From 661118a1743febfa2c44e41739fb6f1724860447 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 26 Dec 2019 17:32:01 +0300 Subject: [PATCH 22/46] feat(identity): make roles and users component replaceable #2404 --- .../identity/src/lib/identity-routing.module.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts index e012a21acf..eff6a7ce98 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts @@ -2,9 +2,9 @@ import { AuthGuard, DynamicLayoutComponent, PermissionGuard, - ABP, CoreModule, ReplaceableRouteContainerComponent, + ReplaceableComponents, } from '@abp/ng.core'; import { NgModule, Type } from '@angular/core'; import { RouterModule, Routes, Router, ActivatedRoute } from '@angular/router'; @@ -23,10 +23,10 @@ const routes: Routes = [ component: ReplaceableRouteContainerComponent, data: { requiredPolicy: 'AbpIdentity.Roles', - component: { + replaceableComponent: { key: 'Identity.RolesComponent', - default: RolesComponent, - } as ABP.ComponentData, + defaultComponent: RolesComponent, + } as ReplaceableComponents.RouteData, }, }, { @@ -34,10 +34,10 @@ const routes: Routes = [ component: ReplaceableRouteContainerComponent, data: { requiredPolicy: 'AbpIdentity.Users', - component: { + replaceableComponent: { key: 'Identity.UsersComponent', - default: UsersComponent, - } as ABP.ComponentData, + defaultComponent: UsersComponent, + } as ReplaceableComponents.RouteData, }, }, ], From 742579d5c0022144f59f45b0805b7841e2431e5f Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 27 Dec 2019 09:23:25 +0300 Subject: [PATCH 23/46] feat(tenant-management): make tenants component replaceable #2404 --- .../lib/tenant-management-routing.module.ts | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts index 6723357c75..16e547e269 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts @@ -1,4 +1,10 @@ -import { AuthGuard, DynamicLayoutComponent, PermissionGuard } from '@abp/ng.core'; +import { + AuthGuard, + DynamicLayoutComponent, + PermissionGuard, + ReplaceableComponents, + ReplaceableRouteContainerComponent, +} from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { TenantsComponent } from './components/tenants/tenants.component'; @@ -6,11 +12,22 @@ import { TenantsComponent } from './components/tenants/tenants.component'; const routes: Routes = [ { path: '', redirectTo: 'tenants', pathMatch: 'full' }, { - path: 'tenants', + path: '', component: DynamicLayoutComponent, canActivate: [AuthGuard, PermissionGuard], - data: { requiredPolicy: 'AbpTenantManagement.Tenants' }, - children: [{ path: '', component: TenantsComponent }], + children: [ + { + path: 'tenants', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'AbpTenantManagement.Tenants', + replaceableComponent: { + key: 'TenantManagement.TenantsComponent', + defaultComponent: TenantsComponent, + } as ReplaceableComponents.RouteData, + }, + }, + ], }, ]; From ec8f06702888913267efac07d5763fd77a5eee06 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 27 Dec 2019 09:30:23 +0300 Subject: [PATCH 24/46] feat(account): make account pages replaceable #2404 --- .../account/src/lib/account-routing.module.ts | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/account/src/lib/account-routing.module.ts b/npm/ng-packs/packages/account/src/lib/account-routing.module.ts index 3df3001272..db4147f2a0 100644 --- a/npm/ng-packs/packages/account/src/lib/account-routing.module.ts +++ b/npm/ng-packs/packages/account/src/lib/account-routing.module.ts @@ -1,4 +1,9 @@ -import { DynamicLayoutComponent } from '@abp/ng.core'; +import { + DynamicLayoutComponent, + AuthGuard, + ReplaceableComponents, + ReplaceableRouteContainerComponent, +} from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { LoginComponent } from './components/login/login.component'; @@ -11,11 +16,36 @@ const routes: Routes = [ path: '', component: DynamicLayoutComponent, children: [ - { path: 'login', component: LoginComponent }, - { path: 'register', component: RegisterComponent }, + { + path: 'login', + component: ReplaceableRouteContainerComponent, + data: { + replaceableComponent: { + key: 'Account.LoginComponent', + defaultComponent: LoginComponent, + } as ReplaceableComponents.RouteData, + }, + }, + { + path: 'register', + component: ReplaceableRouteContainerComponent, + data: { + replaceableComponent: { + key: 'Account.RegisterComponent', + defaultComponent: RegisterComponent, + } as ReplaceableComponents.RouteData, + }, + }, { path: 'manage-profile', - component: ManageProfileComponent, + component: ReplaceableRouteContainerComponent, + canActivate: [AuthGuard], + data: { + replaceableComponent: { + key: 'Account.ManageProfileComponent', + defaultComponent: ManageProfileComponent, + } as ReplaceableComponents.RouteData, + }, }, ], }, From 8fe488907dde3729302f97e127f2141a9b4766e8 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 27 Dec 2019 09:33:03 +0300 Subject: [PATCH 25/46] refactor(core): add a resource control to permission guard --- .../core/src/lib/guards/permission.guard.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts index e23eeb40c2..9321a7dcf6 100644 --- a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts +++ b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts @@ -13,12 +13,22 @@ import { ConfigState } from '../states'; export class PermissionGuard implements CanActivate { constructor(private store: Store) {} - canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - let resource = snq(() => route.data.routes.requiredPolicy) || snq(() => route.data.requiredPolicy as string); + canActivate( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot, + ): Observable | boolean { + let resource = + snq(() => route.data.routes.requiredPolicy) || snq(() => route.data.requiredPolicy as string); if (!resource) { resource = snq( - () => route.routeConfig.children.find(child => state.url.indexOf(child.path) > -1).data.requiredPolicy, + () => + route.routeConfig.children.find(child => state.url.indexOf(child.path) > -1).data + .requiredPolicy, ); + + if (!resource) { + return true; + } } return this.store.select(ConfigState.getGrantedPolicy(resource)).pipe( From 2bd2eb4cc4d1059116cca0098c31170ffb39d264 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 27 Dec 2019 09:38:27 +0300 Subject: [PATCH 26/46] feat(setting-management): make setting management replaceable #2404 --- .../lib/setting-management-routing.module.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts b/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts index c3eb479d2d..d9a50073e1 100644 --- a/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts +++ b/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts @@ -1,14 +1,28 @@ +import { + DynamicLayoutComponent, + ReplaceableComponents, + ReplaceableRouteContainerComponent, +} from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { SettingManagementComponent } from './components/setting-management.component'; -import { DynamicLayoutComponent } from '@abp/ng.core'; const routes: Routes = [ { path: '', component: DynamicLayoutComponent, children: [ - { path: '', component: SettingManagementComponent, data: { requiredPolicy: 'AbpAccount.SettingManagement' } }, + { + path: '', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: 'AbpAccount.SettingManagement', + replaceableComponent: { + key: 'SettingManagement.SettingManagementComponent', + defaultComponent: SettingManagementComponent, + } as ReplaceableComponents.RouteData, + }, + }, ], }, ]; From c7337cbc10434dab533f5797cf78a33e9b645a22 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 27 Dec 2019 10:50:35 +0300 Subject: [PATCH 27/46] fix(core): add ExtractFromOutput instead of ExtractFromGeneric to common types #2404 --- .../packages/core/src/lib/models/common.ts | 6 +++++- .../core/src/lib/models/replaceable-components.ts | 14 ++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/models/common.ts b/npm/ng-packs/packages/core/src/lib/models/common.ts index 6661572893..8b4fb76cb0 100644 --- a/npm/ng-packs/packages/core/src/lib/models/common.ts +++ b/npm/ng-packs/packages/core/src/lib/models/common.ts @@ -1,5 +1,7 @@ import { eLayoutType } from '../enums/common'; import { Config } from './config'; +import { EventEmitter } from '@angular/core'; +import { Subject } from 'rxjs'; export namespace ABP { export interface Root { @@ -48,5 +50,7 @@ export namespace ABP { [key: string]: T; } - export type ExtractFromGeneric = Generic extends Array ? X : Generic; + export type ExtractFromOutput< + T extends EventEmitter | Subject + > = T extends EventEmitter ? X : T extends Subject ? Y : never; } diff --git a/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts b/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts index fb7e813791..9b6ae02d78 100644 --- a/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts +++ b/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts @@ -1,5 +1,6 @@ -import { Type } from '@angular/core'; +import { Type, EventEmitter } from '@angular/core'; import { ABP } from './common'; +import { Subject, BehaviorSubject } from 'rxjs'; export namespace ReplaceableComponents { export interface State { @@ -11,7 +12,10 @@ export namespace ReplaceableComponents { key: string; } - export interface ReplaceableTemplateData { + export interface ReplaceableTemplateData< + I, + O extends { [K in keyof O]: EventEmitter | Subject } + > { inputs: ReplaceableTemplateInputs; outputs: ReplaceableTemplateOutputs; componentKey: string; @@ -21,8 +25,10 @@ export namespace ReplaceableComponents { [K in keyof T]: T[K]; }; - export type ReplaceableTemplateOutputs = { - [K in keyof T]: (value: ABP.ExtractFromGeneric) => void; + export type ReplaceableTemplateOutputs< + T extends { [K in keyof T]: EventEmitter | Subject } + > = { + [K in keyof T]: (value: ABP.ExtractFromOutput) => void; }; export interface RouteData { From 9e62f6334190b41892e86cdf79fab9d3c449837a Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 27 Dec 2019 11:38:10 +0300 Subject: [PATCH 28/46] refactor(core): add resetDefaultComponent method to replaceable-template directive #2404 --- .../replaceable-template.directive.ts | 50 ++++++++++++------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts index 35dabc52a5..2ac0bc8cfc 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts @@ -50,10 +50,7 @@ export class ReplaceableTemplateDirective implements OnInit, OnDestroy, OnChange ) { this.context = { initTemplate: ref => { - Object.keys(this.defaultComponentSubscriptions).forEach(key => { - this.defaultComponentSubscriptions[key].unsubscribe(); - }); - this.defaultComponentSubscriptions = {} as ABP.Dictionary; + this.resetDefaultComponent(); this.defaultComponentRef = ref; this.setDefaultComponentInputs(); }, @@ -73,6 +70,9 @@ export class ReplaceableTemplateDirective implements OnInit, OnDestroy, OnChange .subscribe((res = {} as ReplaceableComponents.ReplaceableComponent) => { this.vcRef.clear(); this.externalComponent = res.component; + if (this.defaultComponentRef) { + this.resetDefaultComponent(); + } if (res.component) { this.setProvidedData(); @@ -102,19 +102,27 @@ export class ReplaceableTemplateDirective implements OnInit, OnDestroy, OnChange ngOnDestroy() {} setDefaultComponentInputs() { - if (!this.defaultComponentRef || !this.data.inputs) return; - - for (const key in this.data.inputs) { - if (this.data.inputs.hasOwnProperty(key)) { - if (!compare(this.defaultComponentRef[key], this.data.inputs[key].value)) { - this.defaultComponentRef[key] = this.data.inputs[key].value; - - if (this.data.inputs[key].twoWay && !this.defaultComponentSubscriptions[key]) { - this.defaultComponentSubscriptions[key] = this.defaultComponentRef[ - `${key}Change` - ].subscribe(value => { - this.data.outputs[`${key}Change`](value); - }); + if (!this.defaultComponentRef || (!this.data.inputs && !this.data.outputs)) return; + + if (this.data.inputs) { + for (const key in this.data.inputs) { + if (this.data.inputs.hasOwnProperty(key)) { + if (!compare(this.defaultComponentRef[key], this.data.inputs[key].value)) { + this.defaultComponentRef[key] = this.data.inputs[key].value; + } + } + } + } + + if (this.data.outputs) { + for (const key in this.data.outputs) { + if (this.data.outputs.hasOwnProperty(key)) { + if (!this.defaultComponentSubscriptions[key]) { + this.defaultComponentSubscriptions[key] = this.defaultComponentRef[key].subscribe( + value => { + this.data.outputs[key](value); + }, + ); } } } @@ -145,4 +153,12 @@ export class ReplaceableTemplateDirective implements OnInit, OnDestroy, OnChange ), }); } + + resetDefaultComponent() { + Object.keys(this.defaultComponentSubscriptions).forEach(key => { + this.defaultComponentSubscriptions[key].unsubscribe(); + }); + this.defaultComponentSubscriptions = {} as ABP.Dictionary; + this.defaultComponentRef = null; + } } From 48ea971486493b3c7b1b11d2de1b0f572c8a3d68 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 27 Dec 2019 16:03:00 +0300 Subject: [PATCH 29/46] tests(core): add replaceable-route-container.component.spec #2404 --- .../replaceable-route-container.component.ts | 4 +- .../core/src/lib/guards/permission.guard.ts | 9 +-- ...laceable-route-container.component.spec.ts | 66 +++++++++++++++++++ 3 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/replaceable-route-container.component.spec.ts diff --git a/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts b/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts index 80a56cfb04..32d2dadb76 100644 --- a/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts +++ b/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts @@ -30,8 +30,8 @@ export class ReplaceableRouteContainerComponent implements OnInit, OnDestroy { this.store .select(ReplaceableComponentsState.getComponent(this.componentKey)) .pipe(takeUntilDestroy(this), distinctUntilChanged()) - .subscribe(({ component } = {} as ReplaceableComponents.ReplaceableComponent) => { - this.externalComponent = component; + .subscribe((res = {} as ReplaceableComponents.ReplaceableComponent) => { + this.externalComponent = res.component; }); } diff --git a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts index 9321a7dcf6..c4b70d0b7b 100644 --- a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts +++ b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router'; import { Store } from '@ngxs/store'; -import { Observable } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { tap } from 'rxjs/operators'; import snq from 'snq'; import { RestOccurError } from '../actions'; @@ -13,10 +13,7 @@ import { ConfigState } from '../states'; export class PermissionGuard implements CanActivate { constructor(private store: Store) {} - canActivate( - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot, - ): Observable | boolean { + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { let resource = snq(() => route.data.routes.requiredPolicy) || snq(() => route.data.requiredPolicy as string); if (!resource) { @@ -27,7 +24,7 @@ export class PermissionGuard implements CanActivate { ); if (!resource) { - return true; + return of(true); } } diff --git a/npm/ng-packs/packages/core/src/lib/tests/replaceable-route-container.component.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/replaceable-route-container.component.spec.ts new file mode 100644 index 0000000000..f5874bca46 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/replaceable-route-container.component.spec.ts @@ -0,0 +1,66 @@ +import { createHostFactory, SpectatorHost } from '@ngneat/spectator/jest'; +import { Component } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Store } from '@ngxs/store'; +import { of, Subject, BehaviorSubject } from 'rxjs'; +import { ReplaceableRouteContainerComponent } from '../components/replaceable-route-container.component'; +import { ReplaceableComponentsState } from '../states'; + +@Component({ + selector: 'abp-external-component', + template: '

external

', +}) +export class ExternalComponent {} + +@Component({ + selector: 'abp-default-component', + template: '

default

', +}) +export class DefaultComponent {} + +const activatedRouteMock = { + snapshot: { + data: { + replaceableComponent: { + defaultComponent: DefaultComponent, + key: 'TestModule.TestComponent', + }, + }, + }, +}; + +describe('ReplaceableRouteContainerComponent', () => { + const selectResponse = new BehaviorSubject(undefined); + const mockSelect = jest.fn(() => selectResponse); + + let spectator: SpectatorHost; + const createHost = createHostFactory({ + component: ReplaceableRouteContainerComponent, + providers: [ + { provide: ActivatedRoute, useValue: activatedRouteMock }, + { provide: Store, useValue: { select: mockSelect } }, + ], + declarations: [ExternalComponent, DefaultComponent], + entryComponents: [DefaultComponent, ExternalComponent], + }); + + beforeEach(() => { + spectator = createHost('', { + detectChanges: true, + }); + }); + + it('should display the default component', () => { + expect(spectator.query('p')).toHaveText('default'); + }); + + it("should display the external component if it's available in store.", () => { + selectResponse.next({ component: ExternalComponent }); + spectator.detectChanges(); + expect(spectator.query('p')).toHaveText('external'); + + selectResponse.next({ component: null }); + spectator.detectChanges(); + expect(spectator.query('p')).toHaveText('default'); + }); +}); From f95afd4711ab40044ece09c65ab30b104e3fc1bf Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 30 Dec 2019 11:10:14 +0300 Subject: [PATCH 30/46] tests(core): add replaceable-template.directive.spec #2404 --- .../replaceable-template.directive.ts | 4 +- .../replaceable-template.directive.spec.ts | 175 ++++++++++++++++++ 2 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/replaceable-template.directive.spec.ts diff --git a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts index 2ac0bc8cfc..f6a7e9beb8 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts @@ -23,8 +23,6 @@ import snq from 'snq'; @Directive({ selector: '[abpReplaceableTemplate]' }) export class ReplaceableTemplateDirective implements OnInit, OnDestroy, OnChanges { - private context = {}; - @Input('abpReplaceableTemplate') data: { inputs: any; outputs: any; componentKey: string }; @@ -33,6 +31,8 @@ export class ReplaceableTemplateDirective implements OnInit, OnDestroy, OnChange any >; + context = {} as any; + externalComponent: Type; defaultComponentRef: any; diff --git a/npm/ng-packs/packages/core/src/lib/tests/replaceable-template.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/replaceable-template.directive.spec.ts new file mode 100644 index 0000000000..613508f56b --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/replaceable-template.directive.spec.ts @@ -0,0 +1,175 @@ +import { Component, EventEmitter, Inject, Input, OnInit, Optional, Output } from '@angular/core'; +import { createDirectiveFactory, SpectatorDirective } from '@ngneat/spectator/jest'; +import { Store } from '@ngxs/store'; +import { Subject } from 'rxjs'; +import { ReplaceableTemplateDirective } from '../directives'; +import { ReplaceableComponents } from '../models'; + +@Component({ + selector: 'abp-default-component', + template: ` +

default

+ `, + exportAs: 'abpDefaultComponent', +}) +class DefaultComponent implements OnInit { + @Input() + oneWay; + + @Input() + twoWay: boolean; + + @Output() + readonly twoWayChange = new EventEmitter(); + + @Output() + readonly someOutput = new EventEmitter(); + + ngOnInit() {} + + setTwoWay(value) { + this.twoWay = value; + this.twoWayChange.emit(value); + } +} + +@Component({ + selector: 'abp-external-component', + template: ` +

external

+ `, +}) +class ExternalComponent { + constructor( + @Optional() + @Inject('REPLACEABLE_DATA') + public data: ReplaceableComponents.ReplaceableTemplateData, + ) {} +} + +describe('ReplaceableTemplateDirective', () => { + const selectResponse = new Subject(); + const mockSelect = jest.fn(() => selectResponse); + + let spectator: SpectatorDirective; + const createDirective = createDirectiveFactory({ + directive: ReplaceableTemplateDirective, + providers: [{ provide: Store, useValue: { select: mockSelect } }], + declarations: [DefaultComponent, ExternalComponent], + entryComponents: [ExternalComponent], + }); + + describe('without external component', () => { + const twoWayChange = jest.fn(a => a); + const someOutput = jest.fn(a => a); + + beforeEach(() => { + spectator = createDirective( + ` +
+ +
+ `, + { hostProps: { oneWay: { label: 'Test' }, twoWay: false, twoWayChange, someOutput } }, + ); + selectResponse.next(undefined); + const component = spectator.query(DefaultComponent); + spectator.directive.context.initTemplate(component); + spectator.detectChanges(); + }); + + afterEach(() => twoWayChange.mockClear()); + + it('should display the default template when store response is undefined', () => { + expect(spectator.query('abp-default-component')).toBeTruthy(); + }); + + it('should be setted inputs and outputs', () => { + const component = spectator.query(DefaultComponent); + expect(component.oneWay).toEqual({ label: 'Test' }); + expect(component.twoWay).toEqual(false); + }); + + it('should change the component inputs', () => { + const component = spectator.query(DefaultComponent); + spectator.setHostInput({ oneWay: 'test' }); + component.setTwoWay(true); + component.someOutput.emit('someOutput emitted'); + expect(component.oneWay).toBe('test'); + expect(twoWayChange).toHaveBeenCalledWith(true); + expect(someOutput).toHaveBeenCalledWith('someOutput emitted'); + }); + }); + + describe('with external component', () => { + const twoWayChange = jest.fn(a => a); + const someOutput = jest.fn(a => a); + + beforeEach(() => { + spectator = createDirective( + ` +
+ +
+ `, + { hostProps: { oneWay: { label: 'Test' }, twoWay: false, twoWayChange, someOutput } }, + ); + selectResponse.next({ component: ExternalComponent, key: 'TestModule.TestComponent' }); + }); + + afterEach(() => twoWayChange.mockClear()); + + it('should display the external component', () => { + expect(spectator.query('p')).toHaveText('external'); + }); + + it('should be injected the data object', () => { + const externalComponent = spectator.query(ExternalComponent); + expect(externalComponent.data).toEqual({ + componentKey: 'TestModule.TestComponent', + inputs: { oneWay: { label: 'Test' }, twoWay: false }, + outputs: { someOutput, twoWayChange }, + }); + }); + + it('should be worked all data properties', () => { + const externalComponent = spectator.query(ExternalComponent); + spectator.setHostInput({ oneWay: 'test' }); + externalComponent.data.inputs.twoWay = true; + externalComponent.data.outputs.someOutput('someOutput emitted'); + expect(externalComponent.data.inputs.oneWay).toBe('test'); + expect(twoWayChange).toHaveBeenCalledWith(true); + expect(someOutput).toHaveBeenCalledWith('someOutput emitted'); + + spectator.setHostInput({ twoWay: 'twoWay test' }); + expect(externalComponent.data.inputs.twoWay).toBe('twoWay test'); + }); + + it('should be worked correctly the default component when the external component has been removed from store', () => { + expect(spectator.query('p')).toHaveText('external'); + const externalComponent = spectator.query(ExternalComponent); + spectator.setHostInput({ oneWay: 'test' }); + externalComponent.data.inputs.twoWay = true; + selectResponse.next({ component: null, key: 'TestModule.TestComponent' }); + spectator.detectChanges(); + const component = spectator.query(DefaultComponent); + spectator.directive.context.initTemplate(component); + expect(spectator.query('abp-default-component')).toBeTruthy(); + + expect(component.oneWay).toEqual('test'); + expect(component.twoWay).toEqual(true); + }); + + it('should reset default component subscriptions', () => { + selectResponse.next({ component: null, key: 'TestModule.TestComponent' }); + const component = spectator.query(DefaultComponent); + spectator.directive.context.initTemplate(component); + spectator.detectChanges(); + const unsubscribe = jest.fn(() => {}); + spectator.directive.defaultComponentSubscriptions.twoWayChange.unsubscribe = unsubscribe; + + selectResponse.next({ component: ExternalComponent, key: 'TestModule.TestComponent' }); + expect(unsubscribe).toHaveBeenCalled(); + }); + }); +}); From 754babf6f1770636bee45b8b1d2fd98dc2cea718 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 30 Dec 2019 11:38:00 +0300 Subject: [PATCH 31/46] docs: add some badges to readme.md --- npm/ng-packs/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/README.md b/npm/ng-packs/README.md index 1d1e3b520c..220bc57f37 100644 --- a/npm/ng-packs/README.md +++ b/npm/ng-packs/README.md @@ -1,4 +1,10 @@ -

Abp Ng Packages

+# Abp Ng Packages + +![action badge](https://img.shields.io/github/workflow/status/abpframework/abp/Angular) +![issues](https://img.shields.io/github/issues/abpframework/abp/ui-angular) +![pull requests](https://img.shields.io/github/issues-pr-raw/abpframework/abp/ui-angular) +![npm](https://img.shields.io/npm/dm/@abp/ng.core) +![npm version](https://img.shields.io/npm/v/@abp/ng.core?label=version) ## Getting started From 17465417a9a3e0e4121afcfc1f82b4af06354786 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 30 Dec 2019 13:19:24 +0300 Subject: [PATCH 32/46] tests(core): add replaceable-components.state.spec #2404 --- .../replaceable-components.state.spec.ts | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/replaceable-components.state.spec.ts diff --git a/npm/ng-packs/packages/core/src/lib/tests/replaceable-components.state.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/replaceable-components.state.spec.ts new file mode 100644 index 0000000000..c294b131e1 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/replaceable-components.state.spec.ts @@ -0,0 +1,41 @@ +import { createHostFactory, SpectatorHost } from '@ngneat/spectator/jest'; +import { NgxsModule, Store } from '@ngxs/store'; +import { ReplaceableComponentsState } from '../states/replaceable-components.state'; +import { Component } from '@angular/core'; +import { AddReplaceableComponent } from '../actions'; + +@Component({ selector: 'abp-dummy', template: 'dummy works' }) +class DummyComponent {} + +describe('ReplaceableComponentsState', () => { + let spectator: SpectatorHost; + const createHost = createHostFactory({ + component: DummyComponent, + imports: [NgxsModule.forRoot([ReplaceableComponentsState])], + }); + + beforeEach(() => { + spectator = createHost(''); + }); + + it('should add a component to the state', () => { + const store = spectator.get(Store); + expect(store.selectSnapshot(ReplaceableComponentsState.getAll)).toEqual([]); + store.dispatch(new AddReplaceableComponent({ component: DummyComponent, key: 'Dummy' })); + expect(store.selectSnapshot(ReplaceableComponentsState.getComponent('Dummy'))).toEqual({ + component: DummyComponent, + key: 'Dummy', + }); + }); + + it('should replace a exist component', () => { + const store = spectator.get(Store); + store.dispatch(new AddReplaceableComponent({ component: DummyComponent, key: 'Dummy' })); + store.dispatch(new AddReplaceableComponent({ component: null, key: 'Dummy' })); + expect(store.selectSnapshot(ReplaceableComponentsState.getComponent('Dummy'))).toEqual({ + component: null, + key: 'Dummy', + }); + expect(store.selectSnapshot(ReplaceableComponentsState.getAll)).toHaveLength(1); + }); +}); From 6f233f281d27b6ddbcb4d7ff3fe08eeae1797785 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 30 Dec 2019 14:05:39 +0300 Subject: [PATCH 33/46] feat(feature-management): make feature management component replaceable #2404 --- .../feature-management.component.ts | 1 + .../lib/components/tenants/tenants.component.html | 15 ++++++++++++++- .../lib/components/tenants/tenants.component.ts | 4 ++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts index 3a93380d39..0ec5146dbb 100644 --- a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts +++ b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts @@ -10,6 +10,7 @@ import { pluck, finalize } from 'rxjs/operators'; @Component({ selector: 'abp-feature-management', templateUrl: './feature-management.component.html', + exportAs: 'abpFeatureManagement', }) export class FeatureManagementComponent { @Input() diff --git a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html index 8602c4dc95..04760a3555 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html +++ b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html @@ -182,5 +182,18 @@ - + diff --git a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts index 402f37c280..0d77596270 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts @@ -94,6 +94,10 @@ export class TenantsComponent implements OnInit { } } + onVisibleFeaturesChange = (value: boolean) => { + this.visibleFeatures = value; + }; + constructor( private confirmationService: ConfirmationService, private tenantService: TenantManagementService, From e248f0d560bc8d34ba2312640a83ccd991d29b21 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 30 Dec 2019 14:10:27 +0300 Subject: [PATCH 34/46] feat(feature-management): add inputs and outputs interfaces #2404 --- .../feature-management.component.ts | 5 ++++- .../src/lib/models/feature-management.ts | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts index 0ec5146dbb..b8aba035bd 100644 --- a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts +++ b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts @@ -12,7 +12,10 @@ import { pluck, finalize } from 'rxjs/operators'; templateUrl: './feature-management.component.html', exportAs: 'abpFeatureManagement', }) -export class FeatureManagementComponent { +export class FeatureManagementComponent + implements + FeatureManagement.FeatureManagementComponentInputs, + FeatureManagement.FeatureManagementComponentOutputs { @Input() providerKey: string; diff --git a/npm/ng-packs/packages/feature-management/src/lib/models/feature-management.ts b/npm/ng-packs/packages/feature-management/src/lib/models/feature-management.ts index 05a0a28c99..fa0165ae2e 100644 --- a/npm/ng-packs/packages/feature-management/src/lib/models/feature-management.ts +++ b/npm/ng-packs/packages/feature-management/src/lib/models/feature-management.ts @@ -1,3 +1,5 @@ +import { EventEmitter } from '@angular/core'; + export namespace FeatureManagement { export interface State { features: Feature[]; @@ -26,4 +28,14 @@ export namespace FeatureManagement { providerName: string; providerKey: string; } + + export interface FeatureManagementComponentInputs { + visible: boolean; + readonly providerName: string; + readonly providerKey: string; + } + + export interface FeatureManagementComponentOutputs { + readonly visibleChange: EventEmitter; + } } From d82c7d5c7581d3b21421223a529bd0e581f15d2b Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 30 Dec 2019 14:27:46 +0300 Subject: [PATCH 35/46] feat(core): add autocomplete attiributes added autocomplete attiribute to username and password inputs for chromium based browsers --- .../lib/components/login/login.component.html | 20 +++++++++++-- .../register/register.component.html | 30 ++++++++++++++++--- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/npm/ng-packs/packages/account/src/lib/components/login/login.component.html b/npm/ng-packs/packages/account/src/lib/components/login/login.component.html index 130b013d55..db4e7e9f45 100644 --- a/npm/ng-packs/packages/account/src/lib/components/login/login.component.html +++ b/npm/ng-packs/packages/account/src/lib/components/login/login.component.html @@ -3,7 +3,9 @@

{{ 'AbpAccount::Login' | abpLocalization }}

{{ 'AbpAccount::AreYouANewUser' | abpLocalization }} - {{ 'AbpAccount::Register' | abpLocalization }} + {{ + 'AbpAccount::Register' | abpLocalization + }}
@@ -15,16 +17,28 @@ type="text" id="login-input-user-name-or-email-address" formControlName="username" + autocomplete="username" autofocus />
- +
diff --git a/npm/ng-packs/packages/account/src/lib/components/register/register.component.html b/npm/ng-packs/packages/account/src/lib/components/register/register.component.html index 41d619a16a..eebd20cdde 100644 --- a/npm/ng-packs/packages/account/src/lib/components/register/register.component.html +++ b/npm/ng-packs/packages/account/src/lib/components/register/register.component.html @@ -3,21 +3,43 @@

{{ 'AbpAccount::Register' | abpLocalization }}

{{ 'AbpAccount::AlreadyRegistered' | abpLocalization }} - {{ 'AbpAccount::Login' | abpLocalization }} + {{ + 'AbpAccount::Login' | abpLocalization + }}
* + >
* + > *
* + > *
Date: Mon, 30 Dec 2019 14:27:46 +0300 Subject: [PATCH 36/46] feat(account): add autocomplete attiributes added autocomplete attiribute to username and password inputs for chromium based browsers --- .../lib/components/login/login.component.html | 20 +++++++++++-- .../register/register.component.html | 30 ++++++++++++++++--- .../replaceable-template.directive.ts | 2 +- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/npm/ng-packs/packages/account/src/lib/components/login/login.component.html b/npm/ng-packs/packages/account/src/lib/components/login/login.component.html index 130b013d55..db4e7e9f45 100644 --- a/npm/ng-packs/packages/account/src/lib/components/login/login.component.html +++ b/npm/ng-packs/packages/account/src/lib/components/login/login.component.html @@ -3,7 +3,9 @@

{{ 'AbpAccount::Login' | abpLocalization }}

{{ 'AbpAccount::AreYouANewUser' | abpLocalization }} - {{ 'AbpAccount::Register' | abpLocalization }} + {{ + 'AbpAccount::Register' | abpLocalization + }}
@@ -15,16 +17,28 @@ type="text" id="login-input-user-name-or-email-address" formControlName="username" + autocomplete="username" autofocus />
- +
diff --git a/npm/ng-packs/packages/account/src/lib/components/register/register.component.html b/npm/ng-packs/packages/account/src/lib/components/register/register.component.html index 41d619a16a..eebd20cdde 100644 --- a/npm/ng-packs/packages/account/src/lib/components/register/register.component.html +++ b/npm/ng-packs/packages/account/src/lib/components/register/register.component.html @@ -3,21 +3,43 @@

{{ 'AbpAccount::Register' | abpLocalization }}

{{ 'AbpAccount::AlreadyRegistered' | abpLocalization }} - {{ 'AbpAccount::Login' | abpLocalization }} + {{ + 'AbpAccount::Login' | abpLocalization + }}
* + >
* + > *
* + > *
({ From 48a9a6fcf852d2b986cad875eb11a5ce7fee07bd Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 30 Dec 2019 14:30:22 +0300 Subject: [PATCH 37/46] feat(account): make tenant box component replaceable --- .../lib/components/auth-wrapper/auth-wrapper.component.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/account/src/lib/components/auth-wrapper/auth-wrapper.component.html b/npm/ng-packs/packages/account/src/lib/components/auth-wrapper/auth-wrapper.component.html index 3d210dad08..f25b6eae0c 100644 --- a/npm/ng-packs/packages/account/src/lib/components/auth-wrapper/auth-wrapper.component.html +++ b/npm/ng-packs/packages/account/src/lib/components/auth-wrapper/auth-wrapper.component.html @@ -1,6 +1,8 @@
- + diff --git a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts index d9b602089c..444a014d6d 100644 --- a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts +++ b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts @@ -5,14 +5,20 @@ import { Select, Store } from '@ngxs/store'; import { Observable } from 'rxjs'; import { take, withLatestFrom, finalize } from 'rxjs/operators'; import { ToasterService } from '@abp/ng.theme.shared'; +import { Account } from '../../models/account'; const { maxLength, required, email } = Validators; @Component({ selector: 'abp-personal-settings-form', templateUrl: './personal-settings.component.html', + exportAs: 'abpPersonalSettingsForm', }) -export class PersonalSettingsComponent implements OnInit { +export class PersonalSettingsComponent + implements + OnInit, + Account.PersonalSettingsComponentInputs, + Account.PersonalSettingsComponentOutputs { @Select(ProfileState.getProfile) profile$: Observable; @@ -20,7 +26,11 @@ export class PersonalSettingsComponent implements OnInit { inProgress: boolean; - constructor(private fb: FormBuilder, private store: Store, private toasterService: ToasterService) {} + constructor( + private fb: FormBuilder, + private store: Store, + private toasterService: ToasterService, + ) {} ngOnInit() { this.buildForm(); @@ -29,10 +39,7 @@ export class PersonalSettingsComponent implements OnInit { buildForm() { this.store .dispatch(new GetProfile()) - .pipe( - withLatestFrom(this.profile$), - take(1), - ) + .pipe(withLatestFrom(this.profile$), take(1)) .subscribe(([, profile]) => { this.form = this.fb.group({ userName: [profile.userName, [required, maxLength(256)]], diff --git a/npm/ng-packs/packages/account/src/lib/models/account.ts b/npm/ng-packs/packages/account/src/lib/models/account.ts index faa38252c9..12f28cdc3b 100644 --- a/npm/ng-packs/packages/account/src/lib/models/account.ts +++ b/npm/ng-packs/packages/account/src/lib/models/account.ts @@ -14,4 +14,10 @@ export namespace Account { // tslint:disable-next-line: no-empty-interface export interface TenantBoxComponentOutputs {} + + // tslint:disable-next-line: no-empty-interface + export interface PersonalSettingsComponentInputs {} + + // tslint:disable-next-line: no-empty-interface + export interface PersonalSettingsComponentOutputs {} } From 613680e692201b7f74a30be4042bd4c92f9b9459 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 30 Dec 2019 16:14:57 +0300 Subject: [PATCH 42/46] feat(account): make change password component replaceable #2404 --- .../change-password.component.ts | 41 +++++++++++++++---- .../manage-profile.component.html | 24 +++++++---- .../account/src/lib/models/account.ts | 6 +++ 3 files changed, 56 insertions(+), 15 deletions(-) diff --git a/npm/ng-packs/packages/account/src/lib/components/change-password/change-password.component.ts b/npm/ng-packs/packages/account/src/lib/components/change-password/change-password.component.ts index a1a0a51216..2b66a80b94 100644 --- a/npm/ng-packs/packages/account/src/lib/components/change-password/change-password.component.ts +++ b/npm/ng-packs/packages/account/src/lib/components/change-password/change-password.component.ts @@ -6,6 +6,7 @@ import { comparePasswords, Validation, PasswordRules, validatePassword } from '@ import { Store } from '@ngxs/store'; import snq from 'snq'; import { finalize } from 'rxjs/operators'; +import { Account } from '../../models/account'; const { minLength, required, maxLength } = Validators; @@ -14,8 +15,10 @@ const PASSWORD_FIELDS = ['newPassword', 'repeatNewPassword']; @Component({ selector: 'abp-change-password-form', templateUrl: './change-password.component.html', + exportAs: 'abpChangePasswordForm', }) -export class ChangePasswordComponent implements OnInit { +export class ChangePasswordComponent + implements OnInit, Account.ChangePasswordComponentInputs, Account.ChangePasswordComponentOutputs { form: FormGroup; inProgress: boolean; @@ -26,7 +29,11 @@ export class ChangePasswordComponent implements OnInit { return errors.concat(groupErrors.filter(({ key }) => key === 'passwordMismatch')); }; - constructor(private fb: FormBuilder, private store: Store, private toasterService: ToasterService) {} + constructor( + private fb: FormBuilder, + private store: Store, + private toasterService: ToasterService, + ) {} ngOnInit(): void { const passwordRules: ABP.Dictionary = this.store.selectSnapshot( @@ -61,12 +68,24 @@ export class ChangePasswordComponent implements OnInit { newPassword: [ '', { - validators: [required, validatePassword(passwordRulesArr), minLength(requiredLength), maxLength(32)], + validators: [ + required, + validatePassword(passwordRulesArr), + minLength(requiredLength), + maxLength(32), + ], }, ], repeatNewPassword: [ '', - { validators: [required, validatePassword(passwordRulesArr), minLength(requiredLength), maxLength(32)] }, + { + validators: [ + required, + validatePassword(passwordRulesArr), + minLength(requiredLength), + maxLength(32), + ], + }, ], }, { @@ -89,12 +108,18 @@ export class ChangePasswordComponent implements OnInit { .subscribe({ next: () => { this.form.reset(); - this.toasterService.success('AbpAccount::PasswordChangedMessage', 'Success', { life: 5000 }); + this.toasterService.success('AbpAccount::PasswordChangedMessage', 'Success', { + life: 5000, + }); }, error: err => { - this.toasterService.error(snq(() => err.error.error.message, 'AbpAccount::DefaultErrorMessage'), 'Error', { - life: 7000, - }); + this.toasterService.error( + snq(() => err.error.error.message, 'AbpAccount::DefaultErrorMessage'), + 'Error', + { + life: 7000, + }, + ); }, }); } diff --git a/npm/ng-packs/packages/account/src/lib/components/manage-profile/manage-profile.component.html b/npm/ng-packs/packages/account/src/lib/components/manage-profile/manage-profile.component.html index 5261a11a57..04dd582ac7 100644 --- a/npm/ng-packs/packages/account/src/lib/components/manage-profile/manage-profile.component.html +++ b/npm/ng-packs/packages/account/src/lib/components/manage-profile/manage-profile.component.html @@ -6,14 +6,22 @@ @@ -24,7 +32,9 @@ {{ 'AbpIdentity::ChangePassword' | abpLocalization }}
- +
diff --git a/npm/ng-packs/packages/account/src/lib/models/account.ts b/npm/ng-packs/packages/account/src/lib/models/account.ts index 12f28cdc3b..fc455758cb 100644 --- a/npm/ng-packs/packages/account/src/lib/models/account.ts +++ b/npm/ng-packs/packages/account/src/lib/models/account.ts @@ -20,4 +20,10 @@ export namespace Account { // tslint:disable-next-line: no-empty-interface export interface PersonalSettingsComponentOutputs {} + + // tslint:disable-next-line: no-empty-interface + export interface ChangePasswordComponentInputs {} + + // tslint:disable-next-line: no-empty-interface + export interface ChangePasswordComponentOutputs {} } From 0d0577b3da0b9a93aefa54c58592bdda0bd3dd45 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 30 Dec 2019 16:15:33 +0300 Subject: [PATCH 43/46] feat(account): add autocomplete attiributes to change password component --- .../change-password.component.html | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/npm/ng-packs/packages/account/src/lib/components/change-password/change-password.component.html b/npm/ng-packs/packages/account/src/lib/components/change-password/change-password.component.html index 15b7ca7dd4..fdc8f23ce2 100644 --- a/npm/ng-packs/packages/account/src/lib/components/change-password/change-password.component.html +++ b/npm/ng-packs/packages/account/src/lib/components/change-password/change-password.component.html @@ -1,17 +1,41 @@
- {{ + 'AbpIdentity::DisplayName:CurrentPassword' | abpLocalization + }} * + >
* + > *
- {{ + 'AbpIdentity::DisplayName:NewPasswordConfirm' | abpLocalization + }} * + >
Date: Tue, 31 Dec 2019 14:47:07 +0800 Subject: [PATCH 44/46] Set 204 No Content for void/Task. Resolve #262 --- .../AspNetCore/Mvc/AbpMvcOptionsExtensions.cs | 2 + .../Mvc/Response/AbpNoContentActionFilter.cs | 31 ++++++++++ .../Mvc/Response/NoContentTestController.cs | 51 ++++++++++++++++ .../Response/NoContentTestController_Tests.cs | 58 +++++++++++++++++++ 4 files changed, 142 insertions(+) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Response/AbpNoContentActionFilter.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController_Tests.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpMvcOptionsExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpMvcOptionsExtensions.cs index a633edb37e..4aedf0b087 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpMvcOptionsExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpMvcOptionsExtensions.cs @@ -5,6 +5,7 @@ using Volo.Abp.AspNetCore.Mvc.Conventions; using Volo.Abp.AspNetCore.Mvc.ExceptionHandling; using Volo.Abp.AspNetCore.Mvc.Features; using Volo.Abp.AspNetCore.Mvc.ModelBinding; +using Volo.Abp.AspNetCore.Mvc.Response; using Volo.Abp.AspNetCore.Mvc.Uow; using Volo.Abp.AspNetCore.Mvc.Validation; @@ -28,6 +29,7 @@ namespace Volo.Abp.AspNetCore.Mvc private static void AddFilters(MvcOptions options) { options.Filters.AddService(typeof(AbpAuditActionFilter)); + options.Filters.AddService(typeof(AbpNoContentActionFilter)); options.Filters.AddService(typeof(AbpFeatureActionFilter)); options.Filters.AddService(typeof(AbpValidationActionFilter)); options.Filters.AddService(typeof(AbpUowActionFilter)); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Response/AbpNoContentActionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Response/AbpNoContentActionFilter.cs new file mode 100644 index 0000000000..b6d56b2f2a --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Response/AbpNoContentActionFilter.cs @@ -0,0 +1,31 @@ +using System.Net; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Abstractions; +using Microsoft.AspNetCore.Mvc.Filters; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.Response +{ + public class AbpNoContentActionFilter : IAsyncActionFilter, ITransientDependency + { + public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) + { + if (!context.ActionDescriptor.IsControllerAction()) + { + await next(); + return; + } + + await next(); + + if (context.HttpContext.Response.StatusCode == (int)HttpStatusCode.OK) + { + var returnType = context.ActionDescriptor.GetReturnType(); + if (returnType == typeof(Task) || returnType == typeof(void)) + { + context.HttpContext.Response.StatusCode = (int)HttpStatusCode.NoContent; + } + } + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController.cs new file mode 100644 index 0000000000..dc0ae30d71 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController.cs @@ -0,0 +1,51 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; + +namespace Volo.Abp.AspNetCore.Mvc.Response +{ + [Route("api/NoContent-Test")] + public class NoContentTestController : AbpController + { + [HttpGet] + [Route("TestMethod")] + public void TestMethod() + { + } + + [HttpGet] + [Route("TestMethodWithReturn")] + public string TestMethodWithReturn() + { + return "TestReturn"; + } + + [HttpGet] + [Route("TestCustomHttpStatusCodeMethod")] + public void TestCustomHttpStatusCodeMethod() + { + Response.Redirect("/"); + } + + [HttpGet] + [Route("TestAsyncMethod")] + public async Task TestAsyncMethod() + { + await Task.CompletedTask; + } + + [HttpGet] + [Route("TestAsyncMethodWithReturn")] + public async Task TestAsyncMethodWithReturn() + { + return await Task.FromResult("TestReturn"); + } + + [HttpGet] + [Route("TestAsyncCustomHttpStatusCodeMethod")] + public async Task TestAsyncCustomHttpStatusCodeMethod() + { + Response.Redirect("/"); + await Task.CompletedTask; + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController_Tests.cs new file mode 100644 index 0000000000..6c68c13f07 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController_Tests.cs @@ -0,0 +1,58 @@ +using System.Net; +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Volo.Abp.AspNetCore.Mvc.Response +{ + public class NoContentTestController_Tests : AspNetCoreMvcTestBase + { + [Fact] + public async Task Should_Set_No_Content_For_Void_Action() + { + var result = await GetResponseAsync("/api/NoContent-Test/TestMethod", HttpStatusCode.NoContent) + .ConfigureAwait(false); + result.StatusCode.ShouldBe(HttpStatusCode.NoContent); + } + + [Fact] + public async Task Should_Not_Set_No_Content_For_Not_Void_Action() + { + var result = await GetResponseAsync("/api/NoContent-Test/TestMethodWithReturn") + .ConfigureAwait(false); + result.StatusCode.ShouldBe(HttpStatusCode.OK); + } + + [Fact] + public async Task Should_Not_Set_No_Content_For_Custom_Http_Status_Code_Action() + { + var result = await GetResponseAsync("/api/NoContent-Test/TestCustomHttpStatusCodeMethod", HttpStatusCode.Redirect) + .ConfigureAwait(false); + result.StatusCode.ShouldBe(HttpStatusCode.Redirect); + } + + [Fact] + public async Task Should_Set_No_Content_For_Task_Action() + { + var result = await GetResponseAsync("/api/NoContent-Test/TestAsyncMethod", HttpStatusCode.NoContent) + .ConfigureAwait(false); + result.StatusCode.ShouldBe(HttpStatusCode.NoContent); + } + + [Fact] + public async Task Should_Not_Set_No_Content_For_Not_Task_Action() + { + var result = await GetResponseAsync("/api/NoContent-Test/TestAsyncMethodWithReturn") + .ConfigureAwait(false); + result.StatusCode.ShouldBe(HttpStatusCode.OK); + } + + [Fact] + public async Task Should_Not_Set_No_Content_For_Custom_Http_Status_Code_Async_Action() + { + var result = await GetResponseAsync("/api/NoContent-Test/TestAsyncCustomHttpStatusCodeMethod", HttpStatusCode.Redirect) + .ConfigureAwait(false); + result.StatusCode.ShouldBe(HttpStatusCode.Redirect); + } + } +} From 3f4a97b378cd31b84cced80eaa28ab45f7d32673 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 31 Dec 2019 13:45:29 +0300 Subject: [PATCH 45/46] feat(module-template): make module component replaceable #2404 --- .../src/lib/my-project-name-routing.module.ts | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts b/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts index 5ef00189aa..c1018686fe 100644 --- a/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts +++ b/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts @@ -1,4 +1,10 @@ -import { AuthGuard, DynamicLayoutComponent, PermissionGuard } from '@abp/ng.core'; +import { + AuthGuard, + DynamicLayoutComponent, + PermissionGuard, + ReplaceableComponents, + ReplaceableRouteContainerComponent, +} from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { MyProjectNameComponent } from './components/my-project-name.component'; @@ -8,8 +14,19 @@ const routes: Routes = [ path: '', component: DynamicLayoutComponent, canActivate: [AuthGuard, PermissionGuard], - data: { requiredPolicy: '' }, - children: [{ path: '', component: MyProjectNameComponent }], + children: [ + { + path: '', + component: ReplaceableRouteContainerComponent, + data: { + requiredPolicy: '', + replaceableComponent: { + defaultComponent: MyProjectNameComponent, + key: 'MyProjectName.MyProjectNameComponent', + } as ReplaceableComponents.RouteData, + }, + }, + ], }, ]; From cf836bd7b7912408788bd439931463c6c30df39c Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 31 Dec 2019 14:23:41 +0300 Subject: [PATCH 46/46] fix: lint errors --- .../packages/core/src/lib/actions/index.ts | 2 +- .../packages/core/src/lib/models/index.ts | 2 +- .../packages/core/src/lib/states/index.ts | 4 +- npm/ng-packs/yarn.lock | 679 ++++++++++++------ 4 files changed, 445 insertions(+), 242 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/actions/index.ts b/npm/ng-packs/packages/core/src/lib/actions/index.ts index 46269fd60a..9ef0b1278a 100644 --- a/npm/ng-packs/packages/core/src/lib/actions/index.ts +++ b/npm/ng-packs/packages/core/src/lib/actions/index.ts @@ -3,4 +3,4 @@ export * from './loader.actions'; export * from './profile.actions'; export * from './replaceable-components.actions'; export * from './rest.actions'; -export * from './session.actions'; \ No newline at end of file +export * from './session.actions'; diff --git a/npm/ng-packs/packages/core/src/lib/models/index.ts b/npm/ng-packs/packages/core/src/lib/models/index.ts index 213218d811..c19dcbc96a 100644 --- a/npm/ng-packs/packages/core/src/lib/models/index.ts +++ b/npm/ng-packs/packages/core/src/lib/models/index.ts @@ -4,4 +4,4 @@ export * from './config'; export * from './profile'; export * from './replaceable-components'; export * from './rest'; -export * from './session'; \ No newline at end of file +export * from './session'; diff --git a/npm/ng-packs/packages/core/src/lib/states/index.ts b/npm/ng-packs/packages/core/src/lib/states/index.ts index d70de13d43..7b48292caa 100644 --- a/npm/ng-packs/packages/core/src/lib/states/index.ts +++ b/npm/ng-packs/packages/core/src/lib/states/index.ts @@ -1,4 +1,4 @@ -export * from "./replaceable-components.state"; +export * from './replaceable-components.state'; export * from './config.state'; export * from './profile.state'; -export * from './session.state'; \ No newline at end of file +export * from './session.state'; diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock index e1eb7b85f3..e0af31cd07 100644 --- a/npm/ng-packs/yarn.lock +++ b/npm/ng-packs/yarn.lock @@ -132,26 +132,26 @@ jest-preset-angular "^7.1.1" lodash "^4.17.10" -"@angular-devkit/architect@0.803.20": - version "0.803.20" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.803.20.tgz#792093259d69012c0763aa9176181b255d8795c8" - integrity sha512-NjyDJ61i9kh8J+qXt0E2j+P5Xsmi2mPasBzwcQyrZZGiho4zC0IFxcdxyzcsXFEupmilJKkjdt2g4QQRC5rUDQ== +"@angular-devkit/architect@0.803.21": + version "0.803.21" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.803.21.tgz#0e76b6f646ebdbd9bb88d3972b2ca66fed950f7d" + integrity sha512-E2K/YexIWVyKM/xmyxvDjkJf+wX9u4c8YYpNaK4htsRzA06juc7N1MhlL/jURZiRl5b/K9sapYeq3tMX76saxA== dependencies: - "@angular-devkit/core" "8.3.20" + "@angular-devkit/core" "8.3.21" rxjs "6.4.0" -"@angular-devkit/build-angular@~0.803.20": - version "0.803.20" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.803.20.tgz#b19b0d82c75cbdd939b589a33ccb60e2c9f6eec9" - integrity sha512-JDZkZjOqPbOtCMsSKxQf9C+uSTZ7fQGlKGsCpJMzfa4iQ0WrmrhZvnRKQeEpMTTZTpuou/HQeQjyDV+Sx3yumw== - dependencies: - "@angular-devkit/architect" "0.803.20" - "@angular-devkit/build-optimizer" "0.803.20" - "@angular-devkit/build-webpack" "0.803.20" - "@angular-devkit/core" "8.3.20" - "@babel/core" "7.5.5" - "@babel/preset-env" "7.5.5" - "@ngtools/webpack" "8.3.20" +"@angular-devkit/build-angular@~0.803.21": + version "0.803.21" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.803.21.tgz#f3d12ea09748b05eb2d835a7de7997599fb6b752" + integrity sha512-flfgflvfpwdsm3x/U7QnfbtyZPEbsVipzQAoao1Zo58Beq1a+NsKsWbjrF/x4TSoI2czt0OVWXNytlfXM7LMhg== + dependencies: + "@angular-devkit/architect" "0.803.21" + "@angular-devkit/build-optimizer" "0.803.21" + "@angular-devkit/build-webpack" "0.803.21" + "@angular-devkit/core" "8.3.21" + "@babel/core" "7.7.5" + "@babel/preset-env" "7.7.6" + "@ngtools/webpack" "8.3.21" ajv "6.10.2" autoprefixer "9.6.1" browserslist "4.6.6" @@ -159,7 +159,7 @@ caniuse-lite "1.0.30000989" circular-dependency-plugin "5.2.0" clean-css "4.2.1" - copy-webpack-plugin "5.0.4" + copy-webpack-plugin "5.1.1" core-js "3.2.1" file-loader "4.2.0" find-cache-dir "3.0.0" @@ -192,7 +192,7 @@ stylus "0.54.5" stylus-loader "3.0.2" terser "4.3.9" - terser-webpack-plugin "1.4.1" + terser-webpack-plugin "1.4.3" tree-kill "1.2.1" webpack "4.39.2" webpack-dev-middleware "3.7.2" @@ -202,18 +202,18 @@ webpack-subresource-integrity "1.1.0-rc.6" worker-plugin "3.2.0" -"@angular-devkit/build-ng-packagr@~0.803.20": - version "0.803.20" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.803.20.tgz#d5fcef89580b4077a27c77be078cfeb0c77e71f7" - integrity sha512-4ccjjxfBFUDtz+P0tlxWaPgxlnZZmDAVDocbLPb0tba4f5onbKDn6cnoLxn/gEDRiXOTYuUhSvIH3BI9GcCDiw== +"@angular-devkit/build-ng-packagr@~0.803.21": + version "0.803.21" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.803.21.tgz#6c71d9ddfb005176385b71b45ed463451ea0f55b" + integrity sha512-GqBq06pSvEu3szJQExnpNI3P0XGl2lk1ud1FXzSWuMBKEmU+IfSanlFsLBOqCKhtbSHjTz0mkV0DjVFyaBKmrg== dependencies: - "@angular-devkit/architect" "0.803.20" + "@angular-devkit/architect" "0.803.21" rxjs "6.4.0" -"@angular-devkit/build-optimizer@0.803.20": - version "0.803.20" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.803.20.tgz#36f92c350c1cb3d3d7f1e0f0086feed726478902" - integrity sha512-Vzxf1g1EuzaPBoScDYUhyxemi5chlgnpWmObNo5dzVAVzjxo5gJeDIGpiyDqHvr6LBkprqb6XHcZhMWqIcdIHg== +"@angular-devkit/build-optimizer@0.803.21": + version "0.803.21" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.803.21.tgz#ecb3b6bba4b13ffbfbdbefb5997f690aa3635203" + integrity sha512-gNN6kPaF4phZco3TmsrNr9tIEKXYsoSeoaUiDUfgmCYwa7fAqM8Ojh7HX6IQuB2PpVmEwKGlCcSh6xDtB33NjA== dependencies: loader-utils "1.2.3" source-map "0.7.3" @@ -221,13 +221,13 @@ typescript "3.5.3" webpack-sources "1.4.3" -"@angular-devkit/build-webpack@0.803.20": - version "0.803.20" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.803.20.tgz#c03bd23a9f147c07201db681bf9fc3bfad95f9d9" - integrity sha512-35af8kD3KG/cIv7AB09YNER5HIPlx55ipBxdVk8D+X3MuUcTmD6fFvqXcV0EPlD1vQephthfzSgtNpvuPv4xuA== +"@angular-devkit/build-webpack@0.803.21": + version "0.803.21" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.803.21.tgz#fd45754c0123f44fcde8fa6411ebea52d98054f0" + integrity sha512-zCFVla/Xdk8qGVybvnHtoKml2h0/ShasSjT55VNZO1XaTCMqYkQEwwqSGEiVajpauafWjKrKxxBhsmWoI4efAA== dependencies: - "@angular-devkit/architect" "0.803.20" - "@angular-devkit/core" "8.3.20" + "@angular-devkit/architect" "0.803.21" + "@angular-devkit/core" "8.3.21" rxjs "6.4.0" "@angular-devkit/core@7.3.9", "@angular-devkit/core@^7.3.6": @@ -252,12 +252,23 @@ rxjs "6.4.0" source-map "0.7.3" -"@angular-devkit/schematics@8.3.20", "@angular-devkit/schematics@^8.0.6": - version "8.3.20" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.20.tgz#80e7c31ebfd8f7f8500bfa1cae5c39980b962d6a" - integrity sha512-sDHZakh4e3A5WenR9zr1x6Va9GNRqQlRhqT3xcbkG88v2M0YqEt7dHB7YwnOhm7zSxiWQM8PdWEQHiQ4iu9NyQ== +"@angular-devkit/core@8.3.21": + version "8.3.21" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.21.tgz#447022813e46333e930816c287722d06b9c4dd3a" + integrity sha512-BYyVbrbys535FplX0+GVOlYBg/cyk1U5SRhSxRRFZYi9epVlEBBPk8/6wV4cQPGb6EwXkVj7YtPWXjXcGfzWmA== dependencies: - "@angular-devkit/core" "8.3.20" + ajv "6.10.2" + fast-json-stable-stringify "2.0.0" + magic-string "0.25.3" + rxjs "6.4.0" + source-map "0.7.3" + +"@angular-devkit/schematics@8.3.21": + version "8.3.21" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.21.tgz#80d515f480180be18a4130ea691f90153bcab3ea" + integrity sha512-+wH0362CRr/SijVX4w2baY2ANZ4scQ1k2xO8lT+NMeZQkw3IJQPOfwk1IaqiAs2xuBJZcSDH1Gn80+Jh4Dit7w== + dependencies: + "@angular-devkit/core" "8.3.21" rxjs "6.4.0" "@angular-devkit/schematics@^7.3.6": @@ -268,6 +279,14 @@ "@angular-devkit/core" "7.3.9" rxjs "6.3.3" +"@angular-devkit/schematics@^8.0.6": + version "8.3.20" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.20.tgz#80e7c31ebfd8f7f8500bfa1cae5c39980b962d6a" + integrity sha512-sDHZakh4e3A5WenR9zr1x6Va9GNRqQlRhqT3xcbkG88v2M0YqEt7dHB7YwnOhm7zSxiWQM8PdWEQHiQ4iu9NyQ== + dependencies: + "@angular-devkit/core" "8.3.20" + rxjs "6.4.0" + "@angular/animations@~8.2.14": version "8.2.14" resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-8.2.14.tgz#76736b21e56165e6ca4925fb69605bdcc56aba7d" @@ -284,16 +303,16 @@ optionalDependencies: parse5 "^5.0.0" -"@angular/cli@~8.3.18": - version "8.3.20" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-8.3.20.tgz#63e8f626e7dcf37e73cda820ab38bcac13423326" - integrity sha512-bCo8zVFZ6iPc1EnHmVCmKvIcV7YkvalBKGNU7LtVHq6qZBI+ZmFtuyL5obKvFg1vJcminjKcY/UcMr9uGcAQrQ== +"@angular/cli@~8.3.21": + version "8.3.21" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-8.3.21.tgz#cbb05b86b7f34ecd81d52ccad922359e66a16a15" + integrity sha512-ZZpA7mMfIobFT06rBNxm8vucAh8W2s0huJZ4iL0BPujnhIr71PL+gDwssySWDEz2q6i4CkH9QRH76DHhtL6VSQ== dependencies: - "@angular-devkit/architect" "0.803.20" - "@angular-devkit/core" "8.3.20" - "@angular-devkit/schematics" "8.3.20" - "@schematics/angular" "8.3.20" - "@schematics/update" "0.803.20" + "@angular-devkit/architect" "0.803.21" + "@angular-devkit/core" "8.3.21" + "@angular-devkit/schematics" "8.3.21" + "@schematics/angular" "8.3.21" + "@schematics/update" "0.803.21" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.1" debug "^4.1.1" @@ -387,19 +406,19 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" - integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== +"@babel/core@7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.5.tgz#ae1323cd035b5160293307f50647e83f8ba62f7e" + integrity sha512-M42+ScN4+1S9iB6f+TL7QBpoQETxbclx+KNoKJABghnKYE+fMzSGqst0BZJc8CpI625bwPwYgUyRvxZ+0mZzpw== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" - "@babel/helpers" "^7.5.5" - "@babel/parser" "^7.5.5" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" - convert-source-map "^1.1.0" + "@babel/generator" "^7.7.4" + "@babel/helpers" "^7.7.4" + "@babel/parser" "^7.7.5" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + convert-source-map "^1.7.0" debug "^4.1.0" json5 "^2.1.0" lodash "^4.17.13" @@ -427,7 +446,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.5.5", "@babel/generator@^7.7.4": +"@babel/generator@^7.4.0", "@babel/generator@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.4.tgz#db651e2840ca9aa66f327dcec1dc5f5fa9611369" integrity sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg== @@ -516,7 +535,7 @@ dependencies: "@babel/types" "^7.7.4" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.7.4": +"@babel/helper-module-imports@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91" integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ== @@ -535,6 +554,18 @@ "@babel/types" "^7.7.4" lodash "^4.17.13" +"@babel/helper-module-transforms@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz#d044da7ffd91ec967db25cd6748f704b6b244835" + integrity sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw== + dependencies: + "@babel/helper-module-imports" "^7.7.4" + "@babel/helper-simple-access" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + lodash "^4.17.13" + "@babel/helper-optimise-call-expression@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" @@ -600,7 +631,7 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/helpers@^7.5.5", "@babel/helpers@^7.7.4": +"@babel/helpers@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== @@ -618,12 +649,17 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.5.5", "@babel/parser@^7.7.4": +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.4.tgz#75ab2d7110c2cf2fa949959afb05fa346d2231bb" integrity sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g== -"@babel/plugin-proposal-async-generator-functions@^7.2.0": +"@babel/parser@^7.7.5": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" + integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== + +"@babel/plugin-proposal-async-generator-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz#0351c5ac0a9e927845fffd5b82af476947b7ce6d" integrity sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw== @@ -632,7 +668,7 @@ "@babel/helper-remap-async-to-generator" "^7.7.4" "@babel/plugin-syntax-async-generators" "^7.7.4" -"@babel/plugin-proposal-dynamic-import@^7.5.0": +"@babel/plugin-proposal-dynamic-import@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz#dde64a7f127691758cbfed6cf70de0fa5879d52d" integrity sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ== @@ -640,7 +676,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-dynamic-import" "^7.7.4" -"@babel/plugin-proposal-json-strings@^7.2.0": +"@babel/plugin-proposal-json-strings@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz#7700a6bfda771d8dc81973249eac416c6b4c697d" integrity sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw== @@ -648,15 +684,15 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.7.4" -"@babel/plugin-proposal-object-rest-spread@^7.5.5": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz#cc57849894a5c774214178c8ab64f6334ec8af71" - integrity sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ== +"@babel/plugin-proposal-object-rest-spread@^7.7.4": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz#9f27075004ab99be08c5c1bd653a2985813cb370" + integrity sha512-3qp9I8lelgzNedI3hrhkvhaEYree6+WHnyA/q4Dza9z7iEIs1eyhWyJnetk3jJ69RT0AT4G0UhEGwyGFJ7GUuQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.7.4" -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": +"@babel/plugin-proposal-optional-catch-binding@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz#ec21e8aeb09ec6711bc0a39ca49520abee1de379" integrity sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w== @@ -664,57 +700,64 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz#7c239ccaf09470dbe1d453d50057460e84517ebb" - integrity sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA== +"@babel/plugin-proposal-unicode-property-regex@^7.7.4": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.7.tgz#433fa9dac64f953c12578b29633f456b68831c4e" + integrity sha512-80PbkKyORBUVm1fbTLrHpYdJxMThzM1UqFGh0ALEhO9TYbG86Ah9zQYAB/84axz2vcxefDLdZwWwZNlYARlu9w== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-async-generators@^7.2.0", "@babel/plugin-syntax-async-generators@^7.7.4": +"@babel/plugin-syntax-async-generators@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz#331aaf310a10c80c44a66b238b6e49132bd3c889" integrity sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.7.4": +"@babel/plugin-syntax-dynamic-import@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec" integrity sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-json-strings@^7.2.0", "@babel/plugin-syntax-json-strings@^7.7.4": +"@babel/plugin-syntax-json-strings@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz#86e63f7d2e22f9e27129ac4e83ea989a382e86cc" integrity sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0", "@babel/plugin-syntax-object-rest-spread@^7.7.4": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-optional-catch-binding@^7.2.0", "@babel/plugin-syntax-optional-catch-binding@^7.7.4": +"@babel/plugin-syntax-optional-catch-binding@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz#a3e38f59f4b6233867b4a92dcb0ee05b2c334aa6" integrity sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-arrow-functions@^7.2.0": +"@babel/plugin-syntax-top-level-await@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz#bd7d8fa7b9fee793a36e4027fd6dd1aa32f946da" + integrity sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz#76309bd578addd8aee3b379d809c802305a98a12" integrity sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.5.0": +"@babel/plugin-transform-async-to-generator@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz#694cbeae6d613a34ef0292713fa42fb45c4470ba" integrity sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg== @@ -723,14 +766,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.7.4" -"@babel/plugin-transform-block-scoped-functions@^7.2.0": +"@babel/plugin-transform-block-scoped-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz#d0d9d5c269c78eaea76227ace214b8d01e4d837b" integrity sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.5.5": +"@babel/plugin-transform-block-scoping@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg== @@ -738,7 +781,7 @@ "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.5.5": +"@babel/plugin-transform-classes@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz#c92c14be0a1399e15df72667067a8f510c9400ec" integrity sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg== @@ -752,36 +795,36 @@ "@babel/helper-split-export-declaration" "^7.7.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.2.0": +"@babel/plugin-transform-computed-properties@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz#e856c1628d3238ffe12d668eb42559f79a81910d" integrity sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.5.0": +"@babel/plugin-transform-destructuring@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz#2b713729e5054a1135097b6a67da1b6fe8789267" integrity sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz#f7ccda61118c5b7a2599a72d5e3210884a021e96" - integrity sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw== +"@babel/plugin-transform-dotall-regex@^7.7.4": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.7.tgz#3e9713f1b69f339e87fa796b097d73ded16b937b" + integrity sha512-b4in+YlTeE/QmTgrllnb3bHA0HntYvjz8O3Mcbx75UBPJA2xhb5A8nle498VhxSXJHQefjtQxpnLPehDJ4TRlg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-duplicate-keys@^7.5.0": +"@babel/plugin-transform-duplicate-keys@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz#3d21731a42e3f598a73835299dd0169c3b90ac91" integrity sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-exponentiation-operator@^7.2.0": +"@babel/plugin-transform-exponentiation-operator@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz#dd30c0191e3a1ba19bcc7e389bdfddc0729d5db9" integrity sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ== @@ -789,14 +832,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-for-of@^7.4.4": +"@babel/plugin-transform-for-of@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz#248800e3a5e507b1f103d8b4ca998e77c63932bc" integrity sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-function-name@^7.4.4": +"@babel/plugin-transform-function-name@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz#75a6d3303d50db638ff8b5385d12451c865025b1" integrity sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g== @@ -804,40 +847,40 @@ "@babel/helper-function-name" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-literals@^7.2.0": +"@babel/plugin-transform-literals@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz#27fe87d2b5017a2a5a34d1c41a6b9f6a6262643e" integrity sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-member-expression-literals@^7.2.0": +"@babel/plugin-transform-member-expression-literals@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz#aee127f2f3339fc34ce5e3055d7ffbf7aa26f19a" integrity sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-amd@^7.5.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.4.tgz#276b3845ca2b228f2995e453adc2e6f54d72fb71" - integrity sha512-/542/5LNA18YDtg1F+QHvvUSlxdvjZoD/aldQwkq+E3WCkbEjNSN9zdrOXaSlfg3IfGi22ijzecklF/A7kVZFQ== +"@babel/plugin-transform-modules-amd@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz#39e0fb717224b59475b306402bb8eedab01e729c" + integrity sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ== dependencies: - "@babel/helper-module-transforms" "^7.7.4" + "@babel/helper-module-transforms" "^7.7.5" "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.5.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.4.tgz#bee4386e550446343dd52a571eda47851ff857a3" - integrity sha512-k8iVS7Jhc367IcNF53KCwIXtKAH7czev866ThsTgy8CwlXjnKZna2VHwChglzLleYrcHz1eQEIJlGRQxB53nqA== +"@babel/plugin-transform-modules-commonjs@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz#1d27f5eb0bcf7543e774950e5b2fa782e637b345" + integrity sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q== dependencies: - "@babel/helper-module-transforms" "^7.7.4" + "@babel/helper-module-transforms" "^7.7.5" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.7.4" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.5.0": +"@babel/plugin-transform-modules-systemjs@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz#cd98152339d3e763dfe838b7d4273edaf520bb30" integrity sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw== @@ -846,7 +889,7 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-umd@^7.2.0": +"@babel/plugin-transform-modules-umd@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz#1027c355a118de0aae9fee00ad7813c584d9061f" integrity sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw== @@ -854,21 +897,21 @@ "@babel/helper-module-transforms" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": +"@babel/plugin-transform-named-capturing-groups-regex@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz#fb3bcc4ee4198e7385805007373d6b6f42c98220" integrity sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.7.4" -"@babel/plugin-transform-new-target@^7.4.4": +"@babel/plugin-transform-new-target@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz#4a0753d2d60639437be07b592a9e58ee00720167" integrity sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-object-super@^7.5.5": +"@babel/plugin-transform-object-super@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz#48488937a2d586c0148451bf51af9d7dda567262" integrity sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg== @@ -876,51 +919,51 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.7.4" -"@babel/plugin-transform-parameters@^7.4.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz#da4555c97f39b51ac089d31c7380f03bca4075ce" - integrity sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw== +"@babel/plugin-transform-parameters@^7.7.4": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.7.tgz#7a884b2460164dc5f194f668332736584c760007" + integrity sha512-OhGSrf9ZBrr1fw84oFXj5hgi8Nmg+E2w5L7NhnG0lPvpDtqd7dbyilM2/vR8CKbJ907RyxPh2kj6sBCSSfI9Ew== dependencies: "@babel/helper-call-delegate" "^7.7.4" "@babel/helper-get-function-arity" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-property-literals@^7.2.0": +"@babel/plugin-transform-property-literals@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz#2388d6505ef89b266103f450f9167e6bd73f98c2" integrity sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-regenerator@^7.4.5": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.4.tgz#d18eac0312a70152d7d914cbed2dc3999601cfc0" - integrity sha512-e7MWl5UJvmPEwFJTwkBlPmqixCtr9yAASBqff4ggXTNicZiwbF8Eefzm6NVgfiBp7JdAGItecnctKTgH44q2Jw== +"@babel/plugin-transform-regenerator@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz#3a8757ee1a2780f390e89f246065ecf59c26fce9" + integrity sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw== dependencies: regenerator-transform "^0.14.0" -"@babel/plugin-transform-reserved-words@^7.2.0": +"@babel/plugin-transform-reserved-words@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz#6a7cf123ad175bb5c69aec8f6f0770387ed3f1eb" integrity sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-shorthand-properties@^7.2.0": +"@babel/plugin-transform-shorthand-properties@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz#74a0a9b2f6d67a684c6fbfd5f0458eb7ba99891e" integrity sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-spread@^7.2.0": +"@babel/plugin-transform-spread@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz#aa673b356fe6b7e70d69b6e33a17fef641008578" integrity sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-sticky-regex@^7.2.0": +"@babel/plugin-transform-sticky-regex@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz#ffb68c05090c30732076b1285dc1401b404a123c" integrity sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A== @@ -928,7 +971,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" -"@babel/plugin-transform-template-literals@^7.4.4": +"@babel/plugin-transform-template-literals@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz#1eb6411736dd3fe87dbd20cc6668e5121c17d604" integrity sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ== @@ -936,14 +979,14 @@ "@babel/helper-annotate-as-pure" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-typeof-symbol@^7.2.0": +"@babel/plugin-transform-typeof-symbol@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz#3174626214f2d6de322882e498a38e8371b2140e" integrity sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-unicode-regex@^7.4.4": +"@babel/plugin-transform-unicode-regex@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae" integrity sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw== @@ -951,58 +994,59 @@ "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/preset-env@7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.5.tgz#bc470b53acaa48df4b8db24a570d6da1fef53c9a" - integrity sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A== +"@babel/preset-env@7.7.6": + version "7.7.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.6.tgz#39ac600427bbb94eec6b27953f1dfa1d64d457b2" + integrity sha512-k5hO17iF/Q7tR9Jv8PdNBZWYW6RofxhnxKjBMc0nG4JTaWvOTiPoO/RLFwAKcA4FpmuBFm6jkoqaRJLGi0zdaQ== dependencies: - "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-module-imports" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-dynamic-import" "^7.5.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.5.5" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.5.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.5.5" - "@babel/plugin-transform-classes" "^7.5.5" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.5.0" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/plugin-transform-duplicate-keys" "^7.5.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.4.4" - "@babel/plugin-transform-function-name" "^7.4.4" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-modules-commonjs" "^7.5.0" - "@babel/plugin-transform-modules-systemjs" "^7.5.0" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" - "@babel/plugin-transform-new-target" "^7.4.4" - "@babel/plugin-transform-object-super" "^7.5.5" - "@babel/plugin-transform-parameters" "^7.4.4" - "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.4.5" - "@babel/plugin-transform-reserved-words" "^7.2.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.2.0" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.4.4" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.4.4" - "@babel/types" "^7.5.5" + "@babel/plugin-proposal-async-generator-functions" "^7.7.4" + "@babel/plugin-proposal-dynamic-import" "^7.7.4" + "@babel/plugin-proposal-json-strings" "^7.7.4" + "@babel/plugin-proposal-object-rest-spread" "^7.7.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.7.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.7.4" + "@babel/plugin-syntax-async-generators" "^7.7.4" + "@babel/plugin-syntax-dynamic-import" "^7.7.4" + "@babel/plugin-syntax-json-strings" "^7.7.4" + "@babel/plugin-syntax-object-rest-spread" "^7.7.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" + "@babel/plugin-syntax-top-level-await" "^7.7.4" + "@babel/plugin-transform-arrow-functions" "^7.7.4" + "@babel/plugin-transform-async-to-generator" "^7.7.4" + "@babel/plugin-transform-block-scoped-functions" "^7.7.4" + "@babel/plugin-transform-block-scoping" "^7.7.4" + "@babel/plugin-transform-classes" "^7.7.4" + "@babel/plugin-transform-computed-properties" "^7.7.4" + "@babel/plugin-transform-destructuring" "^7.7.4" + "@babel/plugin-transform-dotall-regex" "^7.7.4" + "@babel/plugin-transform-duplicate-keys" "^7.7.4" + "@babel/plugin-transform-exponentiation-operator" "^7.7.4" + "@babel/plugin-transform-for-of" "^7.7.4" + "@babel/plugin-transform-function-name" "^7.7.4" + "@babel/plugin-transform-literals" "^7.7.4" + "@babel/plugin-transform-member-expression-literals" "^7.7.4" + "@babel/plugin-transform-modules-amd" "^7.7.5" + "@babel/plugin-transform-modules-commonjs" "^7.7.5" + "@babel/plugin-transform-modules-systemjs" "^7.7.4" + "@babel/plugin-transform-modules-umd" "^7.7.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.4" + "@babel/plugin-transform-new-target" "^7.7.4" + "@babel/plugin-transform-object-super" "^7.7.4" + "@babel/plugin-transform-parameters" "^7.7.4" + "@babel/plugin-transform-property-literals" "^7.7.4" + "@babel/plugin-transform-regenerator" "^7.7.5" + "@babel/plugin-transform-reserved-words" "^7.7.4" + "@babel/plugin-transform-shorthand-properties" "^7.7.4" + "@babel/plugin-transform-spread" "^7.7.4" + "@babel/plugin-transform-sticky-regex" "^7.7.4" + "@babel/plugin-transform-template-literals" "^7.7.4" + "@babel/plugin-transform-typeof-symbol" "^7.7.4" + "@babel/plugin-transform-unicode-regex" "^7.7.4" + "@babel/types" "^7.7.4" browserslist "^4.6.0" - core-js-compat "^3.1.1" + core-js-compat "^3.4.7" invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.5.0" @@ -1022,7 +1066,7 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.7.4": +"@babel/template@^7.4.0", "@babel/template@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== @@ -1031,7 +1075,7 @@ "@babel/parser" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.5.5", "@babel/traverse@^7.7.4": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== @@ -1046,7 +1090,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.5.5", "@babel/types@^7.7.4": +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== @@ -2009,12 +2053,12 @@ schematics-utilities "^1.1.1" tslib "^1.9.0" -"@ngtools/webpack@8.3.20": - version "8.3.20" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-8.3.20.tgz#a5288171b67c96e8d3b219f5108f1d6cd962d6a3" - integrity sha512-2e9Kat6PQEzqtNsZZpnOIvoDzyGwMELiuBYBa9keZeaXOD6TxjSyCRzHHXAldAXqvh4Uj2qjTid54Sy14CxtsQ== +"@ngtools/webpack@8.3.21": + version "8.3.21" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-8.3.21.tgz#d28f2b66a8aeced5260c42ae722192ec5d5e4e56" + integrity sha512-DGqmFQ52sV4uB3y3spQTNLa69oU5cwd1yIqMB4GSM+Qp+hozdzrPA2gVH90N2DDhWe8icsSQHAtZQiR9+BDL8g== dependencies: - "@angular-devkit/core" "8.3.20" + "@angular-devkit/core" "8.3.21" enhanced-resolve "4.1.0" rxjs "6.4.0" tree-kill "1.2.1" @@ -2129,21 +2173,21 @@ dependencies: "@types/node" ">= 8" -"@schematics/angular@8.3.20": - version "8.3.20" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.3.20.tgz#737d0a73e891446899a2267c4cc348b6c5a78ca8" - integrity sha512-Y20pSJhQ0KQd8Tk2kPQlmpRDNDaoIKMeOOGLT2FgCFrumxZXuIbBgN9fGDgW40iI2sq80bccOeo24RKkn3QpcA== +"@schematics/angular@8.3.21": + version "8.3.21" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.3.21.tgz#4902e0b6e8be47006859009bf96a026e3d39dd27" + integrity sha512-KahQ+dHvTsGOZwY6IdzqJZLDEn0G89rrK3OY+7okZujoaLM+LXhxlPoznW1udnZJVTa3VNxYGx11fkgLtRJRqA== dependencies: - "@angular-devkit/core" "8.3.20" - "@angular-devkit/schematics" "8.3.20" + "@angular-devkit/core" "8.3.21" + "@angular-devkit/schematics" "8.3.21" -"@schematics/update@0.803.20": - version "0.803.20" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.803.20.tgz#f6cce4f0ee435d8a4071817ac43e418f2b51d22a" - integrity sha512-MseLreuHdnSLUEnRxZFVSHKKK+3mGXH12SgOSeirwATIL22Df74+Q5BYvsge/Kd2k6s9ak/NCuRXG7FAo8mkMA== +"@schematics/update@0.803.21": + version "0.803.21" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.803.21.tgz#572c955bb132348bca03a128491ae264b0068a0a" + integrity sha512-D3BRvEBF2cJEgogvFaNOfqtTFHHv/ctSRfOeAYWjUxILtb+2DpuZ9h5QYDFhN9MPgz/vRaOqFORa3sEZCRkX4g== dependencies: - "@angular-devkit/core" "8.3.20" - "@angular-devkit/schematics" "8.3.20" + "@angular-devkit/core" "8.3.21" + "@angular-devkit/schematics" "8.3.21" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" pacote "9.5.5" @@ -2578,6 +2622,11 @@ acorn@^7.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== +add-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" + integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= + adm-zip@^0.4.9: version "0.4.13" resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.13.tgz#597e2f8cc3672151e1307d3e95cddbc75672314a" @@ -3347,6 +3396,15 @@ browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.8 electron-to-chromium "^1.3.317" node-releases "^1.1.41" +browserslist@^4.8.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.2.tgz#b45720ad5fbc8713b7253c20766f701c9a694289" + integrity sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA== + dependencies: + caniuse-lite "^1.0.30001015" + electron-to-chromium "^1.3.322" + node-releases "^1.1.42" + browserstack@^1.5.1: version "1.5.3" resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.5.3.tgz#93ab48799a12ef99dbd074dd595410ddb196a7ac" @@ -3458,26 +3516,6 @@ cacache@12.0.2: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^11.3.3: - version "11.3.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" - integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3: version "12.0.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" @@ -3603,6 +3641,11 @@ caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000984, caniuse-lite@^1.0.300010 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001013.tgz#da2440d4d266a17d40eb79bd19c0c8cc1d029c72" integrity sha512-hOAXaWKuq/UVFgYawxIOdPdyMQdYcwOCDOjnZcKn7wCgFUrhP7smuNZjGLuJlPSgE6aRA4cRJ+bGSrhtEt7ZAg== +caniuse-lite@^1.0.30001015: + version "1.0.30001017" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001017.tgz#d3ad6ec18148b9bd991829958d9d7e562bb78cd6" + integrity sha512-EDnZyOJ6eYh6lHmCvCdHAFbfV4KJ9lSdfv4h/ppEhrU/Yudkl7jujwMZ1we6RX7DXqBfT04pVMQ4J+1wcTlsKA== + canonical-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" @@ -4063,7 +4106,7 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -conventional-changelog-angular@^5.0.3: +conventional-changelog-angular@^5.0.3, conventional-changelog-angular@^5.0.6: version "5.0.6" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz#269540c624553aded809c29a3508fdc2b544c059" integrity sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA== @@ -4071,6 +4114,40 @@ conventional-changelog-angular@^5.0.3: compare-func "^1.3.1" q "^1.5.1" +conventional-changelog-atom@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.3.tgz#3bd14280aa09fe3ec49a0e8fe97b5002db02aad4" + integrity sha512-szZe2ut97qNO6vCCMkm1I/tWu6ol4Rr8a9Lx0y/VlpDnpY0PNp+oGpFgU55lplhx+I3Lro9Iv4/gRj0knfgjzg== + dependencies: + q "^1.5.1" + +conventional-changelog-cli@^2.0.31: + version "2.0.31" + resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-2.0.31.tgz#3345581170fbb540416946e460fef519a64aef43" + integrity sha512-nMINylKAamBLM3OmD7/44d9TPZ3V58IDTXoGC/QtXxve+1Sj37BQTzIEW3TNaviZ2ZV/b5Dqg0eSk4DNP5fBdA== + dependencies: + add-stream "^1.0.0" + conventional-changelog "^3.1.18" + lodash "^4.17.15" + meow "^5.0.0" + tempfile "^3.0.0" + +conventional-changelog-codemirror@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.3.tgz#ebc088154684f8f5171446b8d546ba6b460d46f2" + integrity sha512-t2afackdgFV2yBdHhWPqrKbpaQeVnz2hSJKdWqjasPo5EpIB6TBL0er3cOP1mnGQmuzk9JSvimNSuqjWGDtU5Q== + dependencies: + q "^1.5.1" + +conventional-changelog-conventionalcommits@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.3.tgz#22855b32d57d0328951c1c2dc01b172a5f24ea37" + integrity sha512-atGa+R4vvEhb8N/8v3IoW59gCBJeeFiX6uIbPu876ENAmkMwsenyn0R21kdDHJFLQdy6zW4J6b4xN8KI3b9oww== + dependencies: + compare-func "^1.3.1" + lodash "^4.17.15" + q "^1.5.1" + conventional-changelog-core@^3.1.6: version "3.2.3" resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz#b31410856f431c847086a7dcb4d2ca184a7d88fb" @@ -4090,12 +4167,68 @@ conventional-changelog-core@^3.1.6: read-pkg-up "^3.0.0" through2 "^3.0.0" -conventional-changelog-preset-loader@^2.1.1: +conventional-changelog-core@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.1.4.tgz#39be27fca6ef20a0f998d7a3a1e97cfa8a055cb6" + integrity sha512-LO58ZbEpp1Ul+y/vOI8rJRsWkovsYkCFbOCVgi6UnVfU8WC0F8K8VQQwaBZWWUpb6JvEiN4GBR5baRP2txZ+Vg== + dependencies: + add-stream "^1.0.0" + conventional-changelog-writer "^4.0.11" + conventional-commits-parser "^3.0.8" + dateformat "^3.0.0" + get-pkg-repo "^1.0.0" + git-raw-commits "2.0.0" + git-remote-origin-url "^2.0.0" + git-semver-tags "^3.0.1" + lodash "^4.17.15" + normalize-package-data "^2.3.5" + q "^1.5.1" + read-pkg "^3.0.0" + read-pkg-up "^3.0.0" + through2 "^3.0.0" + +conventional-changelog-ember@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-2.0.4.tgz#c29b78e4af7825cbecb6c3fd6086ca5c09471ac1" + integrity sha512-q1u73sO9uCnxN4TSw8xu6MRU8Y1h9kpwtcdJuNRwu/LSKI1IE/iuNSH5eQ6aLlQ3HTyrIpTfUuVybW4W0F17rA== + dependencies: + q "^1.5.1" + +conventional-changelog-eslint@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.4.tgz#8f4736a23e0cd97e890e76fccc287db2f205f2ff" + integrity sha512-CPwTUENzhLGl3auunrJxiIEWncAGaby7gOFCdj2gslIuOFJ0KPJVOUhRz4Da/I53sdo/7UncUJkiLg94jEsjxg== + dependencies: + q "^1.5.1" + +conventional-changelog-express@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz#fea2231d99a5381b4e6badb0c1c40a41fcacb755" + integrity sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw== + dependencies: + q "^1.5.1" + +conventional-changelog-jquery@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.6.tgz#460236ad8fb1d29ff932a14fe4e3a45379b63c5e" + integrity sha512-gHAABCXUNA/HjnZEm+vxAfFPJkgtrZvCDIlCKfdPVXtCIo/Q0lN5VKpx8aR5p8KdVRQFF3OuTlvv5kv6iPuRqA== + dependencies: + q "^1.5.1" + +conventional-changelog-jshint@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.3.tgz#ef6e2caf2ee6ffdfda78fcdf7ce87cf6c512d728" + integrity sha512-Pc2PnMPcez634ckzr4EOWviwRSpZcURaK7bjyD9oK6N5fsC/a+3G7LW5m/JpcHPhA9ZxsfIbm7uqZ3ZDGsQ/sw== + dependencies: + compare-func "^1.3.1" + q "^1.5.1" + +conventional-changelog-preset-loader@^2.1.1, conventional-changelog-preset-loader@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.0.tgz#580fa8ab02cef22c24294d25e52d7ccd247a9a6a" integrity sha512-/rHb32J2EJnEXeK4NpDgMaAVTFZS3o1ExmjKMtYVgIC4MQn0vkNSbYpdGRotkfGGRWiqk3Ri3FBkiZGbAfIfOQ== -conventional-changelog-writer@^4.0.6: +conventional-changelog-writer@^4.0.11, conventional-changelog-writer@^4.0.6: version "4.0.11" resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz#9f56d2122d20c96eb48baae0bf1deffaed1edba4" integrity sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw== @@ -4111,6 +4244,23 @@ conventional-changelog-writer@^4.0.6: split "^1.0.0" through2 "^3.0.0" +conventional-changelog@^3.1.18: + version "3.1.18" + resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-3.1.18.tgz#7da0a5ab34a604b920b8bf71c6cf5d952f0e805e" + integrity sha512-aN6a3rjgV8qwAJj3sC/Lme2kvswWO7fFSGQc32gREcwIOsaiqBaO6f2p0NomFaPDnTqZ+mMZFLL3hlzvEnZ0mQ== + dependencies: + conventional-changelog-angular "^5.0.6" + conventional-changelog-atom "^2.0.3" + conventional-changelog-codemirror "^2.0.3" + conventional-changelog-conventionalcommits "^4.2.3" + conventional-changelog-core "^4.1.4" + conventional-changelog-ember "^2.0.4" + conventional-changelog-eslint "^3.0.4" + conventional-changelog-express "^2.0.1" + conventional-changelog-jquery "^3.0.6" + conventional-changelog-jshint "^2.0.3" + conventional-changelog-preset-loader "^2.3.0" + conventional-commit-types@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.3.0.tgz#bc3c8ebba0a9e4b3ecc548f1d0674e251ab8be22" @@ -4124,7 +4274,7 @@ conventional-commits-filter@^2.0.2: lodash.ismatch "^4.4.0" modify-values "^1.0.0" -conventional-commits-parser@^3.0.3: +conventional-commits-parser@^3.0.3, conventional-commits-parser@^3.0.8: version "3.0.8" resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz#23310a9bda6c93c874224375e72b09fb275fe710" integrity sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ== @@ -4151,7 +4301,7 @@ conventional-recommended-bump@^5.0.0: meow "^4.0.0" q "^1.5.1" -convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -4185,12 +4335,12 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -copy-webpack-plugin@5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.0.4.tgz#c78126f604e24f194c6ec2f43a64e232b5d43655" - integrity sha512-YBuYGpSzoCHSSDGyHy6VJ7SHojKp6WHT4D7ItcQFNAYx2hrwkMe56e97xfVR0/ovDuMTrMffXUiltvQljtAGeg== +copy-webpack-plugin@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88" + integrity sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg== dependencies: - cacache "^11.3.3" + cacache "^12.0.3" find-cache-dir "^2.1.0" glob-parent "^3.1.0" globby "^7.1.1" @@ -4198,18 +4348,18 @@ copy-webpack-plugin@5.0.4: loader-utils "^1.2.3" minimatch "^3.0.4" normalize-path "^3.0.0" - p-limit "^2.2.0" + p-limit "^2.2.1" schema-utils "^1.0.0" - serialize-javascript "^1.7.0" + serialize-javascript "^2.1.2" webpack-log "^2.0.0" -core-js-compat@^3.1.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.4.7.tgz#39f8080b1d92a524d6d90505c42b9c5c1eb90611" - integrity sha512-57+mgz/P/xsGdjwQYkwtBZR3LuISaxD1dEwVDtbk8xJMqAmwqaxLOvnNT7kdJ7jYE/NjNptyzXi+IQFMi/2fCw== +core-js-compat@^3.4.7: + version "3.6.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.1.tgz#39638c935c83c93a793abb628b252ec43e85783a" + integrity sha512-2Tl1EuxZo94QS2VeH28Ebf5g3xbPZG/hj/N5HDDy4XMP/ImR0JIer/nggQRiMN91Q54JVkGbytf42wO29oXVHg== dependencies: - browserslist "^4.8.0" - semver "^6.3.0" + browserslist "^4.8.2" + semver "7.0.0" core-js-pure@^3.0.0: version "3.4.7" @@ -4820,7 +4970,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.191, electron-to-chromium@^1.3.317: +electron-to-chromium@^1.3.191, electron-to-chromium@^1.3.317, electron-to-chromium@^1.3.322: version "1.3.322" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz#a6f7e1c79025c2b05838e8e344f6e89eb83213a8" integrity sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA== @@ -5642,6 +5792,14 @@ git-semver-tags@^2.0.3: meow "^4.0.0" semver "^6.0.0" +git-semver-tags@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-3.0.1.tgz#9cb9e4974437de1f71f32da3bfe74f4d35afb1b9" + integrity sha512-Hzd1MOHXouITfCasrpVJbRDg9uvW7LfABk3GQmXYZByerBDrfrEMP9HXpNT7RxAbieiocP6u+xq20DkvjwxnCA== + dependencies: + meow "^5.0.0" + semver "^6.0.0" + git-up@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.1.tgz#cb2ef086653640e721d2042fe3104857d89007c0" @@ -8471,6 +8629,13 @@ node-releases@^1.1.25, node-releases@^1.1.41: dependencies: semver "^6.3.0" +node-releases@^1.1.42: + version "1.1.44" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.44.tgz#cd66438a6eb875e3eb012b6a12e48d9f4326ffd7" + integrity sha512-NwbdvJyR7nrcGrXvKAvzc5raj/NkoJudkarh2yIpJ4t0NH4aqjUDz/486P+ynIW5eokKOfzGNRdYoLfBlomruw== + dependencies: + semver "^6.3.0" + node-sass-tilde-importer@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz#1a15105c153f648323b4347693fdb0f331bad1ce" @@ -8917,7 +9082,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== @@ -10478,6 +10643,11 @@ semver@6.3.0, semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -10507,6 +10677,11 @@ serialize-javascript@^1.7.0: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -11273,6 +11448,11 @@ temp-dir@^1.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + temp-write@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492" @@ -11285,6 +11465,14 @@ temp-write@^3.4.0: temp-dir "^1.0.0" uuid "^3.0.1" +tempfile@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-3.0.0.tgz#5376a3492de7c54150d0cc0612c3f00e2cdaf76c" + integrity sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw== + dependencies: + temp-dir "^2.0.0" + uuid "^3.3.2" + term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" @@ -11292,7 +11480,22 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -terser-webpack-plugin@1.4.1, terser-webpack-plugin@^1.4.1: +terser-webpack-plugin@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser-webpack-plugin@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4" integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==